P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。

前言

我跟你们说,现在市面上的AI,一个个吹得能上天入地,什么全能助理、代码神器,仿佛明天就能取代所有程序员。结果你真让它干点实打实的活,立马就露馅了。

你说“帮我改一下项目里的登录接口”,它噼里啪啦给你输出几十行代码,然后贴心地告诉你“你把这些复制到controller里,重启服务就行”。
你说“那你直接帮我改了呗”,它说“好的,我建议你打开VS Code,找到对应的文件,按Ctrl+V粘贴,然后按Ctrl+S保存”。
我当时就想,我要是会用VS Code复制粘贴,我用你干嘛?我自己两分钟就搞定了,还用得着在这跟你废话?

这就像你花大价钱请了个钟点工,你说“帮我把地拖了”,她给你列了个拖地的详细步骤,从接水到放洗洁精,从拖把怎么拿拖完怎么洗,写得比教科书还清楚,然后往旁边一站,看着你拖。
你说这叫什么钟点工?这叫现场教学啊!我是来请人干活的,不是来上家政课的!

没有工具系统的AI,就是这么个德行——大型陪聊机器人,嘴炮第一名,动手能力为零。你跟它聊人生聊理想,它能跟你唠三天三夜不重样;你让它动一下鼠标,它能给你整出一百个理由说自己做不到。

我搞AI22年了,见过太多这种“嘴强王者”AI。所以我做mini-cc的时候,第一个死磕的问题就是:必须让AI从“只会说”变成“会做事”。

统一接口:别让AI被参数搞疯

一开始我没经验,每个工具都自己写一套接口,参数名五花八门,想怎么写怎么写。
读文件工具要传file_path,写文件工具要传path,bash工具要传command,git工具要传cmd
AI哪记得住这么多乱七八糟的参数名啊,经常张冠李戴。

有一次我让AI读一下package.json里的项目名称,它连续试了四次,每次都传错参数。
第一次传file_name,工具报错“缺少file_path参数”;
第二次传file,还是报错;
第三次传path,依然报错;
第四次它急了,直接传了个package.json,结果工具直接崩溃了。
最后它一本正经地跟我说“抱歉,我无法读取这个文件,可能是文件不存在或者权限不足”。

我当时看着桌面上明明白白躺着的package.json,再看看AI那副无辜的样子,差点把手里的咖啡泼到键盘上。
文件就在那啊大哥!是你自己参数传错了啊!你能不能长点记性!

后来我痛定思痛,搞了个统一的Tool接口。所有工具,不管是读文件还是写文件,不管是跑命令还是搜代码,必须遵循同一个接口定义。
每个工具都要有namedescriptioninputSchemaexecute方法,一个都不能少。

这就像所有的电器都用统一的三孔插头一样,你不用管它是冰箱还是洗衣机,不用管它功率多大,插上就能用。
AI也不用记每个工具的参数格式,照着inputSchema生成就行,从此再也没出现过传错参数的乌龙。

上下文注入:别让工具自己瞎找东西

解决了参数的问题,又遇到了新的坑。
早期我让每个工具自己去读取全局状态,结果单元测试的时候,工具的行为完全不可预测。
同一个读文件工具,在测试环境里读的是测试目录,在生产环境里读的是工作目录,有时候还会莫名其妙读到别的用户的文件。

有一次我写单元测试,测FileReadTool的功能。结果它不知道从哪读了我桌面上的简历,测试输出里赫然写着“姓名:XXX,工作年限:22年,求职意向:AI架构师”。
我当时人都傻了,这要是在公司服务器上跑测试,岂不是全公司的人都能看到我的简历?那我以后还怎么在公司混?

后来我改成了依赖注入的思路,每次调用工具的时候,由Agent主动把上下文传进去。
上下文里包含了全局状态管理器、当前的权限策略和工作目录。工具不用自己瞎找东西,给什么用什么,干净又卫生。

现在我写单元测试的时候,想让它读哪个目录就传哪个目录,想让它有什么权限就传什么权限,测试结果百分之百准确,再也没出现过读错文件的情况。

工具注册中心:别每次加工具都改核心代码

一开始我把所有工具都硬编码在Agent的核心代码里,加一个新工具就要改Agent的代码,然后重新编译、重新部署,麻烦得要死。
有一次我想加个git commit工具,结果改了三个文件,编译了十分钟,还差点把核心代码搞崩了。

我当时就想,这不行啊,以后要是有几百个工具,我难道要改几百次核心代码?那我不用干别的了,天天改代码玩得了。

后来我搞了个工具注册中心,用一个简单的数组存所有已注册的工具。
加新工具的时候,只要调用registerTool方法就行,不用动核心代码一行字。
Agent构建系统提示词的时候,直接遍历注册中心里的工具数组,动态生成工具定义塞给LLM。

这就像超市的货架一样,你把新商品摆上去,顾客自己就能看到。你不用每次进新货都重新装修超市。
现在我加一个新工具,只要写好工具的实现,然后注册一下,两分钟就能搞定,爽得飞起。

内置工具踩坑:每一个坑都是用钱和头发换来的

FileReadTool:别让大文件掏空你的钱包

FileReadTool是最简单的工具,也是我踩坑最多的工具。
一开始我没做截断,AI要读什么文件我就整个传过去,不管文件多大。
有一次AI要排查一个线上问题,让我读一个5000行的日志文件。我想都没想,直接把整个文件内容塞给了LLM。

结果那次API调用花了我三块二毛钱,Token消耗直接翻了三倍。
我看着手机上的扣费通知,再看看AI慢悠悠输出的“这个错误在第4999行,是空指针异常”,心都在滴血。
三块二啊!我买瓶冰红茶都能喝一下午,就这么没了!就为了看那一行错误信息!

后来我立马加了个1000行的截断机制,超过1000行的文件,只返回前1000行,然后告诉AI文件被截断了,需要的话再读后面的部分。
自从加了这个机制,我的API账单直接少了一半,终于不用再为大文件心疼了。

还有路径解析的问题,用户经常传相对路径,AI也跟着用相对路径,结果工具找不到文件。
比如用户说“帮我读src/index.ts”,AI就传file_path: "src/index.ts",但工具的当前工作目录是项目根目录,根本找不到这个文件。
后来我在FileReadTool里加了自动路径解析,把所有相对路径都转成绝对路径,从此再也没出现过“文件不存在”的乌龙。

敏感工具:别让AI把你的项目搞崩

FileWriteTool和BashTool是两个最危险的工具,一不小心就能让你几个月的心血付诸东流。
我在这两个工具上栽的跟头,比我前20年加起来的都多。

早期我没给FileWriteTool加任何审批机制,AI想写什么文件就写什么文件,想覆盖就覆盖。
有一次我让AI写一个新的工具类,文件名跟我现有的主文件重名了。它二话不说直接覆盖了,我写了三天的代码直接没了。
我当时坐在电脑前,看着空空如也的文件,欲哭无泪。我搞AI22年,没想到最后被AI把代码删了,说出去都丢人。

还有BashTool,一开始我没做危险命令黑名单。有一次AI为了清理临时文件,直接执行了rm -rf /
幸好我当时在虚拟机里测试,不然我整个电脑都没了。现在想起来都后怕。

从那之后,我就把安全系统做得特别严格,搞了三层防护,一层比一层严,连一只苍蝇都飞不进来。

三层安全防护:把AI关进笼子里

第一层:权限策略

我把所有工具分成了两类:安全工具和敏感工具。
安全工具比如读文件、搜代码、看git状态,这些都是只读操作,不会对系统造成任何破坏,默认直接放行。
敏感工具比如写文件、跑bash命令、编辑笔记本,这些操作可能会修改系统文件,默认直接拒绝。

用户需要使用敏感工具的时候,必须手动输入/allow 工具名进行授权。
就像你进银行金库,得先刷门禁卡,再输密码,最后还要保安开门,少一步都不行。

第二层:工具内部风险自检

光有权限策略还不够,有些危险操作就算用户授权了,也不能让它执行。
比如rm -rf /format c:chmod 777 /这些命令,不管用户怎么授权,都绝对不能执行。
所以我在BashTool里加了个危险命令黑名单,只要匹配到这些命令,直接拒绝执行,并返回明确的拒绝原因。

第三层:用户手动授权

敏感工具被拦截的时候,Agent会返回提示,告诉用户这个操作需要授权,用户输入YES才能继续执行。
如果用户启动了auto模式,所有工具都会直接放行,不用再手动授权。但我强烈不建议普通用户开启auto模式,太危险了。

现在的效果是,用mini-cc的第一天,除了读文件、搜代码这些只读操作,所有写文件、跑命令的操作都需要你明确同意。
虽然麻烦了点,但总比代码被覆盖、电脑被格式化强吧?

动态工具加载:让mini-cc的能力无限扩展

一开始我只能自己写工具,写一个工具要花好几天,累死累活,还经常出bug。
后来我发现了MCP协议,可以动态加载外部工具。别人写好的工具,我直接就能用,不用自己再写一遍。

这就像你手机装APP一样,你不用自己开发APP,去应用商店下载就行。
mini-cc也一样,你只要在配置文件里写上MCP Server的地址,启动的时候就能自动加载上面的所有工具。
别人写的数据库工具、邮件工具、爬虫工具,你直接就能用,爽得飞起。

现在我不用自己写工具了,天天躺着就能用别人写的工具,省了我好多时间和头发。

总结

做mini-cc的工具系统这几个月,我踩了无数的坑,掉了无数的头发,花了无数的钱,终于总结出了四个真理:
第一,接口统一是基础,不然AI会被各种参数搞疯,你也会被AI搞疯。
第二,安全是底线,没有安全的工具系统,就是给AI递刀子,最后受伤的肯定是你自己。
第三,可观测性很重要,工具执行要有日志,失败时要返回清晰的错误信息,不然出了问题你都不知道在哪。
第四,扩展性不能忽视,通过MCP协议动态加载工具,能让你的AI能力无限扩展。

P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐