Agent 不只是 LLM 加几个 Tool——真正让它跑得起来的,是一整套运行时架构。
近两年,AI Agent 热度攀升。许多开发者起步于“大模型+工具+Prompt”的简单组合,处理简单查询尚可,但面对复杂任务(如多维度销售数据分析)时,常因数据库超时、数据不全或模型循环调用而陷入困境。
此时,单纯依赖大模型生成答案已无法解决问题。工程核心在于构建一套能够持续决策、执行动作、获取反馈、处理异常并明确终止条件的运行时系统。
「这才是 AI Agent 的工程核心。Agent 不只是 LLM 加几个 Tool,它还需要一套负责执行、控制、状态管理和错误恢复的运行时架构。」
本文将从最小 Agent 入手,拆解这套架构的核心要素。
本文看点
02
Think → Act → Observe 内核循环
05
五道防线让 Agent 不失控
10
用 Python 从零搭出最小 Agent
DEFINITION
概念辨析:什么才算真正的 Agent?
在讨论架构前,需厘普通大模型应用、Workflow 与 Agent 的区别:
1. 普通大模型应用
流程为:用户输入 → Prompt → LLM → 返回答案。适用于文本总结、翻译等单次调用场景。若涉及多步查询与分析,单次调用显然不足。
2. Workflow(工作流)
由程序预先定义执行步骤(如:查数据→算环比→识异常→查流失→生报告)。优势在于路径清晰、易测试审计。若业务流程稳定,无需过度智能化。
3. Agent(智能体)
核心区别在于动态选择下一步行动。Agent 根据当前状态和已获信息决定后续动作(如发现华东销售下降,转而查询该区域订单取消率)。执行路径随结果动态变化,非完全预设。
三者关系:企业级应用可采用“Workflow 外层控制 + Agent 动态判断环节”的组合模式,兼顾可控性与灵活性。
4. Agent 的最小组成
从工程实现角度,Agent 包含五个基本部分:

- LLM:负责决策,判断下一步行动。
- Tools:负责执行,包括查询、API 调用、计算等。
- State:负责保存状态,记录任务、历史、结果、进度及预算。
- Loop:负责推进,连接决策、执行与反馈,支持多轮迭代。
- Stop:负责终止,在任务完成、预算耗尽或不可恢复错误时停止。
CORE LOOP
Agent 内核:Think、Act、Observe 循环
Agent 的核心执行模式可概括为:Think(决策)→ Act(执行)→ Observe(观察)。
1. Think:决策下一步
模型接收任务、可用工具、已查数据、历史动作及剩余预算等上下文,决定下一步行动。例如:“暂无销售数据,先查询本月及上月各区域销售额。”注意:模型仅返回调用意图,未实际执行。
2. Act:程序执行动作
运行时解析模型返回的工具调用请求(如 JSON 格式),查找对应工具实现,校验参数后调用实际接口(数据库或 API)。执行者是程序而非模型。执行完成后,工具返回真实结果(如:华东区销售额下降 18%)。
3. Observe:反馈结果
运行时更新 Agent 状态,将工具结果提供给模型。模型基于新状态继续决策(如:检查订单取消率或客户流失率)。如此循环,直至任务完成。
4. 为何不能写成一个大函数?
随着功能增加,单体函数难以维护模型失败、工具超时、预算溢出、用户取消及断点恢复等问题。合理做法是将 Agent 视为有明确状态和转换规则的运行时系统,即引入状态机。
STATE
State 与状态机:超越聊天记录的持久化
聊天记录仅是 State 的一部分。Agent 还需知晓:已执行工具及结果、当前阶段、步数、Token 消耗、子任务状态及错误信息。
1. State 结构设计
简化状态结构示例:
实际系统还需保存工具记录、计划、检查点等。需注意上下文裁剪策略,避免 Token 无限增长,同时保留关键业务事实。
2. 状态机的价值
状态机明确定义了允许做什么及下一步状态。最小 Agent 可包含四种状态:Thinking(决策中)、Acting(执行中)、Done(完成)、Error(错误)。

状态转换规则示例:Done 状态不应继续执行工具;Error 状态不能无条件回到正常路径;Acting 状态超时需根据错误类型决定重试或终止。复杂场景可引入 WaitingApproval(待审批)、Paused(暂停)等状态。
注意:状态机不能替代权限校验。高风险操作需在执行层再次检查授权。
TOOL CALLING
ReAct 与 Function Calling:模型如何调用工具?
模型与工具通信主要有两种思路:
1. ReAct:约定格式
模型输出约定格式的动作信息(如 Action: query_sales),运行时解析并执行。优点是与模型无关,缺点是文本格式不稳定,需严格的解析、校验和错误处理。
2. Function Calling:结构化数据

通过向模型提供工具定义(Schema),模型生成结构化调用请求。运行时负责校验工具存在性、参数类型、权限,并执行工具。Function Calling 仅结构化意图,执行、安全校验和错误恢复仍属运行时职责。
3. 选型建议
生产系统优先使用原生 Function Calling,因其更适合参数校验和管理。ReAct 适用于不支持原生调用的场景。无论哪种方式,核心都是“获取意图→校验→执行→保存结果→继续决策”的循环。
4. 统一工具接口
为便于管理,工具应具备统一接口。Python 可使用 Protocol 定义:
CONTROL
控制机制:防止 Agent 失控的五道防线
1. 限制最大执行步数 (MaxSteps)
设置单次任务最大步数(如 10 步),超过即停止。防止模型因无法推进任务而无限循环。
2. 控制 Token 预算
设置累计 Token 上限。每次调用后更新用量,达到上限即停止。需依据模型接口返回的实际用量统计,多模型环境需考虑成本差异。
3. 设置执行超时
包括单次工具/模型请求超时及任务总期限。Python 可使用 asyncio.wait_for() 等机制。注意:超时取消不一定能立即停止底层操作。
4. 检测重复动作
生成动作签名(如 tool_name:args_json),检测连续相同调用。若超过阈值,触发风险控制。注意区分数据变化导致的合理重复。
5. 限制错误自愈次数 (MaxHealAttempts)
工具返回参数错误时,允许模型修正,但需限制重试次数。区分网络超时(适合退避重试)、参数非法(适合模型修正)和权限不足(不应重试)。
「停止条件是 Agent 核心架构的一部分,而非锦上添花。」
ERROR HANDLING
错误处理:构建可靠的自愈机制
1. 错误分类
- 输入/参数错误:反馈给模型修正,多次失败则停止。
- 瞬时错误(如网络中断):采用有限重试及指数退避。
- 不可恢复错误(如权限不足、预算耗尽):立即停止,避免风险扩大。
2. 自愈实现
将错误信息写入历史,让模型决定修正或确认。重新执行前必须再次校验参数。对于创建订单等敏感操作,禁止因超时而直接重试扣款。
3. 高风险动作的控制
企业 Agent 与普通聊天机器人不同,错误可能导致实际业务后果(如重复下单、越权修改)。权限检查、幂等控制、事务和审批机制不能仅靠 Prompt,需由确定性程序控制:
4. 完整记录
保留错误类型、工具、参数摘要、重试次数及修复结果,以便分析故障根源。
OBSERVABILITY
可观测性:拒绝黑盒,事件流与 Trace
良好的工程体验要求 Agent 执行过程可见。可通过定义基础事件(tool_call, tool_result, answer_delta, error, done)实现。
1. 事件流解耦
使用异步生成器逐步输出事件,前端通过 SSE 或 WebSocket 接收。用户端展示进度,开发者端记录详细日志(耗时、错误码、Token 用量),并注意敏感数据脱敏。
2. 执行轨迹 (Trace)
串联模型调用、工具执行、状态转换和结果,形成完整 Trace。借此分析任务成功率、平均时长、单位成本及错误恢复效果,评估是否适合生产环境。
PLANNING
任务规划:Plan-and-Execute 与 DAG
对于多步骤任务,ReAct 的动态执行可能增加延迟和成本。引入 Plan-and-Execute 模式:先生成计划,再执行。
1. DAG 与并行执行
使用有向无环图 (DAG) 描述任务依赖。独立子任务(如查销售额、查流失率)可并行执行,汇总任务需等待前置完成,提升效率。
2. 计划验证
模型生成计划后,运行时需验证:ID 唯一性、依赖存在性、无循环依赖、工具合法性及预算合规性。模型负责提出,程序负责验证。
3. 混合模式
结合 ReAct 与 Planning:生成初步计划 → 执行子任务 → 观察结果 → 判断计划有效性 → 有效则继续,失效则重新规划。兼顾效率与灵活性。
PERSISTENCE
持久化:从一次性程序到可恢复长期任务
长周期任务需应对服务重启或人工审批等待。内存状态不足,需引入 Checkpoint(检查点)。
1. Checkpoint 机制
关键操作后保存状态快照,包括任务 ID、消息历史、已完成工具、计划、预算及时间戳。可使用 JSON 文件或数据库存储,并通过 Store 接口抽象实现。
2. 恢复执行的复杂性
工具调用可能产生外部副作用(如创建订单)。若进程在保存状态前崩溃,恢复时直接重放会导致重复操作。解决方案:
- 使用幂等键:业务系统识别同一操作。
- 状态核对:恢复前检查外部系统真实状态。
- 事务机制与人工确认:针对高风险操作。
IMPLEMENTATION
实战:用 Python 组织最小 Agent 代码
整合前述机制,构建模块化 Python Agent。
1. 项目结构
分为 agent/(执行控制)、tools/(工具定义)、storage/(持久化)、tests/(测试)。模块化便于职责分离。
2. 统一工具接口与注册表
定义 Tool Protocol,实现 CalculatorTool 等具体工具。建立 ToolRegistry 字典,通过名称查找工具实现。注意:注册不等于授权,执行前需校验权限。
3. 状态与预算控制
定义 AgentState 数据类保存进度。定义 AgentBudget 检查步数和 Token 上限。
4. 执行循环
封装 LLMClient 适配层,统一不同模型的响应格式。主循环逻辑:检查预算 → 请求模型 → 判断类型(最终答案/工具调用) → 执行工具/返回结果 → 更新状态 → 下一轮。
5. 持久化与测试
实现 save_state/load_state 方法。编写单元测试覆盖:普通问答、正常工具调用、参数错误、超时、重复调用、预算溢出、状态恢复、非法工具及重复副作用等场景。测试不仅关注最终答案,更要验证中间执行过程的正确性。
THE END
结语:企业级 Agent 的核心竞争力
大模型仅是 Agent 系统的一部分。真正决定其能否稳定工作的,是状态机、统一工具接口、预算控制、错误处理、事件流、Checkpoint 及幂等机制等工程设施。
企业应用关注的是:数据准确性、权限合规、故障处理、证据可追溯及适时停止。架构应随业务复杂度演进:简单问答用模型,固定流程用 Workflow,动态判断用 Agent,复杂并行引入规划。
大模型决定了系统能做出何种判断,而运行时架构决定了这些判断能否转化为可靠、可控、可恢复的实际行动。这是从 Demo 走向生产系统的关键跨越。
END

