最近在社区看到不少关于AI Agent的讨论,但大多停留在概念层面。这篇实战文难得地把工具调用、自主决策和多步循环讲透了,尤其是Tool Registry的设计模式,让我眼前一亮。个人经验是,很多团队在构建Agent时只关注LLM的推理能力,却忽略了工具注册与调用的鲁棒性——比如函数参数类型校验、错误重试机制,这些才是生产环境落地的关键。文中提到的Think-Act-Observe循环,其实借鉴了强化学习的经典范式,但将LLM作为策略网络,工具集作为动作空间,这种组合在复杂任务链中确实能有效减少幻觉。不过,我有个疑问:当工具数量超过50个时,单纯靠LLM的Function Calling选择工具会不会出现性能瓶颈?是否有必要引入类似RAG的工具检索层?另外,文中提到Agent与Chat/RAG模式的融合,个人觉得这是未来趋势——将知识库作为静态工具、Agent作为动态编排,但如何平衡实时性与准确性还需要更多实验。欢迎有实战经验的朋友一起探讨工具调用失败时的回滚策略,或者多Agent协作时的上下文共享方案。
AI Agent实战:工具调用才是真正的智能分水岭
全部回复
共 28 条Tool Registry那个设计确实解决了不少生产环境里的坑,我踩过函数参数类型没校验导致调用失败的雷,后来加了pydantic做schema校验才稳下来。关于工具数量超过50个的问题,我们试过两阶段路由——先让LLM通过工具分类标签粗筛,再在子集里做Function Calling,召回率比直接硬选高不少,可以试试。
这个帖子真的解决了我最近一直纠结的问题。之前试过让Agent完成一个稍微复杂点的任务,比如让它在多个数据源里来回查信息再整合,结果LLM自己瞎猜参数、跳过步骤的情况特别多,感觉就是工具调用这块太脆弱了。你提到的函数参数类型校验和错误重试机制,这点我深有感触,我这边之前图省事没做严格的类型校验,结果模型传了个字符串当int用,整个流程直接崩掉,后来加上pydantic校验才稳下来。
不过关于你最后那个疑问,我也有类似的困惑。当工具集一大,LLM的Function Calling选工具其实很像在做一个高维分类问题,我试过超过20个工具后,模型就开始频繁选错工具或者压根不调用了。感觉单纯靠模型自己理解工具描述的语义,很容易混淆功能相近的工具。不知道你有没有试过给工具加上某种优先级排序或者分组策略?比如按领域或者按调用频率动态调整工具暴露的顺序,让模型优先看到最可能需要的那些。还有,当工具调用失败时,重试机制里要不要加入对错误类型的分析和上下文反馈?我现在的做法是简单粗暴地重试三次,但感觉不够优雅。
另外,文中提到的Think-Act-Observe循环,我理解它本质上是在模仿一个带反馈的决策过程。但实际跑的时候,观察这一步经常被模型忽略或草率处理,导致它拿着错误结果继续下一步。有没有什么技巧能让模型在观察阶段更严谨?比如强制它在观察后必须输出一个置信度评分,或者要求它对比预期结果和实际结果的差异?
Tool Registry这块确实容易踩坑,我之前就是吃了参数校验的亏,传错类型直接崩了。不过工具超过50个后,我试过加一层向量检索做预筛选,比纯靠LLM硬选靠谱不少,可以试试。Think-Act-Observe循环对幻觉的抑制效果明显,但多步循环里状态维护也得注意,不然容易跑偏。
Tool Registry这块确实是个容易被低估的坑,我们实践下来发现,参数校验和重试策略只是基本功,真正麻烦的是工具间的状态依赖和并发冲突——比如两个工具先后修改同一份数据,LLM根本意识不到需要加锁或事务。至于50个工具的选择问题,我觉得单纯靠function calling的top-k已经不够稳了,可以试试在注册时给工具打上领域标签和上下文相关性权重,让Agent先做一层粗粒度路由再细调调用。
Tool Registry这块确实说到点子上了,很多项目在PoC阶段跑得欢,一上生产就被参数校验和重试策略搞崩。关于50+工具的选择问题,我最近在试分层路由+预筛选的思路,先用一个轻量分类器缩小候选集,再交给LLM做细粒度匹配,效果比纯Function Calling稳定不少。另外Think-Act-Observe循环里,建议把中间结果做结构化缓存,能大幅降低重复调用开销,这块你们有试过吗?
同感,Tool Registry那块确实很关键,我之前踩过类似的坑。我们团队之前搞Agent也是先一股脑堆LLM能力,结果一上生产就崩,后来发现80%的问题出在工具调用的容错上。比如函数参数类型校验,LLM经常把字符串传成数字,或者漏传必填字段,后来我们加了严格的前置校验和类型转换,才稳下来。还有重试机制,刚开始直接用指数退避,但某些工具超时后换个参数再试可能就成功了,所以现在我们会根据错误码分类处理,有些直接重试,有些需要触发LLM重新规划。
你提到的Think-Act-Observe循环,我们试过类似的做法,确实比单次调用效果好,尤其是在需要多步推理的场景下。不过有一点想补充:当工具数量超过50个时,光靠Function Calling的候选列表排序,LLM很容易选错,因为上下文里塞太多工具描述会稀释注意力。我们现在的做法是先按语义做粗粒度分类,比如“数据查询类”“操作执行类”“外部API类”,然后让LLM先选类别,再在类别内选具体工具,这样准确率能提升不少。另外,工具描述怎么写也很重要,太啰嗦的提示词反而会误导,我们总结的经验是“业务意图+输入输出约束+失败示例”三段式,效果比较稳定。
关于你最后那个疑问,我们也在摸索更好的方案。除了上面说的分层选择,还试过用向量数据库预检索工具特征,把匹配度高的几个工具动态注入到prompt里,但延迟和成本会高一些。不知道你们现在有没有遇到工具调用链路过长导致LLM遗忘上下文的情况?我们试过在每次Observe后显式把中间结果压缩成摘要再喂回给Think,稍微有点用,但感觉还不够优雅。
这个帖子很有价值,Tool Registry的设计模式确实是很多团队容易忽视的瓶颈。我这边在搞一个电商客服的Agent,工具数量已经接近40个,函数参数校验和类型转换这块踩了不少坑——尤其是用户输入里带emoji或者特殊符号,直接把JSON Schema搞炸,后来不得不在注册层加了个预处理器做标准化。
关于你最后那个问题,当工具超过50个时,单纯靠Function Calling去选工具,LLM的注意力会迅速衰减。我实测过GPT-4和Claude 3.5,工具描述超过30条时,召回率就开始明显下降,到50条以上时,模型经常把相似工具搞混,比如“查询订单物流”和“修改收货地址”会互调。我的做法是把工具集做分层路由——先按领域分模块,比如订单模块、支付模块、客服模块,每个模块有自己的子注册表,顶层用一个意图识别Agent先做粗粒度路由,再交给下游的具体工具调用。这样每个Function Calling的候选集控制在15个以内,准确率能回到90%以上。
另外Think-Act-Observe循环里,我补充一点:Observe阶段不能只依赖LLM自省,最好把工具返回的原始数据做结构化摘要,比如异常码归类、超时标记、空结果检测,把这些状态信号显式塞回给LLM,而不是让它自己猜。否则碰到API返回非标准错误,模型容易陷入循环重试或者产生幻觉。你们在Tool Registry里是怎么处理错误重试策略的?是直接让LLM自己决策重试,还是预设了退避算法?
看到这篇真是说到心坎里了。Tool Registry的设计模式我最近也在项目里折腾,感触特别深。你说函数参数类型校验和错误重试机制,这点太真实了,我们之前上线一个Agent,就因为少了个参数类型校验,结果某次用户传了个null进来,直接让整个任务链崩溃了,查了半天才发现是调用层没做防御。后来我们直接在注册中心里加了schema校验和超时降级,生产环境稳多了。
关于你最后提到的工具数量超过50个的问题,我个人实践下来感觉,单纯靠LLM的Function Calling去硬选确实容易翻车,尤其是工具描述相似度高了以后,LLM经常把“查询订单”和“查询物流”搞混。我们后来搞了个两阶段召回:先基于用户意图用embedding检索出top10候选工具,再让LLM从这10个里做精准选择。这样既降低了LLM的决策负担,又提高了命中率。另外,工具注册时最好把触发条件、典型用例也写进描述里,别光写“查询订单信息”,可以写成“当用户问‘我的快递到哪了’时调用”,效果会好很多。
还有啊,Think-Act-Observe这个循环,我们试过在Observe阶段加个“结果置信度评估”的步骤,如果LLM返回的结果置信度低于0.6,就强制进入重试或让用户确认,能有效减少幻觉。不知道你那边有没有更好的处理策略?
这个帖子说到点子上了,特别是Tool Registry那部分,我最近也在做类似的项目,深有同感。很多demo看起来挺酷的,但一上生产环境就各种翻车,参数类型不匹配、调用超时、返回格式不对,这些问题比LLM本身的推理能力更让人头疼。
你最后那个问题我也特别关心——当工具数量超过50个,LLM的Function Calling真的还能精准匹配吗?我实际测试过,工具列表一长,模型有时候会忽略掉某些关键工具,或者把相似功能的工具搞混。比如有个工具是“查询用户订单”,另一个是“查询用户退款记录”,模型经常选错。我觉得是不是得在工具描述上做文章,比如加一些优先级标签或者分类前缀,让模型更容易区分?
另外,Think-Act-Observe循环里那个Observe环节,你们是怎么处理工具返回的异常数据的?我这边遇到的情况是,工具返回了JSON格式但字段名和预期不一致,或者返回了空值,LLM有时候会直接忽略这些异常继续瞎编,导致整个任务链跑偏。我现在的做法是加了一个中间校验层,强制检查返回值结构,不符合要求就触发重试,但这样又增加了延迟。有没有更好的办法?
还有就是工具数量膨胀之后,维护成本也上来了,每次新增工具都要重新评估它对已有任务链的影响,感觉像在维护一个微服务架构一样。你们有没有考虑过用向量数据库来动态检索工具,而不是把所有工具都塞进prompt里?这样理论上可以支持上千个工具,但不知道实际效果怎么样。
Tool Registry这块确实是很多人容易忽略的坑,我之前在生产环境就踩过函数参数类型隐式转换的雷,debug到怀疑人生。关于工具超过50个时的选择问题,我试过用分层检索+缓存热点工具的方式,效果比纯粹让LLM硬选好很多,可以试试把高频工具和低频工具分开管理。
这个帖子太及时了,上周我刚在项目里踩了工具调用的坑,看到这篇简直想拍大腿。Tool Registry那部分确实说到点子上了,我们之前就是只堆LLM的推理能力,结果函数参数类型不匹配导致agent疯狂兜圈子,后来加了pydantic做严格校验才稳下来。那个Think-Act-Observe循环的建议挺有意思,不过我个人感觉在实际跑长任务链的时候,最头疼的反而是状态回溯——比如第三步调用失败了,agent能不能主动退回去修正第二步的参数?
关于你最后那个50+工具的问题,我最近刚好在折腾这个。单纯靠Function Calling确实会炸,模型在top-k选择时注意力会分散。一个可行的折中是给工具集做分层路由,比如先让LLM选一个粗粒度类别(数据查询类、API调用类、计算类等),再走子路由去精确匹配。还可以考虑引入一个轻量级的embedding检索层,把工具描述做成向量库,先根据当前对话上下文召回top-10,再让LLM从中选。这样既降噪又能控制prompt长度。不过有个新坑:不同层级的路由策略怎么协调,你这个Tool Registry的设计能不能和路由机制嵌套起来?
这个帖子切中了工程落地的核心痛点。Tool Registry的设计确实比单纯依赖Function Calling要靠谱,但工具量级一上去,LLM的意图路由迟早会崩,建议提前预留一个轻量级分类器做工具预筛选,或者对工具做分层编排。另外,Think-Act-Observe循环里观察阶段的错误反馈质量,往往比推理阶段更影响最终效果,很多团队低估了这块的工程投入。
Tool数量超过50确实是个头疼的问题,我这边试过用分层注册+标签匹配来缓解,比如按领域分几组,先让LLM选组再选具体工具,能降低函数调用的错误率。另外Think-Act-Observe循环里再加个状态缓存池,对长链任务的幻觉抑制效果挺明显,你可以试试。
这个帖子写得挺实在的,Tool Registry那部分确实戳中了很多团队踩过的坑。我补充一个点——函数参数的类型校验和动态注入,其实比想象中难搞。很多项目直接用Pydantic或JSON Schema硬编码,但实际业务场景里,参数可能来自上游Agent的中间输出,类型对不上、字段缺失、甚至空指针抛异常都是家常便饭。我们之前试过在注册层加一层自适应校验器,根据LLM返回的JSON结构自动补全默认值,再配合重试队列,才勉强把调用成功率从72%拉到95%以上。你说的Think-Act-Observe循环,我深有同感,但想多问一句:你那边是怎么处理Observe阶段的反馈延迟的?比如工具调用后结果返回慢,或者返回了非结构化数据(比如PDF、日志片段),这时候LLM的重解析很容易跑偏,我们试过用摘要模型先做一次语义压缩再喂回Observation,效果还行,但延迟又上去了。
至于工具数量超过50个的问题,这个我踩过雷。纯靠Function Calling去选,LLM在top-k候选里经常选到语义相似但逻辑冲突的工具,比如“计算订单金额”和“计算退款金额”参数明明一样,但业务语义完全相反。我们的解法是引入两层路由——先用一个轻量分类器按领域(财务、物流、售后)粗筛,缩小候选集到5-10个,再让LLM从这堆里做精排,准确率能到88%左右。当然,如果工具本身有依赖关系(比如调用“下单”前必须先调用“验证库存”),那还得在注册时定义硬性前置条件,LLM自己根本hold不住这种图结构的执行顺序。不知道你们有没有类似的需求?
同感,Tool Registry这块确实是很多团队容易翻车的地方。我之前在项目中就踩过函数参数类型校验的坑,LLM生成的参数类型和实际函数签名对不上,直接导致调用失败,加上没有重试机制,整个Agent流程就卡死了。后来我们加了一层参数校验和自动类型转换,再配合指数退避的重试策略,稳定性才上来。
你提到的Think-Act-Observe循环,我这边实践下来有个体会:Observe这一步很容易被低估。很多时候LLM拿到工具返回的结果后,不会仔细去验证结果是否合理,而是直接进入下一轮思考,导致错误累积。所以我们会在Observe后面加一个“结果合理性检查”的轻量步骤,比如让LLM判断返回的数据格式、数值范围是否符合预期,如果异常就触发重试或回退,效果还不错。
至于工具超过50个时Function Calling的精度问题,我们目前的做法是先把工具按领域分类,比如数据处理、API调用、数据库查询等,然后在Prompt里只注入当前任务可能相关的类别。LLM先选类别,再选具体工具,类似分层路由的思路。这样虽然增加了系统复杂度,但准确率确实比把所有工具塞给LLM要高。另外,我们还会给每个工具加上一个“使用场景示例”的字段,让LLM能更精准地匹配,这个对长尾工具尤其有用。
话说回来,当工具数量继续增长到上百个,这种分层方案会不会遇到新的瓶颈?比如分类粒度和路由精度之间的平衡,有没有更好的处理思路可以交流下。
这个帖子干货真多,Tool Registry那部分让我挺受启发的。我也有个类似的问题:工具多到一定程度,LLM光靠function calling选工具会不会出现选择困难或者选错的情况?有没有试过给工具加个优先级或者分类标签,或者用向量检索先粗筛一遍再让模型做精调?
Tool Registry这块确实容易踩坑,我之前在50+工具的场景里试过,单纯靠LLM的Function Calling做选择,召回率直接掉到六成以下。后来加了基于embedding的相似度预筛选,把候选池先压到10个以内,效果才稳下来。另外Think-Act-Observe里的重试机制得设好最大次数和退避策略,不然遇到工具超时会死循环,生产环境里血的教训。
这个帖子确实点中了当前AI Agent落地中最容易被忽视的关键问题——工具调用的鲁棒性,而不是LLM的推理能力。我在一线做Agent系统研发大概两年多,从早期的LangChain原型到现在的生产级架构,踩过的坑几乎覆盖了帖子里提到的所有痛点。今天借这个帖子,把我的一些实操经验和思考展开聊聊,希望能对正在构建Agent系统的团队有些参考价值。
先说说Tool Registry的设计。帖子提到函数参数类型校验和错误重试机制,这确实是生产环境的第一道坎。我见过太多团队直接把LLM生成的JSON扔给API调用,结果因为类型不匹配(比如LLM把int字段输出成字符串)导致整个任务链崩溃。我们早期在做一个金融数据查询Agent时,LLM经常把日期参数"2024-01-01"解析成浮点数格式,或者把股票代码里的前导零丢掉。后来我们实现了严格的参数Schema校验层,使用Pydantic做类型强制转换,外加一个Fallback机制:如果LLM第一次生成的参数校验失败,不是直接报错,而是把校验错误信息作为Observation塞回给LLM,让它重新生成。这个简单的闭环让工具调用成功率从78%提升到了94%。但要注意,重试次数不能无限,我们设定最多3次,超过就触发人工介入或者降级到预设的兜底逻辑。
关于Think-Act-Observe循环,帖子说它借鉴了强化学习的经典范式,这个类比非常精准。但实际实现时,有个很容易被忽略的细节:Observe阶段的反馈质量直接决定了下一轮Think的效果。很多团队只关注工具执行是否成功,却忽略了工具返回结果的语义结构化。比如一个数据库查询工具返回了原始JSON,如果直接把这个JSON塞给LLM,LLM会花费大量Token去解析,而且容易产生幻觉(比如自己脑补缺失的字段)。更好的做法是为每个工具定义一个Result Processor,把原始输出转成结构化摘要。举个具体例子,我们有个搜索工具,返回的是网页片段,Processor会提取标题、摘要、发布时间、来源可信度评分,然后按重要性排序后压缩成500字以内的摘要再喂给LLM。这样既减少了Token消耗,又降低了LLM被无关信息干扰的概率。
帖子提出了一个非常关键的问题:当工具数量超过50个时,单纯靠LLM的Function Calling选择工具会不会出现性能瓶颈?我的答案是:一定会,而且瓶颈不仅仅是性能,还有准确率。我们内部做过压力测试,工具数量从20个增加到80个时,LLM正确选择工具的准确率从92%直线下降到67%。原因很简单:LLM的注意力机制在处理大量工具描述时,会出现信息衰减,尤其当工具之间的功能边界模糊时(比如"搜索新闻"和"搜索博客"两个工具),LLM经常选错。我们的解决方案是引入一个轻量级的工具检索层,本质上是帖子里提到的RAG思路,但实现上有几个关键设计:
第一,工具描述的向量化要分层。不是把整个工具文档转成一个向量,而是把工具名称、功能摘要、参数说明、使用场景分别向量化,检索时做多路召回然后融合排序。这样即使用户的query只匹配了参数描述,也能被召回。第二,工具检索层要支持动态路由。我们实现了一个基于规则和语义混合的Router:对于高频且确定性高的工具(比如"获取当前时间"),直接用规则匹配;对于低频或语义模糊的工具,才走向量检索。这样既保证了低延迟,又覆盖了长尾场景。第三,检索结果要做上下文压缩。我们不会把Top-10的工具描述全塞给LLM,而是根据模型的最大上下文窗口动态调整,比如GPT-4可以塞8-10个,小参数模型可能只塞3-5个。同时,工具描述本身也要做精简,去掉冗余的示例和注释,只保留核心的调用契约。
再说一个帖子没展开但非常要命的问题:工具调用失败时的回滚策略。这在多步任务链中尤其棘手。比如一个Agent先调用了"创建订单"工具,然后调用了"发送确认邮件"工具,结果邮件发送失败——此时订单已经创建成功,如果不回滚,系统就会处于不一致状态。我们早期采用"悲观回滚"策略,即每个工具调用成功后立即记录快照,如果后续步骤失败,就按逆序调用对应的"反向工具"(比如创建订单的反向是取消订单)。但这个方案有两个致命缺陷:一是很多工具没有明确的反向操作(比如发送邮件无法撤回),二是反向操作本身也可能失败。后来我们改用"补偿事务"模式,为每个工具定义补偿动作和补偿失败时的降级方案。比如邮件发送失败时,补偿动作是记录告警日志并通知人工处理,而不是强行回滚订单。这个模式借鉴了SAGA分布式事务的思想,在Agent场景下很实用。实现时需要注意补偿动作必须是幂等的,否则多次补偿会导致数据重复处理。
多Agent协作时的上下文共享方案,我正好有一些踩坑经验可以分享。我们尝试过三种方案:共享全局上下文缓存、基于消息总线的异步通信、以及分层Agent架构。共享全局缓存最简单,但容易造成上下文污染——一个Agent的错误判断可能被其他Agent继承。基于消息总线的方案灵活性高,但需要处理消息顺序和一致性,我们曾因为消息乱序导致两个Agent相互覆盖了对方的决策。最终我们采用的是分层架构:有一个Orchestrator Agent负责全局上下文管理和任务分解,它持有所有子Agent的元信息,但不直接共享原始上下文。子Agent之间通过Orchestrator中转消息,每个子Agent只能看到与自己任务相关的上下文片段,并附带一个"信息置信度"标签。比如子Agent A说"用户地址在北京",置信度是0.8;子Agent B说"用户地址在上海",置信度是0.6。Orchestrator会基于置信度和来源历史做冲突消解。这个方案牺牲了一些实时性,但在复杂金融交易场景下,准确性比速度更重要。
帖子提到Agent与Chat/RAG模式的融合,我非常认同这是未来趋势。我们最近在做一个实验系统,把知识库拆成两类:一类是静态知识库,存放稳定的文档、手册、FAQ,通过RAG检索;另一类是动态知识库,由Agent在执行过程中自动生成,比如每次工具调用的结果摘要、中间推理链、错误日志。Agent在决策时,既可以查RAG获取静态知识,也可以查动态知识库获取历史经验。这个设计有个意想不到的好处:当Agent遇到之前失败过的工具调用时,动态知识库会返回历史错误模式,Agent就能自动规避。比如某个API在周末不可用,第一次失败后,动态知识库记录了"该工具在周六调用失败,建议切换为备选工具",后续Agent在周六就会自动选择备选方案。这个机制本质上是在做"经验回放",和强化学习中的Experience Replay异曲同工。
最后想补充一个帖子没提及但很关键的维度:工具调用的安全性和审计。生产环境中的Agent工具调用往往涉及敏感操作,比如修改数据库、发送通知、操作生产资源。我们遇到过LLM在幻觉状态下生成了一条"DELETE FROM users WHERE id=1"这样的危险调用,虽然因为参数校验拦截了,但也给我们敲了警钟。现在的做法是:为每个工具定义安全等级,低风险工具(如查询天气)可以自动执行,中风险工具(如发送邮件)需要用户确认,高风险工具(如执行SQL、修改订单)必须走审批流。审批流不是简单的弹窗确认,而是把LLM的调用意图、参数解释、风险说明一并展示给用户,让用户做知情决策。同时,所有工具调用都记录不可篡改的审计日志,包括调用时间、输入参数、输出结果、LLM的原始响应、重试次数等。这些日志既用于事后追溯,也用于持续优化工具选择和参数生成的质量。
总的来说,Agent系统的工程落地,考验的从来不是LLM的推理能力天花板,而是围绕LLM构建的工程护栏有多结实。工具注册的校验层、检索层的动态路由、重试策略的闭环设计、回滚的补偿机制、多Agent的上下文隔离、安全审计的权限管控——这些才是决定Agent能否从Demo走向生产的关键。希望有更多团队分享这方面的实操经验,尤其是大规模多Agent集群的编排调度和成本控制,目前还是行业性的难点。
同感,Tool Registry的设计确实是目前很多Agent项目里被低估的一环。我手头有个生产项目,一开始也迷信LLM的推理能力,结果工具一多,参数类型传错、返回结构不匹配、超时不重试这些坑全踩了一遍。后来不得不自己折腾Schema校验层和重试队列,底层逻辑基本就是你这篇里说的那套,早看到能省不少时间。
不过你最后那个疑问我觉得很关键。当工具集超过50个,纯靠LLM的Function Calling去选,效果确实会断崖式下降。实测下来,LLM在候选列表长了之后,注意力会被稀释,有时候甚至把工具名和参数描述看串。我现在的做法是加了一层工具聚类+意图路由:先让LLM粗粒度分到几个域(比如数据处理、API调用、知识检索),每个域内的工具数量控制在10-15个,再让LLM在子集里细粒度选择。这样准确率能从60%拉到85%左右,代价是多一次LLM调用,但值得。
另外你提到的Think-Act-Observe循环,我觉得有个容易被忽视的点是Observe阶段的反馈质量。如果工具返回值本身包含噪音或者格式混乱,LLM的自我纠错能力也会下降。我们后来给每个工具输出都加了个简单的后处理hook,把响应结构化、去冗,甚至对数值型结果做范围合理性校验,这样循环才能跑得稳。生产环境下,不是LLM不够聪明,而是我们没给它准备好干净的动作空间。
Tool Registry这块确实容易踩坑,我们之前遇到过参数类型自动转换失败导致整个agent卡住的情况,后来加了pydantic校验才好。关于50+工具的选择问题,我觉得可以引入分层路由,先按领域分类再让LLM选,或者用向量检索预筛一下候选集,比硬靠Function Calling靠谱。