# ISS-001 Executor 重复召回同一文档 **状态**:已修复(2026-06-30) **严重程度**:中(影响 token 消耗和上下文质量,不影响功能正确性) **发现时间**:2026-06-30 **修复版本**:session-dedup-knowledge-map **历史架构文档**:[会话级去重与知识域地图](../../architecture/archive/2026-07-05-legacy/session-dedup-knowledge-map.md) --- ## 现象 单次对话中 `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`