这道题其实问的是,当[[RAG]]系统效果不好时,怎么用工程化的方式定位问题,而不是靠直觉瞎调。我的思路是先把链路拆开,分别测检索和生成。
先说诊断。最直接的方法,就是拿人工精选的文档,替换掉检索模块的结果,送到生成模型里。如果生成质量明显提升,那问题基本就在检索这边,比如召回率不够或者排序有问题。如果换了人工文档还是不行,那就是生成的问题。这个验证方法很简单,但很有效。
对于检索模块,我会看离线指标,比如 Recall@K 和 MRR,对比Top-K结果和人工标注的相关文档。同时我会抽一些坏案例,看看检索结果里到底有没有答案需要的信息。如果信息都在,但模型没用上,那就不是检索的锅。
生成模块的评估,我主要看三个维度:[[忠实性]],就是模型有没有 [[Hallucination]],答案是不是基于上下文;相关性,回答是不是针对用户问题;完整性,有没有覆盖上下文里的关键点。
确认检索准确但生成差,我一般从三个方向优化。先看上下文利用。比如用 [[Rerank]] 或者上下文压缩,去掉冗余信息,把最相关的文档排前面。再一个,设计结构化Prompt,明确标注文档来源,比如'文档1说…文档2说…',让模型清楚知道每段信息的出处。还有个技巧是动态上下文窗口,根据问题复杂度调整送进模型的文档数量,避免信息过载。
再看生成模型和推理优化。如果模型本身指令遵循能力弱,可以用领域数据做 [[SFT]],强化'基于给定上下文回答'的能力。Prompt工程也很重要,比如加一句'如果上下文无法回答,请明确说明',能减少幻觉。解码策略上,我会降低temperature,让输出更稳定,或者用 [[Chain-of-Thought]] 激发推理能力。
还要看反馈闭环。收集'检索准但生成错'的样本,构建针对性训练集。比如用 [[Self-RAG]] 让模型先生成、再自检、后修正,相当于加了一层自我反思。
这里有个坑,就是上下文窗口的限制。比如你送了很多文档,但模型注意力有限,可能只关注了开头或结尾,导致关键信息被忽略。所以我会特别关注文档的排序和截断策略,上线前会用一批长尾query做压力测试,确保信息能正确传递。
总的来说,我更倾向于把诊断和优化当成一个持续迭代的过程,而不是一次性的调参。先快速定位瓶颈,再用数据驱动的方式针对性优化,这样效率最高。