菜鸟AI - 让提示词生成更简单! 全站导航 全站导航
AI工具安装 新手教程 进阶教程 辅助资源 AI提示词 热点资讯 技术资讯 产业资讯 内容生成 模型技术 AI信息库

已有账号?

首页 > AI教程 > Agent核心架构拆解:三元组、工具调用与错误处理
进阶教程 三元组

Agent核心架构拆解:三元组、工具调用与错误处理

2026-06-04
阅读 0
热度 0
作者 菜鸟AI编辑部
摘要

摘要

Agent核心架构由规划、工具、记忆三元组构成。系统提示词作为全局配置,对话历史采用滑

前言

你好,我是宸一,一名28岁的Java开发工程师。

Day 4:用后端思维拆解Agent核心架构——三元组、工具调用、错误处理

今天进入第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后端类比含义
PlanningService层业务编排任务分解、流程决策
Action外部API/工具类封装执行具体操作
Memory数据库 + 缓存层持久化上下文与历史

这套逻辑,正是后端工程师每日的工作流:

  1. 接收请求 → 解析用户意图
  2. 查询数据源 → 加载对话上下文
  3. 编排业务逻辑 → 逐一调用Service
  4. 输出结果 → 生成最终应答

二、系统提示词:全局变量

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配置类来类比@Configurationpublic class AgentConfig {@Value("${agent.role}")private String role;// "二次上路的Java工程师"@Value("${agent.max_history}")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 params);}// 工具注册表(工厂角色)public class ToolRegistry {private Map tools = new HashMap<>();public void register(Tool tool) {tools.put(tool.getName(), tool);}public Tool findByName(String name) {return tools.get(name);}}// 具体工具实现public class WeatherTool implements Tool {@Overridepublic Object execute(Map params) {String city = (String) params.get("city");// 调用底层天气APIreturn weatherApi.getWeather(city);}}

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学习

来源:互联网

免责声明

本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。

同类文章推荐

相关文章推荐

更多