LangChain Agent 反复调用工具死循环?结构化返回 + Prompt 规则让它学会跳过

【导航台账】制造业数据与AI践行者老蒋的技术博客全系列文章汇总(持续更新)

📌 文章摘要

多工具协同 Agent 执行任务链时,常因工具返回 “未找到” 而反复调用,最终触发迭代上限中断。本文深入拆解根因:纯文本错误信号无法被 Agent 精准识别,提供「结构化 JSON 返回 + Prompt 容错规则」双层解决方案,让 Agent 学会识别数据缺失并自动跳过,是生产级 Agent 开发的必备容错方案。

文章目录

问题现象

根因分析

第一层:纯文本“未找到”对Agent来说太“模糊”了

第二层:Prompt里的“容错规则”管不到Agent的“本能”

第三层:语言模型理解“结构”比理解“文本”容易得多

解决方案

第一步:让工具返回结构化JSON(工具层)

第二步:在Prompt中明确“识别信号”(Prompt层)

验证结果

方案对比

经验总结

系列导航

互动与交流

关于作者


问题现象

        兄弟们,上一个坑好不容易解决,嵌套JSON的问题搞定了(点击跳转链接),Agent能调用工具了,我以为可以松一口气了。

结果跑起来之后,我傻眼了。

输入:

交互屏组装A线设备报错E401,帮我排查一下

Agent执行了 search_manual 拿到了维修指引,然后开始调用 query_shift

Action: query_shift
Action Input: {"line_name": "交互屏组装A线"}
Observation: 未找到 交互屏组装A线 在 2026-08-04 的排班数据

Action: query_shift
Action Input: {"line_name": "交互屏组装A线", "date": "今天"}
Observation: 未找到 交互屏组装A线 在 2026-08-04 的排班数据

Action: query_shift
Action Input: {"line_name": "交互屏组装A线", "date": "2026-08-03"}
Observation: 未找到 交互屏组装A线 在 2026-08-03 的排班数据

Action: query_shift
Action Input: {"line_name": "交互屏组装A线", "date": "2026-08-05"}
Observation: 未找到 交互屏组装A线 在 2026-08-05 的排班数据

(... 重复7次后 ...)

> Finished chain.
🤖 Agent: Agent stopped due to iteration limit or time limit.

我当时的第一反应是:这不科学啊……😀😀😀

我明明在Prompt里写了“如果某一步返回未找到,标记为数据缺失,继续执行后续步骤”,它怎么还在死磕?

根因分析

说实话,这个问题我一开始以为是Prompt写得不够强硬。但加了三次“绝对禁止反复查询”之后,Agent依然我行我素。

后来我把 query_shift 的返回值改成了结构化JSON,问题才真正解决。

第一层:纯文本“未找到”对Agent来说太“模糊”了

Agent看到 "未找到 交互屏组装A线 在 2026-08-04 的排班数据" 这个信息时,它真的理解这句话的意思吗?

它不知道

它只知道:这个工具返回了一段中文文本。它无法判断这是一个“明确的失败信号”还是“换个参数重试就能成功的提示”。

在Agent的视角里,这句话更像是在说:“你给的日期不对,换个日期试试。 ”于是它就换了7个日期。

第二层:Prompt里的“容错规则”管不到Agent的“本能”

我在Prompt里写的是:

4. 容错规则:如果某一步工具返回“未找到”或“无数据”,不要反复查询,标记为“数据缺失”,然后继续执行后续步骤。

但问题是:Agent根本不知道“未找到”是一个“信号”

它看到的只是一段文本。它不知道这个文本是一个“标记”,需要被识别并触发“跳过”动作。

这就好比你跟一个外国人用中文说“别去那边”,他听到的只是几个音节,而不是一个指令。

第三层:语言模型理解“结构”比理解“文本”容易得多

大模型虽然能理解自然语言,但它真正擅长的是识别模式

当你把返回值从纯文本改成结构化JSON时:

// ❌ 纯文本(模糊)
"未找到 交互屏组装A线 在 2026-08-04 的排班数据"

// ✅ 结构化JSON(明确)
{
    "status": "not_found",
    "message": "未找到交互屏组装A线在2026-08-04的排班数据",
    "suggestion": "系统无此产线排班数据,请继续下一步排查"
}

Agent看到 "status": "not_found" 时,它可以精确识别这个信号,而不需要“理解”一句中文。

说白了就是:Agent理解JSON比理解中文快得多。给它一个结构化的信号,比给它一句自然语言描述要靠谱得多。

解决方案

别慌,两步搞定它。

第一步:让工具返回结构化JSON(工具层)

修改 query_shift.py 的返回值,从纯文本改为结构化JSON:

# ❌ 旧写法(纯文本)
if record.empty:
    return f"未找到 {line_name} 在 {date} 的排班数据"

# ✅ 新写法(结构化JSON)
if record.empty:
    return json.dumps({
        "status": "not_found",
        "message": f"未找到 {line_name} 在 {date} 的排班数据",
        "suggestion": "系统无此产线排班数据,请继续下一步排查"
    }, ensure_ascii=False)

当查询成功时,也返回结构化JSON:

# ✅ 成功时也返回结构化JSON
return json.dumps({
    "status": "success",
    "line": line_name,
    "date": date,
    "shift": shift
}, ensure_ascii=False)

第二步:在Prompt中明确“识别信号”(Prompt层)

在 builder.py 的 _get_prompt_template 中,把容错规则写得更加具体:

4. **容错规则**:
   - 如果某一步工具返回的 JSON 中 `status` 为 `"not_found"`,说明该数据在系统中不存在。
   - 此时不要反复查询不同参数,直接标记为"数据缺失",然后继续执行后续步骤。
   - 例如:query_shift 返回 `{"status": "not_found", ...}` 时,跳过排班查询,直接进入备件查询。

验证结果

修改后重新运行:

Action: search_manual
Observation: 【智联工坊维修手册匹配】交互屏E401错误:触摸屏驱动通信超时...

Action: query_shift
Action Input: {"line_name": "交互屏组装A线"}
Observation: {"status": "not_found", "message": "未找到排班数据", "suggestion": "继续下一步排查"}

Action: query_spare_parts  ← ✅ 跳过了!直接进入下一步
Action Input: {"part_name": "触摸屏驱动"}
Observation: {"status": "success", "part": "触摸屏", "inventory": {...}}

Action: generate_work_order
Action Input: {"line_name": "交互屏组装A线", "fault_code": "E401", ...}
Observation: {"order_id": "WO-20260804-4164", ...}

Final Answer: 已生成工单 WO-20260804-4164

Agent成功跳过了“未找到”的排班查询,继续执行了后续步骤,完成了整个任务链。

方案对比

方案适用场景优点缺点
纯文本返回简单的单轮对话实现简单无法被Agent精确识别为“信号”
结构化JSON返回多工具协同、链式调用信号明确,便于Agent识别和跳转需要额外解析逻辑
结合Prompt容错规则生产级多工具Agent双重保障,工具层+Prompt层协同需要同时修改两处

经验总结

        怕你忘了,我再啰嗦一遍😀😀😀Agent看不懂中文里的“未找到”暗示,它需要结构化的信号才能精确识别和执行跳转。

落到具体操作上就是三条:

  1. 工具返回值统一使用结构化JSON。包含 status 字段,用 "success" 和 "not_found" 这样的明确信号,而不是让Agent去“理解”一段中文描述。

  2. Prompt中的容错规则要对应JSON结构。用“如果 status 为 not_found”这样的表述,而不是“如果返回未找到”这种模糊描述。Agent识别字段比理解中文更可靠。

  3. 工具层 + Prompt层 = 双层保障。单靠Prompt约束,Agent可能“不听”;单靠结构化返回,Agent也可能“不知道这个字段是什么意思”。两者结合才是生产级方案。

适用范围

本文方案适用于多工具协同Agent中,某个工具可能因数据缺失而返回“未找到”的场景。如果所有工具都保证返回有效数据,则无需此方案。对于需要跳过、重试、降级的容错场景,结构化JSON + Prompt规则组合是最佳实践。

系列导航

本文问题源自《智联工坊实战:多工具协同Agent》实战过程,完整源码及深度教程见该文:链接

💡 建议收藏:开发多工具协同 Agent 时,90% 的卡死问题都来自信号不明确导致的无效重试。本文的双层容错方案可直接复用到所有工具定义中,遇到 Agent 反复调用、迭代超时时可直接对照排查。

互动与交流

        你在多工具协同Agent的开发中,有没有遇到过Agent“卡死”在某个工具上反复尝试的情况?你是怎么让它学会“跳过”的?欢迎评论区交流,咱们互相支支招——说实话,让Agent学会“放弃”这件事,比让它学会“执行”还难。

关于作者

制造业数据与AI践行者老蒋,23年IT老兵。聚焦制造业数据架构与AI融合落地。全流程实战,全源码开源。

标签:#排坑笔记 #LangChain #Agent #多工具协同Agent #Agent容错设计 #工具调用排坑 #迭代上限

内容概要:本文围绕发光太阳聚光器开展蒙特卡洛光线追踪研究,重点利用Matlab编程实现光线在聚光系统中的传播路径模拟。通过蒙特卡洛方法对大量随机光线进行统计追踪,精确分析光能在接收面上的分布特性、聚焦效率及系统整体光学性能,进而评估不同几何结构与材料参数对聚光效果的影响,为高效太阳能收集系统的设计与优化提供理论依据和技术支持。研究不仅涵盖核心算法实现,还结合个跨领域科研案例(如电力系统、路径规划、信号处理、机器学习等),展示了Matlab/Simulink在科研建模与仿真中的广泛应用价值,突出了算法仿真与学科交叉融合的重要性。; 适合人群:具备一定Matlab编程基础,从事光学工程、新能源技术、仿真建模及相关领域研究的科研人员,尤其适合研究生及青年研究人员。; 使用场景及目标:①掌握蒙特卡洛方法在光学系统仿真中的原理与应用;②学习使用Matlab实现光线发射、反射、折射及能量统计的完整追踪流程;③通过实际代码实践优化聚光器结构设计;④借鉴文中领域仿真案例,拓展科研视野与技术迁移能力; 阅读建议:此资源以代码实现为核心,建议读者结合Matlab环境动手运行与调试程序,重点关注光线追踪的物理建模与数值计算细节,并参照其他仿真范例举一反三,全面提升科研建模与算法实现能力。
内容概要:本文复现并深入探讨了一种基于价格弹性矩阵的居民峰谷分时电价激励策略,属于电力系统需求响应领域的关键技术研究。研究通过构建价格弹性矩阵精确刻画居民用户对不同时段电价变化的用电行为响应特性,结合优化算法设计科学合理的峰谷分时电价方案,有效引导用户在高峰时段减少用电、低谷时段增加用电,实现削峰填谷,提升电网运行稳定性与能源利用效率。文中配套提供了完整的Matlab代码实现,涵盖数据处理、模型构建、优化求解及结果可视化等模块,具有较强的可复现性与工程应用价值,适用于需求侧管理政策仿真与学术研究。; 适合人群:面向具备一定电力系统基础知识、能源经济学或需求响应研究背景的科研人员,以及从事相关课题的硕士、博士研究生;熟悉Matlab编程且关注智能电网优化的技术人员亦可从中获益。; 使用场景及目标:①用于居民侧用电行为建模与电价敏感性分析;②支撑峰谷电价政策的设计、仿真评估与优化调整;③作为高校教学中需求响应机制的算法实现案例与科研入门实践项目。; 阅读建议:建议读者结合Matlab代码逐模块解析其实现逻辑,重点掌握价格弹性矩阵的构造方法、目标函数与约束条件的数学建模过程,以及优化求解器的调用方式,同时可尝试引入其他智能优化算法进行对比实验,以深化对电价激励机制设计原理的理解与创新能力。
内容概要:本文详细介绍了基于Matlab实现的无人机FMCW(调频连续波)毫米波高度计雷达仿真技术,系统阐述了雷达测高系统的工作原理、信号建模方法及完整的信号处理流程。通过构建发射信号与地面回波信号模型,依次完成混频、低通滤波、傅里叶变换(FFT)等关键处理步骤,提取差拍频率以精确计算无人机飞行高度,并对测高精度、分辨率及系统参数影响进行仿真分析与验证。该仿真平台不仅有助于深入理解毫米波雷达在复杂环境下的工作特性,也为无人机地形跟随、精准着陆、低空避障等应用场景提供了可靠的技术支撑和算法验证手段。; 适合人群:具备雷达原理、信号与系统、数字信号处理等相关基础知识,从事无人机导航、毫米波雷达开发、自动驾驶传感系统或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入掌握FMCW雷达测距测高的物理机制与数学建模方法;②熟练运用Matlab进行雷达信号仿真与算法实现,提升实际编程与系统调试能力;③为后续开展真实雷达系统开发、测高算法优化或融合其他传感器(如IMU、GPS)的组合导航研究提供理论依据与仿真基础。; 阅读建议:建议结合经典雷达原理教材同步学习,重点理解chirp信号设计、混频后差拍信号特征以及FFT在频率提取中的作用,通过调整带宽、扫频周期、采样率等参数进行仿真实验,观察其对测高性能的影响,从而深化对系统设计关键指标的综合把握。
内容概要:本文介绍了基于Java与Vue构建的自由贸易港政策匹配与企业用策助手系统的设计与实现。系统通过整合分散的政策资源,建立统一的政策数据中心,并结合企业维度画像,实现政策条件与企业特征的智能匹配。采用Spring Boot作为后端框架,MySQL存储核心数据,Redis缓存热点数据,Vue构建前端交互界面,实现了政策采集、清洗、分类、结构化、匹配评分及结果解释等功能。核心模型包括政策知识模型、企业画像模型和匹配算法,其中匹配服务采用加权评分机制,支持必选条件一票否决,并输出详细的匹配依据。系统还提供申报提醒、材料清单生成和数据看板功能,提升政策申报效率与管理决策水平。; 适合人群:具备Java和Vue开发基础,熟悉Spring Boot、MyBatis-Plus、Redis等技术栈,从事政务信息化、企业服务系统或政策服务平台开发的研发人员和技术负责人。; 使用场景及目标:①解决政策信息分散、格式不统一、自然语言难解析的问题;②实现企业画像动态更新与政策精准推送;③构建可解释的政策匹配引擎,提升企业政策获取效率与政府服务能力;④应用于自由贸易港、产业园区、中小企业服务平台等场景下的政策智能匹配与辅助申报系统建设。; 阅读建议:此资源包含完整的模型设计与部分代码示例,建议结合Spring Boot项目结构进行实践,重点关注PolicyCondition、EnterpriseProfile、ConditionEvaluator和PolicyMatchService等核心类的实现逻辑,并补充权限控制、数据校验与缓存刷新机制以适配生产环境。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值