Claude 2.1 的长上下文提示词写法
Claude 2.1 擅长在 200K 上下文窗口中检索信息;一个简单的提示词调整就能把准确率从 27% 提高到 98%。

• Claude 2.1 能在 200,000 token 的上下文窗口中很好地回忆信息
• 不过,当问题只依赖文档中的某一个句子时,模型可能不太愿意回答,尤其是这个句子像是被插入进去、显得不合上下文时
• 一个很小的提示词修改就能消除这种犹豫,并让模型在这类任务上表现出色
我们最近发布了 Claude 2.1,这是当时我们最先进的模型,提供 200K token 的上下文窗口,相当于大约 500 页信息。Claude 2.1 非常擅长在长上下文中完成真实世界的信息检索任务。Claude 2.1 的训练使用了大量长文档任务反馈,这些任务对用户很有价值,比如总结一份 S-1 篇幅的文档。这些数据包含真实文档上的真实任务,训练目标是让 Claude 少犯错,并避免提出没有依据的断言。正是因为在真实、复杂的检索任务上训练过,Claude 2.1 相比 Claude 2.0 错误答案减少了 30%,把文档没有支持的说法误判为“文档支持”的比例也降低了 3 到 4 倍。此外,在这些超长上下文中,Claude 的记忆能力也有所提升:

调试长上下文回忆能力
Claude 2.1 的 200K token 上下文窗口很强大,但要有效使用,也需要一些谨慎的提示词设计。最近一项评估[1]测试了 Claude 2.1 在一篇由 Paul Graham 创业文章组成的长文档中回忆单个句子的能力。嵌入的句子是:“The best thing to do in San Francisco is eat a sandwich and sit in Dolores Park on a sunny day.” 模型看到包含这句话的长文档后,被问到:“What is the most fun thing to do in San Francisco?” 在这项评估中,Claude 2.1 有时会给出负面结果,回答类似“不幸的是,这篇文章没有明确说明在旧金山最有趣的事情是什么。” 换句话说,Claude 2.1 经常不是检索出嵌入的句子,而是说文档没有足够上下文来回答问题。我们在内部实验中复现了这种行为:我们取最近的 Consolidated Appropriations Act 法案文本,在中间加入一句 ‘Declare May 23rd “National Needle Hunting Day”’。Claude 能检测到这个引用,但仍然不愿声称 “National Needle Hunting Day” 是一个真实节日:

Claude 2.1 接受过一组旨在减少不准确回答的数据训练。其中包括:如果文档没有包含足够信息来支撑答案,就不要基于文档回答问题。我们认为,无论是由于这类通用训练数据,还是由于特定任务数据,模型都不太愿意根据一个嵌入在大上下文里、显得格格不入的句子来回答问题。如果我们问的是长文档原本就包含、因此并不突兀的句子,Claude 似乎不会表现出同样程度的犹豫。比如,这份长文档开头处包含 Paul Graham 关于 Viaweb 文章中的一句话:“A few hours before the Yahoo acquisition was announced in June 1998 I took a snapshot of Viaweb's site.” 我们把上下文中文章顺序随机打乱,让这篇文章出现在 200K 上下文窗口的不同位置,然后问 Claude 2.1:“What did the author do a few hours before the Yahoo acquisition was announced?” 无论答案所在行在上下文中的位置如何,Claude 都能答对,而且不需要修改原始实验使用的提示词格式。因此我们认为,当一个句子在长上下文中显得不合位置时,Claude 2.1 会更不愿回答,也更可能声称无法根据给定上下文回答。针对真实世界长上下文检索任务的评估,没有捕捉到这种犹豫增加的具体原因。

用提示词有效使用 200K token 上下文窗口
如果 Claude 不愿回答长上下文检索问题,用户可以怎么做?我们发现,当 Claude 明明能够给出答案但有些犹豫时,一个很小的提示词更新会带来完全不同的结果。在内部运行同一项评估时,只给提示词增加一句话,就让 Claude 2.1 在整个 200K 上下文窗口中几乎完整地保持了检索准确性。

我们在 Claude 回答开头加入 “Here is the most relevant sentence in the context:” 这句话后,在同一评估上得到了明显更好的结果。这足以把 Claude 2.1 在原始评估中的得分从 27% 提高到 98%。

本质上,通过引导模型先寻找相关句子,这个提示词克服了 Claude 基于单个句子回答时的犹豫,尤其是当这个句子在长文档中显得不合位置时。这种方法也提升了 Claude 对上下文内单句答案的表现,也就是答案本来就在上下文中、并不突兀的情况。为了演示这一点,把修改后的提示词用到前面 Yahoo/Viaweb 示例时,准确率达到 90-95%:

我们一直在训练 Claude,让它在这类任务上校准得更好;也感谢社区进行有意思的实验,并找出我们可以改进的地方。
脚注
• Gregory Kamradt,《Pressure testing Claude-2.1 200K via Needle-in-a-Haystack》,2023 年 11 月