定义
RAG(检索增强生成),从指定知识库中检索出与问题相关的信息,再将这些信息作为参考资料给大模型,让模型基于这些资料生成答案
流程
- 将长文档分割成小块
- 将每个小块转化成向量
- 将向量放进数据库,方便查询
- 根据用户问题在数据库匹配到最相关的向量
- 把用户问题和检索到的向量一起拼接成prompt
- 模型根据prompt生成答案
价值
- 提升答案的准确性
- 减轻幻觉(因为有资料依据)
- 答案可追溯(知道引用了哪些文档)
- 企业知识可控(不会泄露)
适用场景
- 知识是固定的
- 知识绝大部分可以从文档中找到答案
- 知识不可泄漏,需要引用企业内部信息
为什么RAG要做文本chunk
模型没办法直接理解整篇文章,把文档切成主题明确的小段,让模型能更精确地检索到与问题更相关的内容
为什么RAG能减轻“幻觉”
因为RAG给模型提供了真实、可引用的资料,减少模型瞎猜的机会,将模型生成过程限制在知识库内,因此能减少幻觉
RAG 在“全局总结”场景下的局限与解决方案
场景设定: 假设用户上传了 20 份 竞品的产品手册和财报(PDF格式),总字数非常多,大约有 20 万个 Token。 用户的 Prompt 是:“请阅读这些文档,总结出这几家竞品在‘定价策略’上的共同点和差异点。”
问题: 在这个场景下,普通的 RAG(检索增强生成) 模式可能会失效或者效果不好。
- 请告诉我,为什么传统的 RAG 在处理这种“全局总结类”任务时效果不好?
- 作为产品经理,你会设计什么样的技术/产品方案来解决这个问题?
原因
传统RAG是基于语义相似度top-k检索(只找出前k个最相似的切片),提问“总结全文”时,RAG系统只会到20万字文档中找与“总结”最相似的切片,面对20万字,RAG查询出来的结果可能只有1%去喂给大模型,大模型会丢失了绝大多数上下文,导致总结不仅不全,还容易以偏概全。
解决方案
- 分治汇总
让大模型并行解析各篇文档,总结各篇文档信息,再把各篇文章的总结汇总起来生成总的总结
优势:突破context限制,成本可控
- 超长上下文
跳过RAG检索,直接使用超长上下文模型进行读取处理
优势:效果最好,能找出跨文档的隐形关联
劣势:贵
如何优化RAG检索精度
- 细化文档切分
对于长文档,使用更小的切片,例如按段落、句子等进行切分,而不仅仅是按章节、大段,这样可以确保检索到更精确的内容。
如果遇到文档中包含多个主题,该如何切分?
根据主题或语义切分文档,每个切片都应该围绕一个明确的主题,这样可以帮助模型检索到更精确的内容。
- 优化向量化技术
可以使用更先进的模型(如Sentence-Bert)来生成高质量向量,而不仅是依赖传统的词向量模型(word2vec),通过更好的预训练模型来提升语义能力,更好地捕捉句子层级的语义信息。
- 引入多级检索(粗略检索+精确检索)
首先通过粗略检索获取相关文档,再通过精细检索进一步筛选,保证结果的精准度。
如何搭建RAG系统
-
搭建知识库,确保知识结构化
-
使用向量化模型将文本转化成向量存储在数据库
-
使用faiss或milvs等向量数据库进行检索
-
根据检索结果和用户问题拼接成propmt输入模型
-
运用模型生成答案返回前端
RAG数据污染与幻觉减轻
场景: 知识库里有一条错误信息(如“长征1938年结束”),导致 RAG 回答错误。 提问:
- 如何快速定位是数据错了还是模型错了?
- 在产品机制上,如何防止脏数据被采纳?
快速定位问题
- 溯源分析:查看后台日志溯源模型引用的文档切片内容
- 问题定位:
- 若是知识库切片文本错了,则问题出在数据,应该做数据清洗和质量检查
- 若知识库切片没错,但模型答错了,则问题出在模型层,应该通过调整propmt设计,或是调整模型温度,让模型更专注于信息准确性,或者考虑更换更稳健的模型
解决方案
- 多路召回+多数派裁决:从多个文档中获取信息,让模型根据多数文档一致呈现的内容来推理最终生成答案,这样可以有效稀释单个错误信息的影响
多数派裁决:通过从多个文本中提取信息,然后对比这些信息的共识,如果是出现信息冲突,模型优先参考最多的相符信息,从而减少单条错误信息对答案的影响。
- 检查阈值过滤:设置相似度阈值,如果召回的文档与用户问题的相关度低于此阈值,拒绝使用,减少模型的错误推理
- 优化模型生成过程:优化propmt设计和调整模型温度,控制模型输出的准确性和稳定性
RAG的挑战
知识库质量问题
知识库中如果存在错误或过时的信息,会直接影响到模型生成的准确性。
解决方案:
- 建立定期更新和审核流程,确保知识库中的信息时效性强且准确
- 引入自动化工具,实时检测和标记潜在的错误数据
上下文问题与长文本处理
RAG在处理长文档时,通常只能基于较短的文本切片进行检索,导致上下文丢失或信息断层。
解决方案:
采用分治策略,将每篇文档先独立总结,然后再把每个文档的总结整合成整体答案,这样可以确保上下文不丢失