简介:本文系统梳理智能体(Agent)架构的定义、背景与核心组成:从不到20行代码的Agent Loop讲起,拆解“感知-决策-行动-反馈”控制流与上下文工程、工具设计、记忆、评测等外围体系,厘清Workflow与Agent的本质区别,并总结三条来自实践的关键工程经验,帮助开发者在选型、调试与落地中少走弯路。
Agent(智能体)架构,是一种以大语言模型为决策核心、以工具调用为执行手段、以循环控制流为组织骨架的软件系统构建方式。它的目标是让系统从“被动执行预定义流程”转变为“围绕目标自主规划并完成任务”。
可以用一个业界广泛认可的抽象公式来理解:
Agent ≈ 大模型(推理与决策)+ 工具(感知与行动)+ 循环(控制流)+ 外围工程体系(上下文、记忆、评测、安全)
从三个视角分别看:
传统自动化(工作流、脚本、流程编排引擎)的前提是:流程可以被人事先穷举。每一步做什么、遇到什么分支走哪条路,都要写死在代码或配置里。这类系统确定性高,但面对路径未知的任务——例如“排查这个服务为什么变慢”——就无法预先定义步骤。
大模型具备推理与指令理解能力,但单次调用只能一次性作答:不能读文件、查数据库、执行命令,也无法根据中间结果调整策略。Agent架构正是为补齐这一层而生:
一句话概括价值:Workflow解决“已知路径的自动化”,Agent解决“未知路径的自动化”。
去掉各类SDK的包装,几乎所有Agent实现的核心循环都可以抽象为下面这段示意代码:
// Agent Loop 最小核心实现(示意代码)const messages = [{ role: "user", content: userInput }];while (true) {// 决策:调用大模型,附带工具定义与完整历史消息const response = await model.chat({model: MODEL_NAME, // 任选支持工具调用的主流大模型maxTokens: 8096,tools: toolDefinitions, // 工具清单:名称、描述、参数结构messages,});// 分叉:模型是否请求调用工具if (response.stopReason === "tool_use") {// 行动:并行执行所有被选中的工具const toolResults = await Promise.all(response.content.filter((block) => block.type === "tool_use").map(async (block) => ({type: "tool_result",toolUseId: block.id,content: await executeTool(block.name, block.input),})));// 反馈:把模型输出与工具结果写回历史messages.push({ role: "assistant", content: response.content });messages.push({ role: "user", content: toolResults });} else {// 终止:模型返回纯文本,任务完成return response.content.find((b) => b.type === "text")?.text ?? "";}}
看起来平平无奇,但这段循环就是Agent全部控制流的基础。大量开源框架与各类官方SDK,无论功能多么丰富,拆开看主循环都与它高度一致。
上述循环对应四个不断重复的阶段:
循环的终止条件只有一个:模型不再请求工具,返回纯文本。
成熟的Agent系统通常在循环外围叠加以下模块:
从最小实现扩展到支持子Agent、上下文压缩、技能加载的复杂系统,主循环基本保持不变。新能力几乎都通过三种方式接入:
常见反模式是把循环体改造成一个巨大的状态机:在循环里塞进各种分支判断、阶段标记和手工跳转逻辑。这会迅速失去可维护性,也会让模型的能力被固化流程锁死。
正确分工是:模型负责推理与决策(它擅长的),外部系统负责状态存取与边界控制(工程擅长的)。 这个分工一旦确立,核心循环就极少需要调整,团队可以把精力投入到真正影响成功率的外围环节。
适合Agent架构的任务通常具备“路径不可预知 + 每步结果可验证”的特征:
反之,路径固定、规则明确的任务(定时同步、固定格式转换等),用Workflow或脚本成本更低、行为更可控。
这是最容易混淆的一对概念,可以用“谁决定下一步”来一刀切:
| 维度 | Workflow | Agent |
|---|---|---|
| 决策者 | 开发者预先编排 | 模型运行时自主决定 |
| 控制流 | 固定图结构(DAG/状态机) | 循环 + 终止条件 |
| 确定性 | 高,输出可预期 | 低,存在探索与试错 |
| 成本 | 步骤数固定,成本可控 | 轮数不定,成本波动 |
| 适用任务 | 路径可穷举 | 路径未知、依赖反馈 |
| 测试方式 | 单元/集成测试 | 评测集 + 成功率统计 |
两者并非对立,实践中常组合使用:外层用Workflow做编排与把关,局部节点用Agent处理开放性子任务。选型建议:先尝试把任务拆成可枚举的步骤;拆不动、或步骤间强依赖运行时反馈,再引入Agent。
换更贵的模型,提升往往没有想象中大。 实践反馈表明,Harness(执行框架)质量与验证测试质量对成功率的影响,常常超过模型能力本身的差距。先修框架,再考虑换模型。
调试Agent行为时,优先检查工具定义。 多数“模型选错工具”的问题,根源是工具描述不准确:描述含糊、职责重叠、缺少使用时机说明。应把每个工具的描述当作面向模型的技术文档来写——写清“做什么、什么时候用、什么时候不用”。
评测系统自身的问题,比Agent的问题更难发现。 若长期在Agent代码上反复调整而成功率不见起色,应当怀疑评测体系本身:测试集是否覆盖真实分布、评分标准是否稳定、是否存在标注噪声。先校准“尺子”,再优化“被测对象”。
此外还需注意:工具权限最小化与沙箱执行,防止误操作造成真实损失;对上下文长度与调用轮数设置上限,控制成本;建立完整追踪能力,否则多步循环中的问题几乎无法归因。
回到定义本身:Agent架构 = 模型 + 工具 + 循环,加上围绕循环构建的上下文、记忆、评测、追踪与安全体系。其本质是把“决策权”从开发者手中移交给模型,把“状态与边界”留在工程系统手中。
三条核心认知值得记住:主循环稳定且极简,能力永远向循环之外生长;模型负责推理、外部系统负责状态的分工一旦确立,架构就很难跑偏;成败的决定因素常常是Harness与评测质量,而非更贵的模型。判断该不该用Agent,只需回答一个问题:这个任务的下一步能不能事先写死——写不死,才轮到Agent出场。