乐于分享
好东西不私藏

Day 9:精读 Agent 源码,从“会用“到“懂原理“

Day 9:精读 Agent 源码,从“会用“到“懂原理“

🤖 系列:Java工程师转AI Agent 3个月学习计划 👤 作者:宸丶一 | 28岁Java程序员,规划狂魔,周一继续肝 🎯 今日目标: 精读 LangChain Agent 源码 + ReAct 论文,理解 Agent 执行原理 💬 个人格言: 代码改不改变世界我不知道,但先让我准时下班。

前言

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

今天是第9天,主题是:从"会用 Agent"升级到"懂 Agent 原理"。

昨天我们用 LangChain 撸了一个迷你豆包,今天要深入源码,看看 Agent 到底是怎么工作的。

先说结论:Agent 不是魔法,就是一个状态机循环。

一、今日学习路线

二、AI 老师的教学策略:不是无脑给翻译

截图说明:AI 老师不是直接把 256 行源码全部翻译成中文,而是分层教学:

先给中文注释版(01_agents_source_annotated.py)

再给英文原文(langchain_agents_source.py)

最后给纯中文翻译(05_agents_source_chinese.py)

为什么这样设计?

就像你读 Spring 源码:

不会直接给你 10 万行代码让你自己看
而是先给你核心类的注释版,理解架构
再给你原文,对照学习
最后给你中文翻译,巩固理解

AI 老师的教学理念:引导式学习,不是填鸭式教学。

三、Agent 的核心:三个状态(agents.py 精读)

3.1 AgentAction = “我要调工具”

class AgentAction:    tool: str           # 工具名,比如 "get_weather"    tool_input: str | dict  # 参数,比如 "北京"    log: str            # LLM 的思考过程

Java 对标:

public classAgentActionimplementsSerializable{    String tool;           // 工具名    String toolInput;      // 工具参数    String log;            // LLM 的思考过程}

3.2 AgentStep = “工具返回了结果”

class AgentStep:    action: AgentAction  # 之前的工具调用请求    observation: Any     # 工具返回的结果

Java 对标:

public classAgentStepimplementsSerializable{    AgentAction action;   // 之前的请求    Object observation;   // 工具结果}

3.3 AgentFinish = “任务完成了”

class AgentFinish:    return_values: dict  # 最终返回值    log: str             # 完整的输出文本

Java 对标:

public class AgentFinish implements Serializable {    Map<String, Object> returnValues;  // 最终答案    String log;                         // 完整输出}

3.4 执行循环(状态机)

┌─────────────────────────────────────────────┐│                                             ││   LLM 思考                                  ││      ↓                                      ││   需要调工具? ──是──→ AgentAction           ││      │                   ↓                  ││      否             执行工具                 ││      │                   ↓                  ││      │             AgentStep(记录结果)      ││      │                   ↓                  ││      └──────────── 回到 LLM 思考 ←─────────┘│                                             ││   不需要调工具 → AgentFinish(任务完成)      │└─────────────────────────────────────────────┘

Java 版:

while (true) {    AgentAction action = llm.think(messages);  // LLM 决定调哪个工具    if (action != null) {        Object result = executeTool(action);   // 执行工具        AgentStep step = new AgentStep(action, result);        messages.add(step);                    // 把结果喂回给 LLM    } else {        AgentFinish finish = llm.getFinalAnswer();        return finish.getReturnValues();       // 返回最终答案    }}

这就是你 Day 5 手写的 Agent!LangChain 只是把它标准化了。

四、ReAct 论文:推理 + 行动 = 新的工作模式

4.1 之前的两种方法

方法
特点
问题
Chain-of-Thought (CoT)
只推理,不行动
会幻觉(编造信息)
Action-only
只行动,不推理
盲目执行,缺乏规划

4.2 ReAct 的核心思想

让 LLM 交替进行"推理"和"行动":

Thought: 我需要先查一下北京的天气Action: search("北京天气")Observation: 北京今天晴,25度Thought: 用户还问了上海,我也查一下Action: search("上海天气")Observation: 上海今天多云,22度Thought: 现在我有两个城市的天气,可以计算温差了Final Answer: 北京25度,上海22度,温差3度

4.3 ReAct 的优势

减少幻觉
:通过行动获取真实信息,不靠 LLM 编造
防止错误传播
:每一步都有观察结果验证,错了能及时纠正
更可解释
:完整的思考过程记录,人类能看懂 Agent 为什么这么做

你的理解:“推理和行动变成新的工作模式” ✅ 非常到位!

五、跑通 LangChain Agent

from langchain_core.tools import toolfrom langchain_openai import ChatOpenAIfrom langchain.agents import create_agent@tooldef get_weather(location: str) -> str:    """获取指定城市的天气信息"""    return f"{location}今天晴,25度"llm = ChatOpenAI(model="mimo-v2-flash", ...)agent = create_agent(model=llm, tools=[get_weather], ...)# 测试result = agent.invoke({"messages": [("user", "北京天气怎么样?")]})print(result['messages'][-1].content)# 输出:北京今天天气晴朗,气温25度

Agent 自动做了这些事:

识别"天气"关键词
决定调用 get_weather 工具
生成正确的参数 “北京”
执行工具并获取结果
整理结果并回复用户

六、思考题(95分)

A 部分:源码阅读

题目
评分
评语
A1 基础题
✅ 10/10
全对
A2 进阶题
✅ 10/10
Java 思维理解到位
A3 挑战题
⚠️ 7/10
混淆了数据结构和数据内容

B 部分:ReAct 论文

题目
评分
评语
B1 基础题
✅ 10/10
全对
B2 进阶题
✅ 10/10
比喻精准
B3 挑战题
✅ 10/10
考虑了失败情况

总分:57/60(95%)

七、成就感满满!

截图说明:每次看到 AI 老师的肯定和鼓励,都觉得自己又进步了一点点。

Day 9 的收获:

✅ 理解了 Agent 的 3 个核心状态(Action → Step → Finish)
✅ 理解了 ReAct 的"推理+行动"新模式
✅ 跑通了 LangChain Agent 的 3 个测试
✅ 思考题 95 分

从"会用 Agent"升级到"懂 Agent 原理",这种感觉真好!

八、Day 10 预告

明天学习LangGraph(Agent 的图执行引擎),把今天学的理论变成可视化的工作流图。

目标:

理解 LangGraph 的核心概念(State、Node、Edge)
用 LangGraph 构建一个简单的 Agent 工作流
对比 LangChain Agent 和 LangGraph 的差异

九、学习资源

今日文件清单

文件
用途
langchain_agents_source.py
源码原文 + 中文注释
01_agents_source_annotated.py
源码注释版(重点学习)
05_agents_source_chinese.py
中文逐行翻译
react_paper_summary.md
ReAct 论文核心摘要
03_langchain_agent_demo.py
LangChain Agent 实战
04_thinking_questions.py
思考题(95分)
notes.md
学习笔记
PROGRESS.md
学习进度
console_log.md
执行记录

推荐阅读

ReAct 论文
:arxiv.org/abs/2210.03629
LangChain 官方文档
:docs.langchain.com
LangGraph 官方文档
:langchain-ai.github.io/langgraph

十、总结

Day 9 的核心收获:

Agent = 状态机
:不是魔法,就是三个状态的循环
ReAct = 推理 + 行动
:新的工作模式,更可靠、更可解释
LangChain = 标准化框架
:底层和你手写的一样,只是抽象了

从"会用"到"懂原理",是每个程序员成长的必经之路。

📅 Day 9 完成! 继续加油,明天见!

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

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料