跳转至

内存系统

ZeroClaw 实现了一个全栈搜索引擎作为内存系统,无外部依赖。

架构概览

┌────────────────────────────────────┐
│ 用户查询(自然语言)                │
└──────────────┬─────────────────────┘
┌──────────────▼─────────────────────┐
│ 混合搜索引擎                        │
├────────────────────────────────────┤
│ 向量搜索 (70%) + 关键词搜索 (30%)  │
└──────────────┬─────────────────────┘
    ┌──────────┼──────────┐
    │          │          │
┌───▼───┐ ┌───▼───┐ ┌────▼────┐
│ 向量  │ │ 关键  │ │ 合并    │
│ 数据库│ │ 搜索  │ │ 排序    │
└───────┘ └───────┘ └─────────┘

内存后端

SQLite(推荐)

[memory]
backend = "sqlite"
auto_save = true
vector_weight = 0.7
keyword_weight = 0.3
embedding_provider = "openai"

优势: - ✅ 快速、可靠 - ✅ 支持向量搜索 - ✅ 支持关键词搜索 - ✅ 混合搜索

Lucid

[memory]
backend = "lucid"
auto_save = true

优势: - ✅ 分层记忆 - ✅ 云同步 - ✅ CLI 集成 - ✅ SQLite 回退

Markdown

[memory]
backend = "markdown"
auto_save = true

优势: - ✅ 人类可读 - ✅ 易于编辑 - ✅ 版本控制友好

None(无记忆)

[memory]
backend = "none"

优势: - ✅ 零存储 - ✅ 隐私保护 - ✅ 最快性能

搜索机制

向量搜索(语义)

查询:"如何配置 API 密钥?"
嵌入:[0.1, 0.3, 0.9, ...]
余弦相似度匹配相关记忆
结果:配置 API 密钥的步骤...

关键词搜索(BM25)

查询:"如何配置 API 密钥?"
提取关键词:"配置"、"API"、"密钥"
BM25 评分匹配
结果:配置 API 密钥的文档...

混合合并

// 加权合并
score = vector_score * vector_weight + keyword_score * keyword_weight
// 示例:0.85 * 0.7 + 0.72 * 0.3 = 0.811

Embeddings

OpenAI Embeddings

[memory]
embedding_provider = "openai"

自定义端点

[memory]
embedding_provider = "custom:https://my-embedding-api.com/v1"

无 Embeddings

[memory]
embedding_provider = "noop"

配置选项

[memory]
# 后端类型
backend = "sqlite"

# 自动保存
auto_save = true

# 搜索权重
vector_weight = 0.7
keyword_weight = 0.3

# 嵌入配置
embedding_provider = "openai"
embedding_model = "text-embedding-3-small"

# 缓存
cache_enabled = true
cache_max_size = 1000

工具集成

ZeroClaw 自动管理内存:

# 保存记忆(自动)
$ zeroclaw agent -m "记住我喜欢 Rust"
[INFO] Memory saved: "用户喜欢 Rust"

# 检索记忆(自动)
$ zeroclaw agent -m "我喜欢什么语言?"
# 代理会自动检索并回复:你喜欢 Rust 语言

手动工具

# 虽然是自动的,但也可以手动调用
[memory.tools]
auto_save = true      # 自动保存对话
auto_recall = true    # 自动检索相关记忆

性能优化

索引优化

# FTS5 全文搜索索引(自动创建)
CREATE VIRTUAL TABLE memory_fts USING fts5(content, tokenize='porter');

# 向量索引(自动创建)
CREATE INDEX memory_embedding_idx ON memory(cosine_similarity);

缓存机制

// LRU 缓存
struct Cache {
    capacity: usize,
    map: HashMap<String, Embedding>,
    list: LinkedList<String>,
}

批量操作

// 批量嵌入
embeddings = client.batch_encode(&texts, batch_size=100);

迁移

从 Markdown 到 SQLite

# 使用迁移命令
zeroclaw migrate memory --from markdown --to sqlite

从 SQLite 到 Markdown

zeroclaw migrate memory --from sqlite --to markdown

故障排查

搜索不返回结果

# 检查索引
$ zeroclaw doctor
[INFO] Memory index:  OK
[INFO] FTS5:  Active
[INFO] Vector search:  OK

# 搜索测试
$ zeroclaw agent -m "搜索: API 密钥"

内存占用过高

# 减少缓存
[memory]
cache_max_size = 100

# 切换到更轻量的后端
[memory]
backend = "none"

最佳实践

  1. 定期清理 - 删除过时的记忆
  2. 使用标签 - 添加上下文标签
  3. 选择权重 - 根据场景调整混合权重
  4. 监控性能 - 使用 zeroclaw doctor 检查

更多信息