Agent 为什么会循环调用工具从规划、执行到终止条件码海寻道 · 大模型、智能体与 RAG 工程组件系列第 39 篇Agent 一直调用搜索、反复重试同一个 API或者在两个工具之间来回跳转通常不是模型“突然失控”而是系统没有为循环定义状态、进展判断和明确的停止条件。一、Agent 为什么天然会循环Agent 的基本模式就是思考 → 调用工具 → 观察结果 → 再思考只要模型认为信息还不足或者工具结果没有明确表示成功它就可能继续调用。以下情况尤其容易循环工具返回空结果但没有明确状态模型无法判断任务是否完成错误被包装成普通文本每一轮都把同样的上下文重新传入没有最大步数、时间和成本上限。二、先给工具结果定义状态不要只返回一段字符串{result:没有找到}更好的结果结构是{status:no_result,items:[],retryable:false,next_action:ask_user_for_more_context}模型和控制器才能区分“没有数据”“暂时失败”和“参数错误”。三、必须设置硬性上限MAX_STEPS8MAX_TOOL_CALLS12MAX_RUNTIME_SECONDS60MAX_COST_CENTS30达到任意上限时Agent 应停止并返回可解释的状态例如“未能在规定时间内完成请缩小查询范围”。硬上限是最后一道保险不应只依赖 Prompt 里的自然语言提醒。这些上限必须由服务端运行时强制执行并按租户、用户、任务类型设置预算。除了步数和耗时还应限制模型 Token、工具调用总数、单个工具调用次数、并发分支数和费用预算耗尽时进入明确的budget_exhausted状态而不是继续把错误交给模型。四、检测重复调用保存最近的工具调用指纹fingerprinthash_json({name:tool_name,arguments:normalized_arguments,state_version:state_version,})iffingerprintinrecent_calls:return{status:duplicate_call,retryable:False,message:相同工具和参数已经调用过,}重复调用不一定永远错误例如查询实时库存可能需要刷新。但这类工具应明确允许刷新次数和时间间隔。对于有副作用的工具重复检测还不够必须把idempotency_key传给下游服务并在数据库或业务服务中保证同一任务不会重复扣款、发货或删除。重试前要区分“请求未到达”“执行结果未知”和“已明确失败”三种状态。五、重试要区分错误类型可以重试网络超时临时 429上游短暂 5xx连接池暂时耗尽。不应自动重试参数校验失败权限拒绝资源不存在SQL 语义错误用户没有提供必要信息。重试应使用指数退避和最大次数不能让 Agent 自己决定无限重试。六、规划和执行要分开一个更容易控制的结构Planner生成有限步骤计划 ↓ Executor执行当前步骤 ↓ Validator检查结果是否满足条件 ↓ 结束 / 修正计划 / 转人工Planner 不应直接拥有所有写操作权限Executor 也不应擅自改变任务目标。在调用有副作用的工具前建议先持久化一次 Checkpoint记录目标、参数、状态版本和审批状态工具返回后再写入结果。这样进程崩溃或人工暂停时可以判断是否需要恢复、查询下游执行状态避免把一次未知结果当成失败而重复执行。七、如何判断“有进展”每轮执行后更新明确的状态{goal:找到合同付款日期,completed:[确认合同 ID,读取合同正文],remaining:[定位付款条款],evidence:[doc-001:v3:chunk-08],last_action:search_contract_clause}如果连续两轮没有新增证据、没有改变状态或没有缩小问题范围应停止循环并请求用户补充信息。八、终止条件应分层设计成功终止目标字段齐全、证据满足阈值、用户确认完成。安全终止需要写入、付款、删除或越权操作时暂停等待审批。失败终止达到重试、步数、时间或成本上限或者遇到不可恢复错误。追问终止缺少订单号、日期、租户或其他关键参数向用户提问而不是继续猜。九、LangGraph 中的循环控制思路LangGraph 用节点和条件边表达循环可以在状态中记录steps、tool_calls和status通过条件边决定继续或结束call_model ├── 有 tool_call → run_tool → call_model ├── 已完成 → END ├── 需要审批 → interrupt └── 超过限制 → fail持久化 Checkpoint 让暂停和恢复成为可管理的状态而不是依赖进程内变量。十、监控循环异常重点监控平均和最大工具调用次数相同工具重复调用率单次运行耗时和 Token达到最大步数的比例因权限和参数错误重试的比例人工中断和用户放弃率。结语Agent 循环本身不是问题失去边界的循环才是问题。通过结构化工具结果、错误分类、重复检测、最大步数、进展状态和分层终止条件可以把 Agent 从“不断尝试”变成可控的执行系统。下一篇将把这些原则应用到数据库 Agent讨论如何防止误删、SQL 注入和越权查询。参考资料LangGraph 官方文档Graph APILangGraph 官方文档Recursion LimitLangGraph 官方文档Interrupts本文为“码海寻道”原创技术文章。循环限制、重试和成本上限应在服务端强制执行不能只写在 Prompt 中。
企业数字化 ERP 产品动态
相关推荐
AI Agent 工程实践(46):模型换了,Agent 为什么突然变笨 发布时间:2026-09-23 标签:AI Agent|工程实践|模型实验|Model Evaluation 上一篇我说,版本七维里最容易翻车的是 Model。 有人不服:换个更强的模型,怎么可能变差? 于是我… · 2026/9/25 20:25:05
一物一码系统做售后时,怎么区分门店受理和总部处理? 一物一码系统做售后时,怎么区分门店受理和总部处理?
太长不看版
一物一码系统做售后,通常可以把“门店受理”和“总部处理”拆成两层:门店承担身份核验、问题登记、材料上传和常规服务;总部根据企业规则处理复杂判定、… · 2026/9/25 20:24:58
MikroORM 内部架构深度解析:Data Mapper、Unit of Work 与 Identity Map 的协同工作方式 后端 【免费下载链接】mikro-orm TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, MariaDB, MS SQL Server, PostgreSQL and SQLite/libSQL databases. 项目地址: https://gitcode.com/gh_mir… · 2026/9/25 20:24:52
Atlas 300V推理加速卡上的YOLO部署实践:从模型转换到性能调优 Atlas 上的 YOLO 部署指南:从硬件认知到推理落地最近后台一直有朋友在问 Atlas 300V 24G 到底是不是运算加速卡,又要怎么在它上面跑 YOLO。这批问题特别集中,今天干脆把这块卡和整套部署流程一次说清楚。Atlas 300V 24G 是运算加速卡… · 2026/9/25 20:51:21
DB-GPT V0.6.1 版本更新:RAG 能力更强,新增 RAG 召回和 Agent 答案评测功能 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 20:51:08
从Excel到自研桌面型CRM:客户沟通与跟进管理实践 1. 为什么我会做 DeskcommCRM,而不是继续用 Excel 表格先交代背景。我手上同时管着三块业务:电话销售、售后客服、以及零零散散的渠道伙伴对接。之前最头疼的不是没工具,而是工具太多太散——客户信息存在 Excel 里,通话记录在话务… · 2026/9/25 20:51:08
Linux 7.4内核HDMI全面升级:FreeSync VRR与ALLM原理及实践指南 如果你还停留在“Linux下插HDMI只要屏幕能亮就算成功”的阶段,那么Linux 7.4内核这次在HDMI功能上的全面升级,很可能会刷新你对Linux桌面显示体验的认知。新增的FreeSync VRR(可变刷新率)与自动低延迟模式(ALLM&#x… · 2026/9/25 20:51:02
Agent 上线前的权限隔离与可观测性:TaoToken 统一 Key 下的团队交接配置清单 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 20:50:50
Langfuse 实战:部署、埋点、评估,跑通 LLM 可观测全流程(TaoToken 统一 Key 接入版) /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 20:50:37
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37