使用JSON/XML结构化提示词,大模型通常有更高的输出质量
大家好,我是鲁工。
最近在使用Claude和GPT的过程中,我发现了一个有意思的现象:当我把提示词从普通的自然语言改成XML或JSON格式后,模型的输出质量明显提升了。
我翻了一下Anthropic的官方文档和几篇学术论文,才发现这背后确实有技术原因。今天就来聊聊这个话题。
格式差异能带来40%的性能波动
2024年,微软和MIT的研究团队发表了一篇论文《Does Prompt Formatting Have Any Impact on LLM Performance?》,专门研究了提示词格式对模型性能的影响。

结论相当惊人。
在代码翻译任务中,GPT-3.5-turbo的性能波动可以达到40%,仅仅是因为换了一种提示词格式。在MMLU基准测试中,JSON格式比Markdown格式的准确率高出42%。
研究还发现,不同模型对格式的偏好不一样。GPT-3.5-turbo更喜欢JSON格式,而GPT-4更偏好Markdown。不存在跨模型通用的最优格式。
不过有个好消息:模型越大,对格式变化的敏感度越低。GPT-4系列的一致性得分超过0.5,而GPT-3.5系列低于0.5。换句话说,如果你用的是顶级大模型,格式的影响会小一些;但如果用的是中小型模型,结构化提示词的价值就非常大了。
为什么结构化格式能提升效果
要理解这个现象,需要从LLM的两个核心机制说起:Tokenization(分词)和Attention(注意力)。
大多数LLM使用BPE(字节对编码)进行分词。当你输入一段文本时,模型会先把它切成一个个token。
结构化格式的好处在于,它能产生更一致、更可预测的token序列。比如XML标签<example>会被切成固定的几个token,模型很容易识别这是一个边界标记。
而普通的自然语言呢?同样的意思可能有很多种表达方式,分词结果也会五花八门。模型需要花更多精力去理解"这里是指令结束、示例开始"。
从注意力机制来看,Transformer的自注意力机制负责建立token之间的关联。简单说,模型会计算每个token应该关注其他哪些token。
结构化格式的标签就像是路标,告诉模型:"这一块是指令,那一块是上下文,这里是示例。"模型的注意力可以更精准地分配到正确的位置。
有研究表明,LLM在相关信息位于输入开头或结尾时表现最好。如果关键信息埋在长文本的中间,模型可能会找不到。结构化格式通过明确的边界,帮助模型更高效地定位关键信息。
五种提示词格式对比
目前主流的提示词格式有五种,简单对比一下:
原始文本:用换行符和冒号分隔,写起来最简单,但模型容易搞混各个部分。
Markdown:用
#标题、列表符号等轻量级格式,人类读起来舒服,但机器解析不如结构化格式精确。YAML:缩进+键值对的格式,人类友好且结构清晰,适合配置类的提示词。
JSON:严格的键值结构,机器解析最准确,但写起来麻烦(双引号、逗号都不能错)。
XML:标签格式,兼具人机可读性,还能通过转义字符防御提示注入攻击。
根据微软和MIT的研究,平均性能排名是:JSON > YAML > 原始文本 > Markdown。(确实JSON是模型易读,Markdown是人类易读)
但这个不绝对。不同任务、不同模型的最优格式可能不一样。我的建议是:如果你主要用Claude,并且提示词涉及多个复杂构成,那么优先考虑XML;如果走API调用,JSON可能更合适。
Anthropic官方:Claude专门为XML标签优化过
说到Claude,Anthropic在官方文档里明确提到:
Claude was trained with XML tags in the training data... Claude has been fine-tuned to pay special attention to XML tags.
Claude在训练数据中就包含了XML标签,并且专门微调过以识别XML作为提示词组织机制。

官方推荐使用XML标签的四个理由:
清晰度:明确分离提示词的不同部分
准确性:减少Claude误解各部分内容的错误
灵活性:轻松添加、删除、修改提示词的各部分
可解析性:让Claude在输出中也使用XML标签,便于后处理
官方还给了几个最佳实践:保持标签名称一致、使用嵌套标签处理层级内容、把XML标签和思维链(Chain of Thought)结合使用。
有意思的是,官方也说了:没有什么魔法标签能额外提升性能。标签名称只要有意义、和内容匹配就行,<instructions>和<指令>效果差不多。

对比案例
看个Claude给的官方例子。
假设你要让Claude生成一份财务报告,下面是两种写法:
普通写法:
你是AcmeCorp的财务分析师。为投资者生成Q2财务报告。包含收入增长、利润率、现金流等部分。参考去年Q1的报告格式。用这个电子表格的数据。报告要简洁、专业、用列表格式。要突出优势和改进空间。XML结构化写法:
你是AcmeCorp的财务分析师。为投资者生成Q2财务报告。AcmeCorp是一家B2B SaaS公司,投资者看重透明度和可操作的洞察。<data>{{电子表格数据}}</data><instructions>1. 包含以下部分:收入增长、利润率、现金流2. 突出优势和改进空间</instructions>语气要简洁专业,按以下格式输出:<formatting_example>{{Q1报告示例}}</formatting_example>第一种写法,Claude可能会输出一封冗长的致投资者的信,格式和语气都不太对。
第二种写法,Claude能准确理解:数据在哪、要求是什么、参考格式是什么,输出一份结构清晰的列表式报告。
这就是结构化提示词的威力:不是让模型变聪明了,而是让它更容易理解你的意图。
不同场景的格式选择建议
基于研究和实践,我总结了一些选择建议:
用Claude的场景:优先使用XML标签。这是官方推荐的方式,Claude专门为此优化过。
API调用/程序化场景:JSON更合适。严格的结构便于程序解析,也方便和其他系统对接。
推理类任务(数学题、逻辑推理):不要用太严格的格式限制。研究表明,在推理任务中,自然语言反而表现更好。可以用"先自然语言推理,最后转成格式化输出"的策略。
分类类任务(情感分析、标签分类):JSON模式表现更好。格式限制在这类任务中反而有帮助,因为它约束了可能的输出范围。
用小模型的场景:一定要用结构化格式。小模型对格式更敏感,结构化提示词的收益更大。
最后一个建议:没有放之四海而皆准的最优格式。最好的方法是在你的具体任务上实际测试,看看哪种格式效果最好。
感谢您阅读我的文章。我是鲁工,八年AI算法老兵,AI全栈开发者。目前正在全面拥抱大模型和AIGC。感兴趣的小伙伴可以加我微信(louwill_)交个朋友。

>/ 作者:louwill
更多推荐
所有评论(0)