- 新增 mvp/architecture/session-dedup-knowledge-map.md - 更新 mvp/README.md 文档导航 - ISS-001 issue 关联架构文档
2.6 KiB
2.6 KiB
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
根本原因
两个层面同时缺失去重机制:
- 工具层无去重:
LookupKnowledgeTool每次独立检索,不感知调用历史,同一查询关键词必然返回同一文档 - 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.javasrc/main/resources/prompts/chat-executor-prompt.md