你好,智能体:从一个会订披萨的AI说起
第 1 章 你好,智能体:从一个会订披萨的 AI 说起
想象一个周五晚上,你刚加完班,瘫在沙发上刷手机。肚子开始咕咕叫,你突然想吃一块热腾腾的玛格丽特披萨。你打开手机,对着一个聊天框说:「帮我订一份披萨。」
如果对面坐的是一个普通聊天机器人——比如 ChatGPT、Claude、文心一言、通义千问——接下来会发生什么?这一章,我们就从这一句看似简单的请求开始,聊清楚一个核心问题:到底什么是 AI Agent(智能体)?它和我们每天在用的 ChatGPT 有什么本质区别?
1.1 订披萨的两种结局:普通 AI vs 智能体
1.1.1 第一次尝试:和「聊天高手」订披萨的崩溃实录
让我们先把时间倒回周五晚上。你对着 ChatGPT 打出那句「帮我订一份披萨」。
ChatGPT 的回答大概是这样的:
> 「好的,我可以帮你!请问你想订哪家的披萨?想吃哪种口味?什么尺寸?送到哪个地址?联系电话多少?希望什么时候送达?」
你一看,心想这 AI 还挺贴心,于是耐心地回答:「必胜客的,超级至尊,大号的,送到中关村大街 27 号,电话 13800138000,现在就要。」
ChatGPT 立刻又问:
> 「请问你的预算是多少?需要加饮料吗?需要发票吗?是否对配料有过敏?是用支付宝还是微信支付?需要备注什么特殊要求吗?」
到这里,你已经有点不耐烦了——明明我刚才都说「现在就要」了。但你还是耐着性子把信息一条条补全,然后 ChatGPT 给出了它最擅长的东西:一段看起来无比专业的「订餐攻略」:
> 「建议您打开美团 APP,搜索『必胜客中关村店』,选择超级至尊大号披萨,加入购物车,填写配送地址,支付订单……」
你盯着屏幕愣了三秒。
它一个字没帮你订。
这就是普通 LLM 的本质——它是一个极其聪明的文字接龙机(next-token predictor)。它能听懂你说的话,能写出让你拍大腿的攻略,能模仿苏格拉底跟你辩论,但它无法替你动手。它没有你的手机,没有你的钱包,不知道现在几点,不知道中关村那家必胜客还开不开门,更不知道美团的优惠券今天能不能用。
当它说「帮你」的时候,它的真实意思是:「我来帮你想一套方案。」
1.1.2 第二次尝试:当 AI 升级为「智能体」之后
让我们重做这个实验。这次,你面对的不是 ChatGPT,而是一个真正的 AI Agent。
你输入:「帮我订一份披萨。」
Agent 没有立刻反问你八条信息。它先在内部做了一件普通 LLM 永远做不到的事:调用工具(tool use)。
第一步,它调用了时间工具,发现现在是周五晚上 10:47,它在思考:「用户说『现在就要』,但 10:47 必胜客可能快打烊了,需要确认。」
第二步,它调用了位置工具,发现你最近的必胜客在中关村,距离你 1.2 公里,营业到 23:00。
第三步,它调用了记忆工具,翻了一下你和它过去的对话,发现你两周前说过「我乳糖不耐受,不要芝士披萨」「我每次都点大号」「我手机号是 13800138000」。
第四步,它调用了下单工具(注意,这一步它必须获得你的授权),它已经选好了:必胜客中关村店 / 大号超级至尊 / 不加芝士 / 联系电话 13800138000 / 预计 11:25 送达。然后它向你确认:「主人,我准备按这些信息下单,金额 89 元从你的支付宝扣,预计 11:25 到,可以吗?」
你回了一个字:「好。」
30 分钟后,披萨准时送到门口。
这就是智能体(Agent)的魅力——它真的帮你把事情办成了。
我们用一张流程图来对比这两种体验的底层差异:
```mermaid flowchart TD A[用户输入: 帮我订披萨] --> B{系统类型}
B -->|普通 LLM / ChatGPT| C[理解意图] C --> D[追问细节] D --> E[生成文字攻略] E --> F[用户自己手动执行] F --> G[用户: 我自己来吧]
B -->|AI Agent| H[理解意图] H --> I[调用时间工具] H --> J[调用位置工具] H --> K[调用记忆工具] H --> L[调用下单工具] I --> M[整合信息,形成方案] J --> M K --> M L --> M M --> N[请求用户授权] N --> O[用户确认] O --> P[自动执行下单] P --> Q[披萨送达] ```
从这张图里你能清晰地看到,普通 LLM 和 AI Agent 的分水岭不在于「谁更聪明」,而在于:谁能把事情真正做完。
1.2 智能体的三个核心特征:自主、目标、工具
既然 Agent 这么神奇,那么它在学术上是怎么定义的呢?学界和工业界对 AI Agent 的定义不下二十种,但无论哪种定义,都离不开三个核心特征:自主性(autonomy)、目标导向(goal-oriented)、工具使用(tool use)。我们一个一个拆开讲。
1.2.1 特征一:自主性(Autonomy)
自主性是指 Agent 能够在没有人类一步步指挥的情况下,自己决定「下一步该做什么」。
还是用订披萨的例子。普通 LLM 是一问一答的:你问一句,它答一句,你不问,它就傻站着。而 Agent 是主动推进的:你只说了「帮我订披萨」,它会自己去查时间、查位置、查历史订单,然后整理出一个完整的方案来向你确认。
我用「实习生 vs 正式员工」的比喻来帮你建立直觉:
- **实习生**(对应普通 LLM):你必须把任务拆得非常细——「打开浏览器」「输入网址」「点击搜索按钮」——它才能执行。它不会主动思考「我是不是该先看看他的历史订单」。
- **正式员工**(对应 Agent):你只需要说「把这个客户的服务做好」,他自己会决定「先看看他之前买过什么」「看看他的偏好」「评估预算」「推荐方案」。
自主性不是说 Agent 会脱离人类控制,而是说它能在你设定的目标范围内,自己规划步骤。这是它和普通 LLM 最大的差别。
1.2.2 特征二:目标导向(Goal-oriented)
目标导向是说 Agent 是为了「达成某个目标」而工作,而不是为了「回答某个问题」而工作。
听起来有点抽象,我们对比一下:
- **ChatGPT 的工作模式**:接收 prompt → 输出回复 → 结束。它的 KPI 是「这次回答得好不好」。
- **Agent 的工作模式**:接收目标 → 规划步骤 → 调用工具 → 检查结果 → 如果没达成,继续循环 → 直到目标达成或宣告失败。它的 KPI 是「任务最终完成了没有」。
一个简洁的判断标准:如果你给它一句话,它会持续「做事」直到事情做完,那它就是目标导向的;如果你给它一句话,它给一段文字就结束了,那它就是普通 LLM。
注意,自主性和目标导向是紧密绑定的。一个真正自主的 Agent,必然是有目标在驱动的;一个真正目标导向的 Agent,必然需要自主性来推进。没有目标的自主叫「漫无目的」,没有自主的目标叫「纸上谈兵」。
1.2.3 特征三:工具使用(Tool Use)
工具使用是 Agent 区别于普通 LLM 最显性的特征。
普通 LLM 是一个封闭系统:它的输入是你给的文字,输出也是文字,它无法触碰外部世界。它的知识截止到训练那一刻,它也不知道现在几点、你家地址在哪、你账户里有多少钱。
Agent 是一个开放系统:它可以通过调用外部工具来获取实时信息、操作外部系统、执行具体动作。这些工具可以是一个 API、一个数据库、一段代码、一个浏览器、另一个 Agent,甚至一台机器人。
工具的本质是什么?工具 = 让 LLM 长出手脚和眼睛。LLM 本身只能生成文字,但加上工具之后,它就能「看到」时间、「摸到」数据库、「操作」手机下单。
用一句话总结这三者:自主性是 Agent 的「性格」,目标导向是 Agent 的「使命」,工具使用是 Agent 的「能力」。 一个真正的 Agent,三者缺一不可。
1.3 横向对比:LLM、RPA、BOT、Agent 各自的江湖
讲到这里,你可能会有疑问:听你这么一说,Agent 听起来像 RPA(机器人流程自动化)啊?或者像那些自动回复的客服 BOT?它们到底有什么不一样?
这是一个非常好的问题。我用一张详细的对比表来帮你厘清四者的边界。
1.3.1 四象限对比表
| 维度 | 普通 LLM(如 ChatGPT) | 传统 BOT(聊天机器人) | RPA(流程自动化) | AI Agent | |------|---------------------|--------------------|-----------------|---------| | 核心能力 | 文本生成、理解 | 关键词匹配、流程应答 | 模拟鼠标键盘、流程执行 | 推理 + 规划 + 工具调用 | | 决策方式 | 一次性推理 | 预设规则、决策树 | 预设脚本、固定流程 | 动态规划、推理决策 | | 对环境变化的适应 | 不适应环境,只适应 prompt | 完全不灵活 | 遇到 UI 变化就崩溃 | 可以推理后应对变化 | | 典型场景 | 写作、问答、翻译 | 客服自动回复、FAQ | 财务对账、报表生成 | 复杂任务自动化、智能助手 | | 是否需要大模型 | 是 | 否 | 否 | 是(核心大脑) | | 是否需要工具 | 否 | 通常否 | 通过 UI 操控软件 | 是,核心特征 | | 成本 | 中(按 token 计费) | 低 | 高(部署维护贵) | 中-高 | | 智能化程度 | 中-高 | 低 | 低 | 高 |
1.3.2 场景化解读
场景一:用户问「我想退货,怎么办?」
- **LLM** 会给一段完整的退货流程说明。
- **BOT** 会匹配「退货」关键词,弹出预设的退货政策链接。
- **RPA** 会按预设脚本打开订单系统、查询订单、生成退货单——但前提是 UI 没有变。
- **Agent** 会先调用订单 API 查这个用户最近的订单,根据订单状态、用户历史退货记录、退货政策综合判断,再决定是直接生成退货单,还是转人工。
场景二:每月做一份销售报表
- **LLM** 写不出,因为它拿不到数据。
- **BOT** 完全做不了,这超出它的能力范围。
- **RPA** 最擅长,固定流程、重复执行。
- **Agent** 可以做,但成本更高。除非这个过程中需要 LLM 来理解邮件中的「特殊情况说明」,否则用 RPA 更划算。
场景三:研究一个陌生的开源项目并写一份摘要
- **LLM** 能写摘要(如果你把代码贴给它)。
- **BOT** 做不了。
- **RPA** 做不了。
- **Agent** 最适合:它可以自己打开 GitHub、克隆仓库、阅读 README、查阅 issue、搜索资料、最终写摘要。
1.3.3 一个实用的判断口诀
判断一个任务该用哪种技术,我有一个简单的口诀:
1. 任务完全固定、流程不变 → 用 RPA 最划算。 2. 任务有标准答案、固定话术 → 用 BOT 最划算。 3. 任务需要理解复杂语言、生成内容 → 用 LLM 最划算。 4. 任务既需要理解复杂语言,又需要执行具体动作,还要能应对变化 → 这才是 Agent 的主场。
记住这四句话,你就再也不会把这几个概念搞混了。
1.4 动手实践:你的第一个 Agent MVP
理论讲了这么多,你是不是有点手痒了?别急,我们马上写代码。
我们的目标是:用最少的代码,让一个聊天机器人能够感知「今天星期几」。这是智能体的最小可行单元(MVP, Minimum Viable Product)。
1.4.1 为什么从「感知时间」开始?
你可能会问:为什么要从这么简单的功能开始?
两个原因:
第一,「感知时间」是 Agent 区别于普通 LLM 的最小可验证特征。普通 LLM 不知道「现在几点」「今天星期几」,因为它的知识截止到训练那一刻。而一旦 Agent 能调用时间工具来获取实时信息,它就具备了「连接现实世界」的能力——这是 Agent 最核心的特征。
第二,这个例子足够简单,你可以在一杯咖啡的时间内跑通,但又足够有代表性,能体现 Agent 的核心工作流:理解意图 → 调用工具 → 整合信息 → 生成回答。
1.4.2 准备工作
在写代码之前,你需要准备两样东西:
1. Python 环境(建议 3.9 以上)。 2. OpenAI API Key(或者任何兼容 OpenAI 接口的大模型服务,例如 Azure OpenAI、DeepSeek、智谱 GLM、月之暗面 Moonshot 等)。
安装必要的库:
```bash pip install langchain langchain-openai python-dotenv ```
在项目根目录新建一个 `.env` 文件,写入:
``` OPENAI_API_KEY=sk-your-api-key-here ```
1.4.3 编写你的第一个 Agent
我们使用 LangChain(一个非常流行的 Agent 开发框架)来快速搭建。
新建一个文件 `first_agent.py`,写入下面的代码:
```python
first_agent.py
这是你的第一个 AI Agent,它能感知今天星期几
import os from datetime import datetime from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain.agents import AgentExecutor, create_openai_tools_agent from langchain_core.prompts import ChatPromptTemplate from langchain_core.tools import tool
1. 加载环境变量
load_dotenv()
2. 定义一个工具:获取今天星期几
@tool def get_today_weekday(query: str = "") -> str: """当你需要知道今天是星期几时,调用这个工具。""" weekdays = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"] today = datetime.now() return f"今天是 {weekdays[today.weekday()]}," \ f"日期是 {today.strftime('%Y-%m-%d')}。"
3. 初始化 LLM 大脑
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
4. 设计提示词,告诉 Agent 它的角色和工具
prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个贴心的智能助手,可以使用工具来回答问题。"), ("human", "{input}"), ("placeholder", "{agent_scratchpad}"), ])
5. 把工具注册到 Agent 上
tools = [get_today_weekday] agent = create_openai_tools_agent(llm, tools, prompt) agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
6. 测试运行
if __name__ == "__main__": result = agent_executor.invoke({"input": "今天星期几?"}) print("\n最终回答:", result["output"]) ```
整段代码不到 30 行,但已经是一个货真价实的 Agent 了。它具备了我们前面讲的三个核心特征:
- **自主性**:你只问「今天星期几」,它自己决定调用 `get_today_weekday` 工具。
- **目标导向**:目标是回答用户问题,它会持续推理直到生成答案。
- **工具使用**:通过 `@tool` 装饰器把 Python 函数注册成 Agent 可以调用的工具。
1.4.4 运行与观察
在终端运行:
```bash python first_agent.py ```
你会看到类似这样的输出(中间是 LangChain 的思考过程):
``` > Entering new AgentExecutor chain... Invoking: `get_today_weekday` with `{'query': ''}`
今天是 星期五,日期是 2025-01-17。 根据工具返回的信息,今天是 2025 年 1 月 17 日,星期五。
> Finished chain.
最终回答: 今天是 2025 年 1 月 17 日,星期五。 ```
注意看 `Invoking: get_today_weekday` 这一行——这就是 Agent 自主决策调用工具的过程。如果把 `verbose=True` 关掉,你只会看到最终的「今天是星期五」。
1.4.5 亲手验证「Agent vs 普通 LLM」
为了让你真切感受到 Agent 和普通 LLM 的差别,你可以做一个对照实验:
1. 同一个 API Key,把 `tools=[]`(空列表)传给 Agent,重新运行。 2. 你会发现 Agent 也能回答「今天星期五」——但这个答案是 LLM 猜的,它其实并不知道真实的日期,它的训练数据截止到某个时间点。 3. 把 `tools=[get_today_weekday]` 加回去,Agent 就会老老实实调用工具获取真实时间。