工具错误处理:让 Agent 优雅应对每一次失败
📅 2026/7/10 23:24:19
👁️ 次浏览
摘要工具错误处理的核心不是避免错误而是让 Agent 看到错误。不抛异常、返回错误信息、实现重试让 Agent 具备自修正能力。引言你有没有遇到过这种情况Agent 调用工具后突然沉默了没有任何响应工具明明执行失败了Agent 却以为成功了继续往下走一个小小的网络超时导致整个对话流程中断这些问题的根源往往是工具的错误处理没做好。在传统编程中我们习惯用异常来处理错误。但在 Agent 系统中这套做法会害了Agent。因为 Agent 的决策完全依赖工具返回的文本——如果工具抛出异常Agent 根本看不到异常内容就像一个盲人摸象只能靠猜测继续行动。核心概念核心原则不抛异常返回错误信息这是工具错误处理的第一性原理工具永远不要抛出异常而是将错误转换为字符串返回。为什么因为 Agent 的决策链路是这样的用户输入 → Agent 思考 → 调用工具 → 读取工具输出 → 继续思考如果工具抛出异常这个链路就断了。Agent 无法读取异常内容也就无法做出正确的后续决策。错误分类与处理策略错误类别示例处理方向输入验证错误缺少必填参数、参数类型错误返回清晰错误信息提示正确格式外部依赖错误网络超时、API 5xx、数据库连接失败区分临时性可重试与永久性错误业务逻辑错误查询无结果、权限不足、资源不存在返回人类可读的错误描述工具内部异常除零错误、索引越界、空指针捕获并转换为工具返回的一部分可重试 vs 不可重试类型特征处理方式临时性错误网络超时、API 限流、服务暂时不可用使用指数退避重试永久性错误参数错误、权限不足、资源不存在直接返回错误让 Agent 调整输入代码示例基础工具内部的 try/except最简单的错误处理就是在工具内部捕获所有异常fromlangchain_core.toolsimporttooltooldefdivide(a:float,b:float)-str:除法运算。try:resulta/breturnstr(result)exceptZeroDivisionError:return错误除数不能为零请提供一个非零的除数。exceptExceptionase:returnf计算失败{str(e)}# 测试print(divide.invoke({a:10,b:2}))# 输出5.0print(divide.invoke({a:10,b:0}))# 输出错误除数不能为零...关键点无论发生什么工具都返回字符串。Agent 能看到错误内容就知道下一步该怎么做。高阶使用 tenacity 实现重试对于临时性错误如网络超时重试是最佳策略。tenacity库让重试逻辑变得优雅fromlangchain.toolsimporttoolfromtenacityimportretry,stop_after_attempt,wait_exponential,retry_if_exception_typeimportrequeststoolretry(stopstop_after_attempt(3),waitwait_exponential(multiplier1,min2,max10),retryretry_if_exception_type(requests.exceptions.Timeout))deffetch_web_data(url:str)-str:从指定 URL 获取数据。try:responserequests.get(url,timeout5)response.raise_for_status()returnresponse.textexceptrequests.exceptions.HTTPErrorase:# 4xx 错误不重试直接返回ife.response.status_code500:returnf请求失败{e.response.status_code}{e.response.reason}# 5xx 错误可以重试raiseexceptrequests.exceptions.Timeout:# 超时错误会触发重试raiseexceptExceptionase:returnf未知错误{str(e)}# 如果 3 次重试都失败tenacity 会抛出异常# 但我们可以结合 handle_tool_error 来兜底重试策略说明stop_after_attempt(3)最多重试 3 次wait_exponential(multiplier1, min2, max10)指数退避等待 2s → 4s → 8s最大 10sretry_if_exception_type(Timeout)只对超时错误重试最佳实践1. 工具内部捕获所有异常tooldefmy_tool(param:str)-str:try:# 业务逻辑passexceptSpecificErrorase:returnf特定错误{str(e)}exceptExceptionase:returnf未知错误{str(e)}永远不要让异常逃逸出工具函数。2. 错误信息要清晰、可操作❌差的错误信息错误✅好的错误信息错误API 调用失败状态码 401。请检查 API Key 是否正确配置。✅更好的错误信息错误无法找到用户 john_doe。请确认用户名拼写正确或尝试使用用户 ID 查询。3. 为临时性错误实现重试使用tenacity库但要注意只对临时性错误重试网络超时、API 限流不要对永久性错误重试参数错误、权限不足设置合理的重试次数和等待时间retry(stopstop_after_attempt(3),waitwait_exponential(multiplier1,min2,max10),retryretry_if_exception_type((Timeout,RateLimitError)))4. 在 Agent 系统提示中加入错误处理指导system_prompt你是一个智能助手。 当工具调用失败时 1. 仔细阅读错误信息 2. 如果是输入错误修正参数后重试 3. 如果是临时性错误等待后重试 4. 如果是永久性错误告知用户并建议替代方案 永远不要忽略错误信息。 5. 记录错误日志在生产环境中错误日志至关重要importlogging loggerlogging.getLogger(__name__)def_handle_error(error:Exception)-str:logger.error(f工具执行失败{error},exc_infoTrue)returnf工具执行出错{error}。请稍后重试。总结工具错误处理的核心原则不抛异常返回错误信息Agent 依赖工具输出做决策错误信息要清晰、可操作告诉 Agent 发生了什么、如何修正使用 handle_tool_error 统一处理作为兜底机制为临时性错误实现重试使用 tenacity区分可重试与不可重试错误Agent 级别也要处理错误handle_parsing_errors让 Agent 自我修正记录错误日志便于监控和调试记住在 Agent 系统中错误不是终点而是新的起点。让 Agent 看到错误它才能学会如何避免错误。
一、开篇
凌晨两点,发酵车间值班室,电话响了。
“师傅,三号罐又染了。”
这已经是连续第八批了。 一台50吨的发酵大罐,连续染菌,前前后后折腾了将近三个月。批批染,批批查,批批分析,批批做纠偏——次次都觉得”这次找到了”,次次下一批还是阳性的。 三个班次的检消…
📅 2026/7/10 23:24:19
荒漠化指数计算一般涉及蓝光、绿光、红光、近红外波段、短波红外1及短波红外2波段,所以在计算各指标之前,先进行各波段的合成,波段的合成可参考博文:Sentinel2数据可见光、近红外及短波红外波段合成-CSDN博客
波段合成后…
📅 2026/7/10 23:23:19
BetterGI:终极原神自动化助手,告别重复劳动的智能游戏伴侣 【免费下载链接】better-genshin-impact 📦BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙…
📅 2026/7/10 23:23:19
很多市政、公用工程、机电安装、装饰装修类企业在上系统时,都会遇到一个很现实的问题:公司已经有OA了,还要不要再上工程项目管理系统?审批不是已经在线了吗?为什么项目经理、材料员、商务造价、财务还是天天对数&#…
📅 2026/7/11 1:41:05
1. 项目概述:当数学建模遇上经典塔防 几年前,当我第一次尝试用Python复刻《植物大战僵尸》时,我把它纯粹当作一个游戏开发练习。但后来我发现,这个看似简单的塔防游戏,其内核其实是一个绝佳的数学建模沙盒。从向日葵的…
📅 2026/7/11 1:41:05
Neo4j Cypher 5 实战:3类索引创建与查询性能对比(附实测数据)在图形数据库领域,索引是提升查询性能的关键工具。Neo4j作为领先的图形数据库,提供了多种索引类型以满足不同场景下的查询需求。本文将深入探讨范围索引、全…
📅 2026/7/11 1:41:05
一、引言:为什么学期总结需要一份好PPT每到学期末,学期总结都是一项绕不开的任务。它不只是一份作业,更是对自己几个月学习、活动、成长的一次系统复盘。
一份条理清晰、视觉舒适的学期总结PPT,能让老师、同学更直观地理解你的收…
📅 2026/7/11 1:41:05
最近在部署大语言模型时,很多开发者都遇到了推理速度慢、显存占用高的问题。特别是像腾讯混元Hy3这样拥有2950亿参数的大型MoE模型,传统推理框架往往难以高效支撑。好消息是,vLLM框架最新版本已经正式支持Hy3模型,这意味着我们可以…
📅 2026/7/11 1:41:05
SRAM vs SDRAM vs DDR3:嵌入式MCU外扩存储选型与实测性能对比1. 嵌入式系统存储选型的核心挑战在STM32/IMX6ULL等嵌入式MCU开发中,外扩RAM的选择往往让工程师陷入"性能、成本、功耗"的三角困境。当项目需要突破片上SRAM容量限制时,…
📅 2026/7/11 1:40:04
摘要前面系列教程覆盖了 ArkUI 组件、路由、生命周期、本地存储、网络请求、Ability 底层全套基础能力,本篇统一梳理标准工程目录分层、模块化拆分、代码复用规范、全局工具统一管理、项目打包权限配置、常见工程报错统一解决方案,形成可直接用于课程设计…
📅 2026/7/11 0:00:31
1. 命令简介gpm 是 Linux 系统下运行于虚拟控制台(文字终端模式)的鼠标服务器。它的主要功能是在没有图形界面的纯文本环境中,为虚拟控制台提供鼠标支持,允许用户使用鼠标进行文本的选择、复制和粘贴操作,极大地提升了…
📅 2026/7/11 0:00:31
导语
先澄清一个常被混用的概念:BI试点"上线",并不等于试点"验收通过"。很多企业把仪表板做出来、账号发下去、培训开完场,就默认试点已经跑通,随后进入推广阶段——结果推广到第二个部门、第三个业务线时&am…
📅 2026/7/11 0:00:31
1. 项目背景与核心需求 在嵌入式系统开发中,快速精确的数据检索是一个常见但极具挑战性的需求。特别是在工业控制、医疗设备和物联网终端等场景下,系统往往需要在毫秒级时间内完成关键参数的读取和写入操作。传统基于Flash存储的方案存在擦写次数有限、操…
📅 2026/7/10 22:46:54
1. 工业电流环信号传输的基础认知在工业自动化领域,4-20mA电流环传输技术已经持续服役超过半个世纪。这种看似简单的信号传输方式之所以能经久不衰,核心在于其独特的抗干扰能力——电流信号在长距离传输时几乎不受线路电阻和电压波动的影响。我曾在化工厂…
📅 2026/7/10 22:46:54
最近在项目里尝试用 YOLO 做目标检测,从环境搭建到模型训练,再到推理部署,整个过程踩了不少坑。网上的资料虽然多,但要么版本老旧,要么步骤零散不成体系,对于刚入门的新手来说,很容易卡在某个环…
📅 2026/7/10 22:46:54
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/10 22:46:54
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/10 22:46:54
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/10 22:46:54