# Tasks: session-dedup-knowledge-map ## T1:数据层基础 **T1-1:新增 knowledge_domain 表** ✅ - 创建 `src/main/resources/db/migration/V009__add_knowledge_domain.sql` - 字段:id、domain_id(unique)、description、when_to_retrieve(TEXT)、document_count、created_at、updated_at **T1-2:新增 KnowledgeDomain 实体和 Repository** ✅ - `KnowledgeDomain.java`:JPA 实体,对应 knowledge_domain 表 - `KnowledgeDomainRepository.java`:`findByDomainId(String)` + save --- ## T2:Frontmatter 扩展 **T2-1:Frontmatter.java / KnowledgeEntry.java 新增字段** ✅ - `Frontmatter`:新增 `List covers`、`String whenToRetrieve` - `KnowledgeEntry`:新增 `List covers`、`String whenToRetrieve` **T2-2:FrontmatterParser 解析新字段** ✅ - 解析 YAML 中的 `covers`(List)和 `when_to_retrieve`(String) **T2-3:KnowledgeIndexService 替换为 Jackson 解析** ✅ - 全量替换手写 extractJsonValue/extractJsonArray 为 `objectMapper.readValue(metadata, Frontmatter.class)` **T2-4:LookupResult 新增 message 字段** ✅ - 新增 `String message` 字段,去重时填入提示 --- ## T3:工具层去重(Part A) **T3-1:新增 RetrievedDocTracker** ✅ - `RetrievedDocTracker.java`:Spring `@Component`,`ConcurrentHashMap>` - 方法:`isAlreadyRetrieved`、`markRetrieved`、`clearSession` **T3-2:ChatService.finally 联动 Tracker** ✅ - `executeChat` / `executeChatComplex` 的 finally 块显式调用 `retrievedDocTracker.clearSession(sessionId)` **T3-3:LookupKnowledgeTool 集成去重** ✅ - 注入 `RetrievedDocTracker`,检索后过滤已召回文档,全部已召回时返回去重提示 --- ## T4:文档级 LLM 生成(Part B 文档级) **T4-1:新增 DocumentFieldEnricher + 上传时调用** ✅ - `DocumentFieldEnricher.java`:调用 LLM 生成 covers / whenToRetrieve - `DocumentManagementService.uploadDocument()` frontmatter 解析后调用 enrich - 失败时降级(covers=空列表,whenToRetrieve=summary),不阻断上传 --- ## T5:域级聚合(Part B 域级) **T5-1:新增 KnowledgeDomainService** ✅ - `buildDomainSummary`:同域文档聚合 → LLM → upsert knowledge_domain - `buildKnowledgeMap`:全量 knowledge_domain → YAML 字符串 - `onDocumentChange`:触发 buildDomainSummary **T5-2:loadIndex 触发域生成 + 文档变更触发域重算** ✅ - `KnowledgeIndexService.loadIndex` 末尾:无 DB 记录的域自动触发生成 - `DocumentManagementService.uploadDocument` / `deleteDocument` 末尾:调用 `onDocumentChange` --- ## T6:Planner 注入(Part B 注入) **T6-1:ChatService 注入 knowledge map** ✅ - `buildChatPlannerAgent()` 注入 `KnowledgeDomainService.buildKnowledgeMap()` 到 prompt **T6-2:chat-planner-prompt.md 新增规则** ✅ - 新增知识库检索规则区块,要求 Planner 按 when_to_retrieve 决策、每域最多一次