Agent 是什么——LLM 只是"嘴",Agent 才有"手"
这是「Agent 工程化」系列的第一篇。本系列从概念讲到生产落地,每篇都能独立阅读。
这篇我们用最朴素的方式把"Agent 到底是什么"讲清楚,不需要任何前置知识。
标签: #AI智能体 #Agent工程化 #大语言模型 #LLM #人工智能 #AI开发 #ReAct #LangChain #AI应用 #技术博客
从一个真实场景说起
先看一句话需求:
“帮我订一张下周五上海飞北京的机票,要早班机。”
把它分别丢给三种"AI",看看它们各自的表现。
第一种:普通 LLM(比如打开 ChatGPT 直接聊)
LLM 很聪明,它会告诉你:“建议选早上 8 点前的航班,比如东航 MU5101,07:00 起飞。” 它甚至能帮你列出推荐清单、避坑指南。
但然后呢?没有了。它不会真的去订。因为它只是个"聊天大脑"——只会输出文字,没有手、没有腿,碰不到真实的订票系统。
第二种:RAG 应用(比如一个"懂行"的旅游知识助手)
它比普通 LLM 强一点:可以接入最新的航班信息、机场攻略,回答里带着来源,看起来更可靠。
但同样是只动嘴不动手。你问它"哪班最早",它答得头头是道;你说"帮我下单",它只能摊手。
第三种:Agent(一个真正的 AI 旅行助手)
它收到这句话后,会自己展开一连串动作:
中间不用你操心,它自己决定下一步干什么、什么时候结束。
这三种 AI 的区别在哪?
普通 LLM / RAG 回答的是"知道",Agent 干的是"做到"。
差距不在"懂不懂",在"能不能动手"。
Agent 到底是什么
一句话定义:
Agent = LLM(大脑)+ 工具(手脚)+ 自主决策循环(灵魂)
拆开看:
- LLM(大脑):负责理解你说的话、推理、做决策。但它有个天生的限制——只会输出文字,碰不到真实世界。
- 工具(手脚):查航班、查天气、下单、发消息……把 LLM 的"想法"变成对外界的"行动"。这是 Agent 和聊天机器人的分水岭。
- 自主决策循环(灵魂):思考 → 行动 → 观察结果 → 再思考。任务没完成就继续循环,直到做完为止。
这里多说一句:工具并不神秘。它就是一个普通的函数或 API,比如 search_flight(出发城市, 到达城市, 日期) 返回航班列表,book_ticket(航班号, 人数) 返回订单号。你天天写的那种。Agent 做的事情,就是"让 LLM 来决定在什么时候、用什么样的参数,去调用这些函数"。
用一张表看普通 LLM 和 Agent 的区别:
| 输入 | 一句话 | 一个目标 |
| 过程 | 一次推理就回答 | 多步推理 + 反复调用工具 |
| 输出 | 一段文字 | 完成任务的最终结果(订单号、诊断结论……) |
| 能力边界 | 只有训练时见过的知识 | 训练知识 + 实时查数据 + 动手操作 |
还有个常被问的问题:Agent 和 RAG 是什么关系?
- RAG(检索增强生成)解决的是"带资料回答":LLM 回答前先查资料库,引用着说。
- Agent 解决的是"动手解决问题":调工具、做动作。
两者不冲突,经常一起用。一个 AI 旅行助手,既需要 RAG 去查"退改签政策"这类文档,也需要工具去真正下单。后面系列会展开讲。
Agent 的"自主性"是分级的
很多人以为 Agent 等于"全自动",其实"自主"是有梯度的。业界通常分 L0-L5:
| L0 | 无自主 | 纯聊天,只会回答"北京几点有早班机" |
| L1 | 工具调用 | 会调"查天气"工具,但只做这一件事 |
| L2 | 链式调用 | 查完机票,接着查酒店,按固定顺序走 |
| L3 | 条件分支 | 看价格:贵的走"推荐经济舱"分支,便宜的走"直接订"分支 |
| L4 | 自主规划 | 自己把"订机票+订酒店+排行程"拆成计划再执行 |
| L5 | 多 Agent 协作 | 机票助手、酒店助手、行程助手分工合作 |
现实是:大多数产品停留在 L1/L2。 越往上越强大,也越需要工程化手段兜底(后面系列会讲)。下次看到"自主智能体"这种词,先问一句:它到 L 几了?
Agent 的核心架构:就一个循环
无论多复杂的 Agent,核心骨架都是同一个循环:
#mermaid-svg-KRbjHAkGKSGd8Anr{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-KRbjHAkGKSGd8Anr .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-KRbjHAkGKSGd8Anr .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-KRbjHAkGKSGd8Anr .error-icon{fill:#552222;}#mermaid-svg-KRbjHAkGKSGd8Anr .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KRbjHAkGKSGd8Anr .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-KRbjHAkGKSGd8Anr .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KRbjHAkGKSGd8Anr .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KRbjHAkGKSGd8Anr .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-KRbjHAkGKSGd8Anr .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KRbjHAkGKSGd8Anr .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KRbjHAkGKSGd8Anr .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KRbjHAkGKSGd8Anr .marker.cross{stroke:#333333;}#mermaid-svg-KRbjHAkGKSGd8Anr svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KRbjHAkGKSGd8Anr p{margin:0;}#mermaid-svg-KRbjHAkGKSGd8Anr .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-KRbjHAkGKSGd8Anr .cluster-label text{fill:#333;}#mermaid-svg-KRbjHAkGKSGd8Anr .cluster-label span{color:#333;}#mermaid-svg-KRbjHAkGKSGd8Anr .cluster-label span p{background-color:transparent;}#mermaid-svg-KRbjHAkGKSGd8Anr .label text,#mermaid-svg-KRbjHAkGKSGd8Anr span{fill:#333;color:#333;}#mermaid-svg-KRbjHAkGKSGd8Anr .node rect,#mermaid-svg-KRbjHAkGKSGd8Anr .node circle,#mermaid-svg-KRbjHAkGKSGd8Anr .node ellipse,#mermaid-svg-KRbjHAkGKSGd8Anr .node polygon,#mermaid-svg-KRbjHAkGKSGd8Anr .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-KRbjHAkGKSGd8Anr .rough-node .label text,#mermaid-svg-KRbjHAkGKSGd8Anr .node .label text,#mermaid-svg-KRbjHAkGKSGd8Anr .image-shape .label,#mermaid-svg-KRbjHAkGKSGd8Anr .icon-shape .label{text-anchor:middle;}#mermaid-svg-KRbjHAkGKSGd8Anr .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-KRbjHAkGKSGd8Anr .rough-node .label,#mermaid-svg-KRbjHAkGKSGd8Anr .node .label,#mermaid-svg-KRbjHAkGKSGd8Anr .image-shape .label,#mermaid-svg-KRbjHAkGKSGd8Anr .icon-shape .label{text-align:center;}#mermaid-svg-KRbjHAkGKSGd8Anr .node.clickable{cursor:pointer;}#mermaid-svg-KRbjHAkGKSGd8Anr .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-KRbjHAkGKSGd8Anr .arrowheadPath{fill:#333333;}#mermaid-svg-KRbjHAkGKSGd8Anr .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-KRbjHAkGKSGd8Anr .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-KRbjHAkGKSGd8Anr .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KRbjHAkGKSGd8Anr .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-KRbjHAkGKSGd8Anr .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KRbjHAkGKSGd8Anr .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-KRbjHAkGKSGd8Anr .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-KRbjHAkGKSGd8Anr .cluster text{fill:#333;}#mermaid-svg-KRbjHAkGKSGd8Anr .cluster span{color:#333;}#mermaid-svg-KRbjHAkGKSGd8Anr div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-KRbjHAkGKSGd8Anr .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-KRbjHAkGKSGd8Anr rect.text{fill:none;stroke-width:0;}#mermaid-svg-KRbjHAkGKSGd8Anr .icon-shape,#mermaid-svg-KRbjHAkGKSGd8Anr .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KRbjHAkGKSGd8Anr .icon-shape p,#mermaid-svg-KRbjHAkGKSGd8Anr .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-KRbjHAkGKSGd8Anr .icon-shape .label rect,#mermaid-svg-KRbjHAkGKSGd8Anr .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KRbjHAkGKSGd8Anr .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-KRbjHAkGKSGd8Anr .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-KRbjHAkGKSGd8Anr :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
没完成
完成
用户提出目标
思考下一步
调用工具
观察结果
任务完成?
输出最终结果
用伪代码看更直白:
while 任务未完成:
llm 输出 { 思考, 要调用的工具, 参数 }
执行工具调用
把结果放回对话历史
判断任务是否完成
回到订机票的例子,这个循环大概长这样:
| 1 | 得先查下周五有哪些航班 | 查航班(上海→北京, 下周五) | 3 个早班机候选 |
| 2 | 挑最早的,看下价格和余票 | 查票价(东航MU5101) | 经济舱 ¥890,有票 |
| 3 | 信息齐了,直接下单 | 下单(东航MU5101, 1人) | 订单号 TD2026XXXX |
| 4 | 完成了,告诉用户 | 结束 | — |
就这么简单。所谓 Agent,本质就是"让 LLM 在一个循环里反复思考、动手、看结果"。第二篇我们会手写一个最小可运行的 Agent(50 行代码),到时候你会发现它真的就只有一个 while 循环。
但生产环境的 Agent,没那么简单
上面的循环能跑通 Demo,但离"好用"还很远。我拆了 6 个实际问题——它们正好是本系列的骨架:
三个常见误区
误区一:Agent = 调大模型 API
不少人觉得"我接了大模型接口,我就在做 Agent 了"。不是的。只做"你说一句,它答一句",那是聊天机器人;有了工具、有了循环,能真正动手完成任务,才叫 Agent。
误区二:Agent 必须用 LangChain 这类框架
框架只是实现方式之一。50 行手写代码也能跑一个像样的 Agent,而且能让你真正理解原理。用框架不等于懂 Agent(第 2 篇会现场演示手写版)。
误区三:Agent 是万能的
它有幻觉,可能一本正经胡说;上下文窗口有限,聊太多会"失忆";给它的工具如果没护栏,它可能真的给你乱下单。越能干的 Agent,越需要工程化手段兜底——这是整个系列最想传达的一件事。
下篇预告
下一篇我们不再讲概念,直接动手:用 50 行 Python 手写一个最小可运行的 ReAct Agent。
它只有一个 while 循环 + 几个简单的"工具",却能自己完成这个任务:
“帮我看看北京明天天气,下雨的话提醒我带伞。”
到时候你会发现,它跑起来的每一步,都能对上今天讲的循环:
| 1 | 先查北京明天的天气 | 查天气(北京, 明天) | 小雨,18-22℃ |
| 2 | 要下雨,提醒用户带伞 | 结束 | — |
框架只是包装,循环才是原理——下一篇我们亲手把它写出来。
本系列路线(从 0 到 1): Agent 是什么 → 手写最小 ReAct → Function Calling 与工具设计 → 上下文管理 → Memory 记忆系统 → RAG 知识库 → Skill 自学习 → 编排模式与多 Agent → 给 Agent 装护栏 → 生产部署与可观测 → 评测与回归




