介绍在 Prompt 中使用 XML 标签来明确分隔上下文、指令、示例等,是 Anthropic 官方推荐的最佳实践。这个简单技巧能显著提高 Claude/GPT 的可靠性和准确率。
一个简单的结构化技巧,可以将杂乱、不可预测的 LLM 输出转化为干净、可靠的结果。
如果你花过任何时间为 Claude、GPT 或任何其他大型语言模型编写提示词,你可能遇到过这个问题:你的提示词适用于简单的请求,但一旦你加入多个指令——一些上下文、几个例子、格式化规则和实际任务——模型就开始混淆。它回答了问题的错误部分。它忽略了你的格式化指令。它把你的示例输出当作实际任务的一部分。
解决方案几乎简单得令人尴尬:用 XML 标记包裹你的提示词部分。
LLM 是在大量代码、文档和标记上训练的。XML(和 HTML)语法深深植根于那些训练数据中,这意味着模型非常擅长识别一个带标记的部分在哪里结束,另一个部分在哪里开始。不像纯文本段落——"这是我的上下文"和"这是我的指令"之间的边界是模糊的——标记创建了明确的边界。
Anthropic 实际上明确为 Claude 推荐这个做法:用 <instructions>、<context>、<example> 和 <output_format> 这样的标记包裹提示词的不同部分(指令、上下文、示例、输出格式),这可以明显改善一致性,特别是在更长或更复杂的提示词中。
把它想象成递给某人一堵文字墙与递给他们一张带有标记字段的表格的区别。两者包含相同的信息,但一个更容易被正确解析——对于人类来说,对于模型来说也是。
Summarize the article below in 3 bullet points. Keep it under 50 words.
Use a neutral tone. Here's an example of the style I want:
"- Company X raised $10M in Series A funding."
Now here's the article: [long article text]
模型必须猜测指令在哪里结束,文章从哪里开始——对于一篇长文章,有时它会开始总结示例而不是真实内容。
<instructions>
Summarize the article in 3 bullet points, under 50 words total.
Use a neutral tone.
</instructions>
<example_style>
- Company X raised $10M in Series A funding.
</example_style>
<article>
[long article text]
</article>
现在没有任何歧义。模型清楚地知道什么是指令、什么是风格参考,以及什么是要处理的原始内容。
你不需要一个正式的模式——这些只是模型可以识别的语义容器。最有用的一些:
<instructions> — 实际的任务
<context> — 模型需要但不应该直接作用的背景信息
<example> / <examples> — 样本输入/输出(少样本提示)
<document> 或 <article> — 待分析/转换的源文本
<output_format> — 你想要的响应结构方式
<thinking> — 用于支持分步推理的模型,在最终答案之前
你也可以嵌套它们,例如,在一次性馈送多个源时使用多个 <document index="1">、<document index="2"> 块——属性也可以,模型能正确解析它们。
这个技巧不只适用于输入——你也可以要求模型在标记中返回它的答案,这使得以编程方式解析响应变得轻而易举:
<answer>
Your final response here.
</answer>
<confidence>high</confidence>
如果你正在将其构建到应用中(比如一个 Next.js API 路由调用 AI SDK),这将一个脆弱的"希望模型格式正确"问题转变为一个简单的字符串提取问题——当你只需要一两个字段时,无需完整的 JSON 模式。
对于单个、简单的指令("把这翻译成法语"),标记就过度了——它们没有任何好处反而增加了噪声。当你的提示词有多个可能相互混淆的不同部分时,请使用 XML 标记:指令 + 上下文 + 示例 + 一个待处理的文档,全部在一条消息中。
XML 标记不是一个技巧——它更接近于应用到提示词的良好 API 设计。你在给模型一个明确的约定,而不是希望它从散文中推断你的意图。下一次当你的提示词感觉"几乎工作"时,在开始重写措辞之前先试试用标记包裹它的部分。通常,问题不在于措辞,而在于结构。