本文是专栏《从零看懂 AI Agent》第 1 篇。回到目录与导读。
先从一个场景说起
假设你想订一张下周去上海的高铁票。
用聊天机器人是这样的:
你:"帮我查下周去上海的高铁。" 它:"好的,你可以打开 12306,搜索……"
它给你的是一段建议。真正的查询、比价、下单,还得你自己动手。
而用一个Agent,理想情况是这样的:
你:"帮我订下周三上午去上海、二等座、靠窗的高铁票。" 它:(自己去查车次 → 筛选上午的 → 挑有靠窗余票的 → 下单 → 回来告诉你)"已订好 G1024,周三 9:00 出发,二等座 07F 靠窗,订单号 xxx。"
差别在哪?聊天机器人只会输出文字;Agent 会自己去做事,中间不用你一步步盯着。
这就是最朴素的区分:
聊天机器人回答问题,Agent 完成任务。
一个能落地的定义
学术和工程界对 Agent 有很多定义,但剥掉外壳,一个 AI Agent 通常具备三个特征:
- 有目标:你给它一个任务,而不只是一个问题。
- 能自主循环:它会自己"想一步、做一步、看结果、再想下一步",直到任务完成,而不是一次输出就结束。
- 能调用工具:它可以搜索、读写文件、调 API、运行代码——伸手去"够"到真实世界。
用一句话概括:
AI Agent = 大模型(会思考) + 循环(能持续推进) + 工具(能动手)。
这三样缺一不可。少了工具,它只能空想;少了循环,它只能回一句就停;少了模型,它就没有"判断该做什么"的大脑。
为什么"循环"是关键
很多人以为 Agent 的魔法在于模型多聪明,其实循环才是它区别于普通问答的分水岭。
普通问答是"一问一答":
输入 → 模型 → 输出(结束)
Agent 是"一个不断转的圈":
目标 →┌─────────────────────────┐
│ 想:现在该做什么? │
│ 做:调用某个工具 │
│ 看:工具返回了什么结果? │
└───────────┬─────────────┘
│ 还没完成?回到"想"
│ 完成了?输出最终结果
正因为有这个圈,Agent 才能应付"计划赶不上变化"的真实任务。比如订票时发现上午没票了,它能自己改成中午——而不是像静态脚本那样直接报错停下。这一点我们会在第 3 篇讲 ReAct时展开。
Agent、工作流、聊天机器人,怎么分?
这三个词经常被混着用,简单对照一下:
| 谁来决定下一步? | 举例 | |
|---|---|---|
| 聊天机器人 | 用户(每一步都要你发话) | 客服问答、翻译 |
| 工作流(Workflow) | 程序员(提前写死的流程) | "收到邮件 → 提取附件 → 存数据库" |
| Agent | 模型自己(运行时临场决定) | "帮我调研这三家公司并出一份对比" |
关键分界在于**"下一步由谁决定"。工作流的路线是人提前画好的,遇到没预料的情况就断了;Agent 的路线是模型临场判断**出来的,所以更灵活,但也更难预测、更难保证稳定——这正是工程上最头疼的地方(第 8 篇会专门讲)。
一条实用经验:能用固定工作流解决的,就别上 Agent。 Agent 的灵活性是有代价的——更慢、更贵、更难调试。只有当任务步骤没法提前写死时,Agent 才真正有价值。
一个"最小 Agent"长什么样
不用任何框架,一个 Agent 的骨架其实就几行伪代码:
目标 = "帮我查北京今天的天气并判断要不要带伞"
历史 = [目标]
while True:
# 1. 想:把历史丢给模型,让它决定下一步
决定 = 模型.思考(历史)
if 决定.是最终答案:
print(决定.内容) # 3-a. 完成,输出
break
# 2. 做:模型想调用某个工具
结果 = 执行工具(决定.工具名, 决定.参数)
# 3-b. 看:把结果塞回历史,进入下一轮循环
历史.append(决定)
历史.append(结果)
是不是比想象中简单?真正复杂的不是这个骨架,而是:
这些正是后面几篇要一块块拆开讲的。
小结
- Agent 不是更能聊的机器人,而是能自己完成任务的系统。
- 三要素:模型(大脑)+ 循环(持续推进)+ 工具(动手)。
- 它和工作流的根本区别是:下一步由模型临场决定,因此更灵活也更难控。
- 能用固定流程搞定的事,优先用工作流;Agent 留给"步骤没法提前写死"的场景。
下一篇,我们把这个"系统"拆开,看看一个 Agent 内部到底由哪几个零件组成。
继续阅读:Agent 的大脑与四肢——拆解核心组成