高级Prompt技术
1. Self-Consistency(自一致性)
1.1 核心思想
Self-Consistency通过多次采样不同推理路径,然后对最终答案进行多数投票(majority vote),以提高推理准确性。
1.2 工作流程
问题 → [CoT推理路径1 → 答案A]
→ [CoT推理路径2 → 答案B]
→ [CoT推理路径3 → 答案A]
→ [CoT推理路径4 → 答案A]
→ [CoT推理路径5 → 答案C]
多数投票 → 答案A(3/5)✓
1.3 实现方式
import openai
from collections import Counter
def self_consistency(prompt, n_samples=5, temperature=0.7):
"""使用Self-Consistency进行多次采样投票"""
answers = []
for _ in range(n_samples):
response = openai.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
temperature=temperature
)
# 从推理过程中提取最终答案
answer = extract_final_answer(response.choices[0].message.content)
answers.append(answer)
# 多数投票
counter = Counter(answers)
return counter.most_common(1)[0][0]
1.4 适用场景与局限
适用: 数学题、逻辑推理、选择题等有明确答案的任务
局限:
- 成本较高(多次API调用)
- 对开放式生成任务效果有限
- 需要可靠的答案提取机制
2. Tree of Thoughts (ToT)
2.1 核心思想
Tree of Thoughts将推理过程组织为树状结构,在每个节点生成多个"思考"分支,并通过评估选择最优路径。
2.2 与CoT的区别
| 方面 | CoT | ToT |
|---|---|---|
| 推理结构 | 线性链 | 树状分支 |
| 探索方式 | 单一路径 | 多路径并行 |
| 回溯 | 无 | 支持 |
| 评估 | 仅最终结果 | 中间步骤可评估 |
2.3 实现框架
class TreeOfThoughts:
def __init__(self, model, evaluator):
self.model = model
self.evaluator = evaluator
def solve(self, problem, max_depth=3, branch_factor=3):
"""BFS方式的ToT求解"""
root = ThoughtNode(problem, depth=0)
current_level = [root]
for depth in range(max_depth):
next_level = []
for node in current_level:
# 生成多个思考分支
thoughts = self.generate_thoughts(node, branch_factor)
for thought in thoughts:
# 评估每个思考的前景
score = self.evaluator.evaluate(thought)
child = ThoughtNode(thought, depth=depth+1, score=score)
node.add_child(child)
next_level.append(child)
# 选择最有前景的节点继续扩展
next_level.sort(key=lambda x: x.score, reverse=True)
current_level = next_level[:branch_factor]
# 返回最优叶节点
return max(current_level, key=lambda x: x.score)
2.4 Prompt示例
问题:{problem}
请生成3个不同的解题思路(只写第一步):
思路1:
思路2:
思路3:
对每个思路评估其可行性(1-10分):
2.5 适用场景
- 创意写作(探索不同叙事方向)
- 数学证明(尝试不同证明策略)
- 规划问题(探索不同行动方案)
- 代码设计(比较不同架构方案)
3. RAG增强Prompt
3.1 基本模式
将检索到的上下文注入Prompt中,增强LLM的知识:
基于以下参考资料回答问题。如果资料中没有相关信息,请如实说明。
参考资料:
---
{retrieved_context_1}
---
{retrieved_context_2}
---
{retrieved_context_3}
问题:{user_question}
请引用参考资料中的具体内容来支持你的回答。
3.2 高级RAG Prompt模式
多步推理RAG:
基于以下资料,请:
1. 首先总结每条资料的要点
2. 分析各资料之间的关联
3. 综合回答用户问题
4. 指出可能需要补充的信息
资料:{contexts}
问题:{question}
带置信度的RAG:
基于提供的资料回答问题。对每个论点标注置信度:
- [高]: 资料中有直接支持
- [中]: 资料中可以推断
- [低]: 资料支持有限,部分基于一般知识
资料:{contexts}
问题:{question}
3.3 与记忆系统的结合
RAG可以作为AI Agent的外部记忆系统,详见 RAG增强记忆。
4. DSPy:程序化Prompt优化
4.1 DSPy概述
DSPy(Declarative Self-improving Python)是一个将Prompt工程转化为编程问题的框架,通过声明式方式定义LLM程序,自动优化Prompt。
4.2 核心概念
- Signature: 定义输入输出的类型签名
- Module: 可组合的LLM操作模块
- Teleprompter/Optimizer: 自动优化Prompt的算法
- Metric: 评估Prompt质量的指标
4.3 基本用法
import dspy
# 配置LLM
lm = dspy.OpenAI(model="gpt-4", max_tokens=300)
dspy.settings.configure(lm=lm)
# 定义Signature
class SentimentClassification(dspy.Signature):
"""Classify sentiment of a text."""
text = dspy.InputField(desc="Text to classify")
sentiment = dspy.OutputField(desc="positive, negative, or neutral")
# 使用Module
classify = dspy.Predict(SentimentClassification)
result = classify(text="This product exceeded my expectations!")
print(result.sentiment) # "positive"
4.4 自动优化
from dspy.teleprompt import BootstrapFewShot
# 准备训练数据
trainset = [
dspy.Example(text="Great product!", sentiment="positive"),
dspy.Example(text="Terrible experience.", sentiment="negative"),
# ...更多样本
]
# 定义评估指标
def accuracy_metric(example, pred, trace=None):
return example.sentiment == pred.sentiment
# 自动优化
teleprompter = BootstrapFewShot(metric=accuracy_metric, max_bootstrapped_demos=4)
optimized_classify = teleprompter.compile(classify, trainset=trainset)
4.5 DSPy的优势
- 可编程: Prompt逻辑用代码表达,可测试、可版本化
- 自动优化: 无需手动调试Prompt
- 可组合: 模块化设计,支持复杂Pipeline
- 与LLM解耦: 更换模型时自动适配Prompt
5. 自动Prompt优化
5.1 APE (Automatic Prompt Engineer)
自动搜索最优Prompt的方法:
1. 给定任务描述和评估数据集
2. 使用LLM生成候选Prompt
3. 在评估集上测试每个Prompt
4. 选择表现最好的Prompt
5. 迭代改进
5.2 OPRO (Optimization by PROmpting)
利用LLM本身作为优化器:
以下是一些Prompt及其表现分数:
Prompt: "Classify the sentiment" → Score: 0.72
Prompt: "Determine if positive or negative" → Score: 0.78
Prompt: "Analyze the emotional tone" → Score: 0.75
请根据以上信息,生成一个可能表现更好的新Prompt。
5.3 实践中的Prompt优化流程
1. 定义评估指标和测试集
2. 编写初始Prompt
3. 在测试集上评估
4. 分析失败案例
5. 修改Prompt(手动 + 自动)
6. 重复3-5直到满足要求
7. A/B测试上线
6. Meta-Prompting(元Prompt)
6.1 概念
使用LLM来生成、评估和改进Prompt。本质上是"写Prompt的Prompt"。
6.2 Prompt生成器
你是一个Prompt工程专家。用户会描述一个任务,你需要:
1. 分析任务的关键要素
2. 生成3个不同风格的Prompt
3. 评估每个Prompt的优劣
4. 推荐最优Prompt
任务描述:{task_description}
请生成适合GPT-4使用的Prompt。
6.3 Prompt评估器
请评估以下Prompt的质量:
Prompt: {prompt_to_evaluate}
目标任务: {task_description}
评估维度:
1. 清晰度(1-10):指令是否明确无歧义
2. 完整性(1-10):是否覆盖所有必要信息
3. 格式化(1-10):输出格式是否清晰
4. 鲁棒性(1-10):对异常输入的处理能力
5. 效率(1-10):token使用效率
综合评分和改进建议:
6.4 Prompt迭代器
当前Prompt: {current_prompt}
评估结果: {evaluation_results}
失败案例: {failure_cases}
请基于以上信息改进Prompt,具体改进:
1. 修复导致失败案例的问题
2. 保留原Prompt的优点
3. 提高整体鲁棒性
改进后的Prompt:
7. 高级技巧汇总
7.1 Prompt链(Prompt Chaining)
将复杂任务分解为多个Prompt的链式调用:
Step 1: 分析 → 提取关键信息
Step 2: 规划 → 制定行动计划
Step 3: 执行 → 生成最终输出
Step 4: 审查 → 检查并修正
7.2 角色扮演增强
让3位专家分别分析这个问题:
- 专家A(数据科学家):从数据角度分析
- 专家B(产品经理):从用户需求角度分析
- 专家C(安全工程师):从安全角度分析
然后综合3位专家的意见给出最终建议。
7.3 约束递减法
当LLM输出不符合要求时,逐步增加约束:
# 第一次
总结这篇文章。
# 第二次(增加约束)
用3个要点总结这篇文章,每个要点不超过20字。
# 第三次(进一步约束)
用3个要点总结这篇文章,每个要点不超过20字。
格式:
- 要点1: [内容]
- 要点2: [内容]
- 要点3: [内容]
只输出要点,不要添加任何其他内容。
8. 总结
| 技术 | 核心思想 | 适用场景 | 复杂度 |
|---|---|---|---|
| Self-Consistency | 多次采样+投票 | 数学/逻辑推理 | 中 |
| Tree of Thoughts | 树状探索+评估 | 规划/创意/复杂推理 | 高 |
| RAG增强Prompt | 检索+注入上下文 | 知识密集型任务 | 中 |
| DSPy | 程序化Prompt定义 | 需要自动优化的Pipeline | 中高 |
| APE/OPRO | 自动搜索最优Prompt | 大规模Prompt优化 | 高 |
| Meta-Prompting | LLM生成/评估Prompt | Prompt开发过程 | 低中 |
参考资料
- Wang et al., "Self-Consistency Improves Chain of Thought Reasoning in Language Models", 2023
- Yao et al., "Tree of Thoughts: Deliberate Problem Solving with Large Language Models", 2023
- Khattab et al., "DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines", 2023
- 思维链与推理模式 — Agent中的推理技术
- Prompt设计基础 — 基础Prompt技术