Files
SuperBizAgent-java/mvp/issues/ISS-001-duplicate-retrieval.md
T
zhuyongxin 2a7164288f chore(docs): 补充 ISS-001 架构设计文档到 mvp
- 新增 mvp/architecture/session-dedup-knowledge-map.md
- 更新 mvp/README.md 文档导航
- ISS-001 issue 关联架构文档
2026-07-01 18:28:19 +08:00

2.6 KiB
Raw Blame History

ISS-001 Executor 重复召回同一文档

状态:已修复(2026-06-30) 严重程度:中(影响 token 消耗和上下文质量,不影响功能正确性) 发现时间:2026-06-30 修复版本:session-dedup-knowledge-map 架构文档:会话级去重与知识域地图


现象

单次对话中 lookup_knowledge 被调用 20 次,其中"故障诊断流程规范"被重复召回约 13 次,多个文档被重复召回 3-6 次。

tool_invocation 记录(db8bfa0f):
L0 命中"故障诊断流程规范" × 13
L0+L1 命中"MySQL 数据库连接池配置" × 5
L1 命中性能类故障 × 2

根本原因

两个层面同时缺失去重机制:

  1. 工具层无去重:LookupKnowledgeTool 每次独立检索,不感知调用历史,同一查询关键词必然返回同一文档
  2. Agent 层无记忆:Executor Prompt 未要求跟踪已使用文档,LLM 每步倾向于"再确认一下",反复触发相同检索

调用链路:

Planner step 0:制定排查计划
Executor step 0:检索知识库 → 命中故障诊断流程规范
Executor step 1:继续检索   → 又命中故障诊断流程规范(不知道已取过)
Executor step 3:继续检索   → 又命中故障诊断流程规范
... (重复 13 次)

影响

  • Token 浪费:同一文档内容反复塞入上下文,多 Agent 场景尤为明显
  • 上下文窗口压缩:重复内容占用有效 token 空间,可能导致有用信息被截断
  • evidence_score 失真:tool_call_count 虚高,规则评分中"成功调用次数"被膨胀

修法方向

方案 A:Prompt 层约束(简单,优先验证)

在 chat-executor-prompt.md 中加规则:

已检索过的文档不要重复检索。每次调用 lookup_knowledge 前,
先检查对话历史中是否已有该文档的内容,有则直接使用,不再重复调用。

优点:不改代码,立即可验证
缺点:依赖 LLM 遵守指令,不保证 100% 生效

方案 B:工具层去重(可靠,推荐长期方案)

LookupKnowledgeTool 在 session 维度维护已召回文档 ID 集合,检索结果返回前过滤掉已召回的文档。

优点:彻底解决,不依赖 LLM
缺点:需要改工具代码,需要 session 级状态传递

建议

MVP 阶段先做方案 A验证效果,若重复率明显下降则保留;
若 LLM 不稳定遵守,再升级到方案 B。


相关文件

  • src/main/java/com/superbiz/agent/tool/LookupKnowledgeTool.java
  • src/main/resources/prompts/chat-executor-prompt.md