跳转至

第 2 章 Agent 的诞生:给大脑装上手和脚

在第 1 章中,我们建立了一个朴素而坚定的共识:大语言模型本质上是一个被困在对话框里的“超级概率机”。不管它显得多么聪明、逻辑多么严密,它最终吐出来的只是一串文字。

它看不见你的屏幕,摸不到你的键盘,打不开你电脑里的任何一个文件夹,更没办法替你真正跑一段程序。

那么,当人们惊叹于“AI 帮我把代码写好并运行了”、“AI 自主分析了一整份财报还画出了趋势图”时,背后到底发生了什么奇迹?

这一章,我们将拆解智能体(Agent)最核心的运转秘密:我们是如何给这个只会吐字的大脑,装上双手和感官的。


1. 破局之道:它不用真的长出手

要让模型操作计算机,普通人第一反应往往是:是不是得改造模型架构,让它的神经元直接连接电脑的键盘线、鼠标线和网线?

完全不需要。

工程师们采用了一种极为优雅且符合软件工程哲学的解法:模型依然只需要负责吐字,具体动手的事情,由运行在电脑上的外部软件(宿主程序)代劳。

整个协作过程就像一个指挥官与传令兵的故事: - 指挥官(大模型):坐在没有窗户的作战密室里,足不出户。他擅长分析全局、做决策,但他身上没有任何装备。 - 传令兵(宿主程序 / Agent 运行环境):穿梭在现实世界里,他拥有电脑的操作权限,能打开软件、能运行命令行、能新建或删除文件。

指挥官只要在纸条上写下一句标准格式的暗号指令(比如:运行 Python 脚本),传令兵拿到纸条后走出密室,在真实的电脑上敲下回车运行;程序跑完后,传令兵把电脑屏幕上的输出结果抄在纸上,再次递进密室给指挥官看。

这种通过“文字暗号”让外部系统代为执行动作并收回结果的机制,就是 工具调用(Tool Calling / Function Calling)。


2. 第一步:系统提示词(给大脑一份使用手册)

模型在刚启动时,并不知道自己正在被谁使用,也不知道这台电脑上有什么能力可用。

因此,在用户正式跟模型交谈之前,Agent 系统会悄悄在会话最顶端塞入一段很长的背景介绍——这就是系统提示词(System Prompt)。

这段话通常包含三个极其明确的信息:

  1. 环境认知:“你现在是一个运行在 Linux/Windows 操作系统上的自主工作助手,当前工作目录是 /home/user/project。”
  2. 工具清单:“为了完成任务,你可以随时使用以下工具:
  3. read_file(路径):读取某个文本文件的内容;
  4. run_python(代码):在电脑终端中执行一段 Python 脚本并获取输出;
  5. list_directory(目录):查看文件夹里有哪些文件。”
  6. 调用暗号规范:“当你需要使用工具时,不要说任何寒暄废话,必须严格按照指定的格式输出工具名称和参数。”

有了这份说明书,模型在面对用户的请求时,就不会只是一味地在屏幕上聊天,而是学会了在关键时刻“召唤工具”。

重要直觉:Agent 能做事情的上限在哪里?
理论上讲,只要一个正常人类坐在这台电脑前能做的事情,Agent 全都能够被赋予能力去做。
如果给它一个能够执行代码的接口,它就能做一切数据分析和计算;如果给它能够读写硬盘的接口,它就能整理你电脑里的上万份文档;如果给它模拟鼠标点击和键盘按键的工具,它甚至能替你在任何没有 API 的老旧软件上点按钮、录入表单。
它的能力边界,完全取决于外部宿主程序愿意给它递上什么样的工具。


3. 为什么“一问一答”做不成复杂任务?

过去我们使用 ChatGPT 这类聊天机器人时,交互模式是极其简陋的“一问一答”: - 你发一句提示:“帮我分析这份销售数据,找出问题并画出折线图。” - 模型只能一口气吐出一大串 Python 代码,然后告诉你:“请你在自己的电脑上安装某某库,把代码复制进去运行即可。”

如果你运行之后,终端里啪地弹出一长串红色的报错信息(例如“列名不存在”、“编码格式错误”),模型根本不知道发生了什么。你只能满脸无奈地把报错复制下来,再贴回聊天框问它“这该怎么修”。

现实世界中解决任何真正的问题,从来都不是靠“一次性闭眼射箭,命中即结束”的。

真正的干活过程必然包含:试探做一步 → 看看结果如何 → 遇到报错分析原因 → 修正方法再试一步 → 最终确认搞定。

为了让 AI 拥有这种解决复杂实际问题的坚韧性,人类发明了 Agent 最核心的运作机制——ReAct 循环。


4. 智能体的灵魂:ReAct 循环

ReAct 是 Reasoning(思考) 与 Acting(行动) 的缩写。它是今天几乎所有主流 AI 编程助手、自动化智能体普遍采用的底层骨架。

思考(Reason) → 行动(Act) → 观察(Observe) → 再思考 → 再行动 → 再观察…… 直到任务完成。

我们来看一个生动完整的数据分析案例,看看齿轮是如何一步一步转动起来的。


实战推演:分析销售数据并生成图表

用户的初始指令:

“在当前文件夹里有一份今年的销售记录,请帮我分析总趋势,并画一张月度销售额折线图保存到桌面上。”

收到任务后,Agent 并没有急着给出一个敷衍的回答,它的 ReAct 循环开始无声转动:

【第 1 轮循环】

  • 思考(Thought):用户没有告诉我具体的文件名是什么,我需要先看一眼当前目录下有哪些文件。
  • 行动(Act):调用工具 list_directory(path=".")。
  • 观察(Observation,外部环境真实返回):目录中包含三个文件:README.md、sales_2025.csv、logo.png。

【第 2 轮循环】

  • 思考(Thought):找到了,销售数据应该就在 sales_2025.csv 里。但我不清楚它的表头字段和数据长什么样,盲目写分析代码一定会报错。我得先读一下前 5 行。
  • 行动(Act):调用工具 read_file(path="sales_2025.csv", lines=5)。
  • 观察(Observation):返回内容显示:
    # 内部统计导出版本,未经清洗
    订单日期,商品品类,销售金额,支付状态
    2025-01-03,电子产品,1299.00,已支付
    2025-01-05,图书,45.50,已支付
    2025-01-12,服装,暂无数据,已退款
    

【第 3 轮循环】

  • 思考(Thought):观察发现了两个细节:第 1 行是带 # 的说明文字,读取时需要跳过;销售金额列里存在像“暂无数据”这种脏数据文本,如果不做类型转换和过滤,画图时一定会报错。现在我掌握了格式,可以写一段 Python 脚本,用 Pandas 清洗数据并用 Matplotlib 画出折线图。
  • 行动(Act):调用工具 run_python(code="...绘图脚本...")。
  • 观察(Observation,现实中的意外发生):终端没有输出成功,而是抛出了一段醒目的 Python 报错:
    ModuleNotFoundError: No module named 'matplotlib'
    

【第 4 轮循环】

  • 思考(Thought):刚才的代码失败了,因为当前运行环境里没有安装 matplotlib 绘图库。不过我发现 Python 内置有简易生成 SVG 矢量图或写 HTML 图表的能力,或者我可以尝试调用系统命令直接把这个库装上。先尝试安装依赖最为彻底。
  • 行动(Act):调用工具 run_command(command="pip install matplotlib")。
  • 观察(Observation):终端输出:Successfully installed matplotlib-3.9.0 ...。

【第 5 轮循环】

  • 思考(Thought):环境依赖已经补齐,现在我重新运行第 3 轮中设计好的绘图脚本。
  • 行动(Act):调用工具 run_python(code="...绘图脚本...")。
  • 观察(Observation):终端输出:图片已成功保存至 ./monthly_sales_trend.png,统计耗时 0.42 秒。

【第 6 轮循环:终局】

  • 思考(Thought):图表已经成功生成在磁盘中,数据处理过程完整无误。用户交代的目标已经全部达成,我不需要再调用任何工具了,可以直接向用户汇报结果。
  • 最终输出(Final Output):
    “销售数据已完成清洗与分析:全年总有效订单共计 1,240 笔,销售峰值出现在 6 月与 11 月。月度趋势折线图已为您生成并保存在当前目录下的 monthly_sales_trend.png 中。”

5. 本章总结:重新定义 Agent

读到这里,Agent 的神秘面纱已经被彻底揭开。

如果用一个公式来定义一个现代智能体:

$$ \text{Agent(智能体)} = \text{大语言模型(思考大脑)} + \text{系统提示词(行动准则)} + \text{工具集(双手与感官)} + \text{ReAct 循环(自主推进的意志)} $$

  • 没有大模型,系统就失去了常识判断和逻辑规划能力;
  • 没有工具集,模型就只能在聊天框里隔靴搔痒;
  • 而如果没有 ReAct 循环,模型就只能做一次性的猜测,一旦遭遇报错就当场休克。

正是 ReAct 循环带来的“在试错中前进、在反馈中调整”的闭环机制,才让原本笨拙的文本补全机,蜕变成了能够独立攻坚任务的数字打工人。


留下一个悬念

你可能觉得,既然有了 ReAct 循环,给模型挂上所有工具,让它无限循环下去,它岂不是能替人类解决世界上的一切问题了?

现实远比理论骨感。

请仔细看刚才的推演过程:每一轮行动过后,外部环境的返回内容(读到的文件文本、报错信息、安装日志)都会被源源不断地塞回会话历史里。

如果一个任务需要循环 50 步、100 步呢? - 模型的上下文窗口会被海量的输出日志彻底塞爆; - 它可能会因为看了太多中间错误,把最初的目标彻底忘得一干二净; - 它甚至可能陷入“死循环”,在同一个报错里打转出不来。

如何给 Agent 设计清爽合理的规矩?如何管理有限的上下文?当工具成百上千时,怎么不把模型的大脑撑爆?

下一章,我们将深入 Agent 世界最重要的分水岭——上下文工程与项目规则配置。