最近在做一个基于RAG的客服问答Agent,遇到个头疼的问题。我的流程是:用户提问→检索Top5文档→LLM生成初步回答。但问题是,当用户问“A产品和B产品有什么区别”时,检索出来的片段往往只覆盖其中一个产品,或者两个产品的描述混在一起。Agent调用了两次检索工具,但返回的上下文太杂,LLM最后生成的结构化对比表格经常漏项或者重复。
RAG里Agent工具调用后结果太乱,怎么设计refine流程?
全部回复
共 88 条我之前做类似场景也踩过这个坑,后来是把检索结果按实体粒度拆开,先让agent分别抽A和B的关键信息,再单独喂给LLM做对比,表格就干净多了。你那个多轮检索的上下文,要不要试试在refine时加个“只保留与问题实体直接相关”的硬过滤规则?漏项的问题可能还是召回阶段没对齐,可以检查下query改写是不是把对比意图丢了。
我之前搞知识库问答也撞上过这个坑,特别能理解你说的漏项问题。后来我换了个思路,不再让Agent自己乱调工具,而是把检索结果先按实体或者主题做个预聚类,比如把提到A产品的段落和提到B产品的段落分开,再分别让LLM总结,最后才让LLM基于这两个总结去对比。这样虽然多了一步,但上下文干净多了,表格基本不会漏。另外你提到“混在一起”的情况,我怀疑是Top5的片段本身重叠度太高,可以考虑用MMR或者按句子级去重,减少冗余信息。还有个偏门方法,就是在refine的时候给LLM一个强制输出的模板,比如“产品名|功能|差异点”这种,让它填槽,比自由生成稳定很多。不过我看你流程里Agent调了两次检索,这两次的query是不是一样?如果一样的话,第二次其实意义不大,不如改成基于第一次结果的反问式检索。
我之前也踩过类似的坑,尤其是对比类问题,检索回来的片段经常是“各说各话”,LLM硬拼起来自然就乱。后来我试了个笨办法,效果还行——在第一次检索后先让LLM判断目标实体(比如A、B),再针对缺失的那个实体单独做一次定向检索,而不是靠Agent自己瞎调两次工具。你这个问题的核心其实是“refine”不知道该补什么,所以得先让模型明确缺哪块信息,再决定要不要二次检索。另外结构化对比表格漏项,我猜是prompt里没给输出格式的强制约束,试试在生成前加一步“信息核对”,让LLM先列提纲,确认覆盖所有维度再填内容。还有个细节,检索Top5里如果两个产品的片段混在一起,可以按文档来源或段落标题做聚类,把属于同一实体的内容先合并,再去喂给模型。工具调用这块,建议给Agent加个“结果去重+字段对齐”的中间层,别让原始上下文直接进LLM。你这问题挺典型的,搞定了对比类,其他复杂查询基本也就顺了。
试试按产品维度先做结果分组,再让模型逐组对比生成,漏项会少很多。
你这情况我也踩过坑,后来是把多轮工具调用的结果先丢给一个轻量级的“合并校验”prompt,强制它先列出所有提到的实体,再按实体去重补漏,最后才让主LLM生成表格。另外检索词可以拆成“A产品特性”和“B产品特性”分开查,别一把梭。漏项大概率是模型注意力被长上下文冲散了,试试把对比维度预先定义好,比如价格、适用场景,让refine阶段照着空表填,会稳很多。
试试按产品维度分组后再让LLM对比,检索结果先做实体对齐,能少很多乱码。
把两次检索结果分开缓存,让模型先各生成摘要再合并,比直接塞一堆上下文靠谱。
我之前也踩过类似的坑,后来是把“检索”和“对比”拆成两步才好转的:先让agent分别针对A、B各检一次,各自整理出要点,再丢给LLM做对比,这样上下文不会糊成一团。另外可以试试在refine提示词里明确加一条“如果某个维度只有单方信息,就标未知或跳过”,能减少瞎编。漏项那个问题,可以考虑让LLM先列出对比维度清单,再回填内容,相当于加个中间校验层,比直接生成表格稳很多。
我之前也踩过这个坑,检索回来的片段确实容易混在一起,LLM分不清哪个是A哪个是B。后来我是在检索后加了一步按实体做分组的refine,让模型先把每个产品的信息单独抽出来再对比,漏项少了很多。你那个表格重复的问题,可能是两次工具调用的结果没去重,可以试试在拼上下文前按来源或相似度过滤一下。