初级提示词让 AI 完成任务;高级提示词让 AI 稳定地、以正确方式完成任务。 本文聚焦真正让输出质量产生质变的核心技巧,面向 Claude API 开发者。
为什么需要高级提示词工程?
同样的问题,提示词写法不同,输出质量天差地别:
-
基础写法:「分析这段代码有什么问题」 → 结果:深度随机,可能漏掉关键问题
-
高级写法:「按以下步骤分析:1) 列出功能假设 2) 逐行识别边界条件 3) 重点检查空指针/类型不匹配/竞态条件 4) 输出按严重程度排序的问题列表」 → 结果:系统完整,可预期,不遗漏
差距的根源是结构化思维的有无。
Chain-of-Thought(思维链)
核心原理
让模型「先想后说」——在最终答案前显式写出推理步骤。 对多步逻辑推导任务效果最显著(数学/逻辑/代码分析)。
Zero-Shot CoT
无需示例,用触发短语激活思维链:
分析以下系统设计方案的可行性:
[系统描述]
请一步步思考:先分析功能需求,再考虑技术约束,最后评估实现风险。
有效触发词:「一步步思考」「请先分析……然后」「Think step by step」
Few-Shot CoT:带推理过程的示例
判断以下 SQL 查询是否存在 N+1 问题:
示例 1:
查询:for user in users: db.query(Order).filter_by(user_id=user.id).all()
思考:外层循环 N 次,内层每次单独查询——共 N 次 DB 查询。
结论:有 N+1 问题。优化:改为 JOIN 或 IN 查询一次获取所有订单。
示例 2:
查询:db.query(User).options(joinedload(User.orders)).all()
思考:joinedload 一次 JOIN 查出用户和订单——只有 1 次 DB 查询。
结论:无 N+1 问题,已用 eager loading 优化。
现在判断:{user_query}
先写思考过程,再给结论。
Few-Shot 示例选取原则:
- 覆盖正反两类情况
- 示例难度与真实任务相近
- 推理格式要和期望输出完全一致
- 2-4 个示例通常够用,过多反而稀释注意力
XML 标签结构化(Claude 最佳实践)
Claude 对 XML 标签有特别好的理解,用标签分隔内容能显著提升输出稳定性:
<task>代码审查:检查安全漏洞</task>
<context>公网服务器上处理用户上传文件的函数</context>
<code>
def upload_file(filename, content):
path = f'/uploads/{filename}'
with open(path, 'wb') as f:
f.write(content)
return path
</code>
<requirements>
1. 识别所有安全漏洞(路径穿越/文件类型/大小限制)
2. 每个漏洞给出风险等级、攻击场景、修复代码
3. 按风险从高到低排序
</requirements>强制 JSON 输出:
分析代码复杂度,以 JSON 返回:
<code>{code}</code>
<output_schema>
{
"cyclomatic_complexity": <整数>,
"issues": [{"type": "字符串", "line": <整数>, "severity": "low|medium|high"}],
"refactor_recommended": <布尔值>
}
</output_schema>
只返回 JSON,不加任何解释。
角色扮演提示(Role Prompting)
给 Claude 一个有行为约束的专家身份,比单纯说「你是专家」有效得多:
# 有效:身份 + 行为约束
你是有 15 年经验的 PostgreSQL DBA,擅长性能调优。
回答时:先诊断根因,给出多方案并说明各自适用场景,
用 EXPLAIN ANALYZE 输出佐证优化效果。
# 无效:只有身份,没有行为约束
你是数据库专家。
任务分解
复杂任务拆分多轮 > 一次性提交:
第 1 轮:分析当前架构,列出主要问题(不改代码)
第 2 轮:基于分析制定重构方案,优先级排序
第 3 轮:实现最高优先级模块
Claude 专属技巧
正向指令 > 禁止指令
- 差:「不要多余解释,不要 Markdown,不要太长」
- 好:「直接输出代码,不加注释,控制 20 行以内」
Claude 更擅长理解「做什么」而不是「不做什么」。
给 Claude 思考空间
在问题末尾加上开放性 XML 标签,迫使 Claude 先分析再回答:
问题:{question}
请先在 <analysis> 内分析所有方案,再在 <answer> 内给出最优答案。
<analysis>
以 <analysis> 开头是一个技巧——Claude 会继续填写标签内容,强制进入分析模式。
提示词 A/B 测试框架
import anthropic, statistics
client = anthropic.Anthropic()
def ab_test(prompt_a, prompt_b, cases, judge, rounds=5):
sa, sb = [], []
for case in cases:
for _ in range(rounds):
ra = client.messages.create(
model='claude-sonnet-4-6', max_tokens=1024,
messages=[{'role':'user','content': prompt_a.format(**case)}]
).content[0].text
rb = client.messages.create(
model='claude-sonnet-4-6', max_tokens=1024,
messages=[{'role':'user','content': prompt_b.format(**case)}]
).content[0].text
sa.append(judge(ra, case))
sb.append(judge(rb, case))
winner = 'A' if statistics.mean(sa) >= statistics.mean(sb) else 'B'
print(f'A={statistics.mean(sa):.2f} B={statistics.mean(sb):.2f} Winner={winner}')来源:Anthropic 官方文档 - docs.anthropic.com/en/docs/build-with-claude/prompt-engineering