notesArea/AI/RAG.md

RAG

RAG 全称 Retrieval-Augmented Generation,即检索增强生成,能够有效解决如下几个问题:

  1. 知识过时
    1. LLM 训练数据有时间点,比如 GPT-5 截止到 2024-06
    2. RAG 能够为大模型提供最新的知识库
  2. 增强专业性
    1. 提供或增强大模型训练数据中并不具备的专业领域知识,如金融、医疗等
    2. 有效降低大模型幻觉问题
  3. 减少训练成本
    1. 由知识库提供最新知识,从而减少重新训练大模型的需求

流程

  1. 用户上传文档作为知识库
  2. 系统对文档进行解析,将完整的文档分成大小合适的文本块
  3. 用户与 AI 进行问答
    1. 用户输入一个问题
    2. AI 从知识库中检索相关文档并召回,排序后输出到下一步
    3. 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 系统关键参数的建议

https://arxiv.org/abs/2401.17043

Scenariotop-kChunk SizeChunk OverlapRetriever
创作:创意内容生成更大,以获取多样化的知识更大,为了保持文章结构更大,为了保持语义连贯性用于语义理解的密集算法
删除:摘要适中,用于精度和召回平衡小,用于更多召回;大,用于更高精度较大,保持语义连贯性BM25 用于精确内容,Dense 算法用于更多召回
阅读:单文档 QA较大,用于重复确定适中,用于精确定位简短的答案较大,用于保持语义连贯性混合 + 重新排名,提高性能
阅读:多文档 QA更大,用于检索互补文章较大,用于文章完整性更大,用于保持语义连贯性混合 + 升级,提高性能
更新:错误修正较小,适用于高精度任务较大,为了避免打破文章结构较小的,纠错任务对语义一致性不敏感BM25 用于精确内容生成
大纲
文件