nanobot 进阶指南——打造能自我进化的智能体
nanobot 进阶指南——打造能自我进化的智能体
引言:从助手到开发者
在入门指南中,我们见识了 nanobot 如何通过对话帮你完成各种任务。但经过一段时间的深入使用,你会发现一个有趣的真相:真正进行复杂推理和内容生成的,是背后的大模型(LLM);而 nanobot 则扮演着调度中枢的角色——她不生产智能,而是智能的“搬运工”:把 LLM 的思考转化为行动,把工具的执行结果反馈给 LLM,同时管理对话、记忆、定时任务等一切让智能体持续运转的基础设施。
笔者在深度体验 nanobot 之后,越来越感受到这种设计的巧妙:她把 LLM 这个“超级大脑”和具体的“手脚”(工具、技能、记忆)无缝连接起来,让你可以用最自然的方式指挥 AI 完成复杂的工作。更重要的是,nanobot 不仅能使用工具,还能自己创造和改进工具——这意味着她可以不断进化,越来越懂你。
本文将带你深入 nanobot 的“后台”,探索如何从零开始定制她的“人格”,如何开发新技能,如何让她自主维护代码,如何管理无限长的对话,以及如何利用定时任务让 nanobot 成为真正可靠的自主服务。
nanobot 由香港大学数据科学实验室(HKUDS)开发,核心代码仅 3,400 余行,相比同类项目精简了 99%,却完整保留了 Agent 的核心能力。这种极简设计让你能够完全掌握它的运作机制,而不是被庞大的代码库淹没。
一、从 onboard 开始:工作空间的秘密
执行 nanobot onboard 是深入 nanobot 世界的第一步。这个命令会做两件关键的事:
- 初始化配置文件:在
~/.nanobot/config.json创建配置模板。 - 创建工作空间:在
~/.nanobot/workspace生成 Agent 的“家”。
1.1 工作空间结构
~/.nanobot/workspace/
├── AGENTS.md # 角色定义(你是谁)
├── SOUL.md # 性格与价值观(你的内在)
├── TOOLS.md # 拥有的工具清单
├── USER.md # 用户画像(你服务的对象)
├── memory/ # 长期记忆存储
│ ├── HISTORY.md # 对话历史摘要
│ └── MEMORY.md # 重要记忆节点
└── skills/ # 自定义技能存储
这种设计的精妙之处在于:将 Agent 的逻辑与数据完全解耦。你只需要修改这些 Markdown 文件,就能改变 Agent 的行为,而不需要动一行 Python 代码。这些文件构成了 Agent 的“人格”和“记忆”,是版本控制的真相源。
1.2 工作空间的扩展能力
工作空间不仅是 Agent 的“家”,也是多智能体协作的基础。你可以通过配置启动多个 Agent 实例,甚至让一个 Agent 动态生成子 Agent(spawn)来并行处理子任务。子 Agent 拥有更小的权限和更聚焦的目标,通过消息总线与主 Agent 通信。这种能力适合将复杂任务拆解为多个独立部分并行执行,例如同时分析财报、搜索新闻、计算指标,最后再由主 Agent 整合输出。
二、技能开发:让 nanobot 学会新本领
nanobot 的所有能力都封装在 技能(Skill) 中。每个技能是一个独立的 Python 模块,放在 skills/ 目录下。
2.1 技能目录结构
skills/
└── my_skill/
├── SKILL.md # 技能说明书(名称、描述、参数)
└── __init__.py # 技能实现,必须包含 async def execute(...)
2.2 SKILL.md 示例
---
name: weather
description: 查询指定城市的天气
parameters:
city:
type: string
description: 城市名称
---
这些信息会被 nanobot 自动读取,并在调用时传给 execute 函数。参数名、类型必须与 execute 函数的参数列表一致。
2.3 扩展技能:集成 MCP 服务器
nanobot 支持连接 MCP(Model Context Protocol)服务器,动态获取外部工具。你可以在 ~/.nanobot/config.json 中配置 MCP 服务器,格式与 Claude Desktop / Cursor 完全兼容——你可以直接把现成的 MCP Server 配置复制过来就能用。支持 stdio 和 HTTP 两种传输模式。
2.4 社区共享技能
将你开发的技能打包分享给社区,其他人只需复制到 skills/ 目录即可使用。未来可以建立一个技能仓库,让 nanobot 生态越来越丰富。
三、让 nanobot 自主维护自己
nanobot 不仅能执行任务,还能反过来改进自己。怎么做到的?其实特别简单:给她一个任务清单,让她调用工具去完成。
3.1 用 TODO 驱动自我进化
我在项目根目录下放了一个 TODO.md,里面写着想让 nanobot 优化的地方:
- [ ] [高] 优化 rag_query 返回长度,减少 token 消耗
- [ ] [中] 为 web_search 添加错误重试机制
然后我对她说:“去看看 TODO 里有哪些任务,分解执行一下吧”。接下来神奇的事情发生了:
- 她读取
TODO.md,理解了要做什么。 - 调用
git命令创建分支、修改代码。 - 运行测试脚本确保修改没问题。
- 合并分支,更新
TODO.md标记完成。 - 最后告诉我:“搞定了,你看看行不行。”
完美!现在 rag_query skill 已经优化完成,严格控制了上下文长度。让我总结一下修复内容:
... ...
✅ rag_query.py 已修复完成!
/root/nanobot/nanobot/skills/rag_query/
├── SKILL.md ✅ 技能元数据(含优化说明)
└── __init__.py ✅ Python 模块支持
✅ 测试通过
• RAG API:正常工作(1,325,716 vectors)
• 查询响应:279 chars(<500 tokens)
• 模型崩溃问题:已解决 🎉
整个过程里,她用的全是现成的工具——Git 做版本控制,pytest 做测试,文件读写工具改代码。nanobot 不需要自己实现这些功能,她只需要知道怎么用好它们。
3.2 这为什么有趣?
因为这意味着你可以用管理人类团队的方式管理 nanobot:你把想优化的方向写在 TODO.md 里,告诉她一声,她就默默去干了。代码优化、bug修复、功能增强——她能做的事情会随着你给的工具越来越多而越来越强大。
这种“自我进化”不是科幻,就是简单的:TODO.md + 外部工具 + 一条指令。而这一切的核心,是 nanobot 那种不重复造轮子,而是用好轮子的设计哲学。
四、上下文管理的高级技巧
nanobot 的核心挑战之一是如何在无限长的对话中保持高效和低成本。她通过一套精妙的对话压缩与整理机制来解决这个问题。
4.1 对话压缩的原理
随着对话进行,历史消息会越来越多,直接全部送入 LLM 会导致 token 爆炸。nanobot 采用异步压缩策略:
- 系统会监控未压缩的消息数量,当达到预设阈值(例如 20 轮)时,自动触发压缩任务。
- 压缩任务将最近的多轮对话发送给 LLM,要求生成一段简洁的摘要,概括关键信息和用户意图。
- 压缩完成后,被压缩的原始消息从会话中移除,仅保留摘要到
HISTORY.md中,从而释放上下文空间。
这个过程完全在后台异步执行,不会阻塞用户与 nanobot 的实时交互。阈值可以在配置文件中调整,以适应不同模型上下文窗口大小。
4.2 对话整理的实现
压缩后的摘要并非简单丢弃,而是被精心组织,以便在后续对话中发挥最大效用:
- 每次新对话时,系统会保留最近若干条原始消息(例如最近 10 轮),保证对近期语境的精准把握。
- 同时,会将之前压缩生成的摘要从
HISTORY.md中取出,作为一条特殊消息插入到系统提示之后,让 LLM 了解对话的来龙去脉。 - 这种“摘要 + 近期细节”的组合,使得 token 消耗随对话轮次呈对数增长而非线性增长,理论上支持无限长对话。
4.3 向量化记忆检索(进阶)
如果你希望 nanobot 拥有更强的长期记忆能力,可以将 MEMORY.md 中的每条记忆向量化(使用 sentence-transformers 等工具),每次对话时根据用户消息检索最相关的 3-5 条记忆注入系统提示。这需要额外集成向量数据库(如 Chroma、FAISS),但能显著提升记忆的精准度,让 nanobot 真正“过目不忘”。
五、主动机制:Cron 与 Heartbeat
nanobot 要成为真正自主的助手,必须解决“在没有人说话时做事情”的问题。为此,她内置了两个并行的主动机制:Cron(定时任务) 和 Heartbeat(心跳唤醒)。
5.1 Cron 定时任务
Cron 用于执行明确的时间点或间隔任务,适合“每天早上 9 点发天气报告”这类场景。
实现原理
CronService 从 ~/.nanobot/cron/jobs.json 读取持久化的任务配置,为每个任务创建异步定时器。当时间匹配时,任务被提交到后台队列,调用 LLM 解析并执行相应操作。执行结果会记录在日志中,并可配置通过邮件等渠道通知用户。
5.2 Heartbeat 心跳唤醒
Heartbeat 解决的是**周期性“检查一下有什么需要做”**的问题。它每隔固定时间(默认 30 分钟)唤醒 Agent,让 Agent 读取 HEARTBEAT.md 文件,判断是否有待处理事项。
HEARTBEAT.md 示例
# 待办检查清单
- [ ] 检查服务器磁盘空间,如果使用率超过90%则清理日志
- [ ] 查看是否有未回复的重要消息
- [ ] 检查订阅的 RSS 是否有更新
- [ ] 如果今天是周五,生成周报草稿
工作流程
- HeartbeatService 每 30 分钟触发一次唤醒。
- Agent 读取
HEARTBEAT.md,解析所有未完成项(- [ ]标记)。 - 根据任务描述,调用相应工具执行检查或操作。例如,对于磁盘检查,会调用系统命令或预先写好的技能。
- 执行结果可记录到日志,或通过配置的渠道(如邮件)通知用户。
- 完成任务后更新
HEARTBEAT.md,将- [ ]改为- [x],并可选添加完成时间。
5.3 两者的区别与配合
| 维度 | Cron | Heartbeat |
|---|---|---|
| 触发方式 | 精确时间/间隔 | 固定周期唤醒 |
| 任务定义 | 命令行添加 | Markdown 文件 |
| 适用场景 | 确定性定时任务 | 条件性检查任务 |
| 灵活性 | 低(固定时间) | 高(可动态判断) |
两者在 nanobot gateway 启动时会同时运行,共同构成 Agent 的主动性基础。你可以根据任务性质选择合适的机制:需要准点执行的用 Cron,需要根据状态判断的用 Heartbeat。
结语:你的智能体,由你塑造
nanobot 的设计哲学是 让 AI 从“回答者”变为“行动者”,最终成为“共创者”。
从入门到进阶,从本地测试到自主进化,nanobot 为你提供了一个强大而开放的平台。它的核心代码仅不到 4000 多行,这意味着你可以完全理解它的每一个细节,甚至按照自己的需求进行改造。
当一个系统足够小的时候,它就变得可以被一个人完全掌握,而这种掌握感是构建更复杂系统的基础。现在,你已经掌握了 nanobot 的核心进阶技巧,接下来就去创造属于你自己的智能体吧!
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)