name: prompt-engineering-patterns description: 掌握高级提示工程技术,以最大化LLM在生产中的性能、可靠性和可控性。在优化提示、改进LLM输出或设计生产提示模板时使用。
提示工程模式
掌握高级提示工程技术,以最大化LLM的性能、可靠性和可控性。
何时使用此技能
- 为生产LLM应用程序设计复杂提示
- 优化提示性能和一致性
- 实施结构化推理模式(思维链、思维树)
- 构建具有动态示例选择的少样本学习系统
- 创建带有变量插值的可重用提示模板
- 调试和优化产生不一致输出的提示
- 为专业AI助手实施系统提示
- 使用结构化输出(JSON模式)进行可靠解析
核心能力
1. 少样本学习
- 示例选择策略(语义相似性、多样性采样)
- 平衡示例数量与上下文窗口限制
- 构建有效的输入-输出对演示
- 从知识库动态检索示例
- 通过战略示例选择处理边缘情况
2. 思维链提示
- 逐步推理引导
- 零样本CoT与“让我们一步步思考”
- 带推理轨迹的少样本CoT
- 自一致性技术(采样多个推理路径)
- 验证和校验步骤
3. 结构化输出
- 用于可靠解析的JSON模式
- Pydantic模式强制执行
- 类型安全响应处理
- 处理格式错误的输出的错误处理
4. 提示优化
- 迭代优化工作流程
- A/B测试提示变体
- 测量提示性能指标(准确性、一致性、延迟)
- 在保持质量的同时减少令牌使用
- 处理边缘情况和故障模式
5. 模板系统
- 变量插值和格式化
- 条件提示部分
- 多轮对话模板
- 基于角色的提示组合
- 模块化提示组件
6. 系统提示设计
- 设置模型行为和约束
- 定义输出格式和结构
- 建立角色和专业知识
- 安全指南和内容政策
- 上下文设置和背景信息
快速开始
from langchain_anthropic import ChatAnthropic
from langchain_core.prompts import ChatPromptTemplate
from pydantic import BaseModel, Field
# 定义结构化输出模式
class SQLQuery(BaseModel):
query: str = Field(description="SQL查询")
explanation: str = Field(description="查询功能的简要解释")
tables_used: list[str] = Field(description="引用的表列表")
# 初始化带结构化输出的模型
llm = ChatAnthropic(model="claude-sonnet-4-6")
structured_llm = llm.with_structured_output(SQLQuery)
# 创建提示模板
prompt = ChatPromptTemplate.from_messages([
("system", """您是专家SQL开发人员。生成高效、安全的SQL查询。
始终使用参数化查询以防止SQL注入。
简要解释您的推理。"""),
("user", "将此转换为SQL: {query}")
])
# 创建链
chain = prompt | structured_llm
# 使用
result = await chain.ainvoke({
"query": "查找过去30天内注册的所有用户"
})
print(result.query)
print(result.explanation)
关键模式
模式1:使用Pydantic的结构化输出
from anthropic import Anthropic
from pydantic import BaseModel, Field
from typing import Literal
import json
class SentimentAnalysis(BaseModel):
sentiment: Literal["positive", "negative", "neutral"]
confidence: float = Field(ge=0, le=1)
key_phrases: list[str]
reasoning: str
async def analyze_sentiment(text: str) -> SentimentAnalysis:
"""使用结构化输出分析情感。"""
client = Anthropic()
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=500,
messages=[{
"role": "user",
"content": f"""分析此文本的情感。
文本: {text}
用匹配此模式的JSON响应:
{{
"sentiment": "positive" | "negative" | "neutral",
"confidence": 0.0-1.0,
"key_phrases": ["短语1", "短语2"],
"reasoning": "简要解释"
}}"""
}]
)
return SentimentAnalysis(**json.loads(message.content[0].text))
模式2:带自验证的思维链
from langchain_core.prompts import ChatPromptTemplate
cot_prompt = ChatPromptTemplate.from_template("""
一步步解决此问题。
问题: {problem}
指令:
1. 将问题分解为清晰步骤
2. 逐步展示您的推理
3. 陈述最终答案
4. 通过对照原问题检查来验证您的答案
将您的响应格式化为:
## 步骤
[您的逐步推理]
## 答案
[您的最终答案]
## 验证
[检查您的答案是否正确]
""")
模式3:带动态示例选择的少样本
from langchain_voyageai import VoyageAIEmbeddings
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_chroma import Chroma
# 用语义相似性创建示例选择器
example_selector = SemanticSimilarityExampleSelector.from_examples(
examples=[
{"input": "如何重置密码?", "output": "转到设置 > 安全 > 重置密码"},
{"input": "在哪里查看订单历史?", "output": "导航到账户 > 订单"},
{"input": "如何联系支持?", "output": "点击帮助 > 联系我们或发邮件至support@example.com"},
],
embeddings=VoyageAIEmbeddings(model="voyage-3-large"),
vectorstore_cls=Chroma,
k=2 # 选择2个最相似的示例
)
async def get_few_shot_prompt(query: str) -> str:
"""用动态选择的示例构建提示。"""
examples = await example_selector.aselect_examples({"input": query})
examples_text = "
".join(
f"用户: {ex['input']}
助手: {ex['output']}"
for ex in examples
)
return f"""您是一个有帮助的客户支持助手。
以下是一些示例交互:
{examples_text}
现在响应此查询:
用户: {query}
助手:"""
模式4:渐进式披露
从简单提示开始,仅在需要时增加复杂性:
PROMPT_LEVELS = {
# 级别1: 直接指令
"simple": "总结此文章: {text}",
# 级别2: 添加约束
"constrained": """在3个要点中总结此文章,关注:
- 主要发现
- 主要结论
- 实际影响
文章: {text}""",
# 级别3: 添加推理
"reasoning": """仔细阅读此文章。
1. 首先,确定主要主题和论点
2. 然后,提取关键支持点
3. 最后,在3个要点中总结
文章: {text}
总结:""",
# 级别4: 添加示例
"few_shot": """阅读文章并提供简洁总结。
示例:
文章: "新研究表明,定期锻炼可减少焦虑达40%..."
总结:
• 定期锻炼减少焦虑达40%
• 每周3次30分钟中等活动足够
• 益处从开始后2周内出现
现在总结此文章:
文章: {text}
总结:"""
}
模式5:错误恢复和回退
from pydantic import BaseModel, ValidationError
import json
class ResponseWithConfidence(BaseModel):
answer: str
confidence: float
sources: list[str]
alternative_interpretations: list[str] = []
ERROR_RECOVERY_PROMPT = """
基于提供的上下文回答问题。
上下文: {context}
问题: {question}
指令:
1. 如果您能自信地回答 (>0.8),提供直接答案
2. 如果您有一定信心 (0.5-0.8),提供最佳答案并附带注意事项
3. 如果您不确定 (<0.5),解释缺少什么信息
4. 如果问题模糊,总是提供替代解释
用JSON响应:
{{
"answer": "您的答案或'我无法从上下文确定这个'"
"confidence": 0.0-1.0,
"sources": ["相关上下文摘录"],
"alternative_interpretations": ["如果问题模糊"]
}}
"""
async def answer_with_fallback(
context: str,
question: str,
llm
) -> ResponseWithConfidence:
"""带错误恢复和回退的回答。"""
prompt = ERROR_RECOVERY_PROMPT.format(context=context, question=question)
try:
response = await llm.ainvoke(prompt)
return ResponseWithConfidence(**json.loads(response.content))
except (json.JSONDecodeError, ValidationError) as e:
# 回退: 尝试无结构提取答案
simple_prompt = f"基于: {context}
回答: {question}"
simple_response = await llm.ainvoke(simple_prompt)
return ResponseWithConfidence(
answer=simple_response.content,
confidence=0.5,
sources=["回退提取"],
alternative_interpretations=[]
)
模式6:基于角色的系统提示
SYSTEM_PROMPTS = {
"analyst": """您是高级数据分析师,擅长SQL、Python和商业智能。
您的职责:
- 编写高效、文档齐全的查询
- 解释您的分析方法
- 突出关键洞察和建议
- 标记任何数据质量问题
沟通风格:
- 讨论方法时精确和技术性
- 将技术发现转化为业务影响
- 在有帮助时使用清晰的可视化""",
"assistant": """您是一个有帮助的AI助手,注重准确性和清晰度。
核心原则:
- 在做事实声明时总是引用来源
- 承认不确定性而不是猜测
- 请求模糊时询问澄清问题
- 为复杂主题提供逐步解释
约束:
- 不提供医疗、法律或财务建议
- 适当重定向有害请求
- 保护用户隐私""",
"code_reviewer": """您是进行代码审查的高级软件工程师。
审查标准:
- 正确性: 代码是否按预期工作?
- 安全性: 是否有任何漏洞?
- 性能: 是否有效率问题?
- 可维护性: 代码是否可读和结构良好?
- 最佳实践: 是否遵循语言习惯?
输出格式:
1. 总结评估(批准/请求更改)
2. 关键问题(必须修复)
3. 建议(有则更好)
4. 正面反馈(做得好的是什么)"""
}
集成模式
与RAG系统
RAG_PROMPT = """您是基于提供上下文回答问题的知识助手。
上下文(从知识库检索):
{context}
指令:
1. 仅基于提供的上下文回答
2. 如果上下文不包含答案,说“我的知识库中没有关于这个的信息”
3. 使用[1]、[2]符号引用具体段落
4. 如果问题模糊,请求澄清
问题: {question}
回答:"""
带验证和校验
VALIDATED_PROMPT = """完成以下任务:
任务: {task}
生成响应后,验证它满足所有这些标准:
✓ 直接解决原始请求
✓ 不包含事实错误
✓ 适当详细(不太简短,不太冗长)
✓ 使用正确格式化
✓ 安全且适当
如果任何标准验证失败,在响应前修订。
响应:"""
性能优化
令牌效率
# 之前: 冗长提示 (150+ 令牌)
verbose_prompt = """
我想请您取以下文本,并为我提供主要要点的综合总结。总结应捕捉关键思想和重要细节,同时简洁易懂。
"""
# 之后: 简洁提示 (30 令牌)
concise_prompt = """简洁总结关键要点:
{text}
总结:"""
缓存公共前缀
from anthropic import Anthropic
client = Anthropic()
# 对重复系统提示使用提示缓存
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1000,
system=[
{
"type": "text",
"text": LONG_SYSTEM_PROMPT,
"cache_control": {"type": "ephemeral"}
}
],
messages=[{"role": "user", "content": user_query}]
)
最佳实践
- 具体明确:模糊提示产生不一致结果
- 展示而非告知:示例比描述更有效
- 使用结构化输出:用Pydantic强制执行模式以提高可靠性
- 广泛测试:在多样、代表性输入上评估
- 快速迭代:小更改可能有大影响
- 监控性能:在生产中跟踪指标
- 版本控制:将提示视为代码进行适当版本控制
- 记录意图:解释为什么提示如此结构化
常见陷阱
- 过度工程化:在尝试简单之前从复杂提示开始
- 示例污染:使用不匹配目标任务的示例
- 上下文溢出:因过多示例超出令牌限制
- 模糊指令:留下多种解释空间
- 忽略边缘情况:不在不寻常或边界输入上测试
- 无错误处理:假设输出总是格式良好
- 硬编码值:不参数化提示以供重用
成功指标
为您的提示跟踪这些KPI:
- 准确性:输出的正确性
- 一致性:跨相似输入的可重现性
- 延迟:响应时间 (P50, P95, P99)
- 令牌使用:每个请求的平均令牌
- 成功率:有效、可解析输出的百分比
- 用户满意度:评分和反馈