这道题其实问的是,为什么[[RAG]]不能简单做成“向量检索+直接输出”,而必须让大模型再读一遍、再写一遍。本质上是想让你说清楚“找得到”和“说得对”之间的鸿沟,以及大模型在中间到底扮演什么角色。
先说准确性。向量检索看的是语义相似度,但语义相似不等于事实正确。举个例子,用户问“苹果公司2024年营收”,向量可能会把“苹果公司2023年营收”或者“苹果公司新产品发布”都召回来,因为它们在向量空间里离得近。但大模型能识别时间约束,知道2024和2023不是一回事,也能区分“营收”和“新产品”是不同实体。说白了,向量检索是模糊匹配,大模型做的是精确理解。所以光靠向量匹配直接输出,很容易答非所问。
再一个,上下文完整性。知识库里的文档被切成[[Chunk]],每个chunk是独立的片段,但原文的逻辑是连贯的。比如一句“如果用户逾期,则收取违约金”,如果只检索到后半句“收取违约金”,没有前面那个条件,回答就错了。还有指代问题,比如“该公司”在chunk里找不到指代对象。大模型的作用就是把分散的chunk重新拼起来,做跨片段的逻辑补全。这里有个坑:如果chunk切得太碎,大模型也补不回来,所以切分策略很关键,我通常会根据文档结构做语义切分,而不是固定字数切。
第三点是[[幻觉]]控制。纯靠大模型生成,容易编造,这就是Hallucination。但如果直接把检索文本当答案输出,又可能答非所问,或者信息过时、片面。RAG的做法是让大模型在检索内容的约束下生成,也就是把检索结果当事实锚点,然后用自己的语言组织能力去回答。这样既降低了虚构概率,又能保持回答的流畅和结构化。不过前提是检索质量要够高,如果召回来的本来就是错的,大模型再强也白搭。
所以落地的时候,我不会只用向量检索。实际业务里,比如客服场景问“满200减50的优惠券能不能叠加”,向量可能把“满100减20”的文档也召回来,因为都是优惠券。我会加上关键词权重,甚至用[[Hybrid Search]]把向量和[[BM25]]结合起来,再经过[[Rerank]]把最相关的顶上去。而且上线前我会特别关注chunk的边界是否合理,以及大模型会不会忽略检索内容、自己瞎编,这是常见的失败场景。
说到幻觉控制,我最近在关注一个方向:让大模型在生成时能主动判断检索内容是否足够,如果不够就触发多轮检索,而不是硬凑答案。比如[[Self-RAG]]那种思路,让模型自己决定要不要搜、搜什么。这其实又回到了[[Agentic RAG]]的范畴。
所以总结一下,我的判断是:向量检索解决“找得到”,大模型生成解决“说得对、说得通、说得完整”。两者缺一不可,但落地时得根据场景做取舍,比如对时效性要求高的场景,我会更依赖大模型自己的知识,减少检索延迟;对准确性要求高的场景,我会加强检索和重排,甚至做多轮验证。