nanobot 工作区的结构

注意——这一篇的内容基本完全来自于 AI,很可能有幻觉。nanobot和openclaw的工作区结构应该是类似的,但openclaw对历史的处理是滚动保存的,见仁见智吧。

一、工作区目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
~/.nanobot/workspace/
├── AGENTS.md # 助手行为指南
├── SOUL.md # 角色设定(AI 的性格、背景)
├── USER.md # 用户偏好信息
├── TOOLS.md # 工具使用说明
├── memory/
│ ├── MEMORY.md # 长时记忆(结构化事实)
│ └── HISTORY.md # 事件日志(时间线记录)
├── skills/ # 自定义技能目录
│ ├── roll-dice/ # 示例:掷骰子技能
│ │ └── SKILL.md # 技能说明文档
│ └── ... # 其他技能
└── sessions/ # 原始会话文件(自动生成)

二、文件加载机制

自动加载文件(每次会话开始时):

  • AGENTS.md → 助手行为准则
  • SOUL.md → 角色设定(AI 是谁)
  • USER.md → 用户偏好信息
  • MEMORY.md → 长时记忆(重要事实)
  • TOOLS.md → 工具使用说明

AI 手动加载文件(需要时读取):

  • HISTORY.md → 通过 grep 或 exec 命令搜索历史
  • 技能文件 → 需要时读取 SKILL.md 了解功能
  • 会话文件 → 自动压缩时参考

HISTORY.md 会非常长——AI 会经常 append 它,因此 AI 基本只能通过 grep 命令来搜索它。AI 告诉我说 HISTORY.md 似乎没有分区或压缩机制……再看吧,反正不会全文读。

关于绘画内容压缩:

  • 会话文件内容过大时会被压缩
  • 压缩后重要信息提取到 HISTORY.md 和 MEMORY.md

三、记忆系统实现

  1. 三层记忆架构

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    • 长时记忆(MEMORY.md):结构化事实,始终加载
    用户偏好、项目上下文、重要关系
    使用 edit_file/write_file 即时更新

    • 短时记忆(HISTORY.md):事件日志,不自动加载
    按时间顺序记录事件:[YYYY-MM-DD HH:MM]
    通过搜索工具查找历史信息

    • 即时记忆(会话文件):完整对话,自动管理
    达到阈值时触发压缩
    提取重要信息到 HISTORY.md 和 MEMORY.md
  2. 记忆更新时机

  • 用户提供重要信息 → 立即写入 MEMORY.md
  • 完成任务或事件 → 可选记录到 HISTORY.md
  • 会话文件过大 → 自动压缩,提取关键信息

四、Skill 系统详解

  1. Skill 是什么?

    1
    2
    3
    4
    • 扩展助手能力的模块
    • 包含:说明文档、脚本(可选)、示例(可选)
    • 位于 skills/目录下的子目录
    • 每个 skill 必须有 SKILL.md 文件作为入口
  2. Skill 加载机制

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    • nanobot 在后台自动跟踪 skills/目录
    • 启动时扫描所有子目录
    • 为每个 skill 生成 XML 格式的"索引"
    • 将索引作为系统指令插入到上下文开头
    • 并且在 skills 下目录有文件更新时更新这个索引

    示例索引:
    <skills>
    <skill available="true">
    <name>roll-dice</name>
    <description>A simple dice rolling skill...</description>
    <location>路径/SKILL.md</location>
    </skill>
    </skills>
  3. Skill 发现规则:自动发现,增加、更新、删除 skill 时会直接反映到系统指令上,但我似乎尝试出来问题,就是为没有 YAML 头的 SKILL.md 增加 YAML 头,它不反映。这时候重启一下 nanobot 会解决。

  4. Skill 元信息:Skill 的元信息来自于 SKILL.md 中的 YAML frontmatter,倘若缺乏这个 YAML 头,description 就会和 name 一致,对 AI 来说缺乏技能的元信息供参考了。

    1
    2
    3
    4
    5
    --
    name: skill-name # 技能名称(英文)
    description: 功能描述 # 一句话描述功能
    metadata: {"nanobot": {"emoji": "🎯", "category": "..."}}
    --

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 协议 ,转载请注明出处!