链载Ai

标题: RAG系统中的困境:上下文不是想加就能加的 [打印本页]

作者: 链载Ai    时间: 昨天 11:56
标题: 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: 

特斯拉Model3是一款纯电动轿车,由特斯拉公司生产,采用了最新的电池技术...

文档B: 

2024年1月,特斯拉官方宣布Model3在中国市场的官方指导价为23.59万元起...

文档C: 

据悉,特斯拉计划在2024年第二季度推出Model3的改款版本,预计将对价格进行调整...

从相关性的角度看,这三段文本都与特斯拉Model 3有关,但它们对回答价格问题的帮助程度却大不相同。文档A虽然介绍了Model 3,但完全没有价格信息;文档B给出了明确的当前价格;文档C提到了价格会调整,但没有具体数字。 

研究者认为,我们需要一个更严格的标准:上下文是否“充分”支持回答问题。换句话说:如果基于给定的上下文能推理出一个合理的答案,那这个上下文就是充分的。在上面的例子中,只有文档B提供了充分的上下文。 

这个概念看似简单,但实际判断起来并不容易。比如对于多跳推理类的问题: 

问题:2024年特斯拉在中国的市值超过了哪家传统车企?

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

  1. 特斯拉2024年在中国的市值数据

  2. 主要传统车企2024年在中国的市值数据

  3. 这些数据的对比关系

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

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

场景一:提供充分上下文 

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

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

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

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

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

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

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

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

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

  1. 这是一个众所周知的事实,存在于模型的预训练知识中

  2. 上下文中提到“欧洲”提供了地理范围的线索

  3. “童年时期”暗示了这可能与出生地有关

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

从“充分上下文”到系统改进: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. 模型对自己答案的确信度评分

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

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

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

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

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

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

  1. 保持原始答案不变

  2. 随机选择20%的样本,将答案改为“不知道”

  3. 选择20%上下文不充分的样本,将答案改为“不知道”

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

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

  1. 在构建RAG系统时,除了关注检索的相关性,还应该评估上下文是否充分。可以考虑:






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5