RAG系统中的困境:上下文不是想加就能加的
“这段代码明明是对的啊,为什么ChatGPT还给出了错误的解释?我都把相关文档放进去了!”
“用户问的是2024年的新闻,我也给了最新的新闻报道作为上下文,但模型回答的还是2022年的旧闻...”
相信做RAG应用开发的同学都遇到过类似的困扰。明明提供了相关的上下文,为什么大模型还是会产生幻觉...是大模型没有好好利用上下文,还是上下文本身就不足以回答问题?
最近Google、UCSD等机构的研究者提出了一个新的视角来看待这个问题。他们在论文《SUFFICIENT CONTEXT: A NEW LENS ON RETRIEVAL AUGMENTED GENERATION SYSTEMS》中,首次提出了“充分上下文”的概念,并基于此深入分析了RAG系统中大模型的行为表现。
论文链接:https://arxiv.org/abs/2411.06037
从相关到充分:重新定义上下文质量
在传统的RAG系统中,我们往往用“相关性”来评价检索到的文档质量。比如用户问“特斯拉Model 3的价格是多少?”,检索系统可能会返回以下几种文档:
文档A:
特斯拉Model 3是一款纯电动轿车,由特斯拉公司生产,采用了最新的电池技术...
文档B:
2024年1月,特斯拉官方宣布Model 3在中国市场的官方指导价为23.59万元起...
文档C:
据悉,特斯拉计划在2024年第二季度推出Model 3的改款版本,预计将对价格进行调整...
从相关性的角度看,这三段文本都与特斯拉Model 3有关,但它们对回答价格问题的帮助程度却大不相同。文档A虽然介绍了Model 3,但完全没有价格信息;文档B给出了明确的当前价格;文档C提到了价格会调整,但没有具体数字。
研究者认为,我们需要一个更严格的标准:上下文是否“充分”支持回答问题。换句话说:如果基于给定的上下文能推理出一个合理的答案,那这个上下文就是充分的。在上面的例子中,只有文档B提供了充分的上下文。
这个概念看似简单,但实际判断起来并不容易。比如对于多跳推理类的问题:
问题:2024年特斯拉在中国的市值超过了哪家传统车企?
可能需要同时具备以下信息才算充分上下文:
- 特斯拉2024年在中国的市值数据
- 主要传统车企2024年在中国的市值数据
- 这些数据的对比关系
那大模型如何使用上下文?
研究者基于“充分上下文”的概念,分析了各种大模型在实际场景中的表现。举个例子,假设问题是:“2024年2月举办的第96届奥斯卡最佳影片是哪部?”
场景一:提供充分上下文
第96届奥斯卡金像奖于2024年3月10日举行,电影《奥本海默》获得最佳影片奖...
场景二:提供不充分但相关的上下文
《奥本海默》《巴比》《如何优雅地炸掉一艘船》等影片入围第96届奥斯卡最佳影片奖提名...
在论文中,他们研究发现,面对这两种场景,不同类型的模型表现出明显的差异:
- 专有模型(如Gemini、GPT)在场景一中能准确回答“《奥本海默》”。但在场景二中,它们倾向于自信地“预测”获奖影片,而不是承认信息不足。这反映出这类模型可能过度依赖自身的预训练知识。
- 而开源模型(如Llama、Mistral)即使在场景一中也表现得不够稳定,有时会产生幻觉(比如说是《巴比》获奖),有时又会过于保守而拒绝回答。这说明这些模型在整合上下文信息方面还有提升空间。
为什么模型有时不需要充分上下文也能对?
在论文中,存在一个比较有趣的发现:即使在上下文不充分的情况下,模型也能在35%-62%的情况下给出正确答案。这是不是就比较unbelievable。
例如,假设问题是:“爱因斯坦是在哪个国家出生的?”,给出的上下文是:
爱因斯坦在欧洲度过了他的童年时期,后来移居美国...
这个上下文并不充分,因为没有直接说明出生地。但模型可能还是会正确回答“德国”,猜测可能的原因是:
- 这是一个众所周知的事实,存在于模型的预训练知识中
- 上下文中提到“欧洲”提供了地理范围的线索
- “童年时期”暗示了这可能与出生地有关
研究者通过分析发现,模型在没有充分上下文时得到正确答案,主要有这么几种情况:
- 对于是非题,比如“爱因斯坦去过中国吗?”,即使上下文不充分,模型也有50%的机会猜对。
- 而对于简单的选择题,从有限选项中选择也会提高正确率。
- 更有意思的是多跳推理题。有时候上下文提供了部分关键信息,模型能够结合自身知识进行推理。比如问“谁是第一个登上月球的美国宇航员?”,即使上下文只提到“阿姆斯特朗是阿波罗11号任务的指挥官”,模型也可能通过预训练知识推断出正确答案。
从“充分上下文”到系统改进:RAG中的深度探索
在理解了大模型的行为模式后,那么,能不能进一步探索如何利用这些发现来改进RAG系统?论文的作者他们提出了一个核心问题:既然知道了上下文的充分性如此重要,那么,能否构建一个自动化的机制来判断上下文是否充分,并据此来指导模型的回答策略?这就面临下一个核心问题:如何让自动判断上下文是否充分?
这个问题看起来就毫无头绪。就像我们人类,面对同一个问题和上下文,不同的人可能会有不同的判断。比如问:“特斯拉2024年第一季度的营收是多少?”,给出上下文:
特斯拉公布2024年第一季度财报:
- 营收同比下降9%
- 毛利率为17.4%
- 交付量达到38.6万辆
有人可能认为这个上下文不充分,因为没有给出具体的营收数字。但也有人可能认为通过同比下降9%,如果知道去年同期数据,是可以算出具体数字的。
好在论文作者们没有放弃,他们搞了一些实验,得到如下的一些自动评估方法:
- 使用Gemini 1.5 Pro配合精心设计的提示词。这种方法在人工标注的测试集上达到了93%的准确率,显示出了最好的表现。
- 使用FLAMe(一个24B参数的评估模型)。虽然模型相对较小,但通过将长文本分块评估的策略,也取得了不错的效果。
- 使用传统的蕴含关系判断模型TRUE-NLI。这种方法的特点是需要参考标准答案,实用性相对较差。
从实验结果来看,大模型确实能够相当准确地判断上下文是否充分。这为我们构建更智能的RAG系统打开了一扇门。
选择性生成:让模型学会“有所为有所不为”
上面我们提到了:模型既然在信息不充分的时候,可能回答错误。那么,顺理成章的想法就是:能否让模型在上下文不充分时,主动选择不回答问题?
这个想法听起来很自然,但实现起来好像并不容易。因为如前所述,即使在上下文不充分的情况下,模型有时也能给出正确答案。如果简单地让模型在上下文不充分时都拒绝回答,反而会损失这部分正确答案。
为了能够达到这个目的,论文作者们设计了一个方案计算如下的两个结果:
- 上下文是否充分的判断结果
- 模型对自己答案的确信度评分
也就是说,对于每个问题,他们会:
- 用FLAMe模型判断上下文是否充分
- 让主模型生成答案和确信度
- 将这两个信号输入到一个简单的逻辑回归模型中
- 根据逻辑回归的预测分数决定是否输出答案
这个方案的高明之处在于:它不是简单地依据单一因素做决定,而是学习了在什么情况下模型更容易给出正确答案。比如,即使上下文不充分,如果模型的确信度特别高,可能也值得冒险输出答案。
论文中的实验结果显示,这种方法能在保持一定回答覆盖率的同时,将正确答案的比例提高2-10%。这个提升看似不大,但考虑到基线系统已经相当强大,这样的改进仍然很有意义。
微调之路:事情没那么简单
除了在推理阶段加入控制机制,作者也尝试了另一个直观的想法:能否通过微调让模型天生就更懂得在上下文不充分时保持谨慎?
他们设计了三种训练数据混合策略:
- 保持原始答案不变
- 随机选择20%的样本,将答案改为“不知道”
- 选择20%上下文不充分的样本,将答案改为“不知道”
然而,实验结果有出人意料了。虽然微调后的模型确实会更多地说“不知道”,但这似乎是以牺牲某些场景下的表现为代价的。比如,有些原本能正确回答的问题,现在模型反而选择了放弃。从这里我们可以看出:模型行为的改进并不是简单的“多说不知道”就行了,而是需要在各种场景下都保持合理的判断。
这项工作不仅能让我们更好地理解RAG系统中的行为模式,也给改进RAG系统提供了一些新的思路:
- 在构建RAG系统时,除了关注检索的相关性,还应该评估上下文是否充分。可以考虑:
- 使用自动评估工具(如FLAMe)判断上下文充分性
- 在检索时增加迭代策略,当上下文不充分时尝试检索更多信息
- 设计更好的提示词,引导模型在上下文不充分时主动说“不知道”
- 在评估RAG系统时,应该分层次看待性能:
- 上下文充分时的表现
- 上下文不充分时是否能合理拒答
- 即使上下文不充分,利用预训练知识作答的准确率
- 选择合适的基座模型:
- 如果任务要求高准确率,专有模型在有充分上下文时表现更好
- 如果希望模型在信息不足时更谨慎,可能需要额外的机制来约束模型行为
从“能用”到“好用”的还有一段路要走
还记得文章开头我们提到的困扰吗?“明明提供了相关上下文,为什么模型还是会出错”。通过这篇论文,我们似乎找到了一些答案:上下文不只是要相关,还要充分;模型不只是要会用上下文,还要懂得合理取舍。
就像我们人类在回答问题时,有时会说“让我查查资料”,有时会说“这个我知道”,有时会说“抱歉,我没有足够的信息来回答”。
那 RAG 系统能否更加智能一点呢?想象一下,如果你的大模型不只会判断手上的资料够不够用,还能主动告诉你:“这个问题要回答准确的话,我还需要知道XX和YY”,是不是会更贴心?或者更进一步,它能说:“基于目前的信息我只能给出一个大致的答案,如果你需要更准确的信息,我建议查看最新的XX”,这样的体验是不是会更好?
如果要实现这些yy 的功能,需要我们在“充分上下文”的基础上继续探索。比如:
- 在检索阶段,不只是找相关的文档,而是要理解问题需要哪些具体信息点,有针对性地进行检索。
- 在回答阶段,不只是决定说还是不说,而是要能够进行信息完整性的评估,给出恰当的限定语和建议。
- 在交互阶段,不只是被动地接受上下文,而是要能主动询问,逐步完善必要的信息。