RAG 全链路:让模型用上可靠的外部知识
从知识库构建到检索、重排、生成与评测,系统掌握检索增强生成的工程全貌
- 搞懂 RAG 解决什么问题,以及它和微调的分工
- 掌握切分、嵌入、向量检索、混合检索与重排
- 掌握生成阶段的引用约束与幻觉抑制
- 会用召回率、命中率这类指标定位 RAG 问题
RAG = 先检索,再让模型基于资料作答
RAG(Retrieval-Augmented Generation,检索增强生成)的思路很直接:不把知识硬塞进模型参数里,回答问题前先从知识库「查出」最相关的资料,连同问题一起丢给模型,让它基于资料回答,还要标注出处。它专门解决三类问题:知识过时、私有知识缺失、以及无依据的幻觉。
需求是“要接入新的/私有的事实类内容、得能随时更新、还要可溯源”→选 RAG;需求是“改说话风格、定输出结构、要稳定的输出模式/格式”→可以考虑微调或者写提示词。 两者不互斥。但事实性知识优先用 RAG,原因很直接:能更新、可追溯、成本低。
2.1 离线:知识库构建流水线
数据清洗:去重、去噪、统一编码、抽取正文(去掉导航、广告、页眉页脚)。 把长文档切成适合检索与阅读的块,叫切分(Chunking)。块太大稀释主题,块太小丢失上下文。常见按段落/标题层级切分,保留一定重叠(overlap),同时附带元数据(来源、标题、章节、时间)。 用嵌入模型把每个块编码成向量,叫嵌入。 写入向量数据库并建立索引,同时保留原文与元数据。
切分文档时比较合理的做法是?
切分策略的权衡
固定长度切分简单,但可能切断语义;按标题、段落的结构化切分,效果更好。表格、代码、FAQ(常见问答)这类内容,一般得用专门的切分方式。
小块检索更精准,但生成时上下文不够,所以行业里常用「小块检索、大块回填」的思路:先用小块定位到目标内容,再把它所属的父段落、相邻块一起拿给模型。块和块之间留10%~20%的重叠,就是为了避免关键句正好被切在块的边界上。
2.2 在线:检索、混合检索与重排
用户提问后,先把问题编码成向量做相似度检索(通常是余弦相似度),取 Top-K 候选。纯向量检索擅长语义匹配,但对精确关键词(专有名词、错误码、型号)可能不敏感,因此生产系统常用混合检索:向量检索 + 关键词检索(如 BM25)取并集。
重排(Rerank):初检索召回的块多,排序也不一定准。用更精细的交叉编码器或大模型,给“问题—候选块”逐一打分重排,只把最相关的少数块放进上下文,能明显提升命中率、省上下文空间。
真实用户的问题通常口语化,还带指代。检索前先让模型做查询改写或扩展——补全指代、生成同义检索词、拆分子问题,多路检索完再合并,召回率能提一大截。
2.3 生成:约束模型“基于资料、给出出处”
把检索块编好号放进提示里,规则直接说死:只能用给的资料回答;资料不够就直接说“根据现有资料无法确定”,不许瞎编;引用要标来源编号。就这么把“开放问答”改成“带开卷资料的问答”,幻觉概率能降很多。
多来源信息矛盾时让模型并列说明。带时间的知识优先最新。检索为空时走兜底:澄清问题、转人工或扩大检索范围,别硬答。
知识库中没有相关资料时,最符合 RAG 设计原则的行为是?
2.4 RAG 怎么评测:把问题定位到具体环节
RAG 出问题别笼统说“答得不好”,得分层定位:
检索阶段:看两个指标——命中率/召回率(判断相关块有没有被召回)、MRR/NDCG(看相关块是不是排在前面)。生成阶段:看三个指标——答案忠实度(有没有忠于检索资料,会不会臆造内容)、答案完整度、引用正确率。端到端:人工或者用更强的模型按标准打分,统计端到端正确率。
召回不到 → 改切分/嵌入模型/查询改写/混合检索;召回到了但排序差 → 加重排;检索都对但答错 → 改生成提示、约束引用、调整放入的块数。不做分层评测就盲目调参,是 RAG 项目最常见的低效原因。
2.5 进阶:Agentic RAG 与工程化要点
单次检索不够用的时候,可以让 Agent 自己判断要不要检索、检索几次、用什么关键词,甚至要不要查工具或者数据库,形成多轮检索—推理的循环,这就是 Agentic RAG。它的能力更强,但复杂度、延迟和成本也更高,得给更严格的工具权限和终止条件,避免出现无限循环。
工程化还要关注:知识库增量更新与失效删除、权限隔离(用户只能检索到有权看的内容)、embedding模型升级后的全量重建、检索与生成的全链路日志(便于复盘每一次答错到底错在哪一环)。
资深工程师加餐
底层原理 · 大厂视角 · 工程经验,点卡片展开
把大量资料全塞进窗口并不等于模型都用得上:研究普遍发现模型对开头和结尾的信息最敏感,长上下文中段的内容容易被忽略(lost in the middle)。实践上应把最相关的证据放在首尾、控制无关噪声、对检索结果按相关度重排而不是无脑拼接,必要时分段提炼。窗口大是能力上限,「放什么、放哪」才是效果下限。