先记住这个答案
当上下文较长时,模型的注意力对序列开头和结尾更敏感,中间部分的信息往往更难被充分利用。如果把查询放在文档之前,文档整体位于查询之后,其中与查询相关的信息若处于中间位置,容易被模型忽略;同时模型虽会编码全部输入,但查询与文档的相对位置较弱会导致关联不足,从而可能引发对先验内容的依赖。而将文档完整呈现后再把查询置于末尾,可以让查询位于近因效应区域,文档开头部分也受首因效应保护,增强对具体内容的定位能力。然而,这并不能自动保证模型只引用材料,仍需显式提示“仅依据以上内容回答”来减少幻觉,在引用数字或事实时尤其关键。
- 文档在前可降低关键内容被忽略的风险
- 关键信息放在开头和结尾更稳
- 超长上下文仍需分段与摘要
注意力分布与回答规划顺序
Transformer模型对长上下文的注意力并非均匀分布。多项研究观察到模型更容易关注位于序列开头和结尾的信息,位于中间的内容即使重要也可能被忽略。如果查询放在文档之前,查询虽然处于序列开头具有位置优势,但文档中的关键信息可能分散在后续较长的区间内,尤其当相关段落位于中部时,模型在生成时或许难以将其与查询关联,从而更倾向于依赖参数中的先验知识,导致回答偏离文档事实。
文档置于查询前的意义在于使文档相对查询处于注意力有优势的首部,同时查询落在末尾便于模型在输出时回溯。由于模型在处理整个输入时会编码全部内容,顺序的影响主要体现在注意力分配上,而不是信息的可见性。因此,明确要求模型“根据文档内容回答”仍是减少幻觉的关键,仅靠位置调整并不足以保证回答的忠实性。
合同条款问答:文档放前还是放后
假设一个法律AI应用,需要根据一份5000字的合同回答具体条款问题。如果把用户问题'第3条违约责任是什么?'放在最前,而合同全文随后,那么模型虽然编码了全部合同,但第3条的位置可能落在注意力较弱的中间地带,导致模型在生成时没有从原文提取该条款,而是根据通用法律常识猜测常见违约责任,从而偏离合同原文。
较稳妥的方式是先输入完整合同文本,然后在末尾附加'基于以上合同内容,请回答:第3条违约责任是什么?'。这样文档首部与查询末位都处于注意力优势区域,模型更容易将问题与对应条款关联起来。工程设计上,可将文档作为固定前缀,用户查询动态追加在最后,既保证结构统一又方便缓存。
文档前置的失效条件与妥协
当文档极长接近上下文窗口上限时,即使文档前置,中段信息仍可能被模型遗漏。此时单纯依赖位置已不足够,需将文档进行摘要或分段,先让模型对整体结构有了解,再针对特定段落深入。例如可将每个条款做成摘要列表放在最前,再附详细正文。
另一种情况是对话式交互:用户先提问,系统再检索文档作为上下文。这种场景无法将文档物理放在查询之前,解法是明确提示模型'请先阅读提供的材料再回答',并可在检索到的文档后重复一次关键问题,或把问题改写成'基于以下资料,回答原始问题:...',本质上仍让模型先处理文档。
容易答错的地方
- 认为只影响长文本
- 有人以为只有超过数万token才需要调整顺序,实际上即使数千token,如果模型对中间细节敏感,顺序也可能影响结果。当文档中关键信息分布较散时,前置查询更容易遗漏部分要点,所以不应只按长度判断。
- 把查询放最后就万事大吉
- 文档放前仅是第一步,还需保证文档内结构清晰、关键信息不过度冗长。若文档本身混乱或无关内容过多,模型仍可能无法定位答案。因此应配合清晰的标题、分段以及必要的摘要,甚至使用XML标签标记文档与问题。
面试官还会怎么问?
如果文档太长无法全部放入上下文怎么办?
需要先做信息检索或分块摘要,只将与查询可能相关的片段传入。可先用查询关键词检索,再按时间顺序或相关性排列文档片段,但注意每段前应注明来源,并让模型综合多个片段。
在对话历史中,应如何安排旧文档与新查询?
应该将完整历史上下文作为前缀,最新查询作为末尾。如果之前已有多轮,可把当前问题重述到文档之后,例如'基于以上全部对话,请回答最新问题:...',以确保模型看到最后一句是明确指令。
所有任务都适合文档前置吗?
不完全。创意写作或头脑风暴时,问题前置反而有助于约束思路。文档前置主要适用于需要引用或分析给定材料的任务,如问答、摘要、信息提取。应根据任务是否依赖外部事实来判断。
参考资料
示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。