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:
@@ -0,0 +1,70 @@
|
||||
# 会话存储体系
|
||||
|
||||
## 问题
|
||||
|
||||
当前 `diagnosis_record` 单表无法支撑通用会话存储需求:
|
||||
|
||||
1. 字段语义耦合在"告警分析"领域(fault_category、error_code 等),ChatService 通用问答场景无法使用
|
||||
2. 缺少 Agent 决策链维度(两个 Agent 的多轮思考过程无法区分和追溯)
|
||||
3. 检索质量不可评估(L0/L1 命中层、截断信息、召回内容长度无记录)
|
||||
4. 指标不完整(缺 token 用量、自评信号、采纳率)
|
||||
|
||||
## 建议方案
|
||||
|
||||
将单表拆分为三表体系,用 `session_id` 关联:
|
||||
|
||||
```
|
||||
diagnosis_session (1)
|
||||
└── agent_step (0:N) —— 每次 Agent 决策
|
||||
└── tool_invocation (0:N) —— 每步中的工具调用
|
||||
```
|
||||
|
||||
### 三表职责
|
||||
|
||||
| 表 | 职责 | 示例查询 |
|
||||
|---|---|---|
|
||||
| diagnosis_session | 诊断级元数据 + 汇总指标 | "某次诊断的总耗时和 Token 消耗" |
|
||||
| agent_step | 决策链:每步 Agent 的输入输出摘要 | "Planner 的思考过程和工具调用决策" |
|
||||
| tool_invocation | 工具调用明细 + 检索质量 | "lookup_knowledge 的 L0/L1 命中分布" |
|
||||
|
||||
### 集成点
|
||||
|
||||
1. `AgentLoggingHook` → 写入 `agent_step`
|
||||
2. `LookupKnowledgeTool` → 写入 `tool_invocation`
|
||||
3. `ChatService` / `AiOpsService` → 创建/更新 `diagnosis_session`
|
||||
|
||||
## 范围
|
||||
|
||||
- 新建 3 张表(Flyway 迁移)
|
||||
- 新建 3 个 JPA Entity + 3 个 Repository
|
||||
- 改造 AgentLoggingHook、LookupKnowledgeTool、ChatService、AiOpsService
|
||||
- 现有 `diagnosis_record` 表保持不动
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不涉及 UI 层面的会话展示
|
||||
- 不涉及历史数据迁移
|
||||
- 不涉及 diagnosis_record 的合并或废弃
|
||||
|
||||
## 上下文约束
|
||||
|
||||
- Flyway 迁移脚本命名:V005__create_diagnosis_session.sql 起
|
||||
- JPA ddl-auto 使用 validate 模式
|
||||
- JSON 列使用 `@JdbcTypeCode(SqlTypes.JSON)`(同现有 diagnosis_record 的 tool_calls 字段)
|
||||
- 已有 SessionManager/Redis 会话机制不变,新表作为持久化补充
|
||||
|
||||
## 已确认的设计决策
|
||||
|
||||
| 决策 | 结论 | 来源 |
|
||||
|------|------|------|
|
||||
| AgentLoggingHook 创建方式 | 改造为 Spring Bean(@Component + 构造注入) | grill user-interview |
|
||||
| AiOpsService 钩子范围 | Planner 和 Executor 各加 AgentLoggingHook | grill user-interview |
|
||||
| Supervisor 步骤记录 | 不单独记录,由子 Agent 步骤覆盖 | grill user-interview |
|
||||
| tool_invocation 截断长度 | 500 字符 | proposal 默认 |
|
||||
| sessionId 传递机制 | ThreadLocal(SessionContextHolder) | grill user-interview |
|
||||
| AiOps 步骤记录 | 只记 Planner/Executor,不记 Supervisor | grill user-interview |
|
||||
|
||||
## 风险
|
||||
|
||||
- AgentLoggingHook 目前是同步写日志,新增 DB 写可能影响 Agent 响应时间 → 考虑异步写入或先同步后优化
|
||||
- tool_invocation 的 output_preview 截断长度需合理(建议 500 字符)
|
||||
Reference in New Issue
Block a user