这道题其实是在问,怎么让大模型在回答问题时不再凭空编造,而是能像人一样去查资料再回答。核心思路一句话:从闭卷考试变成开卷考试,先检索后生成。
具体来说,系统架构可以拆成三个关键模块。先说索引构建,就是把外部知识库切分成小块,用 [[Embedding]] 模型转成向量存进 [[Vector Database]]。这里有个常见坑:切分策略很讲究,固定窗口切分简单但容易把语义割裂,所以落地时我通常会结合段落边界做语义切分。再看检索器,从向量库里召回 top-k 候选。现在主流做法是 [[Hybrid Search]],也就是 [[BM25]] 加向量检索,因为光靠向量对精确匹配不友好,比如订单号、错误码,关键词召回更准。还要看 [[Rerank]] 模块,用 [[Cross-Encoder]] 对召回结果精排,这一步对最终质量提升很明显,但计算开销大,所以一般只对 top-50 做重排。
再说 [[RAG]] 的三大优势。事实准确性提升,本质是给生成加了事实锚点,答案可溯源。动态更新方面,知识库和模型解耦,新文档入库就能生效,比如电商大促时满减政策变了,只需要更新知识库,不用重新训练模型。[[幻觉]]缓解方面,检索到的上下文约束了生成空间,但这里有个前提:检索质量本身得过关,如果检索失败,模型还是会幻觉。所以上线时我会特别关注检索的置信度,分数太低就触发拒答。
举一个具体的业务场景:智能客服处理退款。用户问“我的订单为什么还没退款”,系统先检索知识库里的退款流程、当前订单状态,再结合这些信息生成回答。如果知识库里没有这个订单的异常处理记录,模型可能给出通用但错误的答案。所以落地时我会设计一个兜底逻辑:当检索到的文档与问题相关性低于阈值时,直接返回“请转人工”,而不是让模型硬答。
最后说下我的取舍。我更倾向把 RAG 看作一个增强组件,而不是万能的。它的上限由检索质量决定,所以我会把精力优先放在索引构建和检索优化上,比如用 [[Parent Document]] 策略平衡块大小和上下文完整性。另外,我最近在关注 [[Self-RAG]] 这种让模型自己判断是否需要检索、检索后是否足够可信的思路,它把决策权交给模型,但代价是推理更复杂,计算量更大。我觉得这是 RAG 从固定流程走向自适应的重要方向,但落地时得权衡好延迟和准确性。