Agent核心架构拆解:三元组、工具调用与错误处理
摘要
Agent核心架构由规划、工具、记忆三元组构成。系统提示词作为全局配置,对话历史采用滑
前言
你好,我是宸一,一名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是什么?
系统提示词定义了Agent的角色和基调,一旦设定,对话期间固定不变。
# 相当于Java中的静态常量public static final String ROLE = "28岁再战AI的Java程序员";# 或者在Python里作为配置项SYSTEM_PROMPT = """你是一位正在学习AI Agent的Java工程师,名叫宸一。你的特点是用后端思维拆解AI概念。"""
2.2 为何如此关键?
System Prompt精准控制着Agent的“人设”和“能力域”:
无System Prompt的Agent:用户:你是谁?Agent:我是一个AI助手有System Prompt的Agent:用户:你是谁?Agent:我是宸一,28岁Java程序员,正在深造AI Agent
2.3 后端视角的解读
System Prompt ≈ 全局配置 ≈ 应用中的CONFIG对象
// 用Java配置类来类比public class AgentConfig {private String role;// "二次上路的Java工程师"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次 | 带退避的重试 | 为系统恢复留出时间窗口 |
| 失败切工具 | 降级策略 | 尝试替补方案 |
| 直接告知 | 优雅降级 | 坦诚地向用户反馈问题 |
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;// 最后1次失败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学习
来源:互联网
本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。