🤖 系列:Java工程师转AI Agent 3个月学习计划
👤 作者:宸丶一 | 28岁Java程序员,规划狂魔,正在被AI Agent按头学习
🎯 今日目标: 理解Agent核心架构、工具调用机制、错误处理策略
💬 个人格言: 代码改不改变世界我不知道,但先让我准时下班。


前言

大家好,我是宸一,一个28岁的Java程序员。

今天是第4天,学习内容是:Agent核心架构全解析

前三天我们学了:

  • Day 1:大模型API基础
  • Day 2:LangChain与工具调用
  • Day 3:记忆系统与向量数据库

今天要把这些串起来,看看一个完整的Agent到底是怎么工作的。

这次的学习方式有点不一样——我用的是"1对1问答式"学习。

什么意思?就是我问AI老师问题,它秒回我,我再追问,它再解答。不像传统学习那样"看视频→做笔记→忘了",而是"问→答→理解→追问→深入"。

下面我把今天的核心内容整理出来,全是问答中碰撞出来的干货。


一、Agent三元组:规划、工具、记忆

1.1 最简模型

Agent的本质就是三个核心模块:

👤 用户

🤖 Agent

📋 Planning

🔧 Action

💾 Memory

✅ 输出结果

1.2 用后端思维理解

Agent概念 Java后端对应 说明
Planning Service层业务逻辑 拆解任务、决定执行流程
Action 调用外部API/工具类 执行具体操作
Memory 数据库 + 缓存 存储历史和上下文

这就是我们天天干的事儿:

  1. 接收请求 → 理解用户意图
  2. 查数据库 → 获取历史上下文
  3. 执行业务逻辑 → 调用各种Service
  4. 返回结果 → 生成回答

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

2.1 什么是System Prompt?

系统提示词就是Agent的"人设",一次创建,全程不变。

# 就像Java中的常量
public static final String ROLE = "再战Java工程师的28岁程序员";

# 或者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中我们这样写
@Configuration
public class AgentConfig {
    @Value("${agent.role}")
    private String role;  // "再战Java工程师"
    
    @Value("${agent.max_history}")
    private int maxHistory;  // 10
}

一次创建,全程使用,不会改变。


三、对话历史:滑动窗口

3.1 为什么需要滑动窗口?

大模型的上下文窗口有限,不能无限存储对话历史。

采用

✅ 解决方案

100轮对话

滑动窗口
只保留最近10轮

Token可控 ✅
费用可控 ✅

❌ 问题

用户聊了100轮对话

全部塞给大模型

Token爆炸 💥
费用爆炸 💰

3.2 实现方式

from collections import deque

class 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 完整流程

第4步:调用执行

⚡ get_weather(北京, 明天)

📊 25°C / 晴

第3步:参数提取

📝 NLP解析

city: 北京

date: 明天

第2步:语义匹配

🔍 意图分析

查询天气 → 0.95

搜索网页 → 0.32

第1步:工具注册表

📋 get_weather / search_web

👤 用户输入
帮我查一下明天北京天气

💬 明天北京天气晴,25°C,适合出行~

4.2 用后端思维理解

工具调用 = 策略模式 + 工厂模式

// 策略接口
public interface Tool {
    String getName();
    String getDescription();
    Object execute(Map<String, Object> params);
}

// 工具注册表(工厂)
public class ToolRegistry {
    private Map<String, Tool> 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 {
    @Override
    public Object execute(Map<String, Object> params) {
        String city = (String) params.get("city");
        // 调用天气API
        return weatherApi.getWeather(city);
    }
}

4.3 两种工具选择方式

方式 原理 优点 缺点
向量匹配 语义相似度搜索 灵活,能处理模糊表达 需要向量数据库
大模型直接选择 把工具列表塞给LLM 简单,LLM本身就懂语义 工具太多时prompt很长

现在主流是方式2(OpenAI的Function Calling就是这个原理):

# 把工具描述直接给大模型
prompt = f"""
你有以下工具可用:
1. get_weather - 查询指定城市的天气
2. search_web - 搜索网页信息

用户问题:{user_query}

请选择合适的工具并提取参数。
"""

五、错误处理:三板斧

5.1 完整流程

👤 查一下东京天气

🔄 第1次调用
get_weather(东京)

成功?

🔄 第2次调用

成功?

🔄 第3次调用

成功?

🔀 备选方案
search_web(东京天气)

成功?

⚠️ 兜底
网络异常,请稍后再试

✅ 返回结果

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 核心概念对照表

Agent核心架构

System Prompt
全局配置/常量

对话历史
滑动窗口/deque

工具调用
策略模式+工厂模式

错误处理
try-catch+重试

Agent三元组
Controller+Service+DAO

AI概念 Java后端对应 本质
System Prompt 全局配置/常量 一次创建,全程不变
对话历史 滑动窗口/deque 只保留最近N轮
工具调用 策略模式+工厂模式 注册→匹配→执行
错误处理 try-catch+重试 重试→降级→兜底
Agent三元组 Controller+Service+DAO 规划+工具+记忆

6.2 1对1问答式学习的优势

这次学习我采用了"问答式",发现和传统学习完全不同:

升级

❓ 问答式学习

问问题

主动探索

问题秒回,即时解决

边学边问边理解

保持专注 🔥

📚 传统学习

看视频/文章

被动接收

有问题先记下

学完才能实践

容易走神 😴

传统学习 问答式学习
看视频/文章 问问题
被动接收 主动探索
有问题先记下 问题秒回,即时解决
学完才能实践 边学边问边理解
容易走神 保持专注

举个例子:

我问:系统提示词是什么?
AI答:就是Agent的人设,类似全局变量

我追问:那对话历史呢?
AI答:滑动窗口,只保留最近10轮

我再追问:工具调用怎么知道调哪个?
AI答:语义匹配,向量相似度搜索

每个问题都是秒回,不用等,不用查资料
这种"即时反馈"让学习效率翻倍

6.3 学习感悟

AI Agent的学习曲线其实没有想象中陡峭。

🤖 AI Agent对应概念

☕ Java工程师已有基础

API调用

数据库

缓存

设计模式

异常处理

大模型接口

向量数据库

记忆系统

Agent架构

错误重试

作为Java工程师,我们已经有很好的工程基础:

  • 理解API调用 → 理解大模型接口
  • 理解数据库 → 理解向量数据库
  • 理解缓存 → 理解记忆系统
  • 理解设计模式 → 理解Agent架构
  • 理解异常处理 → 理解错误重试

关键是要用熟悉的视角去理解新概念。


七、明日计划

按照学习计划,明天要:

  • 动手实现一个迷你Agent
  • 把今天学到的架构落地成代码
  • 继续用后端思维拆解AI概念

八、写在最后

学AI不难,难的是坚持。

作为一个"规划狂魔",我太了解那种"规划完就满足"的感觉了。

但这次不一样,我有AI老师陪我学,有问题随时问,有答案即时给。

如果你也是Java工程师,想转AI Agent,欢迎关注我的系列文章。

我们一起,用后端思维,拆解AI世界。


📌 系列目录

  • Day 1:环境搭建与大模型API基础
  • Day 2:LangChain核心与工具调用
  • Day 3:记忆系统与向量数据库
  • Day 4:Agent核心架构全解析(本文)
  • Day 5:动手实现迷你Agent(即将更新)

标签: #AI Agent #Java工程师 #Agent架构 #工具调用 #错误处理 #学习笔记 #Hermes Agent #1对1学习


关于作者: 宸丶一,28岁Java程序员,规划狂魔,正在用AI学AI。

💬 格言: “代码改不改变世界我不知道,但先让我准时下班。”

🎯 目标: 3个月转AI Agent,用后端思维拆解AI世界。

声明: 本文为原创学习笔记,如需转载请注明出处。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐