这道题其实问的是,怎么让大模型在不重训的情况下,能回答实时、专业、可溯源的问题。[[RAG]]的核心思路很简单:不把知识全塞进模型参数里,而是动态拉取相关文档作为上下文,让模型基于检索结果来生成。你可以把它理解成给模型配了个外挂知识库,模型负责推理和表达,知识库负责提供事实。
具体架构分三块:索引模块、检索模块、生成模块。先说索引,离线阶段要把原始文档切成小块,然后用 [[Embedding]] 模型转成向量存到 [[Vector Database]] 里。这里有个关键取舍:切分策略直接影响召回质量。固定长度切分最简单,但容易把完整语义砍断;语义切分虽然准,但计算成本高。我一般先按段落切,对超长段落再用[[滑动窗口]]重叠处理,这样既能保留上下文,又控制单块长度。另外,纯向量检索对关键词不敏感,比如搜“退款政策”可能因为语义偏差召不回“退货流程”,所以生产上我倾向 [[Hybrid Search]],把向量检索和 [[BM25]] 关键词检索结合起来,再通过 [[Rerank]] 模型做最终排序。
工作流程分两步走。离线准备阶段,文档切分、向量化、入库,这部分可以离线跑。在线查询时,用户问题先向量化,到向量库做[[近似最近邻]]搜索,取 Top-K 块,然后把这些块和原始问题拼成一个 Prompt,喂给大模型生成答案。这里有个常见失败场景:检索回来的文档质量差,或者和问题不相关,模型就会基于错误上下文胡编。所以我会在检索后加一道置信度过滤,如果 Top-K 的相似度分数普遍低于阈值,就降级处理,比如告诉用户“知识库没有相关答案”,而不是硬生成。
相比纯生成模型,RAG 的优势很明显。最核心的是知识实时更新,知识库改一条记录,下次查询就生效,不需要重新训练。其次是可溯源,模型引用了哪几段文档能展示给用户,方便审计和调试。但和微调比,RAG 不是万能的。微调适合让模型学会特定风格或复杂推理模式,比如把公司内部术语的表达方式固化下来;而 RAG 适合高频更新、需要引用外部事实的场景,比如客服的退款政策、电商的满减规则。真正落地往往是 RAG 加微调一起上,RAG 负责事实,微调负责表达。
不过 RAG 也有前提和风险。知识库本身的质量决定天花板,如果文档本身有错、过期、或者切分不合理,检索结果就会带偏模型。另外,检索延迟和精度要平衡,Top-K 取太多会让 Prompt 过长,影响模型推理速度和效果。上线我会特别关注 [[RAGAS]] 评估指标,比如上下文精度和召回率,定期用一批标注 query 做回归。
还有一个进阶方向是 [[Self-RAG]],让模型在生成过程中自己判断是否需要检索、检索结果是否可信,而不是每次都无脑拼接。这能进一步减少噪声引入,但实现复杂度也更高。
所以整体上,我把 RAG 看作一个工程系统,核心是在检索质量和生成质量之间做取舍。我更倾向先用混合检索加重排保证召回精度,再通过置信度过滤和降级策略兜底,而不是一味堆高检索召回率。