乐于分享
好东西不私藏

IOTLink 开发手记-2:AI编程助手实现心得

IOTLink 开发手记-2:AI编程助手实现心得
先上最终实现界面,目前功能放到一个模块里有点拥挤,但是先做出来再说,后面会慢慢优化,记得三十年前高中时候老师常说一句:书要先由薄读厚,再由厚读薄才是真正学会了。目前界面有VSCode的型,借鉴VisualStudio。但内部差的很远,为啥ClaudeCode不搞带界面的编辑工具,感觉主要两点:(1)主要是工作量巨大,做一个好的编辑器比纯AI难度大多了;(2)第二个让用户无处可改代码,一个简单的功能都要消耗token 。
系统整体架构图如下
和其他MQTT,数据库,SSH等模块之间通讯使用的IOTLink Bus方式,这个和MCP的区别。
对比项
IOTLink BUS
MCP
定位
IOTLink 内部能力总线
通用开放协议
使用范围
主要供 IOTLink 使用
可被不同 AI 客户端使用
工具描述
自定义 Schema
MCP 标准 Schema
通信格式
IOTLink 自定义调用块或原生 Tool Call
JSON-RPC
生命周期
由 IOTLink 自己管理
有标准初始化、协商和关闭流程
工具发现
内部注册表
tools/list
工具调用
内部 BUS 路由
tools/call
资源与模板
可自行实现
标准 Resources、Prompts
兼容性
只能连接自有模块
可以接入第三方 MCP Server

下面将共享下开发过程心得,功能部分实现参考多个AI Agent工具实现,界面参考VSCode,VisualStudio.

一、AI 模型其实只负责“思考”

很多人会把 AI 编程助手理解成一个更聪明的代码生成器。

你告诉它:

帮我修复这个程序无法启动的问题。

它看起来能够分析代码、修改文件、执行编译,甚至根据错误继续修复。

但大模型本身并不能直接操作电脑。

它真正能做的事情,是根据当前看到的信息,判断下一步应该做什么。例如:

  • 读取哪个文件;
  • 搜索哪个函数;
  • 修改哪几行代码;
  • 执行什么编译命令;
  • 根据什么错误继续排查。

真正负责读取文件、修改代码和执行命令的,是编程助手背后的工具系统。

因此,一个完整的 AI 编程助手,可以简单理解为:

大模型负责思考,工具负责执行,宿主程序负责管理。

大模型像大脑,文件读取、代码搜索、编辑器和终端像手脚,而任务记录、上下文和检查点则像它的笔记本。

只有这些部分配合起来,AI 才能真正开始“干活”。

二、从聊天框到智能体,中间差了什么?

最早的实现方式非常简单。

用户提出问题,程序把问题和部分代码发送给模型,模型返回一段回答。

这种方式适合解释代码,却很难完成复杂任务。

因为真实的软件项目通常包含成百上千个文件。模型既不知道项目结构,也不知道应该从哪里开始,更无法确认自己的修改是否正确。

后来,我给编程助手增加了文件读取、目录浏览、代码搜索和命令执行能力。

AI 可以先查看项目目录,再搜索相关类和函数,最后读取准确的代码片段。

到这一步,它才开始从“聊天机器人”变成“编程智能体”。

不过,新的问题很快又出现了。

工具越多,模型越容易选错;代码读取越多,请求消耗越大;任务执行时间越长,越容易出现重复搜索和上下文混乱。

于是,开发重点也从“增加功能”,逐渐转向“约束行为”。

三、不是读得越多,理解得越好

在最初的设计中,为了让模型充分了解项目,我会把大量历史对话、文件内容和工具结果一起发送过去。

这样做看起来信息很完整,实际效果却不一定好。

当上下文越来越长时,真正重要的代码很容易被淹没。模型可能记住了大量日志,却忽略了当前真正需要修改的函数。

这让我逐渐意识到:

上下文的价值不在于多,而在于准确。

现在的思路是先提供项目结构,再让模型根据任务逐步获取信息。

例如修复一个按钮无效的问题,并不需要读取整个项目。通常只需要找到:

    这些信息能够形成一条完整的证据链。

    模型知道自己为什么要修改,也知道修改会影响哪些地方,而不是凭借一个模糊的代码片段进行猜测。

    四、修改代码之前,先证明自己看懂了

    AI 修改代码最危险的地方,不是它不会写,而是它可能在没有充分理解的情况下直接动手。

    因此,我在编程助手中逐步加入了“先读取、再修改”的限制。

    模型需要先获得目标文件的准确内容,确认文件版本没有发生变化,然后才能提交修改。

    修改前还会保存检查点,记录原始内容。修改完成后,再保存新的版本和校验信息。

    如果结果不正确,就可以恢复到修改前的状态。

    这套机制并不能保证 AI 永远不犯错,但可以把错误控制在可恢复的范围内。

    我的体会是:

    智能体真正需要的不是绝对自由,而是可控的行动能力。

    能力越强,越需要明确边界。

    只读任务不能修改文件;问答任务不能随意执行命令;不同角色只能使用被允许的工具;危险操作必须经过额外检查。

    这些限制看起来降低了 AI 的自由度,实际上却提高了它在真实项目中的可用性。

    五、为什么还要支持多个任务?

    当编程助手只能同时处理一件事时,使用体验非常像早期的单任务系统。

    一个任务正在编译,用户就只能等待;想临时查看另一个问题,也容易打断原来的上下文。

    因此,我后来开始增加多任务能力。

    同一个项目目录下,可以建立多个独立任务。例如:

    • 一个任务负责修复程序启动问题;
    • 一个任务负责优化界面;
    • 一个任务负责分析 Token 消耗;
    • 另一个任务负责研究新的智能体功能。

    每个任务拥有自己的对话、执行状态、上下文和工具结果。

    这样做的意义不仅是能够切换页面,更重要的是避免不同任务之间相互污染。

    不过,多任务并不等于所有操作都可以无限并发。

    模型请求可以分别进行,但编译、文件修改和终端命令需要协调。否则两个任务同时修改同一个文件,很容易产生冲突。

    因此,多任务系统背后还需要一个任务协调器,决定谁可以执行、谁需要等待,以及任务停止后如何恢复。

    用户看到的是几个简单的任务标签,程序内部处理的却是状态隔离、资源竞争和执行顺序。

    这也是软件开发中很典型的一件事:

    越简单的界面,背后往往需要越复杂的工程。

    六、工具不是越多越好

    开发过程中,我还踩过一个很明显的坑:给模型提供了太多工具说明。

    文件读取、代码搜索、目录遍历、文本替换、补丁修改、命令执行、Git 操作、任务计划……每个工具都有自己的参数和规则。

    如果把所有工具的完整说明都发送给模型,不仅会消耗大量 Token,也会增加模型的选择难度。

    后来我开始把工具分层。

    基础工具保持稳定,专业能力通过技能按需加载。模型只有在遇到相应任务时,才获得对应的说明。

    同时,工具参数尽量保持简单、统一和明确。

    这让我得到一个很重要的开发心得:

    设计 AI 工具,本质上也是在设计一套给 AI 使用的用户界面。

    人类面对复杂界面会迷路,模型面对复杂的工具定义同样会迷路。

    好的工具不是功能最多,而是让模型容易选对、容易调用,也容易判断执行结果。

    七、真正影响体验的,往往不是模型大小

    我们很容易把 AI 编程助手的效果归因于模型。

    回答不好,就换一个更大的模型;修改失败,就增加更多提示词。

    但在实际开发中,我越来越感觉到,模型只是系统中的一个部分。

    真正决定体验的,还有很多工程细节:

    • 是否给模型提供了准确的项目环境;
    • 是否能找到真正相关的代码;
    • 是否会重复读取相同文件;
    • 工具执行结果是否能够被模型理解;
    • 修改失败后能否恢复;
    • 用户是否能看到当前执行进度;
    • 一个任务是否会干扰另一个任务;
    • 程序异常退出后,任务能否继续。

    模型能力决定了上限,工程系统决定了下限。

    一个模型能力很强,但工具混乱、上下文臃肿、执行过程不可控,最终仍然很难使用。

    相反,即使模型并不是最强,只要上下文准确、工具清晰、反馈及时,也能完成大量实际工作。

    八、我的一点心得

    做 AI 编程助手之后,我最大的变化,是不再把 AI 看成一个“什么都懂的程序员”。

    它更像一个反应很快、知识很多,但需要明确工作环境和操作规则的新同事。

    你不能只告诉它“把这个问题解决掉”,然后期待它自动理解整个项目。

    你需要给它合适的工具、准确的资料、清晰的边界,以及能够检查和恢复的工作流程。

    这和带新人其实很像。

    刚开始时,我们总想把所有资料一次性交给他。后来才发现,真正有效的方法是告诉他当前目标,让他按照任务一步步查找信息,并在关键节点确认结果。

    AI 也一样。

    未来的编程助手,可能不会只是编辑器旁边的一个聊天窗口。它会逐渐成为项目中的任务执行者:理解需求、查找代码、制定步骤、完成修改、运行验证,并把整个过程清晰地展示出来。

    但无论模型多么强大,有一件事应该始终保持不变:

    AI 可以替我们执行很多工作,但最终的判断和责任,仍然属于使用它的人。

    这也是我在开发 IOTLink AI 编程助手过程中,最深的一点体会。

    我们真正要做的,不是让 AI 看起来更聪明,而是让它在真实工作中,更可靠地完成一件事。