Claude 官方的 Prompt Engineer 建议
随着大语言模型(LLM)参数的增加和指令遵从性的提升,以及最近的 Agent 开发对 ReAct 这类 node 的日益依赖,Prompt 的优化变得比以往任何时候都更加重要。
机缘巧合下,Claude官方文档中关于Prompt的一系列建议与最佳实践引起了关注,这些内容不仅适用于改进现有Prompt,也为引导AI生成Prompt的优化提供了重要指导。
核心原则概览
从 Anthropic 文档中总结的几个核心原则,包括但不限于:
- Prompting vs. Fine-tuning
使用 prompt(和 prompt engineering)比起对模型进行 fine-tuning,通常在资源、时间、透明度、灵活性和适应新领域等方面具有显著优势。
- “Be clear, direct, and detailed”
如同对待一位新同事,Claude 需要清晰的背景、角色说明、任务目标、风格指引等;越明确的指令,模型越容易按预期执行任务。
- Use examples / multishot prompting
提供多个示例(few-shot / multishot)可以大幅提升输出的一致性、结构性和质量,尤其适用于任务复杂或格式要求严格的场景。
- Use XML tags to structure prompt
通过使用标签(例如<instructions>、<example>、<formatting>、<document>等)将 prompt 的不同部分(如背景说明、规则、输出格式、示例等)区分开来。这种结构化方式有助于 Claude 更清晰地理解和区分这些部分。
- Chain complex prompts
对于复杂任务,应将其拆解为多个子任务或步骤,并通过 prompt chain(将多个 prompt 连接起来)进行处理。这样做可以使 Claude 在每一步中更集中注意力,同时也便于调试和追踪问题。
- Long-context prompting tips
当输入或上下文非常长(包含大量文档或token)时,采用特定技巧可以显著提升模型性能,例如将长文本置于 prompt 顶部、使用标签组织文档和元数据,以及请求模型引用相关片段等。
各项技巧与具体示例
下面将每个技巧展开,并配上官方示例(或接近官方示例)以帮助理解。
一、Be Clear, Direct, and Detailed
要点:
- 提供上下文(context):明确任务目标、适用对象及应用场景;
- 明确期望的输出形式:包括格式、结构、风格、字数、语调等;
- 将指令分步骤或分点列出,以减少模型忽略或误解的可能性。
官方示例:
❌ 模糊 Prompt:请删除以下客户反馈中的个人身份信息:{{客户反馈数据}}✅ 清晰 Prompt:任务:对客户反馈进行匿名化处理。规则:1. 姓名替换为 CUSTOMER_[ID]。2. 邮箱替换为 EMAIL_[ID]@example.com。3. 电话替换为 PHONE_[ID]。4. 产品名保留。5. 没有发现个人信息则保持原文。6. 输出用“---”分隔。输入:"你好,我是小王(wang@example.com)。我很喜欢你们的产品,但我的手机(555-123-4567)坏了。"输出:"你好,我是 CUSTOMER_1(EMAIL_1@example.com)。我很喜欢你们的产品,但我的手机(PHONE_1)坏了。"
二、Multishot Prompting / Use Examples
要点:
- 提供 3-5 个相关、多样且覆盖边缘情况的示例;
- 每个示例格式要清晰,用标签或格式标记出来(例如
<example>...</example>),帮助模型学习结构; - 确保示例与实际任务尽量相近,包括问题类别、输出格式等。
官方示例:
❌ 模糊 Prompt:分析此客户反馈并对问题进行归类。请使用以下类别:UI/UX(用户界面/体验)、性能、功能请求、集成、定价,以及其他。同时评估其情绪(积极/中性/消极)和优先级(高/中/低)。反馈内容如下:{{FEEDBACK}}✅ 清晰 Prompt:角色:请分析客户反馈。类别:界面体验 (UI/UX)、性能问题、功能请求、系统集成、价格相关、其他对每条反馈输出:类别、情感(正面/负面/中性)、优先级(高/中/低)。<example>输入:"我上传照片时应用一直崩溃。"输出:类别:性能问题情感:负面优先级:高</example><example>输入:"我希望应用能支持深色模式。"输出:类别:功能请求情感:中性优先级:中</example>现在分析:输入:"界面很好看,但订阅价格太贵了。"
三、Use XML Tags
要点:
- 用标签把 prompt 的组成部分分开:指令 (instructions),示例 (example/examples),格式 (formatting / formatting_example)、背景、数据等;
- 标签应语义清晰、风格统一且可嵌套。这样便于修改特定块,也能让模型更好地理解 prompt 的结构。(Anthropic)
官方示例:
❌ 模糊 Prompt:你是AcmeCorp的一名财务分析师。请为我们的投资者生成一份Q2财务报告。报告需包含收入增长、利润率和现金流等部分,参照去年的示例:{{Q1_REPORT}}。请使用此电子表格中的数据点:{{SPREADSHEET_DATA}}。报告应极其简洁、切中要害、专业,并以列表格式呈现。报告应同时突出优势和改进领域。(注:{{Q1_REPORT}} 和 {{SPREADSHEET_DATA}} 为模板变量,在实际使用时会替换为具体内容)✅ 清晰 Prompt:分析下面的合同。重点关注:风险分配、责任限制、知识产权。在输出中,请将发现写在 <findings>,建议写在 <recommendations>。</instructions><agreement>本协议由甲方(Alpha 公司)与乙方(Beta 公司)签订……</agreement><standard_contract>标准合同条款示例:……</standard_contract>预期输出:<findings>- 缺少责任上限条款- 未明确知识产权归属</findings><recommendations
四、Chain Complex Prompts(任务拆链)
要点:
- 对于复杂的任务,避免将所有子任务堆叠在一个 prompt 中。应将其拆分为多个子任务或步骤,例如先生成摘要,然后检查摘要,再改进,最后格式化或撰写最终稿。这样每一步任务清晰、输出易于控制。(Anthropic)
- 结构化交接:利用 XML 标签或类似方式在步骤间传输内容,确保每个子任务聚焦一个明确的目标。(Anthropic)
- 可采用“自我纠错链”(self-correction chains):让 Claude 在某一步输出后自行检查或评估,提出反馈并进行改进。(Anthropic)
官方示例:
请总结以下研究论文。重点包括:研究方法、研究结果、临床意义。 {{STRATEGY}} 请审阅以下摘要,从准确性、清晰度、完整性三个方面打分(1-5 分),并给出反馈。 {{ANALYSIS}} 请根据反馈改进摘要。Include an executive summary, detailed analysis, and recommendations.
五、Long-Context Prompting Tips
当 prompt 输入中包含非常长的内容(多个文档、大量文本)时,以下技巧尤为重要。以下是官方建议并配示例。
要点:
- 长文本/长输入放在 prompt 的顶部:将其置于指令、示例或查询之前,实验结果表明这样能提升输出质量。(Anthropic)
- Query(你要模型做的事)放在末尾:在处理多文档或复杂输入时,将任务目标或问题放在 prompt 的末尾,可以显著改善输出质量(测试中提高了约 30%)。(Anthropic)
- 用 XML 标签组织多个文档及其元数据:每个文档用
<document>标签包裹,并附带source、document_content等子标签。(Anthropic) - 请 Claude 引用相关文档片段:在回答任务前,要求 Claude 抽取并引用输入中与任务相关的内容,以便“从长上下文中去噪声”。(Anthropic)
示例:
- 多文档结构示例(文档 + 源 + 内容):
<documents>
<document index="1">
<source>annual_report_2023.pdf</source>
<document_content>
{{ANNUAL_REPORT}}
</document_content>
</document>
<document index="2">
<source>competitor_analysis_q2.xlsx</source>
<document_content>
{{COMPETITOR_ANALYSIS}}
</document_content>
</document>
</documents>
分析这些报告,识别战略优势并推荐 Q3 的重点领域。
- 引用提取示例(诊断任务):
您是 AI 医生助手。任务:帮助医生诊断患者疾病。
<documents>
<document index="1">
<source>patient_symptoms.txt</source>
<document_content>
{{PATIENT_SYMPTOMS}}
</document_content>
</document>
<document index="2">
<source>patient_records.txt</source>
<document_content>
{{PATIENT_RECORDS}}
</document_content>
</document>
<document index="3">
<source>patient01_appt_history.txt</source>
<document_content>
{{PATIENT01_APPOINTMENT_HISTORY}}
</document_content>
</document>
</documents>
要求:
- 在<quotes>标签内放出与诊断最相关的文档片段
- 然后基于这些引用片段列出诊断信息,在<info>标签中输出。
使用顺序建议 &调试方法
除了具体技巧,Anthropic 的文档中还建议了一个大致的调优流程/顺序,以及相应的调试方法:
- 如果尚未有初步 prompt(first draft),应先构建一个简单版本,再逐步改进。
- 优先尝试简单的改进,例如清晰的指令、明确的格式和使用示例,然后再应用更复杂的技巧(如长上下文、prompt 链等)。这意味着应首先采用在大多数情况下收益最高的技巧。
- 在拆链 prompt 的过程中,如果某一步出现错误或表现不佳,可以隔离该步骤,只调试这一部分,而非重写整个流程。
常见问题与规避策略
结合官方提示,这里整理了一些可能的误区与规避策略:
| 问题 | 原因 | 对应官方建议 |
|---|---|---|
| 指令不够明确,模型自由发挥过多 | prompt 中未明确结构、格式、要求 | 使用“Be clear, direct”风格,分点说明,引入示例;使用 XML tags 来标明结构 |
| 输出格式或顺序错乱、内容遗漏 | 缺少示例、任务未拆分、或过长的 prompt 混合了多个任务 | 引入 multishot 示例;采用拆链(chain prompts)使每一步明确;利用 long context 工具组织内容 |
| 模型忽视某些内容或被上下文噪声干扰 | 长文本中重要内容被掩盖、或查询(query)排在顶部导致模型焦点不对 | 将长文本置顶,把查询(query)放在末尾;请求模型引用相关段落;使用 XML 标签结构组织文档与元数据 |
| 当任务特别复杂但 prompt 写在一个块里 | 认知负荷过大,模型容易遗漏步骤或混淆 | 采用 prompt chaining,将任务分解为子任务处理;遵循先结构 → 草稿 → 校对 → 最终稿的流程 |
总结
- Claude 的 prompt 工程建议总体可归纳为三层:清晰指令 → 示例指导 → 结构与上下文管理。清晰、具体是基础;示例可快速传达所需格式与风格;复杂任务和长上下文时,则需运用结构标签、拆链与引用来保证质量。
- 在实践中,并非所有技巧都必须同时使用。Prompt 的复杂度应权衡其编辑与维护成本(包括时间及 token 成本)与实际收益。
- 推荐做法:首先撰写一个清晰明确的版本并附带一个或两个示例;如果输入文本较长,可采用长上下文技巧;若任务复杂,则进行 prompt 拆链;最后,利用 XML 标签来组织 prompt 的各个部分。
