RAG 技术原理与工程落地
检索增强生成(Retrieval-Augmented Generation, RAG)是当前大语言模型应用中最主流的技术范式之一。它通过将外部知识库与 LLM 结合,让模型能够回答超出训练数据的专业问题,同时有效降低"幻觉"。
RAG 的核心流程
一个标准的 RAG 系统包含以下环节:
- 文档解析与分块:将原始文档(PDF、网页、数据库记录等)解析为纯文本,并按照一定的策略切分成小块。
- 向量化与索引:使用 Embedding 模型将每个文本块转换为向量,存入向量数据库(如 Milvus、Pinecone、Chroma)。
- 检索:用户提问时,将问题向量化后在知识库中检索最相关的文本块。
- 增强生成:将检索到的上下文与用户问题一起送入 LLM,生成最终答案。
文档分块策略
分块是 RAG 系统中最关键也最容易被忽视的环节。分块过大,检索精度下降;分块过小,上下文不完整。
- 固定大小分块:最常见方案,如每块 512 token,重叠 50 token。简单有效,适合大多数场景。
- 语义分块:基于句子边界或段落结构分块,保持语义完整性。更适合长文档。
- 递归分块:先按大段落分,若仍超出限制则递归细分。兼顾了效率和语义完整性。
- 分块大小经验值:中文文档建议 300-500 字一块,重叠率 10%-15%。
检索优化策略
基础检索往往效果不佳,以下优化手段能显著提升召回质量:
混合检索
结合稀疏检索(BM25 关键词匹配)和稠密检索(向量语义匹配),互补两者的优势。BM25 擅长精确匹配专有名词,向量检索擅长理解语义相近的表述。
重排序(Re-ranking)
初检返回 Top-K 个候选块后,使用 Cross-encoder 模型对每个候选块与问题的相关性重新打分排序,选取最终 Top-N 送入 LLM。重排序能显著提升最终答案的质量。
查询重写
用户的原始问题往往过于简短或口语化。在检索前先用 LLM 将问题改写成更完整、更具体的检索查询,可以提高向量检索的命中率。
实战踩坑记录
- Embedding 模型选型:中文场景推荐使用 text2vec-large-chinese 或 BGE 系列,MTEB 榜单可作为参考但不是唯一标准,一定要在自己数据上评测。
- 元数据过滤:不要把元数据和正文混在一起向量化。利用向量数据库的元数据过滤功能(如按时间、类别筛选)能大幅提升检索精度。
- 上下文窗口管理:检索到的文本块总长度可能超出 LLM 的上下文窗口,需要做截断和优先级排序。
- 增量更新:知识库内容更新时,不要全量重建索引,使用向量数据库的 upsert 机制做增量更新。