【AI应用开发】Agent 无限 loop(反复调用同一个工具)如何规避?
【AI应用开发】Agent 无限 loop反复调用同一个工具如何规避1. Agent Loop 的四种模式模式A: 完全重复 — query_order(id001) × 8 次参数完全相同 模式B: 渐进重复 — search_docs(退货)→search_docs(退货流程)→search_docs(如何退货) 模式C: 乒乓循环 — query_order → search_kb → query_order → search_kb → ... 模式D: 发散循环 — 不断换工具但都不解决问题广度优先式尝试2. 根因分析根因说明LLM 不记忆历史上下文截断后忘记早期步骤工具返回无完成标记LLM 不知道什么算够了Prompt 鼓励过度探索如果不够详细请再次查询是坏指令工具设计缺陷缺少分页标记LLM 以为还有下页3. 七层防御体系第1层: 步数上限 (max_steps15) ← 最简单有效 第2层: 重复检测熔断 (相同调用≤2次) ← 模式A专用 第3层: Token 预算 (超80%预警) ← 兜底保护 第4层: 语义收敛检测 (余弦相似度0.95) ← 模式B/C/D 第5层: 智能终止信号 (完成标记/答案已覆盖) ← 主动终止 第6层: 超时控制 (全局120s/单步30s) ← 最后防线 第7层: 监控告警 (实时指标自动降级) ← 持续改进4. 第一层步数硬限制classStepLimiter:def__init__(self,default_max15,adaptiveTrue):self.limits{single_query:3,# 单次查询multi_step:8,# 多步执行research:20,# 深度研究}self.default_maxdefault_maxdefget_limit(self,task_typeNone):returnself.limits.get(task_type,self.default_max)defcheck(self,step,max_steps):ifstepmax_steps:returnFalse,达最大步数请立即给最终答案ifstepmax_steps*0.8:returnTrue,f仅剩{max_steps-step}步请尽快总结returnTrue,5. 第二层重复检测熔断classDuplicateDetector:def__init__(self):self.history[]self.max_exact2# 完全相同最多2次self.max_similar3# 相似调用最多3次self.circuit_openFalsedefcheck(self,step,tool_name,args,result_hash):# 检测1: 完全相同same[hforhinself.historyifh[tool]tool_nameandh[args]args]iflen(same)self.max_exact:self.circuit_openTruereturnf⛔ 熔断: {tool_name} 相同参数已调{len(same)}次# 检测2: 乒乓 ABABiflen(self.history)3:last4_names[h[tool]forhinself.history[-3:]][tool_name]iflast4_names[0]last4_names[2]andlast4_names[1]last4_names[3]:returnf⚠️ 检测到乒乓循环:{last4_names[0]}↔{last4_names[1]}# 检测3: 结果停滞same_tool[hforhinself.historyifh[tool]tool_name]iflen(same_tool)2andall(h[result_hash]result_hashforhinsame_tool[-2:]):return⚠️ 结果连续不变继续调用无意义self.history.append({step:step,tool:tool_name,args:args,result_hash:result_hash})returnNone6. 第三层Token 预算管理classTokenBudget:def__init__(self,max_total16000,reserve_output2000):self.max_totalmax_total self.reservereserve_output self.used0defcan_continue(self):remainingself.max_total-self.usedifremainingself.reserve:returnFalse,Token预算耗尽必须立即生成最终答案禁止调用工具ifself.used/self.max_total0.8:returnTrue,Token已用80%请精简returnTrue,defspend(self,tokens):self.usedtokens7. 第四层语义收敛检测importnumpyasnpclassSemanticConvergence:检测 Agent 输出是否还在取得进展def__init__(self,embed_model,threshold0.95):self.embedembed_model self.thresholdthreshold self.history[]# [(step, embedding)]defcheck(self,step,output_text):embself.embed.encode(output_text[:500])self.history.append((step,emb))iflen(self.history)3:returnTrue,recent[h[1]forhinself.history[-3:]]sims[]foriinrange(len(recent)-1):simnp.dot(recent[i],recent[i1])/(np.linalg.norm(recent[i])*np.linalg.norm(recent[i1]))sims.append(sim)ifall(sself.thresholdforsinsims):returnFalse,连续步骤结果高度相似信息增益趋零请停止并总结returnTrue,8. 第五层智能终止信号classTerminationManager:defshould_terminate(self,context):综合判断是否该停止reasons[]# 1. LLM 主动说完成了last_msgself._last_assistant_msg(context[messages])iflast_msgandany(winlast_msgforwin[已完成,以上就是,总结]):reasons.append(LLM声明完成)# 2. 问题已被覆盖回答ifself._question_covered(context):reasons.append(问题已完整回答)# 3. 工具返回完成标记forrincontext[tool_results][-2:]:ifisinstance(r.get(result),dict):ifr[result].get(completion_marker,{}).get(task_completed):reasons.append(f工具{r[tool]}标记完成)# 4. 用户取消last_userself._last_user_msg(context[messages])iflast_userandany(cinlast_userforcin[取消,停止,算了]):reasons.append(用户取消)returnlen(reasons)0,; .join(reasons)ifreasonselsedef_last_assistant_msg(self,msgs):forminreversed(msgs):ifm.get(role)assistantandm.get(content):returnm[content]returnNonedef_last_user_msg(self,msgs):forminreversed(msgs):ifm.get(role)user:returnm.get(content,)returndef_question_covered(self,context):# 简化: 检查问题关键词是否在结果中出现qcontext.get(original_question,)all_textjson.dumps([r.get(result,)forrincontext[tool_results]],ensure_asciiFalse)keywords[wforwinqif\u4e00w\u9fff]ifkeywords:coveredsum(1forkinset(.join(keywords)[:10])ifkinall_text)returncovered7returnFalse9. 第六层超时控制importasyncioclassTimeoutGuard:def__init__(self,global_timeout120,step_timeout30,llm_timeout20):self.global_timeoutglobal_timeout self.step_timeoutstep_timeout self.llm_timeoutllm_timeoutasyncdefrun(self,agent_fn,user_input):try:returnawaitasyncio.wait_for(agent_fn(user_input),timeoutself.global_timeout)exceptasyncio.TimeoutError:return{success:False,result:处理超时请缩小问题范围重新提问。,reason:global_timeout}10. 综合防御框架classLoopSafeAgent:集成所有防御机制的 Agentdef__init__(self,llm,tools,embed_model):self.llmllm self.toolstools self.step_limiterStepLimiter()self.dup_detectorDuplicateDetector()self.token_budgetTokenBudget()self.convergenceSemanticConvergence(embed_model)self.terminationTerminationManager()self.timeoutTimeoutGuard()self.terminated_earlyFalse# ← 关键标记是否提前终止asyncdefrun(self,user_input,task_typeNone):state{messages:[],tool_results:[],current_step:0,original_question:user_input}max_stepsself.step_limiter.get_limit(task_type)forstepinrange(1,max_steps1):state[current_step]step# 1. 步数检查can,warningself.step_limiter.check(step,max_steps)ifnotcan:self.terminated_earlyTruereturnself._force_summarize(state,warning)ifwarning:state[messages].append({role:system,content:warning})# 2. Token 预算检查can,msgself.token_budget.can_continue()ifnotcan:returnself._force_summarize(state,msg)# 3. 执行步骤responseawaitself._execute_step(state)# 4. 如果调用了工具记录并检测ifresponse.tool_calls:fortcinresponse.tool_calls:resultawaitself._call_tool(tc)# 重复检测loop_warningself.dup_detector.check(step,tc.name,tc.args,hashlib.md5(json.dumps(result).encode()).hexdigest())ifloop_warning:state[messages].append({role:system,content:f⚠️{loop_warning}})ifself.dup_detector.circuit_open:self.terminated_earlyTrue# ← 熔断强制终止returnself._force_summarize(state,工具熔断)# 语义收敛检测progress,msgself.convergence.check(step,str(result)[:500])ifnotprogress:state[messages].append({role:system,content:f⚠️{msg}})state[tool_results].append({step:step,tool:tc.name,args:tc.args,result:result})# 5. 终止条件检查should_stop,reasonself.termination.should_terminate(state)ifshould_stopandresponse.finish_reasonstop:returnresponse.content# 更新 Token 预算估算self.token_budget.spend(len(str(state[messages][-1]))//4)# 达到最大步数returnself._force_summarize(state,达到最大步数)def_force_summarize(self,state,reason):强制总结已获取的信息ifnotstate[tool_results]:return抱歉处理过程中遇到问题请重新描述您的问题。summary_prompt(f执行被终止原因:{reason}。f请基于以下已获取的信息给用户一个完整的回答\n\njson.dumps([{步骤:r[step],工具:r[tool],结果:str(r[result])[:300]}forrinstate[tool_results]],ensure_asciiFalse,indent2))returnself.llm.chat(summary_prompt)核心思想不要把防止 Loop 仅当作 Prompt 工程问题——必须在代码层面建立多层防线。LLM 不会主动停下来要靠系统强制停下来。

相关新闻

自动续费查询用什么App?续费藏挺深啊一键查清

自动续费查询用什么App?续费藏挺深啊一键查清

自动续费查询用什么App?续费藏挺深啊一键查清摘要:想搞清楚"我到底订阅了哪些付费软件、有哪些在悄悄扣钱",很多人第一反应是去微信、支付宝挨个翻。但平台割裂、入口藏着,往往半途而废。本文围绕"自动续费查询用什…

2026/8/6 13:32:32 阅读更多 →
Sinc函数:从理想低通滤波器到数字信号处理的工程实践

Sinc函数:从理想低通滤波器到数字信号处理的工程实践

1. 从“理想”到“现实”:Sinc函数为何是电气工程师的必修课 如果你在信号处理、通信系统或者图像处理领域工作过,哪怕只是上过相关的课程,大概率都见过一个长相奇特的函数:它在零点取值为1,向两边延伸时像衰减的波浪一…

2026/8/6 13:32:32 阅读更多 →
044、SimAMv2无参注意力在YOLOv12中的复现——基于神经科学启发的轻量涨点方案

044、SimAMv2无参注意力在YOLOv12中的复现——基于神经科学启发的轻量涨点方案

044、SimAMv2无参注意力在YOLOv12中的复现——基于神经科学启发的轻量涨点方案 兄弟们,今天这篇咱们聊点硬核又省事的东西。上周有个做工业质检的哥们儿找我,说他的YOLOv12在钢材表面缺陷数据集上跑到了mAP 78.4,死活上不去了,加了…

2026/8/6 13:31:32 阅读更多 →

最新新闻

Selenium自动化测试:操作元素对象

Selenium自动化测试:操作元素对象

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快一、元素的常用操作element.click() # 单击元素;除隐藏元素外,所有元素都可单击element.submit() # 提交表单;可通过form表单元素…

2026/8/6 14:25:02 阅读更多 →
Zygisk-Assistant深度解析:Android Root隐藏技术的演进与实战指南

Zygisk-Assistant深度解析:Android Root隐藏技术的演进与实战指南

Zygisk-Assistant深度解析:Android Root隐藏技术的演进与实战指南 【免费下载链接】Zygisk-Assistant A Zygisk module to hide root for KernelSU, Magisk and APatch, designed to work on Android 5.0 and above. 项目地址: https://gitcode.com/gh_mirrors/zy…

2026/8/6 14:25:02 阅读更多 →
从零制作东方Project角色模型:Blender与MMD工作流全解析

从零制作东方Project角色模型:Blender与MMD工作流全解析

如果你在B站、YouTube或各类游戏社区关注过东方Project的二创内容,可能会发现一个有趣的现象:那些最让人印象深刻的角色模型或动画,往往并非出自官方,而是由爱好者们用各种“野生”技术栈一点点“捏”出来的。最近,一个…

2026/8/6 14:25:02 阅读更多 →
从GX Works2报错到系统优化:深入理解存储器分类与层次结构

从GX Works2报错到系统优化:深入理解存储器分类与层次结构

1. 从“空间不足”的报错说起:为什么我们需要了解存储器分类? 最近在工控圈子里,看到不少朋友在讨论三菱GX Works2编程软件报出的“存储器空间或桌面堆栈不足”这个经典错误。这个弹窗一出来,往往意味着项目编译失败,程…

2026/8/6 14:25:02 阅读更多 →
谷歌 AI 大将集体出走,联手创办 Discovery Loop

谷歌 AI 大将集体出走,联手创办 Discovery Loop

据《WIRED》报道,谷歌顶尖 AI 科学家杰夫迪恩与多位高管离职,共同创办 Discovery Loop,探索用 AI 驱动药物研发、芯片设计等领域的科学突破。这位谷歌大脑联合创始人的出走,被视为 AI 人才向创业公司迁徙的重要信号。 一、杰夫迪恩…

2026/8/6 14:25:02 阅读更多 →
基于LVGL的嵌入式圆形表盘UI开发:从资源优化到时间显示实战

基于LVGL的嵌入式圆形表盘UI开发:从资源优化到时间显示实战

1. 项目概述:从零构建一个LVGL圆形表盘UI最近在折腾一个基于STM32和ESP32-S3的智能穿戴设备原型,核心需求是在一块圆形的OLED或LCD屏幕上显示一个美观且信息丰富的表盘界面。这听起来像是智能手表的基础功能,但当你真正动手时,会发…

2026/8/6 14:24:02 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →