这道题其实是在问,怎么用检索结果把大模型'拴住',不让它自由发挥产生[[幻觉]]。说白了,检索回来的内容就是事实边界,二次生成的核心就是让模型在这个框里作答,而不是靠它自己记忆去猜。
我先说提示工程这边,它属于软约束,就是靠指令让模型听话。最常用的一个手法叫引用标注,我让模型必须基于给定资料回答,每条结论后面标上出处编号,如果资料不够就明确说'根据现有资料无法确定'。这招好处是强制建立生成内容和检索片段的对应关系,万一出了问题也好溯源。还有一个优先级提示,明确告诉模型'参考资料优先于你的内部知识,冲突时以资料为准',这能缓解模型过度自信的问题。另外就是引导模型对不确定的内容用'可能''据资料显示'这类弱化表达,实在拿不准就直接拒答。
但提示工程有个问题,它依赖模型愿不愿意遵守指令,要是模型叛逆或者指令理解偏了,效果就打折扣。所以还得上硬约束,也就是从解码层面限制输出空间。比如约束解码,限制生成的 token 只能从检索内容的词汇分布里采样,或者要求生成内容的 [[embedding]] 和检索片段相似度超过某个阈值,超了就截断。再比如结构化输出,强制模型输出格式里必须包含直接引用的原句、推理链、置信度评分,这样每一步都有据可查。还有一个技巧是动态调整温度,对检索匹配度高的部分用低温度,保证事实准确;需要综合推理的地方稍微提高温度,让表达更自然。
实际落地的时候,我不会只用其中一种,而是软硬结合,再加一层生成后验证。比如拿一个 NLI 模型去判断生成内容和检索片段是否一致,不一致就拒绝输出或者重新生成。举个例子,客服场景里用户问退款政策,检索到的是满减规则,如果模型直接拿满减规则回答退款,就出幻觉了。这时候 NLI 模型就能拦住。
这里有个坑要特别注意:所有约束的前提是检索质量本身要过关。如果检索回来的内容就是错的或者不相关,你约束得再严也没用。所以我会先确保检索链路靠谱,比如用 [[Hybrid Search]] 把关键词和向量结合起来,再配合 [[Rerank]] 把最相关的片段顶上去。另外,温度调整也得小心,如果检索匹配度高的部分温度设太低,生成内容可能过于死板,像在念原文,用户体验不好。
所以我的整体思路是:把提示工程、约束生成、生成后验证三层叠起来,同时持续监控检索召回率和[[忠实度]]指标。比起花里胡哨的提示词,我更看重检索质量和硬约束的兜底能力。
说到验证,其实还有一个方向是让模型自己对自己生成的内容做自检,比如 [[Chain-of-Verification]],先生成答案,再针对答案里的关键事实生成验证问题去检索,最后对比修正。这个思路在事实密集型场景里特别有用,但开销也会翻倍,怎么平衡准确率和成本,我觉得是落地时值得深挖的点。