手搓个人AI工作流Agent:从死循环调用到稳定干活

举报
yd_243285056 发表于 2026/10/20 07:58:38 2026/10/20
【摘要】 做独立开发久了,日常琐事往往比写业务代码还烦人:服务器跑挂了要排查、网站有异常要查日志、数据库备份要核对、每日待办要整理发通知。前阵子看到大模型的Function Calling(函数/工具调用)能力越来越成熟,我便打算给自己写一个专属的AI运维与工作流Agent。原本以为这事很简单:写几个Python工具函数,把函数定义塞给大模型,模型自己判断该调哪个工具,然后自动执行就完事了。结果刚上线...

做独立开发久了,日常琐事往往比写业务代码还烦人:服务器跑挂了要排查、网站有异常要查日志、数据库备份要核对、每日待办要整理发通知。前阵子看到大模型的Function Calling(函数/工具调用)能力越来越成熟,我便打算给自己写一个专属的AI运维与工作流Agent。原本以为这事很简单:写几个Python工具函数,把函数定义塞给大模型,模型自己判断该调哪个工具,然后自动执行就完事了。结果刚上线跑了两天,我差点被扣费账单吓懵:模型要么在参数里凭空捏造字段,要么陷入无限调用的死循环。经过几番折腾,我终于把这套个人Agent驯服得服服帖帖。这篇博客记录我作为个人开发者踩出来的3个关键教训。

一、原本以为只是给大模型装上“双手”
我的设想很直接:在本地搭一个轻量的Agent执行循环(ReAct模式),对接兼容OpenAI接口格式的大模型API,并给它注册了三个日常最常用的本地工具:查询华为云服务器运行状态、执行指定的安全Shell命令、向手机推送告警消息。
这样一来,只要我用自然语言输入一句话,比如“帮我看看现在服务器CPU占用高不高,如果超过70%就发一条飞书提醒告诉我”,模型就应该能够先调用查状态工具,获取结果分析后,再决定要不要调用通知工具。
逻辑看似天衣无缝,但实际测试时,现实狠狠教育了我。

二、排查与避坑过程

第一个坑:函数参数定义太模糊,模型频频发生参数幻觉
最开始我写函数描述(Function Schema)时图省事,只给工具写了一两句简单的参数说明,类型也只笼统标了string。
结果模型调用工具时极其随心所欲。比如查询服务器状态的工具,我期望它传入固定的区域名称和实例ID,但模型经常自由发挥:有时把整个查询提示词作为参数传进去,有时直接把未定义的参数名拼进JSON,导致我的本地解析脚本频繁报错抛出异常。
更要命的是,本地报错直接中断了执行流,模型根本不知道自己错在哪。
解决办法:我用Pydantic重新严格定义了每一个工具的入参结构,明确标注哪些是必填字段、字段的枚举值范围,并在description里加上具体的传参示例。
同时,我给Agent加上了一层“错误自愈反馈机制”:如果本地脚本执行工具失败,把详细的错误原因作为tool_result原封不动喂回给大模型,让模型看懂报错后自己纠正参数重新发起调用。这一招直接把参数调用成功率拉到了95%以上。

第二个坑:工具返回异常或无结果时,模型陷入死循环调用
这是最危险的一个坑,直接把我的API余额干掉了一大截。
有一次我让它检查某个服务进程的日志,因为当时该服务根本没启动,本地执行返回了“未找到相关进程”。
这时候模型没有选择停下来向我汇报,而是自作主张:“未找到进程,那我换个命令再查一次”,第二次依然没结果,它又换了个参数继续查……就这样在后台默默调用了四五十次,直到触发接口并发限制才停下来,直接刷掉了好几十万Token。
解决办法:必须在代码层面加上硬性的“安全熔断机制”。
首先,严格限制单次任务的最大迭代步数(Max Steps),比如个人场景下单次任务最多只允许连续调用6次工具,超过立即强制终止并向我告警;
其次,在系统提示词里立规矩:“如果某个工具连续两次返回空结果或无法解决问题,必须立即停止调用工具,直接向用户如实汇报现状,严禁无休止尝试”。双重约束加上后,死循环问题彻底绝迹。

第三个坑:把工具的原始输出原样塞进上下文,导致Token爆炸
平时查服务器日志或者调用第三方API,返回的原始数据往往非常冗长,比如一次系统排查命令就可能输出上百行文本。
一开始我完全没做过滤,把工具返回的所有原始字符串全塞进了对话历史(messages)里。
跑了两轮对话后,整个上下文长度瞬间膨胀到了上万Token。这带来了两个严重后果:一是单次推理的延迟从两三秒飙到了十几秒,调用成本翻倍;二是大语言模型在超长杂乱的上下文中出现了严重的注意力涣散,经常把最开始我提出的核心目标给搞丢了。
解决办法:在工具执行层和Agent上下文之间做了一层“中间过滤”。
对于大段的日志或接口返回,本地先用简单的Python脚本做预截断和关键词提取,只保留最近几行关键状态;
如果遇到特别长的输出,先让一个更小、更便宜的轻量模型对结果做个两句话的摘要,再把精简后的摘要喂给主模型的上下文。改造后,每轮任务的Token开销直接压缩到了原来的四分之一。

三、调优后的实际效果
解决完这三个坑后,这个小工具彻底成了我离不开的贴身数字运维助理:
现在只要在手机上发一句“帮我巡检一下服务器磁盘和内存”,Agent就会按部就班地调用接口拉取指标、做数据分析,并在两三秒内给我推回一份排版清晰的简报;
整个执行链路有了熔断和自愈兜底,再也不用担心后台偷偷死循环刷爆账单;
更重要的是,我把这套流程部署在云上,不需要常驻显卡算力,按次调用第三方模型接口,一个月下来花在API上的成本只有几块钱。

四、个人开发者总结
自己动手做Agent,千万别迷信大模型能够纯靠“智商”把所有事情办妥。
在实际工程落地中,大模型只是一个具备推理能力的调度核心,真正决定系统能不能稳定跑下去的,是外层工程代码写得够不够严谨。
规范清晰的接口Schema、强硬的步骤熔断兜底、以及克制的上下文管理,这三样东西做好了,即使是轻量级的小模型,也能在个人工作流中发挥出极其强大的生产力。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。