把一个LLM直接接到聊天窗口上,得到的是一个对话机器人;把同一个LLM放进一套带规划循环、工具注册和记忆管理的框架里,得到的是一个能自主完成任务的智能体。两者的差距不在模型本身,而在架构,以及架构如何使用模型。理解LLM在Agent中扮演的角色,是搭建智能体系统之前必须补上的一课:它负责什么、不负责什么、它的决策如何转化为真实动作、它的能力边界又如何决定整个系统的上限。下面从概念辨析、核心职责、框架实现和选型边界四个层面展开。

先厘清概念:单独的LLM和智能体中的LLM不是一回事
单独使用LLM时,它本质上是一个无状态的文本到文本的映射函数:输入一段提示词,输出一段文本,调用结束,一切归零。它不知道现在几点,无法访问你的数据库,也记不住上一轮对话之外的任何信息,除非你在提示词里手动塞给它。这种形态决定了它只能回答问题,不能执行任务。
而在智能体架构中,LLM的角色发生了根本变化。经典的Agent运行循环可以概括为四个阶段:感知,接收任务描述和环境反馈;规划,把目标拆解成可执行的步骤;行动,选择并调用合适的工具;反思,根据执行结果修正下一步策略。LLM站在每一个需要思考和决策的节点上,但真正执行动作的是外层的工具层,维护运行状态的是外层的记忆系统。换句话说,LLM负责想,框架负责做,两者合在一起才构成完整的智能体。
一个常用的类比是:LLM是大脑,工具是双手,记忆系统是笔记本,运行循环是心跳。大脑再聪明,没有双手就改不了文件,没有笔记本就记不住半小时前做过什么决策。不少智能体项目效果不佳,不是因为模型笨,而是因为只装了大脑,其他器官一个都没配齐,最后做出来的东西自然还是个聊天机器人。
LLM在Agent中承担的四类核心职责
职责一:任务理解与规划分解
用户给出的目标往往是模糊的,比如帮我分析这份销售数据并写一份周报。LLM的第一项工作就是把它翻译成机器可执行的子任务序列:读取文件、清洗数据、计算关键指标、生成报告文本。规划质量直接决定后续每一步的成败,这也是为什么推理能力强的模型在智能体场景里优势格外明显。规划环节的提示词设计有很多讲究,一个实用的模板如下:
你是一个任务规划智能体,请把用户目标拆解为可顺序执行的子任务列表。
用户目标:{goal}
可用工具:
- search_web:联网检索资料
- read_file:读取本地文件
- run_code:执行Python代码
输出要求:
1. 每个子任务必须能由上述工具之一完成
2. 子任务数量控制在5个以内
3. 按执行顺序编号输出
模板里最关键的是那几条约束。没有子任务必须能由单个工具完成这条限制,模型经常拆出十几个步骤,或者产出无法映射到任何工具的空想任务,导致后续循环空转烧token。规划提示词值得反复打磨,它是整个智能体的起点。
职责二:工具选择与调用决策
这是LLM区别于普通聊天场景最典型的能力输出。在函数调用机制下,开发者把每个工具的名称、功能描述和参数结构以JSON形式注册给模型,模型在对话过程中自行判断当前是否需要使用工具、用哪一个、参数该怎么填。看一段典型代码:
import json
# 定义工具的JSON描述,LLM靠它来判断何时调用、如何传参
tools = [
{
"type": "function",
"function": {
"name": "search_weather",
"description": "查询指定城市的实时天气情况",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称,如北京"},
"date": {"type": "string", "description": "查询日期,格式YYYY-MM-DD"}
},
"required": ["city"]
}
}
}
]
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "北京今天适合户外跑步吗"}],
tools=tools
)
# 关键点:此时模型返回的不是文字答案,而是一次调用决策
message = response.choices[0].message
if message.tool_calls:
call = message.tool_calls[0]
args = json.loads(call.function.arguments)
weather_data = search_weather(args["city"])
# 把工具结果回传给模型,让它结合数据继续推理并生成最终回答
注意这段代码里的关键转变:模型第一次返回的并不是对用户问题的回答,而是一次结构化的调用决策。框架层拿到这个决策后执行真正的查询函数,再把结果作为新的消息回传给模型,模型结合天气数据才能给出是否适合跑步的建议。整个过程中LLM没有碰过任何真实数据,它只做判断和调度。工具描述写得是否清晰、参数定义是否规范,会直接影响模型决策的准确率,这是智能体开发中最容易被低估的工程细节。
职责三:记忆组织与反思修正
智能体跑起来之后会产生大量中间结果:工具返回值、历史决策、报错信息。这些内容不可能全部塞进有限的上下文窗口,LLM需要配合外层机制完成信息取舍,常见做法包括滑动窗口截断、摘要压缩、向量检索召回等。另一项容易被忽视的职责是反思与自我修正:当工具返回报错或结果与预期不符时,模型要能识别失败原因,调整参数重试,或者干脆换一条执行路径,而不是机械地把错误信息原样抛给用户。一个不会反思的智能体,遇到第一次挫折就会卡死。
从ReAct框架看LLM如何驱动行动循环
ReAct是当前最主流的智能体推理范式,名字来自Reasoning和Acting两个词的组合。它的核心思想是让LLM在每一步先输出一段思考,再输出一个动作,框架执行动作后把观察结果回传,模型基于新信息继续思考,循环往复直到产出最终答案。这个看似简单的过程,正是LLM从文本生成器变成行动主体的分水岭。用一段精简代码就能看清楚整个机制:
import json
class ReActAgent:
def __init__(self, llm, tools, max_steps=10):
self.llm = llm
self.tools = tools
self.max_steps = max_steps
def run(self, task):
messages = [
{"role": "system", "content": "你是一个任务型智能体,请按 Thought、Action、Observation 的循环逐步解决问题,得到答案后输出 Final Answer。"},
{"role": "user", "content": task}
]
for step in range(self.max_steps):
output = self.llm.chat(messages)
if output.startswith("Final Answer:"):
return output
# 解析模型给出的动作,例如:Action: search_weather[北京]
action = self.parse_action(output)
if action is None:
messages.append({"role": "assistant", "content": output})
messages.append({"role": "user", "content": "请严格按照格式输出 Action"})
continue
tool_name, tool_args = action
observation = self.tools[tool_name].run(tool_args)
messages.append({"role": "assistant", "content": output})
messages.append({"role": "user", "content": "Observation: " + observation})
return "已达最大步数,任务未完成"
这段不到四十行的代码揭示了智能体的本质:一个由LLM驱动的循环。模型每转一圈,就完成一次思考加决策;框架每转一圈,就完成一次与真实世界的交互。循环的终止条件、最大步数限制、格式纠错分支,都是工程层面对模型不可控性的兜底。实际项目中,ReAct循环最常见的故障就是模型不按格式输出Action导致解析失败,所以代码里专门加了格式提醒的重试逻辑。
ReAct之后还衍生出Plan-and-Execute等变体:先让模型一次性生成完整计划,再逐步执行,出现偏差时重新规划。ReAct灵活,适合探索型任务;先规划后执行稳定,适合流程明确的任务。无论哪种变体,LLM的角色定位始终没有变:它是循环中的决策者,而不是循环本身。把框架的能力误认为是模型的能力,或者反过来,都是选型和排错时容易犯的方向性错误。
LLM的能力边界决定智能体的上限
无论框架设计得多精巧,智能体的天花板最终由LLM的能力决定。上下文长度决定了能同时装进多少工具描述和历史记忆;函数调用质量决定了传参准确率;指令遵循能力决定了输出格式是否稳定,而格式不稳定会让整个循环随时中断;推理深度则决定了多步规划和纠错的上限。选型时可以对照下面的维度表逐项评估:
| 能力维度 | 对智能体的直接影响 | 选型参考 |
|---|---|---|
| 上下文长度 | 决定能同时装入多少工具描述、历史记忆和中间结果 | 复杂任务建议128K起步 |
| 函数调用支持 | 原生支持的模型传参更准,无需脆弱的正则解析 | 优先选原生Function Calling |
| 指令遵循能力 | 决定输出格式是否稳定,直接影响循环能否持续运转 | 用格式化测试集实测 |
| 推理深度 | 决定多步规划和自我纠错的上限 | 复杂决策任务选推理强化版本 |
| 调用成本 | 循环式调用会成倍放大token消耗 | 高频简单任务用小模型分层调度 |
实践中有两条经验值得参考。一是不要盲目堆砌工具,注册的工具越多,模型选错的概率越高,上下文消耗也越大,一个运行良好的智能体往往只配备五到十个定义清晰的高质量工具。二是考虑模型分层调度:规划和纠错等关键决策交给强模型处理,格式转换、摘要压缩等简单环节交给轻量模型完成,能在效果和成本之间取得不错的平衡。
回到最初的问题,LLM在智能体中扮演的是大脑角色:它理解任务、规划路径、调度工具、反思修正,但它没有记忆也没有双手,一切自主行动能力都来自围绕它搭建的工程框架。智能体开发的真正功力,恰恰体现在用框架放大模型的能力,同时用兜底逻辑掩盖模型的缺陷。想清楚这一点,再去选模型、配工具、写循环,方向就不会跑偏。