手搓 AI 编程 Agent 实战:180 行代码搞定自主开发与 100 万长文本
最近在折腾开源项目,发现很多开发者一提到做 AI Agent 就本能地去拥抱 LangChain 或 AutoGPT 这种重型框架。其实,真正核心的 Agent 逻辑并没有那么复杂,甚至可以简单到用一个 while(true) 循环就能搞定。
WorkBuddy 协助了解项目架构
今天想把我最近手搓的一个自主 AI 编程 Agent 的实战经验分享出来。这个项目不仅能自己读代码、修 Bug,还能像真正的工程师一样开“子进程”并行干活。全程没有依赖复杂的 Agent 库,核心逻辑代码只有 180 行,但效果却出奇地好。
WorkBuddy 解释 Agentic Loop 核心逻辑
一、为什么我要重新造这个轮子?
起因是我在用的 CNB 平台上虽然自带了一个 NPC 助手,但它太“死”了——功能受限、没法定制,像个只会复读的机器人。我需要一个能完全自主办事的“打工人”:在 Issue 里 @ 它一下,它就能接管整个任务,读代码、改文件、跑测试、发评论,直到把活儿干完再向我汇报。
为了这个目标,我并没有引入任何第三方 Agent 框架,而是直接用 Node.js 22 + TypeScript 手写了整个调度逻辑。最终的产物是一个很精简的 Docker 镜像,部署时只需要一行配置代码就能接入任意仓库。
二、核心架构:180 行的“心跳循环”
WorkBuddy 绘制的项目架构图
很多人觉得 Agent 很神秘,其实剥开外壳,核心就是一个不断思考和动作的循环。我把这个逻辑浓缩在了一个 180 行的 agentic loop 里。
逻辑链条非常清晰:
- 接收指令:用户在 Issue/PR 里 @Agent 提出需求。
- 进入循环:构建 Prompt,开启
while(true)死循环。 - 模型思考:调用 LLM(支持流式输出),让它决定下一步干什么。
- 上下文管理:一旦发现 Token 占用超过窗口的 75%,立即启动一个轻量级的“Flash 模型”把中间的对话历史压缩成 300 字以内的摘要,保留首尾关键信息,防止“失忆”。
- 工具调度:如果 LLM 决定要用工具,就根据工具属性决定是并发还是串行执行,拿到结果后继续循环。
- 审校退出:如果 LLM 说“做完了”,不直接听信,而是进入“Hermes 自审”环节,确认无误才算真正的 Done,否则继续循环。
这种“手搓”的方式最大的好处就是透明。每一行逻辑都在你掌控之中,出了问题一眼就能看到是哪一步断了。
三、痛点攻克:Hermes 自审机制
做大模型应用的同学一定遇到过这种尴尬:AI 在文本里信誓旦旦地写着“代码已修复”或“注释已添加”,但实际上它压根没调用工具——它只是在用文字“欺骗”你说做完了(也就是所谓的幻觉)。
为了解决这个问题,我专门设计了一个Hermes 自审机制。它的逻辑非常冷酷但有效:
- 不看你说什么,看你做了什么。系统会直接去扫消息历史里的
tool_calls字段,统计每个工具实际被调用了几次,生成了一个不可推翻的系统日志。 - 强制二元判断。把这个日志扔给审校模型,强制它只能回答“完成”或者“遗漏:XXX”。没有模棱两可的“大概也许”。
- 闭环修正。一旦发现遗漏,系统会直接把问题反馈给主 Agent,逼着它回去补全动作。
这一招直接把 AI“用嘴干活”的概率降到了零,极大地增强了系统的可靠性。
四、多线程开发:子 Agent 的并行艺术
一个人干活太慢,那就招人。这个 Agent 支持派生出子 Agent。
举个场景:主 Agent 正在专注地修一个复杂的 Bug,这需要长时间的逻辑推演。同时,它发现文档也需要更新。这时,它就不会分心去写文档,而是直接生派一个子 Agent 到后台去跑文档更新任务。
子 Agent 有独立的消息栈和工具集,通过 Promise.race 和事件通知机制与主 Agent 通信。更妙的是,为了防止无限递归把服务器搞崩,我特意在架构上禁止了子 Agent 再去派生孙子 Agent。这种设计让并行开发既高效又安全。
五、工具扩展:真正做到“热插拔”
在开发过程中,工具的扩展性至关重要。我设计了一套动态注册机制:想让 Agent 学个新技能?
- 不需要改任何注册代码。
- 只需要在
tools/目录下丢一个.ts文件。 - 导出标准的
tool对象。
系统启动时会自动扫描该目录,把工具列表注入到系统提示词里。这种设计让代码库极其干净,想加什么功能随手写个插件就能用。
六、百万级上下文:把“红宝书”塞进去
这次开发用的是支持 100 万 token 上下文的模型(WorkBuddy 这点真的很强)。这相当于什么概念?整本《JavaScript 高级程序设计》扔进去都绰绰有余。
在实际场景中,这意味着 Agent 可以一口气读完整个中型仓库的代码,而不需要我去手动挑选文件给它看。这种“全知视角”让它理解架构和修改代码的准确度大幅提升。以前那种“读到这里忘了开头”的蠢事再也没发生过。
七、开发体验:从用户到设计者的转变
整个项目其实都是我借助 WorkBuddy 辅助完成的。说实话,它的流式 Thinking 能力在调试 Agent 循环时帮了大忙。以前 Agent 走错了路,半天不知道它为什么那样选,现在把思考过程实时 dump 到日志里,出了问题秒级定位。
更重要的是,它让我意识到:AI 的核心价值不是帮你写代码,而是让你从“工具使用者”变成“工具设计者”。
当你手里有了一个足够聪明、上下文够大、且能自我纠正的编程伙伴时,技术瓶颈就不再是“能不能写”,而是“能不能想到”,你的想象力成了唯一的限制。
如果你也有想自建 AI Agent 的想法,别被那些复杂的框架劝退。试着像写业务逻辑一样,手写一个核心循环,你会发现整个世界都清晰了。
评论已关闭