🤖 系列: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 源码:
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 的优势
你的理解:“推理和行动变成新的工作模式” ✅ 非常到位!
五、跑通 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 自动做了这些事:
六、思考题(95分)
A 部分:源码阅读
B 部分:ReAct 论文
总分:57/60(95%)
七、成就感满满!

截图说明:每次看到 AI 老师的肯定和鼓励,都觉得自己又进步了一点点。
Day 9 的收获:
从"会用 Agent"升级到"懂 Agent 原理",这种感觉真好!
八、Day 10 预告
明天学习LangGraph(Agent 的图执行引擎),把今天学的理论变成可视化的工作流图。
目标:
九、学习资源
今日文件清单
langchain_agents_source.py | |
01_agents_source_annotated.py | |
05_agents_source_chinese.py | |
react_paper_summary.md | |
03_langchain_agent_demo.py | |
04_thinking_questions.py | |
notes.md | |
PROGRESS.md | |
console_log.md |
推荐阅读
十、总结
Day 9 的核心收获:
从"会用"到"懂原理",是每个程序员成长的必经之路。
📅 Day 9 完成! 继续加油,明天见!
💬 个人格言: 代码改不改变世界我不知道,但先让我准时下班。
夜雨聆风