我觉得这道题其实在问一个很实际的问题:怎么让大模型在不知道答案的时候,还能给出靠谱的回复。[[RAG]] 的核心思路很简单,就是给模型配一个外挂知识库,需要的时候先去查一下。
先讲工作原理,分成三步。第一步是索引,把文档切碎,转成向量存到 [[Vector Database]] 里。这里有个坑,切分策略直接影响检索质量。比如客服退款场景,政策文档经常是一段话里包含多个条件,按固定长度切很容易把完整逻辑切散,导致检索时上下文不完整。我一般会先用语义切分,再结合递归切分兜底,同时保留标题、章节号这些元数据,方便后面溯源。
第二步是检索,用户问个问题,转成向量去库里找最相似的片段。这里有个常见失败场景:纯向量检索对精确数字、产品型号、错误码特别不敏感。比如用户问“订单号 12345 退款失败”,向量检索可能只匹配到“退款失败”的语义,丢了订单号这个精确信息。所以我会用 [[Hybrid Search]],把向量的语义匹配和 [[BM25]] 的关键词匹配结合起来,用 RRF 融合排序,召回率能明显提升。
第三步是生成,把检索到的片段和问题一起喂给 LLM。但检索回来的片段不一定全有用,噪声多了反而会干扰模型。所以我一定会加一层 [[Rerank]],用 [[Cross-Encoder]] 精排一下,只留最相关的 3 到 5 条,再让模型根据这些片段生成答案,并且要求它输出引用标记,方便事后核对。
说到优化,最核心的其实是检索质量。除了混合检索和重排,还有一个技巧是查询改写。比如用户问“怎么退运费”,直接搜可能匹配不到“退货补贴”这个内部说法,我会用 HyDE 先让模型假设一个理想文档,再用这个假设文档去检索,效果更好。
另外,很多人会纠结 RAG 和 [[SFT]] 怎么选。我的看法是,这不是二选一,而是互补。RAG 适合知识频繁更新、需要明确溯源的场景,比如企业 SOP 和合规文档,政策三天两头变,RAG 改个文档就行。SFT 适合学新风格、新格式,比如让模型按特定模板写报告。真正落地常常是 RAG 提供实时知识,SFT 优化生成风格,两者一起上。
最后说下落地风险。一个前提是数据质量必须高,文档本身有错、有矛盾,RAG 反而会放大错误。上线前我会特别关注两件事:一是检索延迟,高频场景下向量检索加重排可能超过 500ms,需要加缓存或者用 [[HNSW]] 索引优化;二是数据一致性,文档更新后,旧向量和旧片段要能及时清理或软删除,否则用户会看到过时信息。
还有一个点值得深入,就是怎么评估 RAG 系统的质量。光看单个环节的指标不够,比如检索的 Recall 高不一定生成就好,因为噪声多了反而有害。我倾向用 [[RAGAS]] 这类框架,从[[忠实度]]、答案相关性、上下文精度几个维度综合打分,同时做 A/B 测试,看实际场景的用户反馈。
所以整体上,我更愿意把 RAG 看作一个工程系统,核心是检索质量和数据质量,模型本身反而没那么关键。