这道题其实问的是,怎么让大模型在对话里不瞎编。说白了,就是解决[[幻觉]]问题。幻觉分两种,一种是模型参数里根本没存这个知识,硬编;另一种是推理逻辑错了,比如算数算不对。所以我觉得核心思路就一条:让模型知道它不知道什么,然后给它工具,让它去查。
先从模型架构说起。现在主流做法是知识解耦,把语言生成和事实存储分开。比如有些模型架构会显式加个外部记忆模块,像KGLM或者RETRO那样,模型生成的时候不是全靠参数记忆,而是去查一个知识库。再一个就是[[Function Calling]],让模型自己判断什么时候该调计算器、搜索引擎或者数据库。举个例子,你问客服系统'退款金额怎么算',模型判断这是个计算任务,就调计算器,而不是自己瞎猜一个数。这里有个前提:你得给模型配好工具,还要训练它识别自己的知识边界,不确定的时候主动触发检索,而不是硬答。
训练策略这块,[[SFT]]和[[RLHF]]是重头。SFT阶段,我特别看重构造高质量的事实性数据集,每个问答对都得有明确的来源,能验证。另外,要刻意加入一些'拒绝回答'的样本,训练模型在不确定的时候说'我不确定',而不是编一个。到了RLHF阶段,奖励模型不能只看流畅度,必须加一个事实准确性维度。怎么做呢?用[[RAG]]增强的偏好数据,对比一下有检索支持的回答和纯靠参数记忆的回答,让模型学会偏好前者。
推理优化,我常用的是约束解码和自验证。约束解码就是在生成的时候,用[[知识图谱]]或者检索结果把token的生成空间限制住,比如你问'爱因斯坦的生日',模型就只能从知识库里抽日期。另一个是[[Self-Consistency]],多次采样,投票选最一致的那个。还有一个叫[[Chain-of-Verification]],先生成答案,再逐条验证每个事实点,发现不对就修正。说白了,就是生成完再跑一遍检查流程。
最后说外部知识集成,也就是RAG。这里有个关键:不是所有场景都适合RAG。高频且事实稳定的场景,比如公司内部SOP查询,我倾向预检索加缓存,减少实时检索延迟。但时效性强的,比如实时政策,那就得上实时RAG加搜索引擎API。具体到检索环节,我一般用[[Hybrid Search]],向量相似度加[[BM25]]关键字,再结合知识图谱路径。检索完一定要做[[重排]],用[[Cross-Encoder]]把噪声文档过滤掉。生成的时候,强制模型标注引用来源,这样出了问题能溯源。
不过这里有个常见的失败场景:如果文档切分没做好,检索到的片段可能不完整,导致模型断章取义。所以我会特别关注[[Chunk]]策略,比如用[[Parent Document]]方法,先切大块,再切小块,检索时用小块,生成时带上大块的上下文。这个切分粒度直接影响RAG效果,面试官如果有兴趣,我们可以深入聊聊。
所以整体上,我更倾向把RAG和微调结合起来用,而不是二选一。RAG解决知识覆盖和时效性,微调解决风格和格式对齐。真正落地的时候,这两者不是替代关系,是互补关系。