这道题问的是检索已经做对了,但生成还是烂怎么办。本质上是在考你对生成问题的诊断和系统化修复能力,不是让你背Prompt模板。很多团队一碰到输出质量差就跑去调检索,其实检索已经准了,那就得把注意力完全转到生成侧。
先说怎么定位。如果检索回来的文档明明对,但模型答得像在拼凑、逻辑断掉甚至自己瞎编,那基本就是纯生成问题。我会先排除一个常见坑:是不是上下文太长把关键信息淹没了?或者多篇文档互相矛盾?这些是上下文层面的问题,不是模型能力不够。
接下来调优,我习惯按成本从低到高走。第一步肯定是Prompt工程,零成本嘛。但不是说加一句'请基于文档回答'就完事。我通常会做三件事:一是把指令结构化,比如明确说'请分三点,每点引用原文';二是给两三个[[Few-shot]]示例,让模型看到输入输出长什么样;三是加角色设定,比如'你是严谨的客服助手',这对风格一致性帮助很大。不过Prompt有天花板,遇到复杂逻辑或长文本,它就不够用了。
第二步是上下文处理。这里有个关键点:检索回来的文档不是越多越好。文档一多,噪声就多,模型容易跑偏。我会先用 [[重排]] 模型把最相关的几篇提到前面,后面的直接截掉。如果单篇文档太长,我会用语义压缩,让大模型自己把关键句抽出来,或者用[[滑动窗口]]分段处理。多文档冲突也是个常见坑,比如一篇说退款3天到账,另一篇说5天,模型可能各取一半。我的做法是要求模型标注引用来源,比如'根据文档A,退款3天',这样冲突就能显式暴露出来。
第三步,如果Prompt和上下文都调了还是不行,那就得上模型微调。成本高,但效果直接。我会用[[LoRA]]做轻量[[SFT]],拿一批高质量QA对,专门训练模型'基于文档回答'这个能力。如果预算够,还可以上 [[RLHF]] 或 [[DPO]],针对连贯性和[[忠实度]]训练奖励模型,减少[[幻觉]]。不过微调有个前提:你的数据质量要够好,如果数据里本身有错误,模型会学歪。
最后是生成控制和后处理兜底。解码参数上,我会把temperature降到0.1到0.3,让输出更确定。后处理可以用规则或小模型检查答案是否覆盖了文档里的关键点,漏了就重试或提示。
其实还有一个方向值得关注,就是让模型自己反思生成质量,比如 [[Self-RAG]] 的思路。它不是在生成后校验,而是在生成过程中就判断要不要检索、要不要引用,动态调整。我觉得这可能是下一代[[RAG]]的方向,比静态调参更灵活。
所以整体上,我会把这个问题看成一条迭代链路:先诊断根因,再按成本从低到高尝试,每一步都要有评估指标,比如忠实度、连贯性。我更倾向于先用Prompt和上下文处理解决80%的问题,剩下20%再考虑微调。毕竟微调一次成本不低,而且维护起来也麻烦。