logo

2026年玩转Agent(1):搞懂Agent并跑通最小闭环

作者:demo2026.11.13 03:32浏览量:0

简介:本文从“Agent 是什么”这一基础概念出发,拆解“核心 + 工具 + 环境反馈”的构成逻辑与“感知—决策—行动”闭环机制,并给出从任务定义、环境接口设计、工具注册、决策核心接入、主循环编排到结果验证与问题排查的完整实现路径,帮助读者动手跑通一个可评估的最小可用 Agent。

一、本教程要解决什么问题

很多人对 Agent 的理解停留在“会聊天的大模型”“能自动写代码的助手”,但真正要落地时,往往卡在三件事上:不清楚 Agent 与一段普通调用脚本的边界在哪里;不知道工具该怎么抽象;写完一个 Demo 之后无法判断它到底“行不行”。

本教程的目标很明确:在不依赖任何特定厂商专有框架的前提下,从概念出发,动手实现一个最小可用(Minimum Viable)的 Agent,并让它具备可观测、可评估、可终止的完整闭环。

读完之后你应该能做到:

  1. 用一句话说清 Agent 与传统程序、与传统规则机器人的本质差别;
  2. 独立设计出一个 Agent 的“环境感知接口 + 工具集合 + 决策核心”三件套;
  3. 写出 Agent 主循环,并处理终止条件、上下文膨胀、工具调用失败等工程问题;
  4. 用一套可重复的评估方法验证 Agent 的行为质量,而不是靠“感觉还行”。

二、适用读者与适用场景

适用读者

  • 后端/全栈开发者:准备把大模型能力接入业务系统,需要理解 Agent 与 Function Calling(工具调用)的关系;
  • 算法与 AI 应用工程师:需要把模型能力工程化,做稳定性与效果调优;
  • 技术负责人 / 架构师:需要评估 Agent 方案的技术边界、成本与风险;
  • 运维与平台工程师:需要为 Agent 补齐可观测性、权限与成本控制。

典型适用场景

  • 需要与外部系统反复交互的任务:查询订单、操作工单、检索知识库、调用内部 API;
  • 需要多步推理且中间结果影响后续动作的任务:数据排查、故障初诊、报告生成;
  • 需要与游戏化/仿真环境交互的策略类任务:作为理解闭环的最佳入门练习;
  • 需要人机协同的任务:Agent 提出建议,由人确认后再执行高风险动作。

不适合的场景(提前说清,避免技术选型失误):单次输入即可产出结果的任务(直接调用模型即可,套 Agent 只会增加延迟与成本);对结果确定性要求极高、不允许任何偏差的强合规流程(应走规则引擎或固定工作流编排)。

三、前置准备

3.1 概念层前置

只需要理解三个通用概念:

  • 模型接口(LLM API):输入文本/结构化消息,输出文本或结构化的调用意图。可自建推理服务,也可通过百度智能云等云厂商提供的大模型服务能力获取;
  • 工具调用(Tool / Function Calling):模型输出一个结构化的“我要调用某个函数、参数如下”的意图,由你的程序真正执行;
  • 结构化输出约束:通过 JSON Schema 等方式约束模型输出格式,是闭环能否稳定运行的关键。

3.2 环境层前置

  • 一种通用后端语言环境(Python / Java / Go / Node.js 均可);
  • HTTP 客户端库、JSON 解析库;
  • 一个可发起 HTTPS 出站请求的网络环境;
  • 大模型服务的访问凭据(API Key)。注意:凭据必须存放于密钥管理服务或环境变量中,禁止硬编码进代码仓库;
  • 可选:日志服务、监控告警、对象存储(用于沉淀执行轨迹与评估数据)。

3.3 数据与资源前置

  • 一份任务说明文档:明确 Agent 要达成的目标、可用工具清单、禁止动作;
  • 一份评测集:20~50 条带标准答案或可判定期望结果的任务样例。这一步经常被跳过,但它决定了你后面能不能“客观判断效果”。

agent-">四、核心认知:Agent = 核心 + 工具 + 环境反馈

回到最本质的定义:Agent 由一个决策核心与一组工具构成;核心通过调用工具获取外界环境的信息,并与环境持续交互,这个持续交互的过程就是 Agent。

这句话里有三个必须拆开理解的点。

4.1 三要素拆解

要素 作用 缺失后的表现
决策核心(Core) 根据当前状态决定下一步动作 只是个工具库,没有自主性
工具(Tools) 与环境交互的唯一通道 只能空谈,无法产生真实效果
环境(Environment) 提供状态与反馈 无法判断动作是否正确,闭环断裂

关键点在于:Agent 不能脱离环境而存在。同样一套核心与工具,放在测试环境里是练习,放在生产环境里就是执行。所以设计 Agent 的第一步不是写提示词,而是定义“环境是什么、环境的状态如何读取、动作如何生效”。

4.2 闭环:感知 → 决策 → 行动

Agent 的灵魂是循环,而不是单次问答。一次完整迭代包含:

  1. 感知(Perceive):读取任务目标 + 历史轨迹 + 本轮环境返回,构成当前状态;
  2. 决策(Decide):核心基于当前状态输出下一步动作(调用哪个工具、传什么参数),或直接给出最终答复;
  3. 行动(Act):程序执行该动作,得到真实反馈(observation);
  4. 回填(Update):把反馈写回上下文,进入下一轮感知。

单次调用模型不叫 Agent,那叫推理;只有当“输出动作 → 环境反馈 → 再决策”形成回路,才构成智能体。

4.3 决策核心的可选形态

  • 大模型(LLM):当前主流选择,泛化能力强、能用自然语言描述任务,适合开放性任务;缺点是输出不完全确定,需要工程手段约束;
  • 深度学习/强化学习模型(较小的黑箱):约二十年前兴起的热门方向,典型形态是打砖块类游戏的策略模型、即时战略游戏的策略模型,以及围棋类博弈模型。它们决策快、单步成本低、行为稳定,但高度依赖环境能被良好建模,且难以用自然语言接收新任务;
  • 规则 / 有限状态机:确定性与可审计性最强,适合作为 LLM Agent 的兜底或高危动作的强制闸门;
  • 混合形态(生产环境最常见):LLM 负责规划与语义理解,规则引擎负责参数校验与危险动作拦截,轻量模型负责高频、低复杂度的子决策。

说明:后文若无特别指出,“Agent”均指以 LLM 为核心的智能体。

五、实施步骤:从零跑通一个最小 Agent

步骤 1:定义任务边界与成功判据

做什么:用一页文档写清:Agent 的目标、可用工具、禁止动作、失败时如何上报、什么情况必须转人工。

为什么:Agent 的自主性越强,边界越重要。没有边界的 Agent 在测试中“很聪明”,上线后往往表现为乱调工具、反复重试、越权操作。

注意:成功判据必须可判定。例如“查询到 3 条以上相关工单并给出摘要”优于“帮用户查一下工单”。

步骤 2:设计环境感知接口(感知层)

做什么:为每个可读取的信息源定义一个只读接口,例如查询数据库、检索文档、读取指标、拉取日志摘要。

为什么:感知层的粒度直接决定后续推理质量。返回原始大段日志会让上下文迅速膨胀且噪声高;返回过多会挤占决策空间。

注意:

  • 感知结果应做裁剪与结构化(字段名 + 值 + 单位),必要时截断并标注 truncated=true;
  • 大对象放对象存储,返回引用 ID 而非全文;
  • 敏感字段在返回前脱敏,避免敏感信息进入模型上下文。

步骤 3:设计工具集(行动层)

做什么:把每个可执行动作定义为一个工具,包含四部分:名称、用途描述、参数 JSON Schema、执行函数。

为什么:工具描述是模型唯一的“说明书”。描述含糊是工具误用最常见的原因。

工具设计通用原则:

  • 一个工具只做一件事,避免“万能工具”导致参数复杂、误调率高;
  • 命名用动词短语并保持风格统一(如 search_* / create_* / update_*);
  • 参数尽量用枚举替代自由文本;
  • 明确标注副作用等级:只读 / 可逆写入 / 不可逆写入;
  • 工具数量建议控制在 10~20 个,过多时应按场景分组或做二级路由。

示例(通用 Schema 片段,与具体厂商无关):

  1. {
  2. "name": "query_ticket",
  3. "description": "按关键字与状态查询工单列表,只读操作,最多返回20条摘要。",
  4. "parameters": {
  5. "type": "object",
  6. "properties": {
  7. "keyword": { "type": "string", "description": "查询关键字,长度1-64" },
  8. "status": { "type": "string", "enum": ["open", "processing", "closed"] },
  9. "limit": { "type": "integer", "minimum": 1, "maximum": 20, "default": 10 }
  10. },
  11. "required": ["keyword"]
  12. },
  13. "risk_level": "readonly"
  14. }

步骤 4:接入决策核心

做什么:封装一个统一的模型调用层,输入为“系统提示 + 历史轨迹 + 工具列表”,输出为“文本回复”或“工具调用意图”。

为什么:把模型调用与业务逻辑解耦,便于后期替换模型、切换云厂商服务、做灰度与压测,也便于统一记录成本与延迟。

注意:

  • 系统提示中必须包含:角色、目标、可用工具摘要、必须遵守的约束(如禁止越权、不确定时要追问)、输出格式要求;
  • 强制结构化输出,并对解析失败做显式兜底(重试一次 → 降级为纯文本回答 → 转人工);
  • 温度等采样参数:需要稳定的工具调用场景建议取较低值,创意生成类任务可适当提高。

步骤 5:编排主循环

做什么:实现“感知—决策—行动—回填”的循环,并设定最大步数。

为什么:循环是 Agent 的核心机制;最大步数是防止死循环与成本失控的最后一道防线。

通用伪代码如下:

  1. def run_agent(task, tools, core, max_steps=10):
  2. history = [system_prompt(), user_message(task)]
  3. for step in range(1, max_steps + 1):
  4. # 1) 决策
  5. decision = core.decide(history, tools) # 可能返回 tool_call 或 final_answer
  6. # 2) 终止判定
  7. if decision.type == "final_answer":
  8. return finalize(decision.text, history)
  9. # 3) 行动:先做参数校验与权限校验,再执行
  10. tool = tools.get(decision.name)
  11. if tool is None:
  12. observation = error(f"未知工具: {decision.name},请从工具列表中选择")
  13. elif not validate(tool.schema, decision.args):
  14. observation = error("参数不合法,请按 Schema 修正后重试")
  15. elif not policy.allow(tool.risk_level, task):
  16. observation = error("该操作超出当前授权范围,已拒绝执行")
  17. else:
  18. observation = safe_execute(tool, decision.args) # 含超时与异常捕获
  19. # 4) 回填
  20. history.append(assistant_message(decision))
  21. history.append(tool_result(observation))
  22. history = trim_context(history, budget=TOKEN_BUDGET) # 上下文裁剪
  23. log_trace(step, decision, observation) # 可观测性埋点
  24. return escalate("达到最大步数仍未完成,转人工处理", history)

注意:

  • 工具执行必须有超时;模型决策也要有超时,避免整条链路被拖死;
  • 错误信息要作为观察结果回传给模型,让它有机会自我修正,而不是直接抛异常终止;
  • 写操作建议加幂等键,防止重试导致重复下单、重复提交。

步骤 6:终止条件与预算控制

做什么:设置四类出口——正常完成、达到最大步数、触发预算上限(总 token / 总耗时 / 总调用次数)、触发高危动作拦截。

为什么:没有预算控制的 Agent 在生产环境是定时炸弹:一次异常任务可能消耗大量额度,或长时间占用连接与线程。

注意:预算应支持按任务、按用户、按租户三个维度分别限制,超限后进入降级路径(返回部分结果 + 明确说明未完成原因),而不是静默失败。

步骤 7:状态与上下文管理

做什么:区分短期上下文(本轮对话)与长期状态(任务进度、已确认事实、待办项),把长期状态外置到数据库或缓存,而不是全塞进提示词。

为什么:上下文窗口有限且成本与长度正相关;把结构化状态外置,既能压缩 token,又能支持任务中断后恢复。

通用做法:保留最近 N 轮原始消息 + 关键结论摘要 + 结构化状态表;对被裁剪的历史做摘要而非直接丢弃,避免模型“忘记”已获得的事实。

步骤 8:可观测性与轨迹记录

做什么:为每一步记录:step、决策内容、工具名、参数摘要(敏感值脱敏)、执行耗时、返回状态、token 用量、累计成本。

为什么:Agent 的问题往往出现在第 3 步之后,没有完整轨迹几乎无法定位。

注意:轨迹可落对象存储并设置生命周期策略;指标(成功率、平均步数、P95 延迟、工具错误率、单任务成本)接入监控告警,对异常突增设置阈值通知。

六、关键配置说明

配置项 含义 常见取值逻辑 风险
max_steps 单任务最大迭代步数 简单任务 5~8,多步排查 10~20 过小导致任务失败,过大导致成本失控
token_budget 单任务 token 上限 由评测集实测 P95 用量上浮 30%~50% 过紧会在长任务中截断
temperature 采样随机性 工具调用 0~0.3;创意生成 0.7~1.0 过高导致参数幻觉、格式错乱
tool_timeout_ms 单次工具执行超时 按下游接口 P99 设定并留余量 过短造成误判失败
max_retries 失败重试次数 2~3 次,仅对幂等操作重试 非幂等操作重试导致数据重复
tool_allowlist 工具白名单 按任务类型/角色最小化授权 过宽造成越权风险
context_window_policy 上下文裁剪策略 滑动窗口 + 摘要压缩 丢关键事实导致重复劳动
concurrency 并发度 依下游配额与容量评估 过高触发限流,产生雪崩

配置原则:先跑通再调优,每一项都要有对应的观测指标,不要凭直觉设置。

七、结果验证:怎么判断 Agent 真的跑通了

分四个层次验证,逐层通过再进入下一层:

  1. 单元测试层:对每个工具单独测试——参数校验是否生效、异常路径是否返回结构化错误、超时是否可控、写操作是否幂等;
  2. 单任务链路层:选 3~5 条典型任务,检查闭环是否走通、终止条件是否生效、轨迹是否完整可读;
  3. 批量评估层:在评测集上跑全量,统计任务成功率、平均步数、工具调用准确率(选对工具 + 参数正确)、P95 延迟、单任务成本。关键是要有对照组:与“直接单次调用模型”和“固定工作流”对比,只有当 Agent 明显优于两者时,引入 Agent 才是合理的工程决策;
  4. 稳定性与异常层:模拟工具超时、返回脏数据、模型输出非法 JSON、并发抢占同一资源、网络抖动,验证降级与恢复能力。

一个容易被忽略的验证点:回归验证。每次修改提示词或工具描述后,都应重跑评测集,防止“修好一个场景、弄坏三个场景”。

八、常见问题与排查

现象 可能原因 通用排查思路
死循环、步数耗尽 工具报错信息含糊,模型无法自我修正;目标本身不可完成 打印完整轨迹定位卡在第几步;改进错误信息语义;在提示中明确“失败两次后必须换策略或转人工”
反复调用不存在的工具 工具描述与名称不匹配,或提示中工具列表与代码不同步 以代码中的 Schema 为唯一事实来源,动态注入提示词,避免手写清单漂移
参数幻觉(编造 ID、枚举值) 缺少取值来源或约束过弱 先用查询类工具拿到真实取值,再在后续调用中使用;Schema 中用枚举强约束
上下文膨胀、成本飙升 感知结果过大、历史无裁剪 截断 + 结构化 + 引用化;启用摘要压缩;对单任务设 token 上限
任务中途“忘记”目标 长历史稀释了系统提示 在每轮末尾重复注入任务目标与当前状态摘要
工具执行成功但结果重复 非幂等操作被重试 加幂等键;仅对只读与幂等操作配置自动重试
并发下数据错乱 多任务共享同一可变状态 状态按任务隔离(session 维度),必要时加分布式锁
偶发解析失败 模型输出被包裹在多余文本中 容错解析(提取代码块/JSON 片段)+ 一次重试 + 失败降级

排查的第一原则:先看轨迹,再看提示词,最后才怀疑模型。 大多数问题出在工具描述与错误反馈,而不是模型能力。

九、优化建议

  • 性能:并行化无依赖的只读工具调用;对高频查询加缓存;把稳定的规划阶段与易变的执行阶段拆分,缩短关键路径。
  • 安全:工具按最小权限授权;写操作强制人工确认或双人复核;上下文输出前做敏感信息过滤;凭据统一由密钥管理服务下发并定期轮换;对提示注入类输入做来源校验与内容隔离。
  • 稳定性:所有外部调用加超时与熔断;设计明确的降级链路(Agent → 固定工作流 → 人工);对关键任务保留可回放的执行轨迹。
  • 可维护性:工具注册表与 Schema 集中管理、版本化;系统提示词纳入版本控制并配套评测;核心与工具通过接口解耦,便于替换模型或切换服务商。
  • 成本控制:按场景选择模型规格(简单分类用小规格,复杂规划用大规格);压缩上下文;对结果做缓存复用;建立单任务成本看板与预算告警。

十、总结与下一步

回到起点,Agent 的定义并不神秘:一个决策核心,加上一组与环境交互的工具,持续执行“感知—决策—行动”的闭环。 它是相对于环境的智能体,脱离了环境就只剩下一段代码。

本教程给出的落地路径可以压缩成一句话:先定义环境与成功判据 → 再设计工具 → 再接入核心 → 用主循环把三者串起来 → 用预算和终止条件兜住风险 → 用轨迹与评测集证明它有效。

工程实践中有两个判断标准值得记住:其一,Agent 与固定工作流的取舍,应由评测数据决定而非技术偏好决定;其二,Agent 的稳定性主要来自工程约束(Schema、白名单、预算、错误反馈),而不是来自更长的提示词。

后续可继续深入的方向包括:多 Agent 协作与任务分解、长期记忆与向量检索的接入策略、基于轨迹的自动评测与提示词迭代、以及人机协同中的确认机制设计。下一篇我们将在本教程跑通的闭环基础上,进一步展开工具调用的工程细节与调试方法。

发表评论

活动