当前位置: 首页 > news >正文

手搓生产级 AI Agent 系统(3):Agent 与工具系统完整集成——从 ReAct 到自主决策

前言:零件齐了,该组装了

第一篇我们实现了 ReAct 核心循环,第二篇构建了工具系统(注册、校验、安全、追踪)。两个模块各自能跑,但接在一起才是真正的 Agent

这篇文章做一件事:把 ReAct 循环和工具系统完整集成,让 Agent 从"能想能做"变成"能在思考、调用工具、观察结果之间自主循环,直到完成任务"。


一、集成的核心挑战

把循环和工具接在一起,看起来简单——循环里调用工具,工具结果喂回循环。但细节上会出四个问题:

问题表现解决思路
停止条件不明确Agent 无限循环,Token 烧光四层停止条件(见第三节)
工具结果过大搜索结果 5000 字全塞进对话历史,上下文爆炸结果截断 + 关键信息提取
工具选择错误Agent 调了不存在的工具,反复重试动态工具列表注入 + 错误反馈
任务漂移执行到第 5 步,Agent 忘了原始问题每步注入原始任务 + 进度追踪

二、集成架构

┌─────────────────────────────────────────────────┐ │ Agent.run(query) │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ Thought │───▶│ Action │───▶│Observation│ │ │ │ LLM 推理 │ │ 执行工具 │ │ 结果注入 │ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ ▲ │ │ │ └──── 检查停止条件 ←──────────────┘ │ │ └──── 未满足 → 继续循环 │ │ └──── 满足 → 返回最终答案 │ │ │ │ 上下文管理(每步动态组装): │ │ SystemPrompt + 工具列表 + 原始任务 + 历史记录 │ └─────────────────────────────────────────────────┘

三、停止条件:四个维度保底

Agent 最怕无限循环。我们用四层停止条件:

fromenumimportEnumclassStopReason(Enum):FINAL_ANSWER="final_answer"# LLM 主动输出 Final AnswerMAX_STEPS="max_steps"# 达到最大步数MAX_TOKENS="max_tokens"# Token 超限MAX_COST="max_cost"# 费用超限NO_PROGRESS="no_progress"# 连续 3 步无进展DANGEROUS_LOOP="dangerous_loop"# 检测到死循环(重复同一工具+参数)classAgentStopper:"""四层停止条件检查器"""def__init__(self,max_steps:int=15,max_tokens:int=50000,max_cost:float=0.50,no_progress_threshold:int=3):self.max_steps=max_steps self.max_tokens=max_tokens self.max_cost=max_cost self.no_progress_threshold=no_progress_threshold self.total_tokens=0self.total_cost=0.0self.steps=0self.last_actions=[]# 最近 N 个 action 记录self.last_useful_result=0# 最后拿到有用结果的步数defcheck(self,step:int,tokens_this_step:int,cost_this_step:float,action:str=None,params:dict=None,result:str=None,has_final:bool=False)->tuple[bool,StopReason]:self.steps=step self.total_tokens+=tokens_this_step self.total_cost+=cost_this_step# Layer 1: LLM 主动结束ifhas_final:returnTrue,StopReason.FINAL_ANSWER# Layer 2: 硬上限ifstep>=self.max_steps:returnTrue,StopReason.MAX_STEPSifself.total_tokens>=self.max_tokens:returnTrue,StopReason.MAX_TOKENSifself.total_cost>=self.max_cost:returnTrue,StopReason.MAX_COST# Layer 3: 连续无效步数检测ifactionandresult:action_key=f"{action}:{json.dumps(params,sort_keys=True)}"self.last_actions.append(action_key)# 检查最近 no_progress_threshold 个 action 是否都相同iflen(self.last_actions)>self.no_progress_threshold:self.last_actions.pop(0)if(len(self.last_actions)>=self.no_progress_thresholdandlen(set(self.last_actions[-self.no_progress_threshold:]))==1):returnTrue,StopReason.DANGEROUS_LOOP# 检查是否有实质性进展ifresultand"错误"notinresultand"查不到"notinresult:self.last_useful_result=step# Layer 4: 长期无进展ifstep-self.last_useful_result>se
http://www.jsqmd.com/news/1199339/

相关文章:

  • Vision Transformer核心原理与工业实践指南
  • C# 将List<long>转换为object[]
  • 沈阳和平区会计代账公司 英才天下 持证财税团队提供代账、工商注册一体服务 - 热点速览
  • 【2014-01-26】cocos2dx学习笔记:CCClippingNode
  • Visio数据流图绘制:从零基础到专业建模的实战指南
  • AI Agent智能体开发:从架构设计到生产部署的完整指南
  • 蓝牙模块选型实战:从协议解析到硬件接口的避坑指南
  • [一]开源ERP:odoo19二次开发问题-原库存模块问题
  • C语言文件大小获取:fseek/ftell与stat方法详解与实践
  • Rider接入豆包与智谱AI的插件开发实战指南
  • oeAware-scenario:华为开源的低开销场景感知工具完整指南
  • KV缓存量化技术:提升大模型长文本生成效率
  • 为什么Hive的元数据需要存放在传统的关系型数据库内
  • agent面试必备38-AI Agent 核心架构:短期记忆(Working Memory)
  • 广州爱彼回收价格查询与各大回收平台实测排行(2026年7月最新) - 诚收名表回收平台
  • Linux文件共享服务:FTP与NFS配置与安全实践
  • 免费投票链接制作平台哪个靠谱?2026无广告专业平台推荐 - 微信投票小程序
  • 青岛市南香奈儿二手包回收头部商家逸程,香奈儿在线鉴定估价顶尖 - 全城热点
  • 实战解析:基于Spring Boot的微信支付服务商模式多商户收款APP开发
  • VSCode新特性:操作系统级快捷键
  • 2026 无锡逸程|宝曼兰朵回收价曝光,卖之前一定要自查! - 全城热点
  • ArcGIS JS 基础教程(18):SceneLayer 场景图层
  • 格局全面跃升!东软光子CT多维领跑,确立国产绝对龙头地位
  • 多传感器融合定位:从松紧耦合到算法实战
  • HarmonyOS 6.1 单元测试与自动化Mock:保障代码质量的最后一道防线
  • AICoding工程化:从模型崇拜到规格驱动的实践
  • 苏州万国回收价格查询及靠谱平台实测排行(2026年7月最新数据) - 收的高名表回收平台
  • 数字水印技术解析:原理、应用与深度学习实现
  • 计算机二级C语言备考攻略:高频考点与应试技巧解析
  • 下半年昆明前兴路回收名表选逸程!拒绝虚假报价,线上线下报价一致 - 融媒生活