RAG
RAG 全称 Retrieval-Augmented Generation,即检索增强生成,能够有效解决如下几个问题:
- 知识过时
- LLM 训练数据有时间点,比如 GPT-5 截止到 2024-06
- RAG 能够为大模型提供最新的知识库
- 增强专业性
- 提供或增强大模型训练数据中并不具备的专业领域知识,如金融、医疗等
- 有效降低大模型幻觉问题
- 减少训练成本
- 由知识库提供最新知识,从而减少重新训练大模型的需求
流程
- 用户上传文档作为知识库
- 系统对文档进行解析,将完整的文档分成大小合适的文本块
- 用户与 AI 进行问答
- 用户输入一个问题
- AI 从知识库中检索相关文档并召回,排序后输出到下一步
- AI 在召回文档的基础上增强、生成最终答案,呈现给用户
RAG 调优的关键
文档解析与分片
能否准确识别文档内容?如何切分长度合适的文本块?文本块过大难以向量化、文本块过小不利于语义理解。
文档的分片策略对最终效果的影响也十分明显,可以选择的分片策略被分为 5 个层级 。从目前来看,语义分片(Semantic Splitting,Level 4)与 Agent 分片(Level 5)效果可能更好,但是需要大模型处理原始文本,耗时过久,成本过高。而常规的字符长度分片(Level 1)可能会导致句子被切断,严重影响检索效果。
从目前实践来看,按照递归字符切换(Recursive Character Text Splitting,Level 2)通用性最好,而且效果还不错。特定类型的文件可以实现对应格式的文件切分方法(Document Specific Splitting,Level 3),比如结构化解析的文档可以根据标题层级进行切分,保证信息的完整性,以 html 类型为例,实践中一般会按照 h1 ~ h3 进行切分。
一般情况下建议的分片长度为 256 ~ 512,这个长度与我实践使用的感受相对一致,一般情况下建议在这个长度范围内进行尝试。论文中使用的重叠长度为 20,从个人经验来看,为了提升召回率和准确性,可以适当增加重叠区域,虽然这样会带来额外的存储的开销。
基于不同任务调整 RAG 系统关键参数的建议
| Scenario | top-k | Chunk Size | Chunk Overlap | Retriever |
|---|---|---|---|---|
| 创作:创意内容生成 | 更大,以获取多样化的知识 | 更大,为了保持文章结构 | 更大,为了保持语义连贯性 | 用于语义理解的密集算法 |
| 删除:摘要 | 适中,用于精度和召回平衡 | 小,用于更多召回;大,用于更高精度 | 较大,保持语义连贯性 | BM25 用于精确内容,Dense 算法用于更多召回 |
| 阅读:单文档 QA | 较大,用于重复确定 | 适中,用于精确定位简短的答案 | 较大,用于保持语义连贯性 | 混合 + 重新排名,提高性能 |
| 阅读:多文档 QA | 更大,用于检索互补文章 | 较大,用于文章完整性 | 更大,用于保持语义连贯性 | 混合 + 升级,提高性能 |
| 更新:错误修正 | 较小,适用于高精度任务 | 较大,为了避免打破文章结构 | 较小的,纠错任务对语义一致性不敏感 | BM25 用于精确内容生成 |