提示工程(Prompt Engineering)是一门通过优化输入文本(即“提示”)来提升大型语言模型(LLM)输出质量与控制性的核心技术。这份综合指南将系统性地介绍与 Claude
系列模型交互的各项最佳实践,覆盖从基础准备到高级应用的全部环节,帮助开发者和研究者最大限度地发挥 Claude
的潜力。
在开始之前:成功的基础
在深入研究具体的提示工程技术前,必须先奠定坚实的基础。这包括:
- 明确的成功标准:清晰地定义用例的成功标准是什么。
- 有效的测试方法:建立一套能够客观、量化地评估模型输出是否符合这些标准的方法。
- 初步的提示草稿:有一个想要改进的初始版本提示。
如果尚未完成这些准备工作,强烈建议先投入时间建立起来。
何时选择提示工程?(对比微调)
并非所有问题都最适合通过提示工程解决。例如,延迟和成本问题有时通过选择不同模型能更轻易地改善。而当需要在控制模型行为时,提示工程和微调(Finetuning)是两种主要手段,以下是提示工程在多种场景下优于微调的原因:
- 资源效率:微调需要大量的计算资源(如高端 GPU)和内存,而提示工程仅需文本输入,对资源更为友好。
- 成本效益:对于使用云端 AI 服务的场景,微调会产生显著的训练成本。提示工程直接利用基础模型,通常成本更低。
- 模型更新兼容性:当模型提供商更新基础模型时,微调过的版本可能需要重新训练。而设计良好的提示通常可以跨版本继续生效。
- 时间效率:微调过程可能需要数小时甚至数天。相比之下,提示工程提供近乎即时的反馈,极大地加速了迭代和解决问题的速度。
- 数据需求极低:微调需要大量特定于任务的、经过标注的数据集,这些数据可能难以获取或成本高昂。提示工程在少样本(few-shot)甚至零样本(zero-shot)的场景下就能有效工作。
- 灵活性与快速迭代:开发者可以迅速尝试多种方法,调整提示并立即观察结果。这种快速实验的敏捷性是微调难以实现的。
- 领域适应性:通过在提示中提供特定领域的上下文,可以轻松地让模型适应新领域,而无需重新训练。
- 理解力提升:在帮助模型更好地理解和利用外部内容(如通过RAG检索的文档)方面,提示工程远比微调更有效。
- 保留通用知识:微调存在“灾难性遗忘”(catastrophic forgetting)的风险,即模型在学习新知识时可能会丢失其原有的通用能力。提示工程则保留了模型的广泛知识基础。
- 透明度与可解释性:提示是人类可读的,能清晰地展示模型收到的确切信息。这种透明度有助于理解和调试模型的行为。
Claude 4
的提示工程核心原则
Claude 4
系列模型(包括 Opus 4.1、Opus 4 和 Sonnet 4)经过优化,能更精确地遵循指令。为获得最佳效果,请遵循以下核心原则。
1. 指令明确且直接
模型对清晰、具体的指令响应最佳。明确说明期望的输出,可以显著提升结果质量。如果希望模型能像旧版 Claude
一样做出“超常发挥”的表现,现在需要更明确地请求这些行为。
示例:创建一个分析仪表盘
- 效果较差的提示:
创建一个分析仪表盘。
- 效果更佳的提示:
创建一个分析仪表盘。请包含尽可能多的相关功能和交互细节,超越基础功能,实现一个功能完备的设计。
2. 补充上下文以提升性能
在指令背后提供背景或动机,例如向 Claude
解释为何某个行为很重要,可以帮助模型更好地理解目标,并提供更有针对性的响应。
示例:格式偏好
- 效果较差的提示:
绝不使用省略号。
- 效果更佳的提示:
你的回答将被文本转语音引擎朗读,所以绝不使用省略号,因为引擎不知道如何发音。
模型足够智能,能够从这类解释中进行归纳。
3. 审慎使用示例和细节
Claude 4
模型会认真对待指令中的每一个细节和示例。请确保你提供的示例与期望鼓励的行为一致,并尽量减少想要避免的行为。
核心提示工程技术大全
以下技术按照从最普适到更专门的顺序组织。在解决性能问题时,建议按此顺序尝试。
- 清晰直接的指令 (如上所述)
- 使用示例 (多样本提示)
- 引导模型思考 (思维链)
- 使用 XML 标签
- 通过系统提示赋予角色
- 预填充模型的回应
- 链式复杂提示
- 长上下文提示技巧
- 使用提示生成器
以下将详细介绍其中最关键的技术。
使用 XML 标签构建结构化提示
当提示包含多个组成部分(如背景信息、指令、示例和输入数据)时,使用 XML 标签是提升 Claude
解析准确性的利器。
- 使用 XML 标签的好处:
- 清晰性:明确分离提示的不同部分,确保结构良好。
- 准确性:减少模型因混淆指令与上下文而导致的错误。
- 灵活性:便于查找、添加、移除或修改提示的特定部分。
- 可解析性:要求模型在输出中也使用XML标签,可以使程序更容易地提取其响应的特定部分。
- 最佳实践:
- 保持一致性:在提示中始终使用相同的标签名,并在指令中引用它们(例如,“使用
<contract>
标签中的合同…”)。 - 嵌套标签:对于层级内容,可以使用嵌套标签,如
<outer><inner></inner></outer>
。
- 保持一致性:在提示中始终使用相同的标签名,并在指令中引用它们(例如,“使用
示例:法律合同分析
未使用 XML 标签的提示:
分析这份软件许可协议的潜在风险和责任:{{CONTRACT}}。关注赔偿、责任限制和知识产权所有权条款。同时,注意任何不寻常或令人担忧的条款。这是我们的标准合同以供参考:{{STANDARD_CONTRACT}}。给出调查结果摘要和给我们法律团队的建议。
结果:分析可能杂乱无章,容易遗漏关键点。
使用 XML 标签的提示:
分析这份软件许可协议的法律风险和责任。
我们是一家跨国企业,正在考虑将此协议用于我们的核心数据基础设施。
<agreement>
{{CONTRACT}}
</agreement>
这是我们的标准合同以供参考:
<standard_contract>
{{STANDARD_CONTRACT}}
</standard_contract>
<instructions>
1. 分析以下条款:
- 赔偿 (Indemnification)
- 责任限制 (Limitation of liability)
- 知识产权所有权 (IP ownership)
2. 指出不寻常或令人担忧的条款。
3. 与我们的标准合同进行比较。
4. 在 <findings> 标签中总结发现。
5. 在 <recommendations> 标签中列出可行的建议。
</instructions>
结果:模型会输出结构清晰的 <findings>
和 <recommendations>
,内容详尽,逻辑严谨,便于法律团队直接采纳。
通过系统提示赋予角色 (Role Prompting)
使用 system
参数为 Claude
设定一个角色,是提升其性能最强大的方法之一。一个恰当的角色能将 Claude
从通用助手转变为虚拟的领域专家。
- 使用系统提示设定角色的好处:
- 增强准确性:在法律分析或财务建模等复杂场景中,角色提示能显著提升
Claude
的表现。 - 定制化语气:无论是需要 CFO 的言简意赅,还是文案策划的生动活泼,角色提示都能调整
Claude
的沟通风格。 - 提升专注度:设定角色后,
Claude
会更好地将自己限制在任务的具体要求范围内。
- 增强准确性:在法律分析或财务建模等复杂场景中,角色提示能显著提升
- 如何实现:
在 Messages API 调用中,将角色描述放入system
参数。将具体的任务指令保留在user
消息中。import anthropic client = anthropic.Anthropic() response = client.messages.create( model="claude-3-opus-20240229", max_tokens=2048, system="你是一家高增长B2B SaaS公司的CFO。我们的投资者希望实现积极增长,但对我们的烧钱率保持警惕。", # <-- 赋予角色 messages=[ {"role": "user", "content": "在董事会议上,请分析我们Q2的财务数据,指出关键趋势,标记关注点,并推荐战略行动:\n\n{{FINANCIALS}}"} ] ) print(response.content)
专家技巧:尝试不同的角色!对于同样的数据,数据科学家
、市场营销策略师
或 专为财富500强公司提供客户洞察分析的数据科学家
可能会得出截然不同的洞见。
引导模型思考 (思维链, Chain of Thought)
当面对研究、分析或解决问题等复杂任务时,给予 Claude
思考的空间可以极大地改善其表现。这种技术被称为思维链(CoT)提示,它鼓励 Claude
分步拆解问题,从而产出更准确、更精细的输出。
- 何时使用思维链?
- 需要思考的任务:用于处理那些人类也需要思考才能完成的任务,如复杂数学计算、多步骤分析、撰写复杂文档或需要权衡多因素的决策。
- 提升准确性:逐步解决问题可以减少在逻辑、数学和分析任务中的错误。
- 调试:观察
Claude
的思考过程有助于你发现提示中可能不清晰的地方。
- 如何引导思考?
从简单到复杂,有多种方式可以引导Claude
思考。一个核心技巧是:始终让 Claude 将其思考过程输出出来,否则思考就不会发生。- 基础提示:在提示中加入“请一步步思考”。
- 引导性提示:为
Claude
的思考过程勾勒出具体步骤。 - 结构化提示:使用
<thinking>
和<answer>
等XML标签将推理过程与最终答案分离开。
示例:财务分析
未使用思维链的分析:
用户
:一个客户想投资1万美元,A选项是年化12%但波动的股票,B选项是年化6%的固定收益债券。客户5年后需要这笔钱付首付。推荐哪个?模型
:推荐B。理由是确定性高、风险规避、时间周期短。结论看似合理但缺乏深度。
使用思维链的分析:
用户
:(同上),但最后加上“请一步步思考”。模型
:<thinking> 1. 理解客户目标和时间线:目标是房屋首付,时间线5年。结论:这是一个短期的、高优先级的财务目标,客户可能无法承受重大风险。 2. 分析选项A(股票): - 优点:历史回报率高(12%)。 - 缺点:波动性大。 - 计算潜在的5年回报: - 最佳情况(年化12%):$10,000 * (1.12)^5 ≈ $17,623.42 - 最差情况(市场崩盘):可能损失惨重,例如50%的崩盘 = $5,000 3. 分析选项B(债券): - 优点:保证回报率(6%)。 - 缺点:回报率低于股票的历史表现。 - 计算5年回报: - 保证:$10,000 * (1.06)^5 ≈ $13,382.25 4. 考虑风险承受能力:目标是房屋首付(必需品,非可有可无),时间短,无法承受市场低迷。结论:客户风险承受能力可能较低。 ... </thinking> <answer> 我推荐选项B,即保证年回报率为6%的债券。虽然股票的历史回报率很诱人,但债券能确保您在5年后拥有$13,382.25用于房屋首付。考虑到您目标的重要性和短暂的时间线,股票的波动性构成了不可接受的风险。 </answer>
这种分析提供了量化数据和更严谨的逻辑,结论更有说服力。
预填充 Claude 的回应 (Prefilling)
预填充是一个独特而强大的技术,允许你在 API 调用的 assistant
消息中提供初始文本,Claude
将从该文本末尾继续生成。这能让你强制执行特定格式(如JSON)、跳过冗长的开场白,或在角色扮演中强化角色一致性。
注意:预填充内容不能以尾随空格结束。此功能目前在扩展思维模式下不受支持。
- 如何预填充:
import anthropic client = anthropic.Anthropic() response = client.messages.create( model="claude-3-opus-20240229", max_tokens=1024, messages=[ {"role": "user", "content": "你最喜欢的颜色是什么?"}, {"role": "assistant", "content": "作为一个AI助手,我没有最喜欢的颜色,但如果我必须选一个,那会是绿色,因为"} # 在此预填充 ] )
示例:控制输出格式并跳过前言
未使用预填充:当要求提取JSON时,模型可能会先说“这是您要的JSON格式的信息:”,然后才给出代码块。
使用预填充:
用户
:从产品描述中提取名称、尺寸、价格和颜色作为JSON对象…助手 (预填充)
:{
Claude 的回应
:"name": "SmartHome Mini", "size": "5 inches wide", "price": "$49.99", "colors": ["black", "white"] }
这会强制
Claude
直接输出JSON内容,干净利落,便于程序解析。
特定场景的指导
- 控制响应格式:
- 正面指令优于负面指令:与其说“不要在你的回应中使用 markdown”,不如说“你的回应应该由流畅的散文段落组成”。
- 使用 XML 格式指示器:尝试:“请将你回应中的散文部分写在
<smoothly_flowing_prose_paragraphs>
标签里。” - 提示风格与期望输出匹配:你提示中使用的格式风格可能会影响
Claude
的回应风格。
- 优化并行工具调用:
Claude 4
模型擅长并行执行工具。虽然它们在没有提示的情况下并行工具调用的成功率很高,但一些轻微的提示可以把成功率提升到接近100%。这个提示被证明最有效:“为达最高效率,每当需要执行多个独立操作时,应同时调用所有相关工具,而非顺序调用。” - 减少在代码生成中创建文件:
Claude 4
模型有时会创建新文件用于测试和迭代。如果你希望尽量减少新文件的创建,可以指示Claude
自行清理:“如果你为迭代创建了任何临时的新文件、脚本或辅助文件,请在任务结束时删除这些文件来清理。” - 增强视觉和前端代码生成:对于前端代码生成,可以通过明确的鼓励来引导
Claude 4
模型创建复杂、详细和交互式的设计:“别拘束,全力以赴。”
自动生成与管理提示
使用提示生成器
有时,使用 AI 模型最难的部分是想出如何有效地提示它。Anthropic
提供了一个提示生成工具,可以引导 Claude
生成针对你特定任务的高质量提示模板。这些模板遵循了许多提示工程的最佳实践,对于解决“空白页问题”特别有用。你可以在 Anthropic Console
中直接尝试提示生成器。
使用提示模板和变量
在部署基于 LLM 的应用时,API 调用通常包含两类内容:
- 固定内容:在多次交互中保持不变的静态指令或上下文。
- 可变内容:每次请求或对话都会变化的动态元素,如用户输入、RAG检索的内容、对话历史等。
提示模板 将这些固定和可变部分结合起来,为动态内容使用占位符。在 Anthropic Console
中,这些占位符用 {{双花括号}}
表示。
使用提示模板的好处:
- 一致性:确保提示在多次交互中结构一致。
- 效率:轻松替换可变内容,无需重写整个提示。
- 可测试性:通过仅更改可变部分,快速测试不同的输入和边缘案例。
- 可扩展性:随着应用复杂性的增长,简化提示管理。
- 版本控制:通过将提示的核心部分与动态输入分开,轻松跟踪提示结构的更改。
从 Sonnet 3.7 迁移到 Claude 4 的注意事项
- 具体说明期望的行为:考虑准确描述你希望在输出中看到的内容。
- 用修饰语构建你的指令:添加鼓励
Claude
提高输出质量和细节的修饰语,有助于更好地塑造Claude
的表现。 - 明确要求特定功能:如果需要动画和交互元素,应明确提出要求。
后续步骤与学习资源
对于希望通过实例深入学习的开发者,可以探索以下资源:
- GitHub 提示工程教程:一个包含丰富示例的教程,涵盖了文档中的提示工程概念。
- Google Sheets 提示工程教程:一个通过交互式电子表格呈现的轻量级版本的提示工程教程。
通过系统地学习和应用本指南中的技术,你将能够更精确、更高效地驾驭 Claude
的强大能力,构建出更加智能和可靠的应用程序。