All Pages Edit on GitHub

RAG

RAG, Retrieval-Augmented Generation, 是大模型应用最常见的架构之一。它通过检索外部知识,把相关内容放进上下文,再让模型生成答案。

RAG 解决什么问题

RAG 主要解决三类问题:

问题 为什么需要 RAG
私有知识 模型训练时不知道你的公司制度、内部文档、客户资料
实时变化 业务数据、政策、产品说明会不断更新
长文档 文档太长,不能全部放进上下文窗口

RAG 不等于让模型“学会”这些资料,而是在每次提问时把相关资料临时找出来,作为回答依据。

RAG 和微调的区别

方式 适合解决 不适合解决
RAG 私有知识、频繁更新、需要引用来源 固定风格、复杂格式习惯
微调 特定风格、格式、任务模式 频繁变化的事实知识
Prompt 简单任务约束和输出格式 大规模知识注入

大多数知识库、客服助手、制度问答项目,应该先做 RAG,再考虑是否需要微调。

基本流程

文档采集 -> 清洗 -> 切分 -> 向量化 -> 存储 -> 检索 -> 重排 -> 生成 -> 引用 -> 反馈

用一个例子理解 RAG

假设你要做一个公司制度问答助手。模型本身不知道你公司的制度,所以不能直接问模型“年假怎么算”。正确做法是:

RAG 的核心思想是:不要让模型凭空记忆私有知识,而是把相关知识临时放进上下文。

关键模块

模块 关注点
文档解析 PDF、网页、Markdown、Office 文档的结构保留
Chunking 切分大小、重叠、标题层级、语义完整性
Embedding 模型选择、语言支持、成本、更新频率
Vector Store 过滤、权限、混合检索、性能
Retrieval top-k、metadata filter、query rewrite
Rerank 提高召回片段排序质量
Generation 引用来源、拒答、答案风格
Evaluation 命中率、忠实度、答案质量、延迟和成本

文档进入系统前要处理什么

文档质量决定 RAG 上限。导入文档时要关注:

不要把“文档解析”当成简单读文本。很多 RAG 效果差,根源在文档进入系统时就已经乱了。

常见问题

推荐路线

Chunking 怎么做

新手可以先用这套默认策略:

判断切分好不好,不是看 chunk 数量,而是看用户提问时能不能检索到足够完整的答案依据。

Chunk 设计取舍

Chunk 太小,可能缺少上下文;chunk 太大,检索不准且浪费 token。可以用下面方式判断:

现象 可能原因 调整方向
检索到片段但回答不完整 chunk 太小或没有标题上下文 增大 chunk,保留父标题
检索结果经常不相关 chunk 太大或 embedding 区分度低 减小 chunk,优化 query
表格答案经常错 表格被切断或格式丢失 单独处理表格
法规条款引用不准 metadata 不完整 保存章节号、页码、条款号

生产系统中,chunking 往往需要按文档类型分别设计。

检索策略

策略 适合场景
向量检索 语义相似问题
关键词检索 专有名词、编号、代码、产品名
混合检索 大多数生产场景
metadata filter 权限、时间、部门、文件类型过滤
rerank 提高 top-k 排序质量

Query Rewrite

用户问题通常不等于适合检索的查询。例如用户问“这个怎么算”,如果没有上下文,检索系统很难找到资料。Query rewrite 的作用是把用户问题改写成更适合检索的形式。

常见做法:

注意:query rewrite 也可能引入错误,所以需要在评测中单独观察检索命中率。

引用和拒答

RAG 回答应该尽量带引用。引用的作用不是装饰,而是让用户能验证答案。

好的引用应该包含:

当检索不到足够资料时,系统应该拒答或说明缺少资料。不要让模型为了“显得有帮助”而编造。

RAG 评测指标

常见优化顺序

RAG 效果不好时,建议按这个顺序排查:

不要一上来就换向量数据库或换模型。先看检索结果,很多问题会很快暴露。

实战练习

实战项目

优先完成:个人知识库问答助手