前言
大家好,我是宸一,一位28岁的Java后端开发工程师。

今天进入学习计划的第4天,我们将深入剖析Agent的核心架构。
前三天我们已经完成了以下基础学习:
- Day 1:大模型API基础
- Day 2:LangChain与工具调用
- Day 3:记忆系统与向量数据库
今天的目标是将这些分散的知识点串联起来,从整体上理解一个完整Agent的工作机制。
本次学习采用了“1对1问答式”交互方法,即直接向AI老师提问,立即获得回复,并通过持续追问来深化理解。相比传统的“观看视频→记录笔记→逐渐遗忘”模式,这种“提问→回答→理解→再追问→再深入”的方式能带来更好的学习效果。以下内容是今天通过问答形式碰撞出的核心干货。
一、Agent三元组:规划、工具、记忆
1.1 最简模型
一个Agent的核心功能可以抽象为三个基本模块:
flowchart LRUser["? 用户"]Agent["? Agent"]Planning["? Planning"]Action["? Action"]Memory["? Memory"]User --> AgentAgent --> PlanningPlanning --> ActionAction --> MemoryMemory --> PlanningPlanning --> Result["✅ 输出结果"]classDef main fill:#3B82F6,color:white,stroke:noneclassDef agent fill:#111827,color:white,stroke:noneclassDef result fill:#10B981,color:white,stroke:noneclass Planning,Action,Memory mainclass Agent agentclass Result result
1.2 后端开发视角的理解
| Agent概念 | Java后端对应 | 说明 |
|---|---|---|
| Planning | Service层业务逻辑 | 负责任务拆解,定义执行流程 |
| Action | 调用外部API/工具类 | 执行具体的功能操作 |
| Memory | 数据库 + 缓存 | 存储历史记录与上下文信息 |
这其实就是后端工程师日常的工作流程:
- 接收用户请求 → 理解其意图
- 查询数据库 → 获取历史对话上下文
- 执行核心业务逻辑 → 调用各类Service
- 返回最终结果 → 生成并输出回答
二、系统提示词:全局变量
2.1 什么是System Prompt?
系统提示词(System Prompt)相当于Agent的“人设”或“角色定义”,在对话过程中一次性设定,全程保持不变。
# 就像Java中的全局常量public static final String ROLE = "再战Ja va工程师的28岁程序员";# 或者Python中的配置项SYSTEM_PROMPT = """你是一个正在学习AI Agent的Ja va工程师,名叫宸一。你的特点是:用后端思维理解AI概念。"""
2.2 它的重要性
System Prompt决定了Agent的“性格”和“能力范围”:
没有System Prompt的Agent:用户:你是谁?Agent:我是一个AI助手有System Prompt的Agent:用户:你是谁?Agent:我是宸一,一个28岁的Ja va程序员,正在学习AI Agent
2.3 后端开发视角的理解
System Prompt就像全局配置对象或应用程序常量。
// Java中类似全局配置管理public class AgentConfig {private String role;// "再战Ja va工程师"private int maxHistory;// 10}
它仅需初始化一次,在整个会话生命周期内都不会改变。
三、对话历史:滑动窗口
3.1 为什么需要滑动窗口策略?
由于大模型的上下文窗口存在容量限制,无法无限期地保留所有历史对话。
flowchart LRclassDef problem fill:#FFEBEE,stroke:#C62828,color:#B71C1C,stroke-width:2pxclassDef solution fill:#E8F5E9,stroke:#2E7D32,color:#1B5E20,stroke-width:2pxclassDef node fill:#FFFFFF,stroke:#90A4AE,stroke-width:1pxsubgraph Problem["❌ 问题"]P1["用户聊了100轮对话"]P2["全部塞给大模型"]P3["Token爆炸 ?
费用爆炸 ?"]P1 --> P2 --> P3class P1,P2,P3 nodeendsubgraph Solution["✅ 解决方案"]S1["100轮对话"]S2["滑动窗口
只保留最近10轮"]S3["Token可控 ✅
费用可控 ✅"]S1 --> S2 --> S3class S1,S2,S3 nodeendProblem -.->|采用| Solutionclass Problem problemclass Solution solution
3.2 实现方案
from collections import dequeclass ConversationHistory:def __init__(self, max_size=10):# 使用双向队列,两端操作均为O(1)复杂度self.history = deque(maxlen=max_size)def add(self, role, content):"""添加新对话记录,自动淘汰最旧条目"""self.history.append({"role": role,"content": content})def get_recent(self, n=5):"""获取最近的n轮对话"""return list(self.history)[-n:]
3.3 后端开发视角的理解
滑动窗口本质上是一个固定大小的环形缓冲区。
┌─────────────────────────────────────────────────────────┐│conversation_history (maxlen=10) │├─────────────────────────────────────────────────────────┤│ [0] 最旧条目 → 新消息加入时自动移除 ││ [1] ... ││ ... ││ [8] ... ││ [9] 最新条目 ← 新消息追加至此 │└─────────────────────────────────────────────────────────┘数据结构选型分析:- 数组:头部删除为O(n),性能较差,不推荐- 链表:头部删除为O(1),但Python中缺乏原生高效实现- deque:最优选择!支持两端O(1)操作
四、工具调用:四步流程
4.1 完整执行流程
flowchart TDclassDef start fill:#1E3A5F,stroke:#0D47A1,color:#FFFFFF,stroke-width:2pxclassDef answer fill:#2E7D32,stroke:#1B5E20,color:#FFFFFF,stroke-width:2pxclassDef step fill:#E3F2FD,stroke:#1565C0,color:#1565C0,stroke-width:2pxclassDef node fill:#FFFFFF,stroke:#90A4AE,stroke-width:1pxclassDef success fill:#C8E6C9,stroke:#388E3C,stroke-width:1pxclassDef fail fill:#FFCDD2,stroke:#D32F2F,stroke-width:1pxStart["? 用户输入
帮我查一下明天北京天气"]class Start startsubgraph Step1["第1步:工具注册表"]TR["? get_weather / search_web"]class TR nodeendsubgraph Step2["第2步:语义匹配"]SM["? 意图分析"]SM1["查询天气 → 0.95"]SM2["搜索网页 → 0.32"]SM --> SM1SM --> SM2class SM nodeclass SM1 successclass SM2 failendsubgraph Step3["第3步:参数提取"]PE["? NLP解析"]PE1["city: 北京"]PE2["date: 明天"]PE --> PE1PE --> PE2class PE nodeclass PE1,PE2 nodeendsubgraph Step4["第4步:调用执行"]EX["⚡ get_weather(北京, 明天)"]RES["? 25°C / 晴"]EX --> RESclass EX nodeclass RES successendAnswer["? 明天北京天气晴,25°C,适合出行~"]class Answer answerStart --> Step1 --> Step2 --> Step3 --> Step4 --> Answerclass Step1,Step2,Step3,Step4 step
4.2 后端开发视角的理解
工具调用机制类似于结合了策略模式与工厂模式的设计。
// 定义策略接口public interface Tool {String getName();String getDescription();Object execute(Map
4.3 两种工具选择方式对比
| 方式 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 向量匹配 | 基于语义相似度进行搜索 | 灵活性高,能处理模糊表达 | 需要部署向量数据库 |
| 大模型直接选择 | 将工具描述列表输入给LLM | 实现简单,LLM本身掌握语义 | 工具数量过多会导致Prompt过长 |
目前业界主流采用方式2(OpenAI的Function Calling即基于此原理):
# 将工具描述直接提供给大模型prompt = f"""你有以下工具可用:1. get_weather - 查询指定城市的天气2. search_web - 搜索网页信息用户问题:{user_query}请选择合适的工具并提取参数。"""
五、错误处理机制:三板斧
5.1 完整处理流程
flowchart TDclassDef start fill:#1E3A5F,stroke:#0D47A1,color:#FFFFFF,stroke-width:2pxclassDef success fill:#2E7D32,stroke:#1B5E20,color:#FFFFFF,stroke-width:2pxclassDef fail fill:#C62828,stroke:#B71C1C,color:#FFFFFF,stroke-width:2pxclassDef retry fill:#F57C00,stroke:#E65100,color:#FFFFFF,stroke-width:1pxclassDef fallback fill:#7B1FA2,stroke:#4A148C,color:#FFFFFF,stroke-width:1pxclassDef decision fill:#FFFFFF,stroke:#90A4AE,stroke-width:2pxStart["? 查一下东京天气"]class Start startR1["? 第1次调用
get_weather(东京)"]D1{"成功?"}class R1 retryclass D1 decisionR2["? 第2次调用"]D2{"成功?"}class R2 retryclass D2 decisionR3["? 第3次调用"]D3{"成功?"}class R3 retryclass D3 decisionFB["? 备选方案
search_web(东京天气)"]D4{"成功?"}class FB fallbackclass D4 decisionGD["⚠️ 兜底
网络异常,请稍后再试"]OK["✅ 返回结果"]class GD failclass OK successStart --> R1 --> D1D1 -->|是| OKD1 -->|否| R2 --> D2D2 -->|是| OKD2 -->|否| R3 --> D3D3 -->|是| OKD3 -->|否| FB --> D4D4 -->|是| OKD4 -->|否| GD
5.2 三板斧策略总结
| 策略 | 术语 | 说明 |
|---|---|---|
| 重试3次 | Retry with Backoff | 给予系统恢复时间 |
| 失败后切换工具 | Fallback Strategy | 尝试备用方案 |
| 直接告知用户 | Graceful Degradation | 诚实地向用户说明情况 |
5.3 后端开发视角的理解
这与后端工程师熟悉的异常处理逻辑完全一致:
public String getWeather(String city) {// 1. 执行最多3次重试for (int i = 0; i < 3; i++) {try {return weatherApi.getWeather(city);} catch (Exception e) {if (i == 2) break;// 最后一次失败则跳出循环Thread.sleep(1000 * (i + 1));// 指数退避策略}}// 2. 尝试切换备选执行方案try {return searchWeb(city + "天气");} catch (Exception e) {// 备选方案同样失败}// 3. 最终兜底处理return "抱歉,当前网络异常,请稍后再试";}
六、今日学习收获
6.1 核心概念对照表
graph LRclassDef root fill:#1E3A5F,stroke:#0D47A1,color:#FFFFFF,stroke-width:2pxclassDef branch fill:#E3F2FD,stroke:#1565C0,color:#1565C0,stroke-width:1pxclassDef leaf fill:#F5F7FA,stroke:#90A4AE,color:#37474FRoot["Agent核心架构"]class Root rootRoot --> P["System Prompt
全局配置/常量"]Root --> H["对话历史
滑动窗口/deque"]Root --> T["工具调用
策略模式+工厂模式"]Root --> E["错误处理
try-catch+重试"]Root --> A["Agent三元组
Controller+Service+DAO"]class P,H,T,E,A branch
| AI概念 | Java后端对应 | 本质 |
|---|---|---|
| System Prompt | 全局配置/常量 | 仅初始化一次,全程不变 |
| 对话历史 | 滑动窗口/deque | 只保留最近的N轮对话 |
| 工具调用 | 策略模式+工厂模式 | 注册→匹配→执行 |
| 错误处理 | try-catch+重试机制 | 重试→降级→兜底 |
| Agent三元组 | Controller+Service+DAO | 规划+工具+记忆 |
6.2 1对1问答式学习的优势
本次采用“问答式”学习方法,与传统方式相比效果显著不同:
flowchart LRclassDef old fill:#FFEBEE,stroke:#C62828,color:#B71C1C,stroke-width:2pxclassDef new fill:#E8F5E9,stroke:#2E7D32,color:#1B5E20,stroke-width:2pxclassDef node fill:#FFFFFF,stroke:#90A4AE,stroke-width:1pxsubgraph Traditional["? 传统学习"]T1["看视频/文章"]T2["被动接收"]T3["有问题先记下"]T4["学完才能实践"]T5["容易走神 ?"]T1 --> T2 --> T3 --> T4 --> T5class T1,T2,T3,T4,T5 nodeendsubgraph QA["❓ 问答式学习"]Q1["问问题"]Q2["主动探索"]Q3["问题秒回,即时解决"]Q4["边学边问边理解"]Q5["保持专注 ?"]Q1 --> Q2 --> Q3 --> Q4 --> Q5class Q1,Q2,Q3,Q4,Q5 nodeendTraditional -.->|升级| QAclass Traditional oldclass QA new
| 传统学习 | 问答式学习 |
|---|---|
| 看视频/文章 | 主动提问 |
| 被动接收信息 | 主动探索未知 |
| 遇到问题先记录 | 问题即时解答,消除疑惑 |
| 完成学习后才实践 | 边学边问,同步理解 |
| 容易分心 | 保持高度专注 |
例如:
问:系统提示词是什么?AI答:就是Agent的“人设”,类似于全局变量追问:那对话历史呢?AI答:使用滑动窗口机制,只保留最近10轮对话再追问:工具调用如何知道该选哪个?AI答:通过语义匹配,进行向量相似度搜索每个问题都能得到即时反馈,无需等待或自行查阅资料这种"即时反馈"模式极大地提升了学习效率
6.3 学习心得
AI Agent的学习曲线实际上并没有想象中那么陡峭。
flowchart LRclassDef ja va fill:#FFF3E0,stroke:#F57C00,color:#E65100,stroke-width:2pxclassDef ai fill:#E3F2FD,stroke:#1565C0,color:#0D47A1,stroke-width:2pxclassDef arrow fill:#FFFFFF,stroke:#90A4AE,stroke-width:1pxsubgraph Ja va["☕ Java工程师已有基础"]J1["API调用"]J2["数据库"]J3["缓存"]J4["设计模式"]J5["异常处理"]class J1,J2,J3,J4,J5 ja vaendsubgraph AI["? AI Agent对应概念"]A1["大模型接口"]A2["向量数据库"]A3["记忆系统"]A4["Agent架构"]A5["错误重试"]class A1,A2,A3,A4,A5 aiendJ1 --> A1J2 --> A2J3 --> A3J4 --> A4J5 --> A5class Ja va ja vaclass AI ai
作为Java开发者,我们已经具备了扎实的工程基础:
- 掌握API调用 → 可快速理解大模型接口
- 熟悉数据库操作 → 可迁移理解向量数据库
- 了解缓存机制 → 可对应理解记忆系统
- 精通设计模式 → 可类比理解Agent架构
- 擅长异常处理 → 可轻松理解错误重试机制
关键在于用自己熟悉的视角去解读和关联新概念。
七、明日计划
按照既定的学习规划,明天的任务包括:
- 动手实现一个迷你版Agent原型
- 将今天所学的架构知识转化为实际代码
- 继续运用后端思维解构AI技术概念
八、写在最后
学习AI技术本身并不难,真正的挑战在于坚持。作为“规划狂”,大家或许都熟悉那种“制定完计划就获得满足感”的状态。但这次有了AI老师的陪伴学习,让我可以随时提问、即时获得答案。用后端开发的思维,来拆解和掌握AI世界的知识。
标签: #AI Agent #Java工程师 #Agent架构 #工具调用 #错误处理 #学习笔记 #Hermes Agent #1对1学习
