提示工程模式Skill prompt-engineering-patterns

提示工程模式是一种高级技能,专注于通过优化提示设计来提升大型语言模型(LLM)在生产环境中的性能、可靠性和可控性。它涉及使用少样本学习、思维链推理、结构化输出等技术,用于AI应用开发、LLM微调、RAG系统集成等场景,关键词包括提示工程、LLM优化、AI应用、性能提升、生产部署。

AI应用 0 次安装 0 次浏览 更新于 3/22/2026

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}]
)

最佳实践

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

常见陷阱

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

成功指标

为您的提示跟踪这些KPI:

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

资源