Task 4.1: 包名统一重构 - 重命名 41 个 Java 文件的包名 - 更新所有 import 语句 - 恢复枚举类(FaultCategory、DiagnosisStatus、SourceType) - 更新测试类的 import 重构范围: - domain/entity: 3 个实体类 - domain/model: 2 个数据类 - domain/enums: 3 个枚举类 - repository: 3 个接口 - service/session: 2 个类(接口 + 实现) - config: 9 个配置类 - controller: 2 个控制器 - agent/tool: 4 个工具类 - client: 1 个客户端 - Main.java: 主类 验证结果: - 编译成功,无错误 - 所有测试通过 (27/27) - ApiDocumentRepositoryTest: 7/7 ✅ - CaseLibraryRepositoryTest: 6/6 ✅ - DiagnosisRecordRepositoryTest: 6/6 ✅ - RedisSessionManagerTest: 8/8 ✅ Progress: 21/33 tasks completed (64%)
学习报告索引
创建日期:2026-05-30
主题:AI Ops 3-Agent 协同架构深度分析
学习路径:从核心设计 → outputKey 机制 → 疑难解答
📚 学习报告清单
01. AI Ops 核心设计 - Essence 报告
内容:
- 3-Agent 协同分析模式详解
- 完整调用链(HTTP → Service → Agents → Tools → SSE)
- 设计模式对比与权衡分析
- 迁移示例与关键陷阱
适合:
- 第一次学习 AI Ops 架构
- 需要理解"为什么用 3 个 Agent"
- 准备在自己的项目中应用这个模式
关键收获:
- ✅ 理解 Planner、Executor、Supervisor 的职责
- ✅ 掌握 Agent 协同的执行流程
- ✅ 学会避免常见的陷阱
02. outputKey 深度解析
内容:
- outputKey 的核心机制(共享内存模型)
- 完整时间线示例(8 个步骤)
- Prompt 占位符替换原理
- 调试技巧与实践建议
适合:
- 已理解 3-Agent 架构,想深入了解状态传递机制
- 遇到 Agent 间通信问题
- 想知道如何在 Prompt 中引用其他 Agent 的输出
关键收获:
- ✅ 理解
OverAllState的工作原理 - ✅ 掌握 outputKey 的命名规范
- ✅ 学会在 Prompt 中正确引用 state
03. 3个核心疑问解答
内容:
- 疑问 1:Prompt 中的
{}占位符如何替换? - 疑问 2:如果两个 Agent 用同一个 outputKey 会怎样?
- 疑问 3:如何在 Prompt 中读取多个 key?
适合:
- 对特定机制有疑问
- 遇到实际问题需要快速查阅
- 想了解边界情况的处理
关键收获:
- ✅ 掌握 Prompt 模板引擎的替换规则
- ✅ 避免 outputKey 冲突导致的数据丢失
- ✅ 学会在 Prompt 中读取多个 state 值
04. RAG 分块策略 - Essence 报告
内容:
- Token 感知的智能分块机制
- 结构保护(Markdown 标题、列表、代码块)
- 软硬双重限制防止失控
- 重叠机制保证上下文连续性
- 与 LangChain 等方案的对比
适合:
- 需要理解 RAG 链路中的文档处理流程
- 想了解如何切分文档而不破坏语义
- 准备优化自己项目的文档分块策略
关键收获:
- ✅ 理解为什么用 Token 估算而不是字符计数
- ✅ 掌握不可中断上下文的检测逻辑
- ✅ 学会软硬双重限制的设计哲学
- ✅ 理解重叠机制如何提升检索准确率
05. 文件上传自动索引 - Essence 报告
内容:
- 上传即索引的自动化流程
- 基于文件名的覆盖更新策略
- 原子化的删除-索引流程
- 同步 vs. 异步的权衡分析
- 一致性保证的设计思路
适合:
- 需要理解 RAG 系统的文件管理机制
- 想了解如何保证文件系统与向量库的一致性
- 准备构建自己的文档上传功能
关键收获:
- ✅ 理解为什么上传成功后立即触发索引
- ✅ 掌握基于文件名的覆盖更新策略
- ✅ 学会同步索引 vs. 异步队列的权衡
- ✅ 理解索引失败不阻塞上传的设计哲学
06. RAG 查询流程 - Essence 报告 ⭐ 新增
内容:
- Tool-Driven RAG 架构
- ReactAgent 智能路由机制
- 向量检索 + LLM 综合答案
- Tool-as-Service 松耦合设计
- JSON 返回格式与 Agent 契约
适合:
- 需要理解查询如何触发 RAG
- 想了解 ReactAgent 的工作原理
- 准备构建多功能 AI 助手(不只是文档问答)
关键收获:
- ✅ 理解为什么用 ReactAgent 而不是直接调用 RAG
- ✅ 掌握 Tool-as-Service 架构的优势
- ✅ 学会系统提示词如何引导 Agent 选择工具
- ✅ 理解 Top-K = 3 的设计依据
🎯 推荐学习顺序
快速模式(30 分钟)
01-AI-Ops-核心设计-Essence报告.md
↓ (只看"核心洞察"、"完整调用链"、"迁移示例")
完成 ✅
标准模式(1 小时)
01-AI-Ops-核心设计-Essence报告.md
↓ (完整阅读)
02-outputKey-深度解析.md
↓ (重点看"完整时间线示例")
03-核心疑问解答.md
↓ (按需查阅)
完成 ✅
深度模式(2 小时)
01-AI-Ops-核心设计-Essence报告.md
↓ (完整阅读 + 对照源码验证)
02-outputKey-深度解析.md
↓ (完整阅读 + 自己画时间线图)
03-核心疑问解答.md
↓ (完整阅读 + 尝试回答扩展问题)
实践:修改 AiOpsService 添加新的 Agent
↓
完成 ✅
📊 学习检查点
完成 01 后,你应该能回答:
- 为什么用 3 个 Agent 而不是 1 个?
- Planner 的 Replanner 角色是什么意思?
- Executor 为什么只执行"第一步"?
- Supervisor 如何知道该调用哪个 Agent?
- 如果 Executor 执行失败会发生什么?
完成 02 后,你应该能回答:
- outputKey 的本质是什么?
- Prompt 中的
{executor_feedback}如何被替换? - 如何从 state 中提取最终报告?
- 如何调试 Agent 间的状态传递?
完成 03 后,你应该能回答:
- 如果两个 Agent 使用同一个 outputKey 会发生什么?
- 如何在 Prompt 中同时读取 3 个 key?
- 模板引擎是如何工作的?
完成 04 后,你应该能回答:
- 为什么用 Token 估算而不是字符计数?
- 什么是"不可中断的上下文"?举例说明。
- 软限制和硬限制的区别是什么?
- 重叠机制如何提升检索准确率?
- 这个设计与 LangChain 的切分器有什么不同?
- 在什么情况下会在列表中间强制切断?
完成 05 后,你应该能回答:
- 为什么上传成功后要立即触发索引?
- 为什么使用原始文件名而不是 UUID?
- 索引失败为什么不影响上传?这个设计的利弊是什么?
- 如何保证文件更新时,向量库中的旧数据被删除?
- 这个设计在什么场景下会出现问题?
- 如何改造为异步索引?
完成 06 后,你应该能回答:
- 为什么用 ReactAgent 而不是直接调用 RAG?
- InternalDocsTools 的
@Tool注解是如何被 ReactAgent 发现的? - 工具返回为什么必须是 JSON 格式?
- Top-K = 3 的设计依据是什么?
- L2 距离和余弦相似度的区别?何时该换?
- 如果要添加一个新工具(如查 GitHub Issues),需要改哪些文件?
🔗 相关文档
项目文档
源码文件
| 文件 | 关键行 | 说明 |
|---|---|---|
AiOpsService.java |
51-70 | 3-Agent 构建与编排 |
AiOpsService.java |
100-124 | Planner & Executor 构建 |
AiOpsService.java |
144-257 | Agent Prompts |
ChatController.java |
280-314 | HTTP 入口 + SSE 返回 |
DocumentChunkService.java |
104-202 | RAG 分块核心逻辑 ⭐ |
DocumentChunkService.java |
279-297 | Token 估算算法 |
DocumentChunkService.java |
307-336 | 不可中断上下文检测 |
VectorIndexService.java |
124-168 | 文档索引流程 |
RagService.java |
55-83 | RAG 查询编排 |
FileUploadController.java |
35-103 | 文件上传接口 ⭐ |
FileUploadController.java |
72-80 | 自动索引触发(核心设计) |
VectorIndexService.java |
173-215 | 删除旧数据(覆盖更新) |
ChatController.java |
140-274 | ReactAgent 对话接口 ⭐ |
ChatService.java |
59-96 | 系统提示词构建 |
InternalDocsTools.java |
49-78 | RAG 工具封装 |
VectorSearchService.java |
42-94 | 向量检索 |
🚀 下一步
实践练习
-
修改 Planner Prompt
- 调整
buildPlannerPrompt()中的指令 - 观察 Agent 行为变化
- 记录你的发现
- 调整
-
添加新的 Agent
- 在 Planner 和 Executor 之间添加一个 Validator Agent
- 验证 Planner 的计划是否合理
- 实现 3-Agent → 4-Agent 升级
-
调试工具失败场景
- 故意让某个工具返回失败
- 观察 Executor 如何反馈给 Planner
- 验证 Planner 的重新规划逻辑
📝 学习笔记模板
你可以在这个文件夹创建自己的学习笔记:
# 我的学习笔记 - [日期]
## 今日学习
- 阅读文档:[文档名]
- 学习时长:[X小时]
- 完成练习:[练习名]
## 关键收获
1.
2.
3.
## 疑问
1.
2.
## 下一步计划
- [ ]
- [ ]
🎓 扩展阅读
Spring AI 官方文档
- Agent Framework - Spring AI Agent 官方文档
- Tool Use - 工具使用指南
相关设计模式
- Chain of Responsibility(责任链模式)- Supervisor 调度模式的基础
- Strategy Pattern(策略模式)- Planner 的多策略规划
- Observer Pattern(观察者模式)- Agent 间的状态通知
💡 提示:这个学习报告文件夹会持续更新。当你遇到新的问题或有新的发现时,可以创建新的 Markdown 文件添加到这里。
创建日期:2026-05-30
最后更新:2026-05-31
版本:v1.3 (新增 RAG 查询流程报告,完成 RAG 全链路分析)