Java后端转Agent学习路线 · AI Agent
Java 后端转 AI Agent 学习路线
目标定义
目标不是“会用一个 Agent 框架”,而是能从后端工程角度做出一个可靠的 AI Agent 系统:
代码块收起展开
用户目标 -> 意图识别 -> 检索知识 -> 调用工具 -> 维护状态 -> 生成答案 -> 记录 trace -> 评测回归最终项目建议锁定为:
Personal Knowledge Agent:基于 Obsidian 的个人知识库 Agent,支持 RAG 问答、MCP 暴露、学习计划、任务追踪、长期记忆、trace/eval。
能力迁移图
flowchart TD
Java["Java 后端基础"] --> Backend["后端工程能力"]
Backend --> API["LLM Gateway"]
API --> Agent["Agent Runtime"]
Backend --> Tool["Tool / State / Trace"]
Tool --> Agent
Notes["Obsidian Notes"] --> RAG["RAG Retriever"]
RAG --> Agent
Agent --> MCP["MCP Server"]
Agent --> Product["Personal Knowledge Agent"]
代码块收起展开<rect x="60" y="140" width="150" height="44" rx="8" fill="#dcfce7"/>
<text x="90" y="166">MySQL / Redis</text>
<path d="M210 162 L288 162" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<rect x="290" y="140" width="170" height="44" rx="8" fill="#bbf7d0"/>
<text x="319" y="166">Memory / Trace Store</text>
<rect x="60" y="200" width="150" height="44" rx="8" fill="#fef3c7"/>
<text x="86" y="226">线程池 / MQ</text>
<path d="M210 222 L288 222" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<rect x="290" y="200" width="170" height="44" rx="8" fill="#fde68a"/>
<text x="318" y="226">异步 Tool / Eval Runner</text>
<rect x="520" y="92" width="150" height="42" rx="8" fill="#ede9fe"/>
<text x="548" y="117">RAG / MCP</text>
<rect x="520" y="154" width="150" height="42" rx="8" fill="#ffe4e6"/>
<text x="542" y="179">Workflow Agent</text>
<rect x="520" y="216" width="150" height="42" rx="8" fill="#ccfbf1"/>
<text x="546" y="241">可评测产品</text>总体路线
| 阶段 | 核心问题 | 必会能力 | 产出物 |
|---|---|---|---|
| P0 AI 工程共识 | LLM 应用和 CRUD 有什么不同 | token、上下文、流式、非确定性、成本 | AI 工程基础笔记 |
| P1 LLM API | 怎么稳定接模型 | Gateway、Streaming、错误归一化 | /chat、/chat/stream |
| P2 Tool Calling | 模型怎么调用真实能力 | tool schema、参数校验、权限、审计 | 3 个本地工具 |
| P3 MCP | 工具怎么标准化暴露 | tools/resources/prompts、transport、安全边界 | Notes MCP Server |
| P4 RAG | 模型怎么读私有知识 | chunk、embedding、retrieval、citation、refusal | Obsidian RAG |
| P5 Workflow | 多步任务怎么可控 | 状态机、最大步数、失败恢复 | 学习计划 Agent |
| P6 Memory | 长期状态怎么维护 | user profile、event memory、reflection、update/delete | Memory Store |
| P7 Trace/Eval | 怎么知道 Agent 没瞎跑 | trace、eval set、judge、debug report | Eval Runner |
| P8 产品化 | 怎么长期维护 | 配置、部署、成本、安全、README | 可演示项目 |
每阶段必懂的工程对象
| 对象 | 作用 | 不理解会导致什么 |
|---|---|---|
Message | 模型输入输出的基本单位 | prompt 拼接混乱,历史丢失 |
ToolDefinition | 模型可调用能力说明 | 工具参数不可控 |
ToolCall | 模型请求执行的动作 | 无法审计模型做了什么 |
ToolResult | 工具执行结果 | 模型拿不到结构化观察 |
ContextBuilder | 决定模型本轮看见什么 | 上下文膨胀、漏证据 |
MemoryRecord | 长期记忆最小单元 | 记忆来源不明、无法撤销 |
TraceEvent | 每一步执行日志 | 失败无法复盘 |
EvalCase | 固定回归问题 | 改 prompt 全靠感觉 |
典型后端架构
flowchart TD
UI["Web / CLI / App"] --> Controller["AgentController"]
Controller --> Runtime["AgentRuntime"]
Runtime --> Context["上下文层<br/>RAG / Memory"]
Context --> Data["Vector DB / MySQL"]
Runtime --> Tooling["工具层<br/>Local Tools / MCP"]
Tooling --> Model["Model Gateway"]
Runtime --> Ops["观测层<br/>Trace / Eval"]
技术选型建议
| 层 | 推荐先学 | 选择理由 | 不建议 |
|---|---|---|---|
| 后端主语言 | Java / Spring Boot | 复用已有工程能力 | 为了跟风完全放弃 Java |
| 原型语言 | TypeScript 或 Python | MCP/RAG 生态样例多 | 一开始多语言失控 |
| Java AI 框架 | Spring AI 或 LangChain4j 选一个 | 能快速接模型和工具 | 两个都深挖 |
| 向量库 | 先轻量本地,后续换服务化 | 先验证链路 | 一开始重型平台化 |
| MCP | 先 stdio,只读工具 | 安全、容易调试 | 开局暴露写入/删除 |
| Workflow | 自己写状态机 | 能理解本质 | 直接套复杂框架看不懂 |
| Eval | 固定问题集 + 规则检查 | 可快速回归 | 只让模型自评 |
先修依赖与升级判定
这条路线不是按名词推进,而是按“工程对象能否跑通”推进。每一层都有上一层必须提供的证据,缺证据就不要跳到下一层。
| 当前层 | 先修依赖 | 升级条件 | 不该提前做 |
|---|---|---|---|
| LLM API | 稳定请求、超时处理、token 日志 | /chat 和 /chat/stream 有错误归一化 | 上来封装复杂 Agent 框架 |
| Tool Calling | DTO、参数校验、读写权限 | tool 有 schema、权限、审计、结构化结果 | 暴露任意命令执行 |
| MCP | 已有可用工具能力 | 同一工具能被不同 client 发现和调用 | 把 MCP 当业务系统重写 |
| RAG | 有可读资料和元数据 | 能检索、引用、拒答、复盘错误 | 只把整篇笔记塞进 prompt |
| Workflow | RAG / Tool 都可控 | 多步任务有状态、步数上限、失败出口 | 让模型无限自我规划 |
| Memory | trace 能解释历史行为 | 记忆有来源、置信度、更新和撤销 | 每轮对话无脑 append |
| Eval | 有固定场景和失败样本 | 改 prompt / chunk / tool 后能比较结果 | 靠主观感觉判断质量 |
阶段交付切片
每个阶段都要留下能复盘的产物。只写笔记不算完成,只写代码但没有 trace / eval 也不算完成。
| 阶段 | 必交付代码对象 | 必留证据 | 失败样本 |
|---|---|---|---|
| LLM API | ModelGateway, ChatController, StreamHandler | 请求日志、token、耗时、错误码 | 超时、空响应、限流 |
| Tool Calling | ToolDefinition, ToolExecutor, PermissionGuard | tool 参数、结果、拒绝原因 | 参数缺失、越权、超时 |
| MCP | McpServer, ToolRegistry, ResourceRegistry | initialize、list、call 日志 | 断连、schema 不匹配 |
| RAG | NoteIndexer, Retriever, ContextBuilder | query、chunk、score、source path | 召回错、引用假、资料不足 |
| Workflow | AgentState, StepRunner, StopPolicy | 状态迁移、最大步数触发 | 循环、重复检索、工具失败 |
| Memory | MemoryRecord, MemoryPolicy, MemoryStore | 写入原因、来源、版本、撤销记录 | 事实过期、偏好冲突、污染写入 |
| Eval | EvalCase, EvalRunner, DebugReport | pass/fail、差异摘要、失败归因 | prompt 退化、RAG 退化 |
路线分叉决策
学习中最容易浪费时间的是“看到新框架就切方向”。用下面的判定表决定当前该补什么。
| 现象 | 优先补 | 判断依据 |
|---|---|---|
| Chat 能跑,但回答不可控 | Prompt / structured output | 输出是否能被程序校验 |
| 模型会调用工具,但经常填错参数 | Tool schema | schema 是否有类型、枚举、长度、必填 |
| 工具能跑,但换 Agent 就不能复用 | MCP | 是否能通过 list / call 标准发现 |
| 回答经常没有依据 | RAG | source 是否进 topK,答案是否逐句可引用 |
| 多步任务跑飞 | Workflow | 是否有状态机、步数上限、停止条件 |
| 用户偏好被反复遗忘 | Memory | 是否有写入策略和冲突处理 |
| 改完不知道更好还是更差 | Eval | 是否有固定问题集和失败报告 |
从 Java 后端到 Agent 工程的迁移模型
Java 后端经验不是被 Agent 淘汰,而是换了落点。传统后端的核心是“确定性请求处理”:输入固定、代码路径固定、数据库事务固定。Agent 工程的核心是“受约束的非确定性决策”:模型会选择路径、调用工具、引用上下文、写入记忆,所以必须把不可控部分关进工程边界里。
| Java 后端熟悉对象 | Agent 工程对应对象 | 新增不确定性 | 必须补上的工程证据 |
|---|---|---|---|
| Controller | Chat / Task API | 用户输入更自由,任务边界模糊 | request schema、任务分类、拒答分支 |
| Service | Agent Runtime / Planner | 执行路径由模型参与决定 | state machine、step limit、trace |
| Repository | Vector Store / Memory Store | 检索不是精确主键查询 | chunk 元数据、score、source、召回评测 |
| DTO 校验 | Tool schema / structured output | 模型可能填错字段 | schema validation、repair/refuse 策略 |
| 权限拦截器 | PermissionGuard / Tool Policy | 模型可能请求危险工具 | capability、sideEffect、approval、audit |
| 事务 | Tool call commit boundary | 外部副作用可能半成功 | idempotency key、rollback/unknown 状态 |
| 日志 | TraceEvent / DebugReport | 错误可能来自上下文、工具、模型、检索 | phase-level trace、root cause 分类 |
| 单元测试 | EvalCase / Regression Eval | prompt 和模型升级会改变行为 | 固定场景集、版本绑定、差异报告 |
| 配置中心 | Prompt / Model / Retriever version | 配置变化就是行为变化 | hash、版本号、灰度、回滚 |
迁移路线不要理解成“学更多框架”,而是把旧能力升级成下面的成熟度:
| 等级 | 能力状态 | 典型表现 | 下一步 |
|---|---|---|---|
| L0 脚本 | 能调用 LLM | prompt 写在代码里,失败靠手改 | 加请求日志和错误归一 |
| L1 API | 能对外提供 chat 接口 | 有 controller/service,但答案不可验证 | 加结构化输出和拒答规则 |
| L2 工具 | 能让模型调用函数 | 工具能跑,但权限和副作用不清楚 | 加 ToolExecutor、PermissionGuard、audit |
| L3 知识 | 能基于资料回答 | RAG 能召回,但引用和评测薄弱 | 加 chunk 元数据、source 校验、RAG eval |
| L4 工作流 | 能做多步任务 | 有 planner,但容易循环、跑偏 | 加状态机、step limit、stop policy |
| L5 生产化 | 能持续迭代 | 改 prompt/RAG/tool 后知道好坏 | 加 Trace/Eval、灰度、回归样本库 |
学习时可以把每个新概念都落成一个后端对象:
代码块收起展开
# Agent 工程对象清单:每学一个概念,都问它最终落在哪个对象里。
agent_service:
role: "编排一次任务,从用户输入到最终答案"
must_have: ["state", "traceId", "stepLimit", "failurePolicy"]
tool_executor:
role: "把模型的 tool_call 变成受控的真实动作"
must_have: ["schemaValidation", "permissionDecision", "timeout", "audit"]
context_builder:
role: "决定模型本轮能看到什么"
must_have: ["systemRules", "userTask", "retrievedChunks", "memory", "tokenBudget"]
eval_runner:
role: "判断一次改动是进步还是退化"
must_have: ["caseSet", "promptVersion", "retrieverVersion", "diffReport"]真正的学习闭环是:概念 -> 工程对象 -> 可运行接口 -> trace 证据 -> eval 回归。只停在概念解释,容易觉得自己懂了;能把它写成对象、接口、失败样本和评测,才算进入工程阶段。
12 周里程碑
gantt
title Java 后端转 Agent 12 周路线
dateFormat YYYY-MM-DD
section 基础闭环
LLM API / Streaming :a1, 2026-07-05, 14d
Tool Calling / Security :a2, after a1, 14d
section 知识与协议
MCP Server :b1, after a2, 14d
Obsidian RAG :b2, after b1, 14d
section Agent 化
Workflow / Memory :c1, after b2, 14d
Trace / Eval / Deploy :c2, after c1, 14d
| 周期 | 主线 | 必交付 |
|---|---|---|
| 1-2 | LLM API + Prompt + Streaming | 可运行 Chat API,带日志 |
| 3-4 | Tool Calling + 安全边界 | 3 个工具,带权限和审计 |
| 5-6 | MCP | 只读 Notes MCP Server |
| 7-8 | RAG | Obsidian 问答,带引用和拒答 |
| 9-10 | Workflow + Memory | 学习计划 Agent,状态可复盘 |
| 11-12 | Trace + Eval + Deploy | 固定评测集,debug report,演示 README |
主项目拆解
flowchart TD
PKA["Personal Knowledge Agent"] --> Knowledge["知识层<br/>Notes Indexer / RAG Q&A"]
Knowledge --> Runtime["运行层<br/>MCP Server / Learning Planner"]
Runtime --> Feedback["复盘层<br/>Memory Store / Trace Eval"]
Feedback --> Product["可持续学习产品"]
验收门槛
| 能力 | 验收问题 | 合格标准 |
|---|---|---|
| LLM API | 连续问 20 个问题是否稳定 | 无崩溃,有错误提示,有耗时/token 日志 |
| Tool Calling | 工具参数错时会怎样 | 拒绝执行,返回结构化错误 |
| MCP | 能否读取指定笔记 | 只能读白名单目录,不能越权 |
| RAG | 问笔记里没有的问题 | 明确说资料不足,不编造 |
| Workflow | 多步任务失败怎么办 | trace 可见,能降级或停止 |
| Memory | 用户偏好变化怎么办 | 能 update,不无限 append |
| Eval | 改 prompt 后怎么判断 | 固定问题集对比新旧结果 |
先做什么
优先做一个闭环,不要先追复杂 Agent:
- Spring Boot 写
/chat和/chat/stream。 - 加
search_notes、read_note两个只读工具。 - 把 Obsidian 的
技术栈/AI Agent建成最小索引。 - 回答必须带来源路径。
- 保存每轮 trace。
- 把
search_notes/read_note暴露成 MCP。 - 做 20 个固定问题的 eval。
判断是否真正学会
如果系统能完成下面这件事,说明路线走通:
用户问:“我有 Java 后端基础,怎么继续学 Agent?”
系统必须:
- 读取本目录路线笔记。
- 检索相关 AI 工程基础和项目清单。
- 生成分阶段路线。
- 给出引用来源。
- 创建本周任务。
- 记录 trace。
- 支持通过 MCP 让其他 Agent 调用这个能力。
这不是一个“回答”,而是一个完整 AI Agent 工程闭环。