Files
HomeAgent/DESIGN.md
root e450edf865 docs: rewrite DESIGN.md and ARCHITECTURE.md matching current architecture
- Plugin = container with embedded IO channel
- OneBot QQ protocol support
- Output channel capability validation
- Atomic hot-reload (plgreload)
- Three-layer memory (TF-IDF relevance pruning)
- Remove all Docker/snapshot/multi-agent outdated content
2026-07-02 12:18:46 +08:00

7.6 KiB
Raw Blame History

HomeAgent 架构设计 v3

一、核心理念

24 小时陪伴用户、随时待命的智能管家。单会话·单 Agent,身份不漂移。

设计原则

  • 所有输入走 IO 抽象层(中断模式),不直调 agent 方法
  • 所有 LLM 调用走 Provider 接口,不直连 API
  • DeepSeek v4 flash 为默认 LLMthinking 模式关闭
  • 人格固定personal.md记忆分层管理防止性格突变
  • 知识独立于记忆agent 主动学习
  • 插件 = 容器IO 通道是插件的内嵌组件

二、核心抽象

IO 抽象层(唯一输入路径)

外部设备 (Mic/Camera/OneBot/GPIO/HTTP)
        │
        ▼
IOManager
  ├─ Device 接口(每个设备实现)
  │   ├─ Name() / Type() / Description()
  │   ├─ Tools() → 给 LLM 的 Function Calling 工具
  │   ├─ Execute() → 工具调用分发
  │   ├─ Start() / Stop()
  │   └─ OutputCapabilities() → 输出能力声明
  ├─ InputEvent{Source, Type, Payload} → inputCh
  ├─ OutputEvent{Target, Type, Payload} → outputCh
  └─ 路由表: 输入源 → 默认输出通道

输出通道能力声明OutputCapability 位掩码):

能力 说明
CapText 文本输出
CapFile 文件传输
CapImage 图片输出
CapAudio 音频输出
CapStructured 结构化数据JSON/卡片)

Agent 可调用通道工具

  • output_list_channels — 查看所有可用通道及其能力
  • output_set_channel — 切换当前回复的输出通道
  • output_send — 通过指定通道异步发送消息(校验能力)

API 抽象层(唯一输出路径)

Agent Core → Provider.Chat() → LLM API
                │
        ┌───────┴───────┐
        ▼               ▼
  OpenAIProvider    LuaAdapter
  (DeepSeek API)    (格式转换)

插件系统OpenClaw 兼容)

Plugin容器
  ├─ 元数据: name, version, author, description
  ├─ IOConfig可选: 声明 IO 端口
  ├─ Device可选: 原生 Go IO 设备实现
  └─ Tools: 给 LLM 的工具定义

插件来源:

  • plugins/ 目录热加载agent 通过 plgreload 工具显式控制重载
  • 有原生工厂注册的(如 QQ/OneBot→ 构造原生设备
  • 纯 SKILL.md → 用 PluginDevice 包装为 IO 设备
  • 原子化替换:新设备 Start → 原子换路由 → 旧设备 Stop

三、记忆体系(三层)

用户输入 → Context内存, 30条, TF-IDF排序
              │ 每次响应后裁剪最不相关的
              ▼
          DocumentJSON + TF-IDF向量, 冷72h→图
              │ 心跳蒸馏30min
              ▼
          GraphSQLite三元组, 定期重整+同义合并)
存储 容量 裁剪策略
Layer 1: 上下文 RelevanceContext(内存环形缓冲) 30 条 TF-IDF 余弦相似度排序,低分→文档
Layer 2: 文档 document.StoreJSON 文件 + 向量索引) 无上限 72h 未访问 + ≤2 次命中→图
Layer 3: 图 memory.GraphDBSQLite 三元组) 无上限 定期重整 + bigram Jaccard 同义合并

注入策略

  • 只注入图索引(实体名+类型+提及数)到 prompt不注入全文
  • agent 通过 memory_recall 主动查询详情
  • 文档摘要按相关性注入前 3 条

四、知识体系

独立于记忆agent 主动学习。

knowledge/
  smart_home/content.md
  cooking/content.md
       │
       ▼
  TF-IDF 向量索引(字符 bigram
       │
       ▼
  knowledge_search / knowledge_create / knowledge_list

五、人格内核

personal.md → 加载一次 → 固定在 system prompt 最前 → 永不漂移。


六、OneBot QQ 通道

go-cqhttp / LagrangeOneBot 前端)
        │  Reverse WebSocket
        ▼
OneBot Clientinternal/onebot/
  ├─ 事件循环 → Event → IO InputEvent
  ├─ Action 调用 → send_private_msg / send_group_msg / ...
  └─ 自动重连 + 心跳检测
        │
        ▼
Device 注册 → IOManager → Agent

七、数据流

用户消息 → IO InputEvent → eventLoop
  │
  ├─ 1. 追加到 RelevanceContext
  ├─ 2. 构建 prompt:
  │     personal.md + 图索引 + 文档摘要 + 上下文 + 工具
  ├─ 3. 工具循环(最多 10 轮)
  │     LLM → tool_calls → Execute → 结果 → LLM → ...
  ├─ 4. 追加响应到上下文
  ├─ 5. 相关性裁剪Prune → 不相关的归档到文档)
  ├─ 6. OutputEvent → 输出通道
  └─ 7. 记忆候选 → TextMemory(JSONL) + Distiller → GraphDB

心跳30min:
  ├─ Indexer.Sync() — 图→向量
  ├─ DocStore.Reindex() — 文档向量重建
  ├─ 冷文档→图归化
  └─ 图同义合并

插件重载plgreload:
  ├─ 扫描 plugins/ 目录
  ├─ 加载新插件Start 新设备
  ├─ 原子替换 IOManager 设备表 + 路由表
  └─ Stop 旧设备

八、配置

daemon:
  listen_addr: ":8080"
  data_dir: "/var/lib/homeagent"
  heartbeat_interval: 15s
llm:
  model: "deepseek-v4-flash"
  base_url: "https://api.deepseek.com/v1"
  api_key: "${DEEPSEEK_API_KEY}"
  temperature: 0.7
  max_tokens: 4096

九、关键文件

cmd/homed/main.go                — 入口:组装所有子系统
internal/agent/core/agent.go     — Agent 核心:事件循环、工具循环、心跳
internal/agent/core/context.go   — RelevanceContextTF-IDF 上下文管理
internal/agent/personal.go       — 人格加载
internal/agent/api/provider.go   — Provider 接口 + DeepSeek 实现
internal/agent/io/channel.go     — IO 抽象层Device/InputEvent/OutputEvent/路由
internal/api/handler.go          — HTTP API 端点
internal/knowledge/knowledge.go  — 知识系统
internal/memory/graph.go         — SQLite 图数据库
internal/memory/indexer.go       — 图索引器
internal/memory/vector/store.go  — TF-IDF 向量存储
internal/memory/document/doc.go  — 文档记忆
internal/memory/text/text.go     — 文本记忆JSONL
internal/memory/pipeline/        — 蒸馏器
internal/onebot/                 — OneBot V11 协议实现
internal/plugin/plugin.go        — 插件系统
internal/tracker/tracker.go      — 变更追踪
internal/supervisor/daemon.go    — 守护进程
internal/lua/vm.go               — Lua 适配器 VM
plugins/                         — 插件目录
  qq/SKILL.md                    — QQ 插件 SKILL.md
  qq/skill.json                  — QQ 插件 JSON 元数据
config/config.go                 — 配置加载
pkg/types/                       — 类型定义
DESIGN.md                        — 本架构文档

十、与旧设计的核心区别

维度 旧设计 (v1) 当前设计 (v3)
上下文裁剪 固定 FIFO 20 条 TF-IDF 相关性排序 top-K
图记忆注入 关键词 LIKE 查询 向量搜索实体名,只注索引
文档→图 72h 冷文档自动归化
图重整 向量同步 + bigram Jaccard 同义合并
知识系统 knowledge/ 目录 + TF-IDF 向量
人格 personal.md 固定注入
向量引擎 自研 TF-IDF + 倒排索引(字符 bigram
部署 Docker 容器 + 快照 单二进制 + overlayfs 追踪
Agent 模型 多 Agent 编排 单 Agent + 工具循环
输出通道 能力声明 + 路由 + 校验
插件系统 OpenClaw SKILL.md + 原生工厂
QQ 通道 OneBot V11 Reverse WS