跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

RAG 系统中数据量对问答效果的影响及优化方案

探讨了 RAG 系统中数据量与问答效果的关系。实验表明,单纯增加数据量可能导致检索退化,使准确率下降。这是因为传统 Bi-Encoder 检索仅计算相似度而非相关性,容易受噪声干扰。解决方案是采用两阶段检索框架:第一阶段利用 Bi-Encoder 快速召回候选集,第二阶段使用 Cross-Encoder 进行精细化重排。该方案有效解决了数据干扰问题,实现了数据越多效果越好的目标,并为后续优化如切片策略、多路召回等提供了方向。

星辰大海发布于 2025/2/6更新于 2026/7/2138 浏览
RAG 系统中数据量对问答效果的影响及优化方案

RAG 系统中数据量对问答效果的影响及优化方案

当我们构建一个知识库问答应用的时候,总是希望知识库里面灌的数据越多,问答的效果越好。事实真是如此吗?本文将深入分析数据量如何影响 RAG(Retrieval-Augmented Generation)系统的问答效果,并讨论如何优化这一系统以适应不断增长的海量数据。

引言

在人工智能问答系统的发展中,RAG 技术以其独特的检索增强生成方式,为减少大模型幻觉开辟了新的天地。然而,在实际落地过程中有一个很大的疑问:RAG 系统,数据越多效果越好吗?

大型语言模型(LLMs)已经展现出了强大的能力,但在实际应用中仍面临很多挑战,如模型幻觉、知识更新缓慢以及答案缺乏可信度等。LLM 虽然是在非常庞大的数据集上训练的,但并不是在您的私有数据上训练的。检索增强生成(RAG)通过将您的数据链接到 LLMs 来解决这个问题。

RAG 是一种将知识检索与生成模型相结合的技术,可以提高问答系统的准确性和相关性。它通过从外部知识源中动态检索信息,并将检索到的数据作为参考来组织答案,从而能有效缓解 LLM 中存在的幻觉问题。

RAG 系统架构

RAG 的工作流程主要包含三个核心模块:

1. 索引(Indexing)

文本索引的构建包括以下步骤:文档解析、文本分块、Embedding 向量化和创建索引。

  • 文档解析:先将不同格式的原始文件解析转换为纯文本。
  • 文本分块:把文本切分成较小的文本块(Chunks)。
  • Embedding 向量化:通过 Embedding 模型为每一个文本块生成一个向量表示,用于计算文本向量和问题向量之间的相似度。
  • 创建索引:将原始文本块和 Embedding 向量以键值对的形式存储,以便将来进行快速和频繁的搜索。

2. 检索(Retrieval)

使用 Embedding 模型将用户输入问题转换为向量,计算问题的 Embedding 向量和语料库中文本块 Embedding 向量之间的相似度,选择相似度最高的前 K 个文档块作为当前问题的增强上下文信息。

3. 生成(Generation)

将检索得到的前 K 个文本块和用户问题一起送进大模型,让大模型基于给定的文本块来回答用户的问题。

数据量对于问答效果的影响

从宏观层面来看,RAG 包含两个核心的要素:数据和系统。RAG 的应用场景非常多,包括文档助手,智能客服机器人,领域/行业知识库问答等。不同的应用场景优化的侧重点可能有所差异。

对于文档助手这类应用来说,数据是已知的,上传几篇文档就针对这些文档来问问题。我们几乎不用关注数据侧的事情,把精力放在优化系统就可以了。

而对于领域/行业知识库问答来说,需要从数据侧和系统侧同时优化。因为如果用户问题回答不上来,有可能是没相关数据,也有可能是有数据但 RAG 系统没找到。

数据侧的优化很'简单',就是尽可能多的收集领域内相关的数据,通通灌进知识库里面。但是,请先别着急!在开始组织人力收集整理数据之前,我们首先得弄清楚一件事情:RAG 系统,数据越多,效果越好吗?

如果答案是肯定的,意味着:

  • 海量数据放心灌:可以一批一批地往知识库中加数据,不用担心数据量太大相互干扰导致效果不佳。
  • 快速迭代快速优化:对于上线之后的 badcase,业务侧可以直接通过加相应数据来快速迭代优化。
  • 降低数据成本:收集和整理的成本,不用费劲心思去做数据去重和脏数据的处理。
  • 增加系统的稳定性:如果我加的数据不相关,问答的效果不一定会变好,但是起码能保证以前的效果不会变差。

反之,那工作量可就大了。

实验:数据量对于问答效果的影响

以教育领域的知识库问答为例,我们基于 RAG 做了一个升学百科问答的应用,专门解答用户关于高考升学规划和志愿填报政策相关的问题。

升学百科问答不是给定数据,给定问题,然后只需要去优化算法或者系统的 Benchmark 任务。它的问题是开放的,数据也是开放的(你可以收集到尽可能多的相关数据来提升问答的效果)。所以优化的变量就多了一个:系统是一部分,数据也是一部分。问答效果的好坏不光取决于好的 RAG 系统,还取决于你的数据量够不够,覆盖的知识全不全?如何优化 RAG 能让它完全发挥出海量数据的价值是我们研究的重点。

关于数据量对 RAG 问答质量的影响,我们在升学百科问答项目中做了比较详细的研究。实验设置如下:

  • :收集了 176 个升学百科相关的问题,包括升学路径、志愿填报、选科等相关政策咨询问题。
用户问题
  • RAG 系统:一个经典的 RAG 系统,包括文本解析切片,embedding 向量化建库,检索相关片段,语言模型总结问答等模块。
  • 领域数据:我们收集了海量升学规划相关的资料来验证数据的问题,包括教育领域的互联网数据,书本资料,FAQ 问答对等。
  • 结果:检索退化问题

    我们分批往 RAG 知识库中灌入数据,每加一批数据都做一次评测,观察随着数据量变大,问答效果的变化情况:

    1. 迎来上涨:第一批数据加入后问答正确率有 42.6%,此时有一些问题没回答上来是因为确实缺少相关资料。继续加数据…
    2. 显著提升:第二批加了更多数据,覆盖知识范围更广。准确率提升到了 60.2%,提升非常明显,看来加数据确实还是挺有用的。
    3. 坏消息:当加入第三批数据的时候,我们最担心的事情还是发生了。正确率急剧下降,跌了将近 8 个百分点。

    到这里,我们的问题有了答案,不是所有的 RAG 系统都能保证:数据越多,效果越好。海量数据有可能会把 AI 喂吐,随着数据的增多,数据之间可能会有相互干扰,导致检索退化的问题,影响问答的质量。

    具体问题具体分析

    先抓一个典型看看,大连医科大学怎么样?这个问题在 v2 版本(加入第三批数据前)是能回答对的,v3 版本(加入第三批数据后)回答错了。看了一下送到 LLM 的文本片段,居然全部都是大连理工大学相关的信息。

    问题分析:主要原因是第三批加入的某些文档中恰好有大连理工大学 xxx 怎么样?的句子,和 query 大连医科大学怎么样?表面上看起来确实非常像,Embedding 给它打了比较高的分。而类似大连医科大学师资介绍这样的片段相关性就稍微低了些。而 LLM 输入 token 有限制,前面两个最相关但是实际并不能回答 query 问题的片段就已经占满了 token 的窗口,只能把他俩送进 LLM 里。结果可想而知,啥都不知道。

    语义检索:相似≠相关

    文本片段与 query 的相似性和文本片段是否包含 query 的答案(相关性)是两回事。RAG 中一个非常重要的矛盾点在于检索召回的片段比较多,但是 LLM 输入 token 是有限制,所以必须把能回答 query 问题的片段(和问题最相关)给 LLM。

    Embedding(Bi-Encoder)

    Embedding 也可以给出一个得分,但是这个得分描述的更多的是相似性。Embedding 本质上是一个双编码器,两个文本在模型内部没有任何信息交互。只在最后计算两个向量的余弦相似度时才进行唯一一次交互。所以 Embedding 检索只能把最相似的文本片段给你,没有能力来判断候选文本和 query 之间的相关性。但是相似又不等于相关。

    从某种程度上,Embedding 其实就是在算两个文本块中相似字符的个数占比,它分不清 query 中的重点是大连医科大学,在它看来每个字符的重要性都是一样的。

    Rerank(Cross-Encoder)

    Rerank 本质是一个 Cross-Encoder 的模型。Cross-Encoder 能让两个文本片段一开始就在 BERT 模型各层中通过 self-attention 进行交互。它能够用 self-attention 判断出来这个 query 中的重点在于大连医科大学,而不是怎么样?。所以,大连医科大学怎么样?这个 query 和大连医科大学创建于 1947 年… 更相关。

    Cross-Encoder 这么好,为什么不直接用?

    因为速度慢。这里说的速度慢不是 cross-encoder 的模型比 bi-encoder 的模型速度慢。关键在于 bi-encoder 可以离线计算海量文本块的向量化表示,把他们暂存在数据库中,在问答检索的时候只需要计算一个 query 的向量化表示就可以了。拿着 query 的向量表示去库里找最相似的文本即可。

    但是 cross-encoder 需要实时计算两个文本块的相关度,如果候选文本有几万条,每一条都需要和 query 一起送进 BERT 模型中算一遍,需要实时算几万次。这个成本是非常巨大的。

    所以,我们可以把检索过程分为两个阶段:召回(粗排)和重排。

    • 第一阶段:目标是尽可能多的召回相似的文本片段,这个阶段的文本得分排序不是特别靠谱,所以候选的 topK 可以设置大一些,比如 topK=100;
    • 第二阶段:目标是对 100 个粗排的候选文本片段进行重新排序,用 cross-encoder 计算 100 个候选文本和 query 的相关度得分;

    两阶段检索结合可以兼顾效果和效率。

    两阶段检索在 RAG 中的实践

    我们对上面升学百科中的文本片段用 Rerank 模型再做一次排序,重排序后的结果更加合理,和人的感受基本上是一致的。重排序之后送进 LLM 窗口内的文本和 query 是最相关的,语言模型也能轻松根据相关信息回答出问题,再也不会说不知道了。

    在数据不变的情况,两阶段检索问答准确率有明显提升,这个结果再次证明了一阶段检索中存在数据互相干扰的情况。两阶段检索可以最大化的挖掘出数据的潜力,我们继续加数据,效果能够稳定提升。

    两阶段检索最大的意义在于让'数据越多,效果越好'变成了现实。这是在准备开始优化一个 RAG 系统之前要确保的第一件事情。

    未来展望与优化方向

    两阶段检索是一个大的框架,给 RAG 提供了一个好的基础。未来可以在两阶段的基础上做更多细致的优化。这里有一些想法,贴出来和大家一起探讨:

    1. 切片策略(Chunking Strategy):切片策略对检索召回的影响非常大。目前主流的切片策略还比较机械(如固定字符数),经常造成一些信息的损失。未来可能会出现更加智能的切片方式,例如基于语义完整性或递归字符分割。
    2. 多路召回(Multi-Path Recall):可以在 embedding 检索的基础上增加 BM25 检索,或者通过 LLM 改写 query 的方式生成多个检索 query 增加召回率。混合检索(Hybrid Search)往往能取得更好的效果。
    3. 意图分类(Intent Classification):不同的问题走不同的知识库,或者用不同的处理逻辑。例如,事实性问题走精确检索,开放性话题走生成式检索。
    4. Agent 集成:基于文档的问答能做的事情非常有限,Agent 和 RAG 结合起来可以做更多事情,例如工具调用、代码执行等。
    5. 查询重写(Query Rewriting):利用 LLM 对用户问题进行澄清或扩展,使其更适合向量检索。
    6. 反馈机制:引入用户反馈循环,根据点赞/点踩数据微调检索模型或 Rerank 模型。

    总结

    RAG 系统并非简单的数据堆砌。随着数据量的增加,检索退化(Retrieval Degradation)现象会导致问答效果下降。这主要是因为传统的单阶段向量检索(Bi-Encoder)无法准确区分'相似'与'相关'。通过引入两阶段检索框架,即先用 Bi-Encoder 进行大规模召回,再用 Cross-Encoder(Rerank)进行精排,可以有效解决这一问题。这种架构使得系统在数据规模增长时仍能保持稳定的高质量输出,是实现企业级知识库问答的关键路径。

    目录

    1. RAG 系统中数据量对问答效果的影响及优化方案
    2. 引言
    3. RAG 系统架构
    4. 1. 索引(Indexing)
    5. 2. 检索(Retrieval)
    6. 3. 生成(Generation)
    7. 数据量对于问答效果的影响
    8. 实验:数据量对于问答效果的影响
    9. 结果:检索退化问题
    10. 具体问题具体分析
    11. 语义检索:相似≠相关
    12. Embedding(Bi-Encoder)
    13. Rerank(Cross-Encoder)
    14. Cross-Encoder 这么好,为什么不直接用?
    15. 两阶段检索在 RAG 中的实践
    16. 未来展望与优化方向
    17. 总结
    • 免费图片AI生成工具免费生成了解详情
    • Magick API 一键接入全球大模型注册送1000万token查看
    • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
    • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
    • 100+免费在线小游戏爽一把
    极客日志微信公众号二维码

    微信扫一扫,关注极客日志

    微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

    更多推荐文章

    查看全部
    • 基于Python的高校毕业生招聘信息推荐系统设计与实现
    • Naiz AI:从语义到像素,全链路重构视频本地化
    • 基于 Python 的淘宝商品数据爬取与可视化系统
    • Llama-2-7b 在昇腾 NPU 上的六大核心场景性能基准测试
    • LeetCode 290. 单词规律:多种解法与性能对比
    • Spring AI 实战指南:核心接口、消息类型与流式输出详解
    • 用两个栈模拟队列:LIFO 到 FIFO 的转换实现与原理分析
    • 开源 IPTV 播放器 IPTVnator 功能与使用指南
    • Java 图形界面编程:AWT 基础与组件体系
    • ToClaw:从聊天工具到可执行任务的数字助理
    • Linux lsof 命令常用用法与实战指南
    • SparkAi 创作系统:AI 大模型、绘画与视频生成一站式方案
    • Git:如何将一个分支的特定提交合并到另一个分支
    • Java Stream API 并行流中的副作用陷阱与顺序敏感操作
    • 海螺 AI 多模态架构解析与 Python 接入指南
    • Qwen-Image-2512 V2 整合包部署指南:ComfyUI 与 WebUI 支持
    • 海螺 AI 多模态架构解析与 API 接入指南
    • 海螺 AI 多模态架构解析与 API 接入指南
    • 从零开始搭建 Trae 的 Java 开发环境
    • 论文精读:利用人类反馈强化学习对齐语言模型

    相关免费在线工具

    • 加密/解密文本

      使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

    • RSA密钥对生成器

      生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

    • Mermaid 预览与可视化编辑

      基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

    • 随机西班牙地址生成器

      随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

    • Gemini 图片去水印

      基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

    • curl 转代码

      解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online