第 3 章 — 检索增强生成
《LLM Primer V: Building Real-World LLM Applications》 章节走读的第三篇。这一章走完 RAG 管道,顺带把 “在你最爱的十份文档上跑得漂亮的 demo” 和 “接触到真实语料还能活下来的系统” 分开。
这一章为什么存在
基础模型知道的,就是它训练语料里看过的那些,别的不知道。你要造的产品几乎肯定需要模型对训练语料之外的东西做推理 —— 内部文档、上周的工单、这位客户的下单历史、今早刚发布的一条政策。检索增强生成就是把这道缝合上的工程学科:在 query 到达时,从记录系统里取出相关材料,格式化进 prompt,让模型基于它去生成。朴素版本是一次 embedding 加一次 top-k 查找。生产版本是一条带切分策略、query 变换、混合打分、重排、评估回路的管道。第 3 章从头到尾走这条管道,再走那些把 demo 管道变成一次部署的技巧。
3.1 五阶段管道与混合检索
最小 RAG 管道有五个阶段,而每一段都以事后看很明显的方式跟其他段互相影响。加载器保住结构 —— 标题、章节路径、时间戳、来源 URL、访问控制标签 —— 因为下游能用什么,全看加载器留了什么。切分器沿着文档天然的纹路切,不是按一个任意的 token 数切。embedder 把 chunk 投影进一个几何完全由 embedding 模型训练分布决定的向量空间。检索器找最近邻。生成器被喂进检索到的上下文,而框架的说法要紧:“只根据下面的上下文回答,否则就说 ‘我没有这方面的信息’” 是生产 RAG 里最有效的减幻觉写法。纯稠密检索懂改写但错过精确标识符;词法检索抓得住标识符但错过语义;混合检索,用 Reciprocal Rank Fusion 融合,把两种效果都拿到,再叠一个交叉编码器的重排器对融合后的 top-50 做重排,还能再拿到十到二十个百分点的精度。
3.2 切分决定质量的生死
“每 500 token 切一刀,50 token 重叠” 这个默认值,在惊人比例的通用语料上有用,在几乎每一份专业语料上都失效。结构化切分器沿 HTML 或 Markdown 按标题级别走,每一个叶子节都发出一个 chunk,并把祖先标题的面包屑作为前缀写进去。父子切分器为了检索精度用小的子 chunk 做 embedding,但每一次命中都会先扩到它所在的父段再交给生成器,把 “检索单元” 和 “上下文单元” 解耦。语义切分器沿一段句子级 embedding 序列走,在话题切换的地方切。组合起来 —— 先结构、再对长段内做语义切分 —— 这两种模式就能覆盖真实语料里几乎每一种源类型。而每一个 chunk 都要带着丰富的元数据 —— 来源、URL、时间戳、标题路径、语言、可见范围 —— 因为这些字段决定了检索出来的 chunk 能不能被归因、被过滤、被系统其他部分读得懂。
3.3 query 变换、多模态与 text-to-SQL
用户的 query 很少就是最适合检索的 query。多 query 展开让模型给出几个改写,分别检索再融合。HyDE —— Hypothetical Document Embeddings —— 让模型编一个看上去合理的答案,把这个答案 embedding 去用,理论根据是答案和问题在 embedding 空间里活在不同的区域。step-back prompt 生成一个更泛化的问题,同时检索两者,让模型用泛化的框架回答具体的情况。分解把一个复合问题拆成检索器能一次处理一个的子问题。迭代检索让模型自己决定下一步要取什么 —— 这就是 RAG 到 agent 的桥。RAG 也不止于文本:CLIP 式的图文联合 embedding 空间支持多模态检索;text-to-SQL 把数据库 schema 当作检索语料,针对只读副本生成查询并带上超时。路由器按每一次 query 挑对的变换,不是把所有变换都跑一遍。
第 3 章为后面铺了什么
RAG 是众多能力里的一种。生产级助手很少只靠检索活着:它需要取出某位客户最近的订单、去另一个系统查库存、把结果汇总一下、问一个澄清问题,并且自己决定什么时候做哪一件事。给这种行为找一个自然的框架就是 agent 化 —— 模型从一组工具里挑一个,系统把选中的工具跑一遍,结果回到模型,循环下去直到任务完成。检索,在这个框架里,是 agent 能伸手拿的其中一个工具。第 4 章把这层外壳变成一个 agent:ReAct 循环、把工具 schema 当合同,以及让 agent 能跨轮次持有状态的三层记忆。
明天 — 第 4 章:AI 智能体与工具调用。那个把无状态模型变成一个追目标的行动者的循环 —— 带工具、带记忆,以及对 “跑飞了” 的行为设硬边界。