Agent学习笔记(一):从零理解Agent是什么
这篇文章是学习笔记,不是教程。记录的是我真实的学习过程——从哪里开始、遇到什么卡点、怎么解决的、哪些概念一开始理解错了。希望对同样在学Agent的人有帮助。
起点:我和Agent的距离
在2026年初,我对Agent的理解止步于:"就是ChatGPT加了个循环,让它自己决定调什么工具。"这个理解不算错,但太粗糙了,导致我看Agent框架的代码时完全看不懂。
所以我决定:从零开始,把Agent的每个概念拆开来学。
第一步:理解"Agent = LLM + 循环 + 工具"
最开始我以为Agent很神秘。后来看到一个极简的Agent实现,才发现自己想复杂了:
def simple_agent(user_input):
messages = [{"role": "user", "content": user_input}]
while True:
response = llm.call(messages)
if response.has_tool_call:
result = execute_tool(response.tool_call)
messages.append(response)
messages.append({"role": "tool", "content": result})
else:
return response.content
这就是Agent的核心:LLM决定下一步做什么,执行,把结果喂回去,再让LLM决定。循环直到任务完成。
卡点:一开始不理解为什么要有while True。后来想明白了——Agent的本质是"让模型自己控制流程",而不是我们写死if-else。
第二步:ReAct框架(推理+行动)
理解了循环之后,下一个问题是:LLM怎么决定"下一步做什么"?
答案是:让它把自己的思考过程说出来。
ReAct(Reasoning + Acting)的核心思想:让LLM在每次调用工具之前,先输出一段"思考"(Thought),再输出"行动"(Action)。
输入:北京今天天气怎么样?
Thought: 我需要查天气,应该用get_weather工具
Action: get_weather(city="北京")
Observation: { "temp": 28, "weather": "晴" }
Thought: 已经拿到天气数据了,可以回答了
Action: Final Answer: 北京今天28度,晴天。
卡点:一开始我以为ReAct是某个框架特有的功能。后来发现ReAct是一种Prompt设计模式,任何支持Tool Calling的LLM都能用。关键是Prompt要引导模型输出"Thought"。
第三步:Tool Calling(工具调用)
这是最实际的一步。怎么让LLM"真的"调工具,而不是"假装"调工具?
OpenAI的Function Calling是最标准的实现:
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名"}
},
"required": ["city"]
}
}
}
]
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=tools # 关键:把工具定义传进去
)
卡点:工具描述(description)写得不好,LLM就会乱调工具。比如get_weather的description如果写成"获取天气",LLM可能不知道这个工具能查哪些城市。要写成"获取指定城市的当前天气,支持国内外主要城市"。
第四步:记忆机制(短期+长期)
Agent跑多轮对话时,最大的问题是:上下文越来越长,token消耗越来越大,而且早期信息会被"淹没"。
解决方案分两层:
- 短期记忆:就是messages列表。简单直接,但长度有限制(通常8k-128k tokens)。
- 长期记忆:把历史对话压缩成摘要,或者存入向量数据库,需要时再检索出来。代表框架:MemGPT、LangChain Memory。
卡点:向量检索的准确率是个大问题。用户问"上周那个项目的进度怎么样了",Agent需要从历史记录里找到"上周的项目讨论"——如果直接用向量相似度,可能召回的是不相关的内容。解决方法是:给记忆加时间戳 + 给工具调用结果加结构化摘要。
第五步:多Agent协作
学到这里,我开始想:一个Agent能力有限,多个Agent分工合作是不是更好?
答案是肯定的。比如:
- Planner Agent:负责拆解任务
- Executor Agent:负责执行具体步骤
- Reviewer Agent:负责检查结果
卡点:Agent之间的通信格式。如果每个Agent都输出自然语言,信息传递会有损耗。更好的做法是:Agent之间传递结构化数据(JSON Schema),只有最终输出才转成自然语言。
目前的学习状态
到这篇文章写成时,我已经完成了:
- ✅ 理解Agent的基本原理(循环 + 工具调用)
- ✅ 会用OpenAI Function Calling实现简单Agent
- ✅ 理解ReAct框架的Prompt设计
- ✅ 初步了解记忆机制
- 🔄 正在学:多Agent协作框架(AutoGen / CrewAI)
- 🔄 正在学:Agent的评估方法(怎么知道Agent表现好不好)
下一步计划:用一个真实场景把Agent跑起来——我想做一个"自动化脚本生成Agent":用户描述需求,Agent自动生成Selenium脚本并验证是否能运行。这个做出来,对我的自动化外包业务有直接帮助。
写给同样在学的人
Agent的学习曲线不是"陡峭",而是"坑多"。概念不难,但每个概念都有实践中的坑。我的建议是:
- 不要一开始就上框架(LangChain/AutoGen),先手写一个极简Agent
- 工具描述要写仔细,这是Agent表现好坏的关键
- 给Agent加日志,看清它每一步在想什么
- 多Agent不是越多越好,两个够用就别用三个
学习Agent的过程,也是理解"AI能做什么、不能做什么"的过程。这个认知,比学会某个框架更有价值。
下一篇笔记会记录多Agent协作的实践,以及"自动化脚本生成Agent"的实现过程。踩到新坑了会继续更新。