feat(session): 会话存储体系实现 & Chat多Agent路由

- 新增诊断会话(diagnosis_session/agent_step/tool_invocation)三表
- AgentLoggingHook 持久化 agent_step,记录决策链和耗时
- LookupKnowledgeTool 写入 tool_invocation,记录L0/L1检索质量
- TokenTrackingChatModel 捕获真实token用量
- Chat接口支持意图路由:简单问题单Agent,复杂问题多Agent(Planner+Executor)
- Prompt外置到 src/main/resources/prompts/
- 删除旧 diagnosis_record 表及相关文件
- 新增SessionContextHolder(ThreadLocal传递sessionId)
- QuestionComplexity 复杂度判断工具
- 测试覆盖三张新表的Repository
This commit is contained in:
zhuyongxin
2026-06-26 16:22:05 +08:00
parent a74ccea5be
commit 0d9cce75f9
33 changed files with 1941 additions and 470 deletions
+151
View File
@@ -0,0 +1,151 @@
# 会话存储 — 任务拆解
## 切片 1:Flyway 迁移脚本
**文件**: `src/main/resources/db/migration/V005__create_session_storage.sql`
**内容**:创建 diagnosis_session、agent_step、tool_invocation 三张表
**验收标准**:
- [x] 三张表均通过 Flyway 创建成功
- [x] 字段类型、索引、JSON 列定义正确
- [x] 回滚脚本可选(不做强制要求)
---
## 切片 2:JPA 实体类
**文件**:
- `src/main/java/com/superbiz/agent/domain/entity/DiagnosisSession.java`
- `src/main/java/com/superbiz/agent/domain/entity/AgentStep.java`
- `src/main/java/com/superbiz/agent/domain/entity/ToolInvocation.java`
**内容**:三个 Entity,使用 @JdbcTypeCode(SqlTypes.JSON) 映射 JSON 列
**验收标准**:
- [x] 编译通过,无 JPA 映射错误
- [x] Entity 字段与 DDL 对齐
- [x] Lombok 注解完整
---
## 切片 3:JPA Repository
**文件**:
- `src/main/java/com/superbiz/agent/repository/DiagnosisSessionRepository.java`
- `src/main/java/com/superbiz/agent/repository/AgentStepRepository.java`
- `src/main/java/com/superbiz/agent/repository/ToolInvocationRepository.java`
**内容**:三个 Repository,含自定义查询方法
**验收标准**:
- [x] 编译通过
- [x] 自定义方法命名正确
- [x] 可在 Spring 中自动注入
---
## 切片 4:SessionContextHolder 工具类
**文件**: `src/main/java/com/superbiz/agent/util/SessionContextHolder.java`
**内容**:基于 ThreadLocal 的 sessionId 传递工具
```java
public class SessionContextHolder {
private static final ThreadLocal<String> SESSION_ID = new ThreadLocal<>();
public static void setSessionId(String sessionId) { SESSION_ID.set(sessionId); }
public static String getSessionId() { return SESSION_ID.get(); }
public static void clear() { SESSION_ID.remove(); }
}
```
**验收标准**:
- [x] 编译通过
- [x] set/get/clear 在同一线程内正常工作
---
## 切片 5:AgentLoggingHook 改造为 Spring Bean
**文件**: `src/main/java/com/superbiz/agent/hook/AgentLoggingHook.java`
**内容**:
- 加 @Component 注解
- 构造注入 AgentStepRepository
- beforeModel 创建 agent_step
- afterModel 更新 agent_step
- 从 RunnableConfig 读取 sessionId
**验收标准**:
- [x] 编译通过
- [x] beforeModel 写入 agent_step 到 DB
- [x] afterModel 更新正确行
- [x] 原日志行为不变
---
## 切片 6:ChatService 集成
**文件**: `src/main/java/com/superbiz/agent/service/ChatService.java`
**内容**:
- 注入 DiagnosisSessionRepository
- executeChat 前后创建/更新 diagnosis_session
- 通过 RunnableConfig 传递 sessionId
**验收标准**:
- [x] 每次 executeChat 产生一条 diagnosis_session 记录
- [x] sessionId 可被 Hook 读取
- [x] status、duration 等汇总指标正确
---
## 切片 7:AiOpsService 集成
**文件**: `src/main/java/com/superbiz/agent/service/AiOpsService.java`
**内容**:
- 注入 DiagnosisSessionRepository 和 AgentLoggingHook
- executeAiOpsAnalysis 前后创建/更新 diagnosis_session
- Planner 和 Executor 各加 AgentLoggingHook
- Supervisor 不加 Hook
**验收标准**:
- [x] 每次 executeAiOpsAnalysis 产生一条 diagnosis_session 记录
- [x] Planner 执行产生 agent_step 记录
- [x] Executor 执行产生 agent_step 记录
- [x] Supervisor 不产生 agent_step 记录
---
## 切片 8:LookupKnowledgeTool 集成
**文件**: `src/main/java/com/superbiz/agent/tool/LookupKnowledgeTool.java`
**内容**:
- 注入 ToolInvocationRepository
- 执行后写入 tool_invocation 记录
- 记录 L0/L1 检索质量
**验收标准**:
- [x] 每次 lookup_knowledge 调用写入一条 tool_invocation
- [x] retrieval_layer / l0_match_count 等字段正确
- [x] 异常场景 success=false
---
## 切片 9:测试
**文件**:
- `src/test/java/com/superbiz/agent/repository/DiagnosisSessionRepositoryTest.java`
- `src/test/java/com/superbiz/agent/repository/AgentStepRepositoryTest.java`
- `src/test/java/com/superbiz/agent/repository/ToolInvocationRepositoryTest.java`
**内容**:
- Repository 单元测试(CRUD + 自定义查询)
- 集成测试需要运行环境(后续补充)
**验收标准**:
- [x] Repository 测试通过