Files
SuperBizAgent-java/mvp/issues/ISS-001-duplicate-retrieval.md
T

83 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`