优化 RAG 召回质量:从文档处理到生成阶段的五大实战技巧
在金融风控等垂直行业的系统开发中,RAG(Retrieval-Augmented Generation)系统的召回准确性至关重要。一次因召回文档不准而导致的合规报告生成错误,足以让我们深刻体会到:跑通 RAG 流程或许只需三天,但将召回效果调优到生产可用,却可能需要三个月。 本文将聚焦于我们在实践中遇到的核心挑战,并分享在文档处理、召回策略和生成优化三大环节的解决方案,旨在帮助开发者构建更高效、更精准的 RAG 系统。 一、文档处理:格式兼容性决定召回上限 当知识库包含 PDF 合同、Excel 数据表、Word 需求文档等多种格式时,单一的文档加载与切分策略往往会失效。 核心问题 混合内容解析失效:PDF 中的表格与正文被分离开来,导致上下文关联丢失;图表(如架构图)在解析后可能变成无意义的乱码。 结构化数据丢失:Excel 中的关联字段或表格在向量化过程中被拆解成独立的文本片段,破坏了原有的数据结构。 解决方案:构建文档预处理流水线 针对不同格式的文档,我们建立了一套定制化的预处理流水线。 智能解析 PDF:利用 PyMuPDF 等工具,不仅提取文本,更重要的是保留表格、图片与上下文文本的空间坐标关联。这使得模型能够理解“位于第三段下方的表格”或“与该图表相关的说明文字”。 # PDF 处理示例:使用 PyMuPDF 提取图文关系 def parse_pdf_with_layout(doc): for page in doc: # 以字典形式获取文本块及其位置信息 text_blocks = page.get_text("dict")["blocks"] # 查找页面中的表格 tables = page.find_tables() # TODO: 编写逻辑,将表格与其坐标邻近的文本块关联起来 # ... 非结构化内容重组:对于图片、图表等难以直接向量化的内容,我们采用分块-重组策略。例如,将图片区域映射到其在文档中相邻的文本区块,或者直接提取图片标题和注释作为其文本描述。 元数据描述索引:对于关键的架构图、流程图等,我们放弃传统的向量化方法,转而为其建立元数据描述索引。通过人工或多模态模型生成对图像内容的详细文字描述(例如,“该图展示了一个三层应用架构,包括表示层、业务逻辑层和数据层…”),然后对这段描述文字进行索引和检索。 二、召回优化:多策略融合提升精准度 单纯依赖向量相似度搜索在复杂业务场景下存在明显缺陷。 核心问题 业务术语召回缺失:用户查询“KYC 流程”,但知识库中的官方文档使用的是“客户尽职调查”,导致因用词不同而召回失败。 相似度陷阱:查询返回的 Top-K 结果在向量空间上虽然相近,但可能内容高度重复或与查询意图无关,导致信息淹没。 解决方案:混合检索与查询扩展 我们采用多种策略组合的“组合拳”来提升召回效果。 查询重写(Query Rewriting):利用 LLM 对用户的原始查询进行扩展,生成 2-3 个同义或相关的查询。例如,将“KYC 流程”扩展为“客户尽职调查步骤”、“用户身份验证方法”等,再将这些查询的召回结果进行合并。 ...