🚀 快速安装

复制以下命令并运行,立即安装此 Skill:

npx @anthropic-ai/skills install wshobson/agents/prompt-engineering-patterns

💡 提示:需要 Node.js 和 NPM

提示工程模式

掌握高级提示工程技术,以最大化 LLM 的性能、可靠性和可控性。

何时使用此技能

  • 为生产级 LLM 应用设计复杂提示
  • 优化提示性能和一致性
  • 实施结构化推理模式(思维链、思维树)
  • 构建具有动态示例选择的小样本学习系统
  • 创建支持变量插值的可重用提示模板
  • 调试和优化产生不一致输出的提示
  • 为专门的 AI 助手实施系统提示
  • 使用结构化输出(JSON 模式)实现可靠解析

核心能力

1. 小样本学习

  • 示例选择策略(语义相似性、多样性采样)
  • 在示例数量与上下文窗口限制之间取得平衡
  • 构建包含输入-输出对的有效演示
  • 从知识库动态检索示例
  • 通过策略性示例选择处理边缘情况

2. 思维链提示

  • 引导逐步推理
  • 使用“让我们一步步思考”进行零样本思维链
  • 带有推理轨迹的小样本思维链
  • 自洽性技术(对多个推理路径进行采样)
  • 验证和确认步骤

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 = "\n".join(
        f"用户:{ex['input']}\n助手:{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}\n\n答案:{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}]
)

最佳实践

  1. 具体明确:模糊的提示会产生不一致的结果
  2. 展示而非告知:示例比描述更有效
  3. 使用结构化输出:使用 Pydantic 强制模式以提高可靠性
  4. 广泛测试:在各种代表性的输入上进行评估
  5. 快速迭代:小的改动可能产生大的影响
  6. 监控性能:在生产环境中跟踪指标
  7. 版本控制:将提示视为代码,并进行适当的版本管理
  8. 记录意图:解释提示如此构建的原因

常见陷阱

  • 过度工程:在尝试简单提示之前就使用复杂提示
  • 示例污染:使用与目标任务不匹配的示例
  • 上下文溢出:因示例过多而超过令牌限制
  • 指令模糊:留有多种解释的余地
  • 忽略边缘情况:未对异常或边界输入进行测试
  • 无错误处理:假设输出总是格式良好的
  • 硬编码值:未对提示进行参数化以实现重用

成功指标

跟踪提示的以下关键绩效指标:

  • 准确性:输出的正确性
  • 一致性:对相似输入的可复现性
  • 延迟:响应时间(P50、P95、P99)
  • 令牌使用量:每次请求的平均令牌数
  • 成功率:有效、可解析输出的百分比
  • 用户满意度:评分和反馈

📄 原始文档

完整文档(英文):

https://skills.sh/wshobson/agents/prompt-engineering-patterns

💡 提示:点击上方链接查看 skills.sh 原始英文文档,方便对照翻译。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。