Files
HomeAgent/DESIGN.md
root bc26850b50 feat: complete HomeAgent architecture v2
- IO abstraction layer with OutputChannel routing and capability validation
- Three-layer memory (Context-Document-Graph) with TF-IDF relevance pruning
- OneBot V11 QQ protocol plugin with Reverse WebSocket client
- Plugin system with hot-reload (SKILL.md + native factories)
- Knowledge system with TF-IDF vector indexing
- Personality system (personal.md)
- Text memory (JSONL with rotation)
- Change tracker (overlayfs) with rollback
- Lua adapter VM
- Design document (DESIGN.md)

Module: gitcode.com/JianFeeeee/HomeAgent
2026-07-02 12:04:36 +08:00

9.1 KiB
Raw Blame History

HomeAgent 架构设计 v2

一、核心理念

24 小时陪伴用户、随时待命的智能管家。单会话·单 Agent(可分身/调用其他 Agent身份不漂移。

设计原则

  • 所有输入走 IO 抽象层(中断模式),不直调 agent 方法
  • DeepSeek v4 flash 为默认 LLMthinking 模式关闭
  • 人格固定personal.md记忆分层管理防止性格突变
  • 知识独立于记忆agent 主动学习

二、人格内核Personality Core

personal.md ──→ 固定注入 system prompt
  • 纯文本 Markdown 文件,定义 agent 的人格、行为准则
  • 加载一次永不改变(不随对话漂移)
  • 放在 prompt 最前面,优先级最高

三、记忆体系Memory System

三层分级架构,自顶向下逐渐持久化、抽象化:

             用户输入
                 │
                 ▼
     ┌─────────────────────┐
     │  Layer 1: 上下 文    │  RelevanceContext
     │  基于相关性保留      │  30 条活跃TF-IDF 排序
     │  最不相关的→文档记忆 │  
     └────────┬────────────┘
              │ 相关性裁剪(每次响应后)
              ▼
     ┌─────────────────────┐
     │  Layer 2: 文档记忆   │  document.Store
     │  全文 + TF-IDF 向量  │  JSON 持久化
     │  冷文档→图数据库     │  72h 未访问→Graph
     └────────┬────────────┘
              │ 心跳蒸馏30min
              ▼
     ┌─────────────────────┐
     │  Layer 3: 图数据库   │  memory.GraphDB (SQLite)
     │  实体-关系三元组     │  向量索引(实体名)
     │  定期重整+同义合并   │  bigram Jaccard
     └─────────────────────┘

Layer 1: 上下文RelevanceContext

不再使用固定条数裁剪。改为:

  1. 每次用户输入后,计算模型输出与每条上下文的 TF-IDF 余弦相似度
  2. 按相关性从高到低排序,保留 topK默认 30
  3. 最不相关的上下文 → 归档到文档记忆Layer 2保留全文+向量
  4. 活跃上下文中只保留最近且相关性高的内容

相关文件: internal/agent/core/context.go

Layer 2: 文档记忆Document Store

作用:

  • 存储被上下文裁剪下来的事件摘要、agent 主动提交的文档、图记忆同步的索引
  • 每个文档包含:摘要、全文、标签、实体、来源、访问计数、最后访问时间
  • TF-IDF 向量索引(字符 bigram支持向量相似度搜索

冷文档归化:

  • 心跳检测(每 30min找出 72h 未访问且访问次数 ≤ 2 的文档
  • 转为图数据库三元组(文档→包含内容、提及实体、标签、来源)
  • 清理已归化的冷文档

相关文件: internal/memory/document/document.go

Layer 3: 图数据库Graph Memory

存储: SQLite 三元组(实体-关系-实体),每个关系带置信度、会话 ID、日期桶

注入方式(区分于文档注入):

  • 用户消息到达时,先对实体名做向量相似度搜索TF-IDF
  • 找到相关实体名 → 查询图数据库
  • 只注入节点索引(实体名+类型+提及次数+关系类型)到 prompt不注入全文
  • 需要更多细节时agent 调用 memory_recall 工具查询

定期重整(心跳触发,每 30min

  1. 同步实体名到向量索引(Indexer.Sync()
  2. 文档记忆向量索引重建
  3. 冷文档→图归化
  4. 实体同义合并bigram Jaccard > 0.5

相关文件: internal/memory/graph.go, internal/memory/indexer.go

Agent 可用记忆工具

工具 作用 操作对象
memory_recall 检索图记忆 GraphDB
memory_commit 写入三元组 GraphDB
memory_introspect 查看记忆统计 GraphDB
doc_query 向量查询文档记忆 Document Store
doc_commit 提交文档 Document Store

四、知识体系Knowledge System

独立于记忆系统,用于 agent 学习知识:

knowledge/
  smart_home/
    content.md     ← 原始知识文件
  cooking/
    content.md
  ...
       │
       ▼
  TF-IDF 向量索引 ← 知识目录扫描时自动构建
       │
       ▼
  knowledge_search(query) → 返回相关内容

知识来源:

  1. agent 主动学习:调用 knowledge_create 工具,生成知识→写入目录+向量化
  2. 用户上传HTTP 文件上传端点 → 写入目录+向量化
  3. 预置知识knowledge/ 目录下的 content.md

相关文件: internal/knowledge/knowledge.go

Agent 可用知识工具

工具 作用
knowledge_search 向量搜索知识库
knowledge_list 列出知识分类
knowledge_create agent 主动创建知识

五、数据流总览

用户消息
  │
  ▼
IO 输入中断 (channel.go)
  │
  ▼
eventLoop → processTextInput
  │
  ├─ 1. 追加上下文 (RelevanceContext.Append)
  │     └─ 计算向量,缓存
  │
  ├─ 2. 构建 prompt
  │     ├─ 人格设定 (personal.md)
  │     ├─ 图记忆索引 (Indexer.BuildContext → 向量搜索实体名 → Recall → 摘要注入)
  │     ├─ 文档记忆摘要 (DocStore.Query → 注入前3条摘要)
  │     ├─ 工作记忆上下文 (RelevanceContext.Format)
  │     ├─ 技能注入 (skills)
  │     └─ 工具说明 (indexer + doc + knowledge tools)
  │
  ├─ 3. 工具循环 (process)
  │     ├─ 调用 LLM (DeepSeek v4 flash)
  │     ├─ 解析 tool_calls
  │     ├─ 执行工具 (memory_*/knowledge_*/doc_*/设备工具)
  │     └─ 返回结果,循环直到无 tool_calls
  │
  ├─ 4. 追加响应到上下文
  │
  ├─ 5. 相关性裁剪 (RelevanceContext.Prune)
  │     └─ 最不相关的 → 文档记忆归档
  │
  ├─ 6. IO 输出响应
  │
  └─ 7. 记忆候选事件
        └─ → TextMemory (JSONL 持久化)
            └─ → Distiller → GraphMemory (三元组萃取)

心跳线程 (每 30min):
  ├─ distillContext: 安全裁剪兜底
  ├─ syncGraphToDocs: 图→文档索引同步
  ├─ reorgGraph:
  │   ├─ Indexer.Sync(): 实体名→向量索引
  │   ├─ DocStore.Reindex(): 文档向量重建
  │   ├─ 冷文档→图归化
  │   └─ 同义实体合并
  └─ (后续) GraphDB 向量索引生成/重整

六、关键文件

cmd/homed/main.go               — 入口:组装所有子系统
internal/agent/core/agent.go     — Agent 核心:事件循环、工具循环、心跳
internal/agent/core/context.go   — RelevanceContext基于 TF-IDF 的上下文管理
internal/agent/personal.go       — Personalitypersonal.md 加载
internal/agent/api/provider.go   — LLM ProviderDeepSeek API 封装
internal/agent/io/channel.go     — IO 抽象层:中断输入、设备注册
internal/api/handler.go          — HTTP APIREST + OpenAI 兼容端点
internal/knowledge/knowledge.go  — 知识系统:目录扫描、向量索引、搜索
internal/memory/graph.go         — 图数据库SQLite 三元组 CRUD
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/tracker/tracker.go      — Change Trackeroverlayfs 文件变更追踪
internal/plugin/plugin.go        — 插件平台SKILL.md 加载
internal/supervisor/daemon.go    — 守护进程:健康检查、自动 rollback
internal/lua/vm.go               — Lua 适配器 VM
config/config.go                 — 配置加载
pkg/types/                       — 类型定义

七、配置示例

daemon:
  listen_addr: ":8080"
  data_dir: "/var/lib/homeagent"
  heartbeat_interval: 15s
  check_interval: 30s

llm:
  provider: "openai"
  model: "deepseek-v4-flash"
  base_url: "https://api.deepseek.com"
  api_key: "${DEEPSEEK_API_KEY}"
  temperature: 0.7
  max_tokens: 4096

八、对比原设计

维度 旧设计 新设计
上下文裁剪 固定 20 条 FIFO TF-IDF 相关性排序,保留最相关
上下文→文档 蒸馏器每周期 flush 每次响应后按相关性裁剪归档
图记忆注入 关键词 LIKE 查询 向量搜索实体名,只注索引
文档→图 72h 冷文档自动归化
图重整 心跳:向量同步+同义合并
知识系统 knowledge/ 目录+向量索引+工具
人格 personal.md 固定注入
向量引擎 自研 TF-IDF + 倒排索引