RAG系统中的困境:上下文不是想加就能加的

发布于 2024-12-18 10:42
浏览
0收藏

“这段代码明明是对的啊,为什么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年特斯拉在中国的市值超过了哪家传统车企?

可能需要同时具备以下信息才算充分上下文: 

  1. 特斯拉2024年在中国的市值数据
  2. 主要传统车企2024年在中国的市值数据
  3. 这些数据的对比关系

那大模型如何使用上下文?

研究者基于“充分上下文”的概念,分析了各种大模型在实际场景中的表现。举个例子,假设问题是:“2024年2月举办的第96届奥斯卡最佳影片是哪部?” 

场景一:提供充分上下文 

第96届奥斯卡金像奖于2024年3月10日举行,电影《奥本海默》获得最佳影片奖...

场景二:提供不充分但相关的上下文 

《奥本海默》《巴比》《如何优雅地炸掉一艘船》等影片入围第96届奥斯卡最佳影片奖提名...

在论文中,他们研究发现,面对这两种场景,不同类型的模型表现出明显的差异: 

  • 专有模型(如Gemini、GPT)在场景一中能准确回答“《奥本海默》”。但在场景二中,它们倾向于自信地“预测”获奖影片,而不是承认信息不足。这反映出这类模型可能过度依赖自身的预训练知识。
  • 开源模型(如Llama、Mistral)即使在场景一中也表现得不够稳定,有时会产生幻觉(比如说是《巴比》获奖),有时又会过于保守而拒绝回答。这说明这些模型在整合上下文信息方面还有提升空间。

为什么模型有时不需要充分上下文也能对?

在论文中,存在一个比较有趣的发现:即使在上下文不充分的情况下,模型也能在35%-62%的情况下给出正确答案。这是不是就比较unbelievable。 

例如,假设问题是:“爱因斯坦是在哪个国家出生的?”,给出的上下文是: 

爱因斯坦在欧洲度过了他的童年时期,后来移居美国...

这个上下文并不充分,因为没有直接说明出生地。但模型可能还是会正确回答“德国”,猜测可能的原因是: 

  1. 这是一个众所周知的事实,存在于模型的预训练知识
  2. 上下文中提到“欧洲”提供了地理范围的线索
  3. “童年时期”暗示了这可能与出生地有关

研究者通过分析发现,模型在没有充分上下文时得到正确答案,主要有这么几种情况: 

  • 对于是非题,比如“爱因斯坦去过中国吗?”,即使上下文不充分,模型也有50%的机会猜对。
  • 而对于简单的选择题,从有限选项中选择也会提高正确率。
  • 更有意思的是多跳推理题。有时候上下文提供了部分关键信息,模型能够结合自身知识进行推理。比如问“谁是第一个登上月球的美国宇航员?”,即使上下文只提到“阿姆斯特朗是阿波罗11号任务的指挥官”,模型也可能通过预训练知识推断出正确答案。

从“充分上下文”到系统改进:RAG中的深度探索

在理解了大模型的行为模式后,那么,能不能进一步探索如何利用这些发现来改进RAG系统?论文的作者他们提出了一个核心问题:既然知道了上下文的充分性如此重要,那么,能否构建一个自动化的机制来判断上下文是否充分,并据此来指导模型的回答策略?这就面临下一个核心问题:如何让自动判断上下文是否充分?

这个问题看起来就毫无头绪。就像我们人类,面对同一个问题和上下文,不同的人可能会有不同的判断。比如问:“特斯拉2024年第一季度的营收是多少?”,给出上下文: 

特斯拉公布2024年第一季度财报:
- 营收同比下降9%
- 毛利率为17.4%
- 交付量达到38.6万辆

有人可能认为这个上下文不充分,因为没有给出具体的营收数字。但也有人可能认为通过同比下降9%,如果知道去年同期数据,是可以算出具体数字的。 

好在论文作者们没有放弃,他们搞了一些实验,得到如下的一些自动评估方法: 

  1. 使用Gemini 1.5 Pro配合精心设计的提示词。这种方法在人工标注的测试集上达到了93%的准确率,显示出了最好的表现。
  2. 使用FLAMe(一个24B参数的评估模型)。虽然模型相对较小,但通过将长文本分块评估的策略,也取得了不错的效果。
  3. 使用传统的蕴含关系判断模型TRUE-NLI。这种方法的特点是需要参考标准答案,实用性相对较差。

从实验结果来看,大模型确实能够相当准确地判断上下文是否充分。这为我们构建更智能的RAG系统打开了一扇门。 

选择性生成:让模型学会“有所为有所不为”

上面我们提到了:模型既然在信息不充分的时候,可能回答错误。那么,顺理成章的想法就是:能否让模型在上下文不充分时,主动选择不回答问题?

这个想法听起来很自然,但实现起来好像并不容易。因为如前所述,即使在上下文不充分的情况下,模型有时也能给出正确答案。如果简单地让模型在上下文不充分时都拒绝回答,反而会损失这部分正确答案。 

为了能够达到这个目的,论文作者们设计了一个方案计算如下的两个结果: 

  1. 上下文是否充分的判断结果
  2. 模型对自己答案的确信度评分

也就是说,对于每个问题,他们会: 

  • 用FLAMe模型判断上下文是否充分
  • 让主模型生成答案和确信度
  • 将这两个信号输入到一个简单的逻辑回归模型中
  • 根据逻辑回归的预测分数决定是否输出答案

这个方案的高明之处在于:它不是简单地依据单一因素做决定,而是学习了在什么情况下模型更容易给出正确答案。比如,即使上下文不充分,如果模型的确信度特别高,可能也值得冒险输出答案。 

论文中的实验结果显示,这种方法能在保持一定回答覆盖率的同时,将正确答案的比例提高2-10%。这个提升看似不大,但考虑到基线系统已经相当强大,这样的改进仍然很有意义。 

微调之路:事情没那么简单

除了在推理阶段加入控制机制,作者也尝试了另一个直观的想法:能否通过微调让模型天生就更懂得在上下文不充分时保持谨慎? 

他们设计了三种训练数据混合策略: 

  1. 保持原始答案不变
  2. 随机选择20%的样本,将答案改为“不知道”
  3. 选择20%上下文不充分的样本,将答案改为“不知道”

然而,实验结果有出人意料了。虽然微调后的模型确实会更多地说“不知道”,但这似乎是以牺牲某些场景下的表现为代价的。比如,有些原本能正确回答的问题,现在模型反而选择了放弃。从这里我们可以看出:模型行为的改进并不是简单的“多说不知道”就行了,而是需要在各种场景下都保持合理的判断。 

这项工作不仅能让我们更好地理解RAG系统中的行为模式,也给改进RAG系统提供了一些新的思路:

  1. 在构建RAG系统时,除了关注检索的相关性,还应该评估上下文是否充分。可以考虑:
  • 使用自动评估工具(如FLAMe)判断上下文充分性
  • 在检索时增加迭代策略,当上下文不充分时尝试检索更多信息
  • 设计更好的提示词,引导模型在上下文不充分时主动说“不知道”
  1. 在评估RAG系统时,应该分层次看待性能:
  • 上下文充分时的表现
  • 上下文不充分时是否能合理拒答
  • 即使上下文不充分,利用预训练知识作答的准确率
  1. 选择合适的基座模型:
  • 如果任务要求高准确率,专有模型在有充分上下文时表现更好
  • 如果希望模型在信息不足时更谨慎,可能需要额外的机制来约束模型行为

从“能用”到“好用”的还有一段路要走

还记得文章开头我们提到的困扰吗?“明明提供了相关上下文,为什么模型还是会出错”。通过这篇论文,我们似乎找到了一些答案:上下文不只是要相关,还要充分;模型不只是要会用上下文,还要懂得合理取舍。 

就像我们人类在回答问题时,有时会说“让我查查资料”,有时会说“这个我知道”,有时会说“抱歉,我没有足够的信息来回答”。 

那 RAG 系统能否更加智能一点呢?想象一下,如果你的大模型不只会判断手上的资料够不够用,还能主动告诉你:“这个问题要回答准确的话,我还需要知道XX和YY”,是不是会更贴心?或者更进一步,它能说:“基于目前的信息我只能给出一个大致的答案,如果你需要更准确的信息,我建议查看最新的XX”,这样的体验是不是会更好? 

如果要实现这些yy 的功能,需要我们在“充分上下文”的基础上继续探索。比如: 

  1. 在检索阶段,不只是找相关的文档,而是要理解问题需要哪些具体信息点,有针对性地进行检索。
  2. 在回答阶段,不只是决定说还是不说,而是要能够进行信息完整性的评估,给出恰当的限定语和建议。
  3. 在交互阶段,不只是被动地接受上下文,而是要能主动询问,逐步完善必要的信息。

本文转载自​芝士AI吃鱼​,作者: 芝士AI吃鱼 ​​

收藏
回复
举报
回复
相关推荐