简介:本文系统解析 AI Agent 的定义与本质:它是以大语言模型为“大脑”,叠加规划、记忆与工具调用能力、能自主完成任务的智能体。文章拆解 LLM、Planning、Memory、Tools 四大组件的职责与协作方式,讲清“思考—行动—观察”运行循环,并给出约 150 行 Python 的极简实现思路,帮助开发者厘清 Agent 与 LLM 的边界并掌握落地要点。
AI Agent(智能体)是一种以大语言模型(LLM)为核心决策单元,具备任务规划、记忆与工具调用能力,能够在较少人工干预的情况下自主理解任务、拆解步骤、调用外部系统并最终交付结果的软件系统。
用一个公式概括其组成:
AI Agent = LLM(大脑)+ Planning(规划)+ Memory(记忆)+ Tools(工具)
一个直观的类比:市面上常见的对话式大模型产品,好比一位“足不出户的专家”——你问什么,它答什么,但它不能替你查资料、跑代码、改系统;AI Agent 则像是把这位专家的“大脑”装进了一位全能助理的身体里:这位助理能听懂任务、自己安排步骤、记住中途发生的事,还能动手操作真实世界。
判断一个系统是不是 Agent,可以看三个特征:
对话式大模型能力很强,但作为“纯模型”直接使用时存在四个结构性局限:
这四个局限决定了纯 LLM 只能当“顾问”;而当业务希望大模型直接“干活”——自动查数据、自动处理工单、自动排查故障——就需要在模型之外补齐工程能力。Agent 正是这一层工程架构的统称:它不是玄学,而是一套可落地、有明确边界的软件设计模式。
其核心价值可以概括为:把模型从“能说”升级为“能做”,把原本需要人工按流程串起来的“理解—查询—计算—执行—汇报”环节,交给一个可自主循环的系统完成。
LLM 承担 Agent 中所有“需要动脑”的环节:理解用户意图、拆解任务、决定何时调用哪个工具、阅读工具返回结果、判断任务是否完成、生成最终答复。Agent 的智能上限基本由所选用的大模型能力决定。
面对“分析上季度销售数据并写一份总结”这类复合任务,Agent 需要先规划执行顺序:查数据→做计算→汇总成文。规划组件通常包含两类能力:
业界常见的实现思路是“推理与行动交替”:每一步先让模型输出当前思考,再决定动作,动作结果反馈回来后进入下一轮思考。这种“边想边做”的模式,是多数轻量级 Agent 的骨架。
记忆通常分两层:
没有记忆,Agent 每一步都处于“失忆”状态,无法连贯地完成多步任务。
模型本身只能输出文字,工具让它具备“动手”能力。技术上的通行做法是函数调用(Function Calling)机制,协作方式如下:
典型工具包括:检索知识库、查询数据库、调用计算器、在沙箱中执行代码、操作文件系统、发送通知等。
Agent 的运行本质是一个带终止条件的循环:
接收任务│▼┌─► 模型结合(记忆 + 工具说明书)推理│ ││ ├── 信息不足?──► 执行工具 ──► 结果写入记忆 ──┐│ │ ││ └── 信息足够?──► 生成最终答复,结束 ││ │└──────────────────────────────────────────────────┘
用文字描述一次完整执行:
这个循环解释了两个重要设计点:为什么需要记忆(第 4 步依赖第 3 步的结果)、为什么需要限制最大步数(防止模型陷入无休止的调用循环)。
理解原理最有效的方式是亲手实现一遍。下面这段通用 Python 代码给出一个极简 Agent 的完整骨架,含注释不足 150 行,由“工具抽象、记忆、主循环、示例工具”四部分组成:
# ---------- 1. 工具基类:每个工具自带"说明书" ----------class Tool:def __init__(self, name, description, parameters):self.name = name # 工具名self.description = description # 用途说明:告诉模型何时使用我self.parameters = parameters # 参数结构(Schema)def run(self, **kwargs):raise NotImplementedErrorclass CalculatorTool(Tool):"""示例工具:四则运算计算器(语法树求值,避免直接执行表达式)"""def __init__(self):super().__init__(name="calculator",description="计算一个四则运算表达式,例如 (120 + 30) * 1.13",parameters={"type": "object","properties": {"expression": {"type": "string", "description": "待计算的表达式"}},"required": ["expression"],},)def run(self, expression):import ast, operatorops = {ast.Add: operator.add, ast.Sub: operator.sub,ast.Mult: operator.mul, ast.Div: operator.truediv}def _eval(node):if isinstance(node, ast.Constant) and isinstance(node.value, (int, float)):return node.valueif isinstance(node, ast.BinOp) and type(node.op) in ops:return ops[type(node.op)](_eval(node.left), _eval(node.right))raise ValueError("不支持的表达式")return str(_eval(ast.parse(expression, mode="eval").body))class SearchTool(Tool):"""示例工具:在本地资料中检索关键词"""def __init__(self, documents):super().__init__(name="search_docs",description="在资料库中检索包含关键词的文档,用于获取事实信息",parameters={"type": "object","properties": {"keyword": {"type": "string", "description": "检索关键词"}},"required": ["keyword"],},)self.documents = documentsdef run(self, keyword):hits = [d for d in self.documents if keyword in d]return "\n".join(hits) if hits else "未找到相关资料"# ---------- 2. 记忆:可追加、可整体读取的会话列表 ----------class Memory:def __init__(self):self.messages = []def add(self, role, content, name=None):msg = {"role": role, "content": content}if name:msg["name"] = nameself.messages.append(msg)# ---------- 3. Agent 主循环:思考 - 行动 - 观察 ----------def run_agent(task, llm_chat, tools, max_steps=8):""":param task: 用户任务描述:param llm_chat: 大模型对话接口的抽象封装,返回{"answer": ...} 或 {"tool_name": ..., "arguments": {...}}:param tools: 可用工具列表:param max_steps: 最大循环步数(安全阀)"""memory = Memory()memory.add("user", task)for _ in range(max_steps):# 3.1 组装工具说明书,随消息一起交给模型tool_schemas = [{"name": t.name, "description": t.description, "parameters": t.parameters}for t in tools]decision = llm_chat(memory.messages, tool_schemas)# 3.2 模型决定调用工具:执行 -> 观察 -> 写回记忆if decision.get("tool_name"):tool = next((t for t in tools if t.name == decision["tool_name"]), None)if tool is None:memory.add("tool", f"工具 {decision['tool_name']} 不存在")continuetry:result = tool.run(**decision["arguments"])except Exception as e:result = f"工具执行出错:{e}" # 失败也要反馈,让模型调整策略memory.add("tool", str(result), name=tool.name)continue# 3.3 模型认为信息充分,返回最终答案return decision.get("answer", "")return "已达到最大步数,任务未完成。"# ---------- 4. 组装运行 ----------if __name__ == "__main__":docs = ["2024年Q3销售额为120万元", "2024年Q3毛利率为35%"]tools = [CalculatorTool(), SearchTool(docs)]answer = run_agent("查一下 Q3 销售额,再帮我算出它的 1.13 倍是多少",llm_chat=None, # 对接你所使用的大模型服务后实现tools=tools,)print(answer)
对这段代码做三点说明:
这些场景的共同特征是:任务由多个步骤组成、中间需要外部信息或动作、结果需要整合汇报——恰好对应 Agent 的三大组件能力。
LLM 与 Agent:LLM 是 Agent 的核心组件,但 LLM “被动应答、无状态、只产文字”;Agent “主动执行、有记忆、可操作系统”。一句话:LLM 是大脑,Agent 是装上了手脚和记忆的完整的人。
Agent 与传统自动化脚本:脚本的流程由开发者预先写死,遇到分支只能穷举;Agent 的流程由模型现场决策,能处理事先没枚举到的模糊情况。代价是确定性下降,需要用步数限制、工具白名单等手段兜底。
Agent 与工作流编排:工作流(把大模型作为节点之一的固定流程图)中“下一步做什么”由流程图决定;Agent 中由模型决定。前者可控性强,适合确定性业务;后者灵活性强,适合开放性任务,两者也常组合使用。
单 Agent 与多 Agent 系统:简单任务用单 Agent 循环即可;复杂任务可拆给多个角色化 Agent 协作(如一个负责检索、一个负责写作、一个负责审查),但协作会显著增加复杂度与成本,需谨慎评估必要性。
回到定义本身:AI Agent 是“LLM 大脑 + Planning 规划 + Memory 记忆 + Tools 工具”构成的、能自主完成任务的智能体系统。它出现的根本原因,是纯大模型“只能说不能做”,而业务需要“能做”的系统。其工作原理是一个带终止条件的“思考—行动—观察”循环,用一百多行 Python 即可搭出教学级原型;但走向生产的关键不在模型,而在工具设计、权限控制、循环边界与可观测性这些工程细节。理解了这些,你就掌握了评估各类“智能体”方案的通用框架,也能更准确地判断它适合与不适合的场景边界。