Agent学习 学习笔记

Agent学习笔记(一):从零理解Agent是什么

2026-07-04 · 约10分钟阅读 · Agent基础 · ReAct · Tool Calling

这篇文章是学习笔记,不是教程。记录的是我真实的学习过程——从哪里开始、遇到什么卡点、怎么解决的、哪些概念一开始理解错了。希望对同样在学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"的实现过程。踩到新坑了会继续更新。