Files
SuperBizAgent-java/openspec/changes/archive/2026-06-30-session-dedup-knowledge-map/proposal.md
T
zhuyongxin a1c896ebda chore(docs): 归档 ISS-001 session-dedup-knowledge-map + ISS-002 mvp 文档
- 移动 session-dedup-knowledge-map OpenSpec 到 archive 目录
- 提交 ISS-001 遗留的 devflow 档案文件
- 更新 ISS-002 状态为已修复
- 新增 mvp/architecture/action-memory-relevance.md 设计文档
- 更新 mvp/README.md 文档导航
- 更新 devflow/index.md OpenSpec 链接指向 archive
2026-07-01 18:27:04 +08:00

62 lines
2.8 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.
# Proposal: session-dedup-knowledge-map
## 问题
1. **ISS-001 重复召回**:`LookupKnowledgeTool` 每次调用完全无状态,同一 session 中同一文档可被重复召回 13+ 次,浪费 token、压缩上下文窗口、导致 `tool_call_count` 虚高。
2. **Planner 缺少全局视野**:Planner 不知道知识库里有哪些域,只能靠 Executor 反复试探,导致低效的"盲目检索"模式。
## 建议方案
### Part A:工具层去重(彻底修复 ISS-001)
在 `LookupKnowledgeTool` 的 session 维度维护已召回文档 ID 集合。
每次检索时,过滤掉已召回的文档;相同 query 命中相同文档则直接跳过(返回"已在上下文中"提示)。
状态存储:`ConcurrentHashMap<sessionId, Set<docKey>>`,生命周期随 session(`SessionContextHolder.clear()` 时清理)。
### Part B:知识图谱注入 Planner
启动时(`KnowledgeIndexService.loadIndex()` 完成后),将 L0 索引中的所有 `KnowledgeEntry` 聚合为域级摘要(knowledge map)。
每次构建 Planner prompt 时(`buildChatPlannerAgent()`),将 knowledge map 注入 system prompt,让 Planner 有"知识边界"。
聚合策略:按 `category` 字段分组,生成结构:
```
available_knowledge_domains:
- domain_id: "payment"
description: "..."
covers: [...]
document_count: N
when_to_retrieve: "..."
```
知识图谱的 `description` / `when_to_retrieve` 字段来源于:
- 选项 1:直接聚合 KnowledgeEntry 的 title/summary
- 选项 2:文档 frontmatter 中新增 `domain_description` / `when_to_retrieve` 字段
- 选项 3:上传时 LLM 自动生成这两个字段
## 范围
**In scope**:
- `LookupKnowledgeTool`:添加 session 级去重状态管理
- `KnowledgeIndexService`:添加 `buildKnowledgeMap()` 方法
- `ChatService.buildChatPlannerAgent()`:注入 knowledge map 到 prompt
- `chat-planner-prompt.md`:添加如何使用 knowledge map 的指令
**Out of scope**(本次不做):
- `EvaluationService.tool_call_count` 的统计口径调整(去重后虚高问题自然消失,但评分规则不改)
- RRF 混合重排
- 文档 frontmatter 自动生成(上传时 LLM 生成,留 Phase 2)
## 风险
- Part A 引入 JVM 内存 Map,高并发时多 session 并发需线程安全
- Part B knowledge map 注入 Planner prompt 会增加每次请求的 token 消耗(固定开销)
- 文档 `category` 字段缺失或不规范时,聚合结果可能混乱
## 上下文约束
- `SessionContextHolder` 是 ThreadLocal,异步路径不安全(已知限制,Part A 需确认同步路径)
- `EvaluationService` 依赖 `tool_call_count`,去重会降低此值(是修复,不是回归)
- `KnowledgeEntry` 已有 `category` 字段,但当前数据库中的文档是否都有 `category` 需确认