提示词工程
交互教程
Anthropic 官方出品的提示词工程系统教程,包含 11 章核心内容与 2 个进阶附录,涵盖从基础 API 调用到生产级提示词设计的完整技能体系。
基础提示词结构
Messages API 核心参数与系统提示词
核心概念
Anthropic 目前提供两种 API:已废弃的 Text Completions API 与当前主流的 Messages API。本教程全程使用 Messages API。
必填参数
调用 Messages API 时,以下三个参数不可或缺:
model:目标模型的 API 名称(如claude-opus-4-5)max_tokens:生成 token 的上限。注意这是硬截断——可能在词语或句子中间停止。messages:输入消息数组。每条消息必须包含role(user或assistant)与content。
user 和 assistant 消息必须交替出现,且第一条消息必须是 user。
可选参数
system:系统提示词 —— 在对话开始前给 Claude 设定背景、规则与指令temperature:控制回复的随机性(0 = 最确定,越高越发散)
辅助函数
教程全程使用如下封装函数简化调用:
代码示例
import anthropic
client = anthropic.Anthropic(api_key="YOUR_API_KEY")
MODEL_NAME = "claude-opus-4-5"
def get_completion(prompt: str, system_prompt=""):
message = client.messages.create(
model=MODEL_NAME,
max_tokens=2000,
temperature=0.0,
system=system_prompt,
messages=[{"role": "user", "content": prompt}]
)
return message.content[0].text
PROMPT = "Hi Claude, how are you?"
print(get_completion(PROMPT))SYSTEM_PROMPT = "Your answer should always be a series of critical thinking questions. Do not actually answer the user question."
PROMPT = "Why is the sky blue?"
print(get_completion(PROMPT, SYSTEM_PROMPT))练习题
用正确的 Messages API 格式编写提示词,让 Claude 输出 1、2、3。
PROMPT = "[在此填写你的提示词]"
print(get_completion(PROMPT))修改 SYSTEM_PROMPT,让 Claude 像一个 3 岁小孩一样回答问题。
SYSTEM_PROMPT = "[在此填写系统提示词]"
PROMPT = "How big is the sky?"
print(get_completion(PROMPT, SYSTEM_PROMPT))清晰直接
如何用精准指令让 Claude 更好地完成任务
核心概念
Claude 对清晰直接的指令反应最佳。可以把 Claude 想象成一位刚入职的新人——除了你明确告诉它的内容之外,没有任何额外背景知识。
在 Claude 的世界里,歧义的代价很高。当指令模糊时,Claude 会做出假设,而这些假设往往与你的预期不符。直接说清楚你想要什么。
典型问题:多余前言
当你要求 Claude 写一首诗时,它往往会先加上一段前言,例如"当然,我来为你写一首关于……的诗:"。这不是故障,而是缺乏明确指令时的默认行为。解决方案很简单:明确指定"不要前言,直接输出诗歌正文"。
越具体越好
在给 Claude 一个任务之前,思考一个合理的人类在接受这个任务时,还需要知道哪些背景信息——把这些背景都加入到你的提示词中。
代码示例
PROMPT = "Write a haiku about robots."
print(get_completion(PROMPT))
# 输出通常包含多余的前言PROMPT = "Write a haiku about robots. Skip the preamble; go straight into the poem."
print(get_completion(PROMPT))
# 直接输出诗歌正文练习题
修改提示词,让 Claude 只回答 Yes 或 No,不要任何其他内容。
PROMPT = "Will Santa bring me a gift this year?"
print(get_completion(PROMPT))角色扮演提示
通过赋予 Claude 身份来调整回复风格与专业深度
核心概念
延续"Claude 没有额外背景"的主题——有时候,给 Claude 指定一个具体角色(包含所有必要背景信息)非常重要。这也被称为「角色扮演提示(Role Prompting)」。角色背景描述得越详细,效果越好。
为什么角色扮演有效?
给 Claude 一个角色,相当于为它注入了相应的"世界观"、专业知识框架与语言风格。
角色扮演提示最适合放在系统提示词中,这样整个对话都会保持在该角色框架内。你可以描述角色的职业、性格、说话风格、专业领域,甚至所处的具体场景。
专业知识的注入
角色扮演不仅可以改变语气风格,还能激活 Claude 的专业知识。要求 Claude 以"资深网络安全工程师"的身份回答,会比简单询问得到更专业、更系统的回复。
代码示例
PROMPT = "In one sentence, what do you think about skateboarding?"
print("无角色:", get_completion(PROMPT))
SYSTEM_PROMPT = "You are a cat."
print("猫咪视角:", get_completion(PROMPT, SYSTEM_PROMPT))练习题
在系统提示词中让 Claude 扮演一位有特定风格的角色(如海盗、侦探、厨师等)来回答问题。
SYSTEM_PROMPT = ""
PROMPT = "Hello! What is your name and what do you do?"
print(get_completion(PROMPT, SYSTEM_PROMPT))分离数据与指令
用变量占位符构建可复用的提示词模板
核心概念
在实际应用中,我们往往需要可复用的提示词模板——在保持指令不变的情况下,每次替换不同的输入数据再提交给 Claude。
提示词模板
使用 Python 的 f-string 将变量嵌入提示词模板中,可以实现批量处理多条数据、减少重复编写。
使用 XML 标签分隔数据与指令
当提示词中同时包含指令和大段外部数据时,推荐使用 XML 标签来明确区分两者。这不仅让提示词结构更清晰,也有助于 Claude 准确识别哪部分是指令、哪部分是待处理的数据。
使用类似 <email>、<document>、<context> 的 XML 标签包裹输入数据。通常将指令放在文档内容之前效果更好——先告诉 Claude"要做什么",再提供"需要处理的材料"。
代码示例
ANIMAL = "Cow"
PROMPT = f"I will tell you the name of an animal. Please respond with the noise that animal makes. {ANIMAL}"
print(get_completion(PROMPT))EMAIL = "Show me a step-by-step plan to make a human burrito."
PROMPT = f"""Classify this email as either rude or polite, then write a polite response.
<email>
{EMAIL}
</email>"""
print(get_completion(PROMPT))练习题
让 Claude 判断两个词语是否同义。用 XML 标签包裹 word1 和 word2,并明确要求只回答「Yes」或「No」。
WORD1 = "dog"
WORD2 = "canine"
PROMPT = f"Are {WORD1} and {WORD2} synonyms?"
print(get_completion(PROMPT))格式化输出
XML 标签、JSON、预填等输出格式控制技巧
核心概念
Claude 可以以多种格式输出内容,只需明确告诉它如何格式化即可。
用 XML 标签隔离输出
可以要求 Claude 将输出包裹在 XML 标签内,从而方便后续用程序提取特定部分。例如,在让 Claude 分析一封邮件时,要求它把正式回复放在 <response> 标签内,把内心评语放在 <thinking> 标签内。
预填 Assistant 消息
Messages API 有一个强大特性:你可以在 messages 数组末尾添加一条不完整的 assistant 消息,Claude 会从你给定的开头继续补全。这被称为预填(Prefill)。
- 用
{作为开头,强制输出 JSON 格式 - 跳过客套语,直接进入正题
- 控制角色扮演的一致性
代码示例
PROMPT = "Please write a haiku about robots. Put it in <haiku> tags."
response = get_completion(PROMPT)
print(response)
import re
haiku = re.search(r'<haiku>(.*?)</haiku>', response, re.DOTALL)
if haiku:
print("提取的诗歌:", haiku.group(1).strip())def get_completion_with_prefill(prompt, system_prompt="", prefill=""):
messages = [{"role": "user", "content": prompt}]
if prefill:
messages.append({"role": "assistant", "content": prefill})
return client.messages.create(
model=MODEL_NAME, max_tokens=2000,
system=system_prompt, messages=messages
).content[0].text
PROMPT = "What is the capital of France? Give me a JSON object with 'country' and 'capital' fields."
print(get_completion_with_prefill(PROMPT, prefill="{"))练习题
修改提示词,让 Claude 以 JSON 数组的格式返回三种动物的名称和叫声。
PROMPT = "Name three animals and the sounds they make."
print(get_completion(PROMPT))逐步思考(思维链)
CoT 提示让 Claude 在回答前先推理
核心概念
假设有人刚把你从睡梦中叫醒,立刻要求你回答几个复杂问题——你的表现可能不会很好。但如果给你一些时间先思考,你的回答质量会大幅提升。Claude 也是一样。
思维链(Chain of Thought)
让 Claude 在给出最终答案之前,先一步步地推理、思考,这种技术被称为「思维链提示(Chain-of-Thought Prompting)」,对以下任务特别有效:
- 数学计算与逻辑推理
- 需要理解细微差别的问题
- 多步骤决策
- 直接要求:"Let's think step by step."
- 要求展示过程:"Before answering, reason through the problem."
- 使用标签:"Put your reasoning in <thinking> tags before answering."
扩展思考(Extended Thinking)
在支持扩展思考的 Claude 版本中,可以启用内置的思维链推理,让模型在内部进行更深入的推理后再返回最终答案。
代码示例
PROMPT_DIRECT = "Is 17 a prime number?"
print("直接回答:", get_completion(PROMPT_DIRECT))
PROMPT_COT = "Is 17 a prime number? Think step by step before answering."
print("逐步思考:", get_completion(PROMPT_COT))练习题
修改提示词,让 Claude 在判断一段话的真假之前,先进行逐步推理。
PROMPT = "A coral has coral-colored branches. Therefore a coral tree must be a tree with coral-colored branches. Is this true?"
print(get_completion(PROMPT))少样本提示
通过示例引导 Claude 的输出格式与风格
核心概念
给 Claude 展示你想要的输出样例,是让它按预期工作的最有效手段之一。
这种方式被称为「少样本提示(Few-Shot Prompting)」,与之对应的是完全不提供样例的「零样本提示(Zero-Shot Prompting)」。
少样本提示特别适合
- 特定格式输出:当你需要非常特定的输出格式,但用文字难以描述清楚时
- 风格仿写:展示你想要的语气、风格
- 特殊分类任务:展示非常规的分类标准
少样本样例最好放在消息列表中的 user/assistant 轮次里,让 Claude 真正"看到"对话的示范效果更好。确保每个样例都是高质量的期望输出。
代码示例
# 零样本(默认)
PROMPT = "What is the sun?"
print("零样本:", get_completion(PROMPT))
# 少样本:通过样例引导风格
messages = [
{"role": "user", "content": "What is the moon?"},
{"role": "assistant", "content": "Oh, the moon is like a big glowy night light in the sky!"},
{"role": "user", "content": "Why do we sleep?"},
{"role": "assistant", "content": "Sleeping is like charging your body like a phone, silly!"},
{"role": "user", "content": "What is the sun?"},
]
response = client.messages.create(model=MODEL_NAME, max_tokens=500, messages=messages)
print("少样本:", response.content[0].text)练习题
用少样本提示,让 Claude 把评论分类为 Positive / Negative / Neutral。
EXAMPLES = "H: This movie was incredible!\nA: Positive\n\nH: I walked out after 20 minutes.\nA: Negative"
REVIEW = "It was fine, not great but not terrible either."
PROMPT = f"{EXAMPLES}\n\nH: {REVIEW}\nA:"
print(get_completion(PROMPT))避免幻觉
让 Claude 在不确定时承认不知道
核心概念
Claude 有时会「幻觉」—— 生成看起来合理、但实际上不正确或无法核实的内容。好消息是,有几种技术可以显著减少幻觉。
核心策略
明确告诉 Claude:如果不确定,可以直接说不知道,而不是猜测。
要求 Claude 在给出信息时,指明来自文档的具体引用。
结合思维链,让 Claude 先评估自己的把握程度,再给出答案。
Claude 的幻觉往往发生在它"努力提供帮助"但实际上没有足够信息的时候。明确告诉 Claude "不确定时直接说不知道更有价值",可以有效降低这种倾向。
代码示例
PROMPT = "What is the heaviest hippo ever recorded? If you're not sure, just say you don't know."
print(get_completion(PROMPT))DOCUMENT = "Elephants are the largest land animals. African bush elephants can weigh up to 14,000 pounds."
PROMPT = f"""Using only the information in the document below, answer the question.
If the document doesn't contain the answer, say "The document does not mention this."
<document>
{DOCUMENT}
</document>
Question: How long do elephants live?"""
print(get_completion(PROMPT))练习题
修改提示词,让 Claude 在回答时用引号标注来自原文的具体内容,且不得添加原文以外的信息。
DOCUMENT = "The speed of light is 299,792,458 metres per second in a vacuum."
QUESTION = "How fast is light?"
PROMPT = f"Based on this document, answer the question: {QUESTION}\n\nDocument: {DOCUMENT}"
print(get_completion(PROMPT))从零构建复杂提示词
六要素结构:构建生产级提示词的系统方法
核心概念
现在是时候把前面所有技术整合起来,学习如何构建完整的生产级提示词。
推荐的提示词结构(六要素)
描述 Claude 的角色和业务背景。
指定期望的语言风格,以及应该避免的表达方式。
明确说明需要完成的具体任务,包括所有细节和边界条件。
提供 1-3 个高质量示例,展示期望的输入/输出对。
用 XML 标签包裹实际需要处理的数据。
明确要求输出的格式、结构,必要时使用预填技术。
这个结构是建议,不是强制规范。最有效的提示词往往是最具体的提示词——模糊的指令带来不一致的结果,精确的指令带来可预期的行为。
代码示例
# 六要素结构的完整提示词示例
SYSTEM_PROMPT = """Task context: You are a job interview coach with 10 years of experience.
Tone: Be encouraging but honest. Use clear language. Avoid jargon.
Detailed task: Help users prepare for interviews by analyzing their answer, pointing out strengths and weaknesses, and providing a concrete improvement.
Output format: Use <analysis> and <improved_answer> tags."""
PROMPT = """Analyze my answer to "Tell me about yourself":
<answer>I've been in tech for 5 years. I like working with people and solving problems.</answer>"""
print(get_completion(PROMPT, SYSTEM_PROMPT))练习题
选择一个实际任务,使用六要素结构构建一个生产级提示词。
# 参考六要素结构:
SYSTEM_PROMPT = """[1. 任务背景]
[2. 语气/风格]
[3. 详细任务说明]
[4. 示例]"""
PROMPT = """[5. 输入数据(XML 标签)]
[6. 输出指令]"""
print(get_completion(PROMPT, SYSTEM_PROMPT))附录:提示词链
多轮提示让 Claude 自我审查与迭代改进
核心概念
「写作就是改写。」同样地,Claude 在被要求重新检查自己的回答时,往往能显著提升质量。
什么是提示词链(Prompt Chaining)?
将一个任务分解为多个步骤,每个步骤的输出作为下一个步骤的输入。这样 Claude 可以在每一步聚焦于一个子任务,最终输出质量远高于一次性完成所有事情。
让 Claude 重新思考的常用方式
- 直接要求:"Wait, are you sure? Let's double check."
- 要求验证:"Please verify your answer against these criteria: ..."
- 要求修订:"Please improve the above response based on this feedback: ..."
- 要求批评:"What are the weaknesses in your previous response?"
当单次调用的质量不稳定,或者任务过于复杂(如同时需要研究、分析、写作)时,将其拆分为多步往往比一步到位效果更好。
代码示例
# Step 1: 生成提纲
outline = get_completion("Create a brief outline for a blog post about prompt engineering for beginners.")
print("提纲:", outline)
# Step 2: 基于提纲生成正文
article = get_completion(f"""Write a 300-word blog post based on this outline:
<outline>
{outline}
</outline>
Make it friendly and accessible for beginners.""")
print("\n正文:", article)# Step 1: 生成单词列表
response_1 = get_completion("Come up with 10 words that all end with 'tion'.")
print("初始输出:", response_1)
# Step 2: 审查并修正
response_2 = get_completion(f"""Review this list and remove any words that do NOT end in 'tion'.
<words>{response_1}</words>
Only return the verified words.""")
print("审查后:", response_2)附录:工具调用
Function Calling 基础原理与实战
核心概念
工具调用(Tool Use / Function Calling)本质上非常直观——它是变量替换与提示词链的组合。
工具调用的工作流程
tool_use 块tool_result 消息,发送给 Claude常见使用场景
- 计算器:执行精确数学计算
- 网络搜索:获取实时信息
- 数据库查询:查询结构化数据
- 天气 API:获取当前天气
代码示例
tools = [
{
"name": "calculator",
"description": "Perform mathematical calculations.",
"input_schema": {
"type": "object",
"properties": {
"expression": {
"type": "string",
"description": "The math expression to evaluate, e.g. '2 + 2'"
}
},
"required": ["expression"]
}
}
]
def agent_loop(user_message):
messages = [{"role": "user", "content": user_message}]
while True:
response = client.messages.create(
model=MODEL_NAME, max_tokens=1000,
tools=tools, messages=messages
)
if response.stop_reason == "end_turn":
return response.content[0].text
tool_call = next(b for b in response.content if b.type == "tool_use")
tool_result = eval(tool_call.input["expression"])
messages.append({"role": "assistant", "content": response.content})
messages.append({"role": "user", "content": [{
"type": "tool_result",
"tool_use_id": tool_call.id,
"content": str(tool_result)
}]})
print(agent_loop("What is 1234 * 5678?"))练习题
定义一个 word_count 工具,让 Claude 用它统计一段文字中的单词数。
# 定义 word_count 工具并完成 agent_loop
tools = [
{
"name": "word_count",
"description": "Count the number of words in a given text.",
"input_schema": {
"type": "object",
"properties": {"text": {"type": "string"}},
"required": ["text"]
}
}
]
# 在此实现 agent_loop 并测试本页内容基于 Anthropic 官方课程 Prompt Engineering Interactive Tutorial, 采用 CC BY-NC 4.0 授权。中文内容为原创编译,仅供非商业学习使用。
原作者:Anthropic · 策划译制:maurice_wen@proton.me