Prompt工程
Prompt Engineering(提示工程)的常见技术和方法可以分为基础技巧、进阶框架、结构化方法和优化策略四个层面。以下是当前主流的实践分类:
一、基础提示技巧
1. Zero-shot(零样本提示)
核心:直接描述任务,零示例
直接描述任务,不提供示例。适用于模型已经理解的基础任务。
response = llm.invoke([HumanMessage(content="人工智能正在改变生活方式,翻译这句话")])2. Few-shot(少样本提示)
核心:直接描述任务,零示例
提供2-5个输入-输出示例,让模型通过上下文学习模式。
# 定义示例库examples = [ {"input": "开心", "output": "Joyful, elated, cheerful"}, {"input": "难过", "output": "Melancholic, sorrowful, dejected"}, {"input": "生气", "output": "Irritated, furious, indignant"}]
example_prompt = ChatPromptTemplate.from_messages([ ("human", "{input}"), ("ai", "{output}")])
few_shot_prompt = FewShotChatMessagePromptTemplate( example_prompt=example_prompt, examples=examples, input_variables=["input"])
final_prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个提供英文同义词的专家,给出3个不同程度的近义词。"), few_shot_prompt, ("human", "{input}"), # 实际查询])
few_shot_chain = final_prompt | llmprint(few_shot_chain.invoke({"input": "害怕"}).content)无样本提示输出结果
**害怕** 的英文同义词(按程度递增):1. **Worry**(轻度:担忧,对可能的负面结果感到不安)2. **Fear**(中度:恐惧,对具体威胁的直接反应)3. **Panic**(重度:恐慌,极度的恐惧伴随生理反应)
**中文近义词参考**(供理解):- 轻度:担心、忧虑- 中度:畏惧、惊惶- 重度:惊恐、恐慌
可根据具体语境选择更贴切的词汇。Afraid, fearful, terrified3. Chain-of-Thought(思维链 / CoT)
在示例中展示推理步骤,引导模型”逐步思考”。
cot_examples = [ { "question": "15个苹果均分给3个朋友,每人几个?", "reasoning": "总数15除以人数3,15÷3=5,所以每人5个。", "answer": "5个" }, { "question": "一个长方形长8cm,宽是长的一半,面积是多少?", "reasoning": "先求宽:8÷2=4cm。再算面积:长×宽=8×4=32平方厘米。", "answer": "32平方厘米" }]
cot_example_prompt = ChatPromptTemplate.from_messages([ ("human", "问题:{question}"), ("ai", "思考过程:{reasoning} 最终答案:{answer}")])
cot_few_shot = FewShotChatMessagePromptTemplate( example_prompt=cot_example_prompt, examples=cot_examples)
cot_prompt = ChatPromptTemplate.from_messages([ ("system", "解决数学问题时,请模仿示例,先展示详细推理,再给出答案。"), cot_few_shot, ("human", "问题:{question}"),])
cot_chain = cot_prompt | llmresult = cot_chain.invoke({"question": "汽车时速60km,行驶2.5小时,路程多少?"})二、进阶推理框架
1. Zero-shot-CoT / Auto-CoT
不借助示例,仅通过在问题后添加”让我们一步步思考”等触发词激活推理能力。
理论上对大模型来说,只需要提示其“一步一步输出”,但是8b规模小,需要明确指定才可
zero_shot_cot_prompt = ChatPromptTemplate.from_template("""问题:{question}请按以下格式回答:<thinking>步骤1:分析题目要求和已知条件步骤2:详细计算过程步骤3:验证结果</thinking><answer>最终答案</answer>
开始解答:""")
zero_shot_cot_chain = zero_shot_cot_prompt | llm非 Zero-shot-CoT 与 Zero-shot-CoT 结果对比
按照数学运算的优先级规则,乘法应先于加法和减法进行计算。因此,原式 $12 + 34 \times 2 - 10$ 的计算步骤如下:1. **先计算乘法部分**: $34 \times 2 = 68$2. **将结果代入原式**: $12 + 68 - 10$3. **从左到右依次进行加减法**: - $12 + 68 = 80$ - $80 - 10 = 70$**最终答案**:$$\boxed{70}$$<thinking>步骤1:分析题目要求和已知条件题目要求计算表达式 $12 + 34 \times 2 - 10$ 的值,需遵循数学运算顺序(先乘除后加减)。
步骤2:详细计算过程1. **先计算乘法部分**:$34 \times 2 = 68$。2. **将乘法结果代入原式**:$12 + 68 - 10$。3. **计算加法**:$12 + 68 = 80$。4. **计算减法**:$80 - 10 = 70$。
步骤3:验证结果- 重新检查每一步计算: - $34 \times 2 = 68$(正确)。 - $12 + 68 = 80$(正确)。 - $80 - 10 = 70$(正确)。- 通过分步验证,结果无误。</thinking><answer>70</answer>2. Tree of Thoughts(思维树 / ToT)
将推理过程展开为树状结构,探索多条路径并评估,适用于复杂决策。
生成多个思考步骤,评估每个步骤的得分,回溯或继续深入最有希望的路径
核心:维护多个思维路径,评估后选择最优
3. ReAct(Reasoning + Acting)
交替进行思考(Thought)和行动(Action),并观察环境反馈(Observation),适合工具使用场景。
4. Self-Consistency(自一致性)
对同一问题采样多个CoT推理路径,选择出现频率最高的答案,提高准确性。
三、结构化与角色设定
Role Prompting(角色扮演)
赋予模型特定身份,激活相关领域知识和表达风格。
System/User/Assistant分层
区分系统指令(全局规则)和用户输入(具体请求),这是ChatGPT/Claude等对话模型的标准用法。
Structured Output(结构化输出)
强制指定输出格式(JSON、Markdown表格、YAML等),便于程序解析。
四、优化与工程化方法
1. Prompt Chaining(提示链)
将复杂任务拆分为多个子任务,前一阶段的输出作为后一阶段的输入,降低单次推理复杂度。
2. Reflexion(自我反思)
让模型评估自己的输出,发现错误并修正。
请检查你刚才的回答,是否有逻辑错误或遗漏?
3. Directional Stimulus Prompting(定向刺激)
在提示中加入关键词或提示性线索,引导模型关注特定方面。
4. APE(Automatic Prompt Engineering)
使用算法自动生成和筛选最优提示词,减少人工试错。
5. RAG增强提示(Retrieval-Augmented Generation)
在提示中插入从知识库检索的相关上下文,解决知识时效性和幻觉问题