Prompt 缺少上下文分级:模型为什么答错了那一段

你把所有内容平铺成一面墙,模型分不清哪几行是关键、哪几行是背景。加标签、给来源打标、把任务放到注意力最高的位置。

你贴了 1200 字:一段会议转录、3 条 Slack 消息、两段背景、4 条要求 bullet,末尾一个问题。所有内容的视觉权重一模一样,模型没有”哪段更重要”的地图。没有可锚定的东西时,它就退回去按长度估算——最长的那块是转录,于是它总结了转录,把你的要求忽略了。

这是分级问题,不是能力问题。模型不知道哪几行是承重墙,因为你从没标出来。这同时也是一个已知的注意力问题:语言模型对 prompt 开头和结尾的注意力最高、中间最低(即”lost in the middle”现象),所以埋在 prompt 中段的重要信息,权重恰恰最低。

最快的修法: 把任务和硬要求放进带标签的分块,把粘贴的长材料移进打了 tag 的块里,再把真正的问题放到 prompt 最底部。对于长输入(大约 20k+ token / 30 页以上),Anthropic 官方的建议是文档放前、问题放后——在它的测试里,把 query 放最后能让回答质量提升最多 30%(截至 2026 年 6 月)。

“lost in the middle”到底是什么意思

长上下文检索的研究发现了一条 U 形注意力曲线:在 20 篇文档的上下文里,把相关文档从第 1 位移到第 10 位时,多文档问答的准确率会掉 30 个百分点以上。模型没坏,它就是对窗口两端的权重高于中段。所以分级不是表面功夫——一个事实摆在 prompt 的哪个位置,直接影响模型对它”看见”多少。

Anthropic 一个有名的例子:在长上下文的大海捞针测试里,只在答案前面加一句 Here is the most relevant sentence in the context:,就把 Claude 2.1 的准确率从 27% 拉到了 98%。修好它的不是更强的模型,而是告诉模型该往哪看。

你属于哪一类

症状可能原因跳到
模型总结最长的那块,而不是回答问题没有分块标签,默认按长度走Step 1
输出把代码、转录、规格搅成一团多种输入类型混在一起,没有分隔Step 2
一条”必须”的要求被悄悄丢掉硬规则写成了软 proseStep 3
事实对,但强调错了重点任务埋在 prompt 中段Step 4
模型把错误的来源当成权威粘贴材料没有出处Step 2
长参考被整段无视区块太长,没有摘要锚点Step 5

常见原因

1. 没有分块标签

一面 prose 墙逼着模型自己去推断上下文在哪结束、任务从哪开始。这个推断会挑出主导主题,通常就是背景。

如何判断: 没有 ## 标题,没有 Task: / 背景: 之类的标记,也没有一张要求清单。

2. 多种输入类型粘在一起

代码、转录、需求、截图转成的文字塞在一个块里。模型跨它们做平均,产出一个混血回答。

如何判断: 两种以上输入类型之间没有任何分隔(没有 tag、没有栅栏、没有标题)。

3. 硬要求埋在软 prose 里

如果能 X 就好了我们绝对需要 Y 出现在同样的视觉权重上。模型读到了”绝对”,但周围的软语境把这个信号稀释了。

如何判断: 不可协商的规则写在段落里,而不是一张带标签、全大写的清单里。

4. 参考材料没有出处

你贴了三个来源的文字,却没标明哪段是哪个。模型把它们当成同等权威,哪怕一个是粗草稿、一个是已定稿的规格。

如何判断: 粘贴内容没有归属标头(没有 <source>From: …,也没有点名文档的标题)。

5. 区块顺序不按优先级

短 prompt 里,任务落到了中段——注意力最低的地方。长 prompt 里,问题压在最顶上,排在模型回答它所需要读的文档之前。

如何判断: 结构倒置——背景占了高注意力位置,任务没占到。

动手前先确认

  • 列出当前 prompt 里的每种输入类型(转录、规格、代码、邮件等)。
  • 标出哪些行是硬要求、哪些是背景上下文。
  • 定一个优先级顺序:模型最该关注什么?
  • 确认每个粘贴的来源是否有清晰出处。
  • 估一下大致 token 量。2000 字以内的表现,和 30 页的粘贴完全不同(见 Step 4)。

最短修复路径

Step 1:每一块都打标签

## 任务
<一句祈使句>

## 硬要求(不可协商)
- 要求 1
- 要求 2

## 软偏好(冲突时放弃)
- 偏好 1

## 背景上下文
<参考材料>

## 输出格式
<schema>

可见的结构胜过推断出来的结构。Anthropic 的 prompt 指南给了一条黄金法则:把你的 prompt 拿给一个完全没有背景的同事,让他照着做。如果他会困惑该干什么,模型也会。

Step 2:给混源输入打上来源 tag

把每一块粘贴内容包进一个 tag,标明它是什么、来自哪里。这正是 Anthropic 推荐的多文档输入格式:

<documents>
  <document index="1">
    <source>standup-2026-05-21</source>
    <document_content>
      ... 转录文本 ...
    </document_content>
  </document>
  <document index="2">
    <source>product-spec-v3</source>
    <document_content>
      ... 需求 ...
    </document_content>
  </document>
</documents>

块数不多时,更轻的内联写法也行:

<transcript source="standup-2026-05-21">
... 转录文本 ...
</transcript>

<requirements source="product-spec-v3">
... 需求 ...
</requirements>

XML 风格的 tag 解析得很干净,因为模型靠 tag 就能区分指令和数据,而不用去猜。Markdown 栅栏也能分隔块,但 tag 还额外带上了出处,正好修掉原因 #4。

Step 3:用全大写关键词标硬规则

## 硬要求

MUST: 每个输出都包含客户订单号。
MUST NOT: 透露内部员工姓名。
MUST: 返回合法 JSON。

MUST / MUST NOT 读起来比”应当”更强,因为它们对应 RFC 2119——这是 IETF 的惯例,模型从多年的规范和文档里吸收了它。有一个细节很关键:RFC 2119 里只有关键词写成全大写时才带规范性效力。小写的 must 读作普通行文。所以真正想要的不可协商项,关键词一定要大写。

Step 4:把任务放到注意力最高的位置

放哪取决于 prompt 有多长。

短 prompt(约 2000 字以内): 开头和结尾的注意力最高,两头都用上。开头放任务和硬要求,最底部再把不可协商项重申一遍。

[顶] 任务 + 不可协商项
[中] 背景、转录、参考
[底] 输出格式 + 重申不可协商项

长 prompt(大约 20k+ token / 30 页以上的粘贴材料): 反过来。Anthropic 的长上下文建议是把长文档放在最上面、排在 query 之前,把真正的问题和指令放到最底部。在它的测试里,这个顺序能让复杂、多文档输入的回答质量提升最多 30%(截至 2026 年 6 月)。

[顶] <documents> ... 长粘贴材料 ... </documents>
[底] 任务 + 指令 + 输出格式

两条规则之所以都成立,是因为背后是同一条 U 形曲线:别把你最需要模型去执行的东西放进死掉的中段。

Step 5:长参考加摘要,并让回答落在引文上

如果某一块超过约 200 字,前置一段两行摘要,让模型在看证据之前先拿到一张地图:

<reference source="customer-email">
<summary>客户对账单不满;关键论断是同一周期被收了两次费。</summary>
<full>
... 400 字邮件 ...
</full>
</reference>

对于长文档任务,再加一条能稳定提升准确率的指令:让模型先引用相关片段、再回答。Anthropic 明确推荐这一招,帮模型从周围文本里”切穿噪音”:

Find the quotes from the documents above that are relevant to the
question, and put them in <quotes> tags. Then answer using only those
quotes. If nothing is relevant, say so.

这强制让检索这一步发生在推理之前,而平铺 prompt 制造的恰恰就是反过来的失败模式。

Step 6:复用模板

对于反复出现的任务类型,把结构骨架(任务 / 硬要求 / 背景 / 输出格式)存下来,填槽即可。填模板比每次重搭结构快,也能防止版式漂回那面平铺的墙。

怎么确认已经修好

  • 一个陌生人读完 prompt,能在大约 30 秒内说出任务、要求和背景。
  • 输出处理的是真正的任务,而不是最长的那段。
  • 每一条硬要求都出现在输出里。
  • 出处站得住:模型引用一个事实时,你能追溯到某个 <source> tag。
  • 重跑同一个 prompt,输出结构一致,而不是每次都换个形状。

如果还是没修好

  1. Prompt 可能就是太长了。在加更多结构之前,先剪掉那些不改变答案的背景。
  2. 硬要求可能太多。给它们排序、砍掉最弱的;十条”必须”读起来等于零条。
  3. 把长期有效的规则彻底搬出消息本身——放进 system prompt、Claude/ChatGPT Project 的自定义指令,或 Cursor 的 rules 文件——让它们跨轮次持久,而不是每次重新粘贴。
  4. 如果输入实在没法再短,换一个上下文窗口更大、对中段注意力更好的模型。截至 2026 年 6 月,Claude Opus 4.7、Sonnet 4.6 和 Gemini 3.1 Pro 都是 1M token 窗口;ChatGPT Plus 在应用内大约暴露 320 页,完整的 1M 上下文留给 $200 的 Pro 档。

常见问题

模型真的会更不仔细地读我 prompt 的中段吗?

会,而且是可测量的。在 20 篇文档的上下文里,答案从第 1 位移到第 10 位时,多文档问答准确率会掉 30 个百分点以上。把关键指令放在开头或结尾——别放中段——就能直接对冲它。

任务应该放 prompt 顶部还是底部?

短 prompt:开头放任务,结尾再重申不可协商项。粘了大段文档的长 prompt(约 20k+ token):文档放前、任务放后——Anthropic 测得”以 query 结尾”能带来最多 30% 的质量提升。

我必须用 XML tag 吗,Markdown 行不行?

两者都能分隔块。XML 风格 tag 有一个优势:像 <source>product-spec-v3</source> 这样的 tag 带着出处,模型就能分辨哪段粘贴更权威。需要标明来源时用 tag,不需要时栅栏就够了。

为什么 MUST 和 MUST NOT 要大写?

因为 RFC 2119 惯例只对全大写的形式赋予规范性效力。小写的 must 读作普通行文。在规范上训练过的模型会把 MUST NOT 当成硬性禁止——这正是你对一条不可协商规则想要的效果。

这些都做了,要求还是被忽略,怎么办?

先减少要求数量(排序后砍掉最弱的),再加上 Step 5 里那条引文落地指令,让模型先检索再推理。如果还是漏,就把规则搬进 system prompt 或 project 指令,让它不必和粘贴材料抢注意力。

预防建议

  • 默认规则:任何超过约 200 字的 prompt 都用带标签的分块。
  • 每种反复出现的任务类型留一份模板,骨架预先就位。
  • 多源拼接时,每段粘贴都打上来源 tag。
  • 硬规则用 MUST / MUST NOT(大写);“应当”留给偏好。
  • 长输入默认采用”文档在前、问题在后”的顺序。
  • 团队里,商定一套共享的分块分类,让所有人的 prompt 读起来一致。

相关阅读

外部参考:Anthropic 长上下文 prompt 指南RFC 2119 的要求关键词定义。

标签: #排查 #Prompt #Prompt 质量 #Prompt 工程