什么是提示技術?
? ? ? ? 提示技術是實現提示工程目標的具體技術手段,是提示工程中的“工具庫”。
什么又是提示工程?
????????提示工程是指通過設計、優化和迭代輸入到大語言模型(LLM)的提示(Prompt),系統性提升模型輸出質量(如相關性、準確性、可控性)的實踐領域。它是一個覆蓋全流程的方法論,包括:
- 明確目標任務(如生成教學內容、問答、翻譯);
- 設計提示結構(如指令、上下文、示例);
- 選擇模型與參數(如溫度、top_p);
- 驗證與迭代(根據輸出調整提示)。
其核心是“通過工程化方法控制大語言模型(LLM)的行為”。
概念
????????使用大語言模型讀取自然語言問題并生成程序作為中間推理步驟的方法,被稱為程序輔助語言模型(Program-Aided Language Models, PAL)。
概念圖解
應用場景
- 數學與邏輯推理:解決復雜數學問題,如微積分、代數方程、幾何證明等;
- 數據分析與處理:自動化數據分析,生成可視化圖表,計算統計指標等;
- 編程輔助:為開發者生成代碼片段,解決實際問題,如生成特定功能的 Python代碼等;
- 教育與學習:幫助學生理解數學或編程問題,并通過代碼提供具體步驟等;
- ……
案例實操
使用工具:扣子
實現方式:扣子工作流
完整工作流如下:
工作流節點配置信息:
開始節點:
生成 Python代碼節點:
正則提取 Python代碼節點:
里面的代碼是 Python 語言,具體如下:
# 在這里,您可以通過 'args' 獲取節點中的輸入變量,并通過 'ret' 輸出結果
# 'args' 已經被正確地注入到環境中
# 下面是一個示例,首先獲取節點的全部輸入參數params,其次獲取其中參數名為'input'的值:
# params = args.params;
# input = params['input'];
# 下面是一個示例,輸出一個包含多種數據類型的 'ret' 對象:
# ret: Output = { "name": '小明', "hobbies": ["看書", "旅游"] };async def main(args: Args) -> Output:params = args.paramscode_param = params['input']import recode_match = re.search(r"```python(.*?)```", code_param, re.DOTALL)if not code_match:raise ValueError("無法從模型輸出中提取Python代碼")generated_code = code_match.group(1).strip()# 構建輸出對象ret: Output = {"key0": generated_code}return ret
CodeRunner插件節點:
結束節點:
測試輸入:
小明有5個蘋果,7個香蕉。吃了2個香蕉,又買了3個蘋果,請問現在有幾個水果?
運行結果:
大家若有編程基礎的話,可以參考下面的代碼案例來實現與體驗不同場景下使用程序輔助語言模型提示。
代碼實現程序輔助語言提示
技術棧:Python;LangChain
代碼實現引用包導入:
pip install langchain_experimental==0.3.4;
pip install langchain_core==0.3.66;
pip install langchain_community==0.3.26;
具體代碼:
import os
import refrom dotenv import load_dotenv
from langchain_community.chat_models import ChatZhipuAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_experimental.utilities.python import PythonREPL# 加載環境變量
load_dotenv()# 1. 初始化智譜AI模型(GLM-4)
zhipu_chat = ChatZhipuAI(model="glm-4",api_key=os.getenv("ZHIPUAI_API_KEY")
)# 2. 創建Python代碼執行環境
python_repl = PythonREPL() # 實例化 REPL 工具# 3. 設計PAL提示模板
pal_prompt = ChatPromptTemplate.from_messages([("system","""你是一名數學教師助手,必須通過生成可執行的Python代碼來解決問題。步驟:1. 先理解題目中的數學關系2. 生成能解決問題的Python代碼3. 代碼必須包含print輸出最終答案4. 不要直接給出數學計算結果"""),("human", "題目:{question}"),]
)# 4. 創建PAL工作流
def solve_math_problem(question: str):# 生成Python代碼code_generation = zhipu_chat.invoke(pal_prompt.format_messages(question=question))# 提取生成的代碼(實際應用中需要更嚴謹的代碼提取邏輯)code_match = re.search(r"```python(.*?)```", code_generation.content, re.DOTALL)if not code_match:raise ValueError("無法從模型輸出中提取Python代碼")generated_code = code_match.group(1).strip()# 執行代碼try:result = python_repl.run(generated_code)except Exception as e:return {"error": f"代碼執行失敗: {str(e)}","generated_code": generated_code}return {"generated_code": generated_code,"execution_result": result}# 5. 測試案例
math_question = "小明有5個蘋果,7個香蕉。吃了2個香蕉,又買了3個蘋果,請問現在有幾個水果?"print("正在處理中,請等待...")
solution = solve_math_problem(math_question)print("=== 生成的Python代碼 ===")
print(solution["generated_code"])
print("\n=== 執行結果 ===")
if "error" in solution:print(f"錯誤: {solution['error']}")
else:print(solution["execution_result"])
總結與思考
? ? ? ? 自動推理并使用工具(ART),是讓 LLM 自主規劃任務并判斷是否要調用工具,工具是已存在的(當工具是函數時,也就是代碼),這與程序輔助語言模型(PAL)有明顯的不同,具體的不同可以對比分析來看:
維度 | 自動推理并使用工具(ART) | 程序輔助語言模型(PAL) |
核心思想 | 利用大語言模型(LLM)自動生成推理步驟,并結合外部工具(如API、數據庫)執行復雜任務。 | 讓LLM生成可執行的程序代碼作為中間推理步驟,調用解釋器完成計算或邏輯推理。 |
是否依賴程序生成 | 否,但可調用現成程序/工具。 | 是,LLM直接生成可運行的程序代碼(如Python腳本)。 |
是否調用外部工具 | 是,主動選擇和調用外部工具(如搜索、計算器、數據庫查詢)。 | 否,僅生成程序,不涉及真實外部系統交互。 |
推理方式 | 基于自然語言的多步推理 + 工具調用鏈。 | 基于編程語言的符號推理,借助代碼實現邏輯運算。 |
輸出形式 | 自然語言推理路徑 + 工具調用結果。 | 程序代碼 + 解釋器執行結果。 |
是否需要訓練 | 不需微調模型,僅通過提示工程實現。 | 不需微調模型,僅通過提示工程實現。 |
是否支持動態交互 | 是,可根據中間結果調整后續推理路徑。 | 是,根據問題結構動態生成不同代碼段。 |
是否適合非結構化任務 | 是,適用于自然語言理解+工具調用結合的任務。 | 否,更適合結構化數學/邏輯任務。 |
資源消耗 | 高(需調用多個外部工具,可能有網絡延遲)。 | 中等(僅需執行輕量級代碼片段)。 |
可解釋性 | 高,推理路徑清晰,工具調用過程透明。 | 高,程序代碼明確,執行流程可見。 |
典型指令示例 | “請一步步思考如何解決這個問題,必要時調用計算器或搜索最新數據。” | “請用Python代碼解決以下數學題:...” |
一句話總結來說:? ? ? ??
????????ART 更強調“推理+工具調用”的聯動,適用于現實世界中需要訪問外部數據與服務的復雜任務;而 PAL 更專注于“用程序代碼輔助推理”,在結構化邏輯和數學問題上表現出色。
?好了,到此。
提示技術系列,接下來分享:ReAct 框架等等
為了方便大家學習,這里給出專欄鏈接:https://blog.csdn.net/quf2zy/category_12995183.html
歡迎大家一起來學習與交流……