OpenClaw记忆系统深度解析:构建AI代理的长期记忆能力

摘要

OpenClaw作为一个多通道AI代理平台,其核心能力之一就是为AI代理提供长期记忆功能。本文深入分析OpenClaw记忆系统的架构设计、实现原理和技术细节,涵盖从本地向量存储到外部记忆系统集成的完整技术栈。

1. 记忆系统架构概览

OpenClaw的记忆系统采用分层架构设计,主要包含以下核心组件:

1.1 核心架构图

graph TB
    A[记忆系统] --> B[MemoryIndexManager]
    B --> C[嵌入向量层]
    B --> D[存储引擎层]
    B --> E[搜索算法层]
    
    C --> C1[OpenAI嵌入]
    C --> C2[Gemini嵌入]
    C --> C3[本地模型]
    
    D --> D1[SQLite向量存储]
    D --> D2[FTS5全文检索]
    D --> D3[文件系统索引]
    
    E --> E1[混合搜索算法]
    E --> E2[相关性排序]
    E --> E3[结果合并]
    
    F[插件系统] --> G[QMD外部记忆]
    F --> H[会话记忆钩子]
    F --> I[自定义扩展]

1.2 系统特点

  • 多模型支持:支持OpenAI、Gemini和本地嵌入模型
  • 混合搜索:结合向量相似度和全文检索
  • 实时同步:文件监控和增量索引机制
  • 插件化架构:支持外部记忆系统集成
  • 会话记忆:自动保存和索引会话历史

2. 核心组件深度分析

2.1 MemoryIndexManager:记忆索引管理器

MemoryIndexManager是记忆系统的核心组件,位于src/memory/manager.ts,包含2355行代码,负责:

1
2
3
4
5
6
7
// 核心接口定义
export interface MemorySearchManager {
search(query: string, opts?: SearchOptions): Promise<MemorySearchResult[]>;
sync(params?: SyncParams): Promise<void>;
status(): MemoryProviderStatus;
close(): Promise<void>;
}

主要功能

  1. 文件处理:监控工作空间文件变化,自动索引新文件
  2. 分块策略:智能文本分块,优化向量嵌入效果
  3. 嵌入计算:调用嵌入模型生成文本向量
  4. 索引构建:构建向量索引和全文检索索引
  5. 搜索查询:执行混合搜索算法

2.2 嵌入向量提供者抽象层

系统定义了统一的嵌入向量接口,支持多种模型:

1
2
3
4
5
6
export type EmbeddingProvider = {
id: string;
model: string;
embedQuery: (text: string) => Promise<number[]>;
embedBatch: (texts: string[]) => Promise<number[][]>;
};

支持的嵌入模型

2.3 混合搜索算法

混合搜索是记忆系统的核心技术,位于src/memory/hybrid.ts

1
2
3
4
5
6
7
8
9
10
11
export function mergeHybridResults(params: {
vector: HybridVectorResult[];
keyword: HybridKeywordResult[];
vectorWeight: number;
textWeight: number;
}) {
// 1. 分别计算向量相似度和文本相关性分数
// 2. 应用权重合并分数
// 3. 去重和排序结果
// 4. 返回Top-K结果
}

搜索流程

  1. 向量搜索:计算查询向量与存储向量的余弦相似度
  2. 全文检索:使用SQLite FTS5进行关键词匹配
  3. 分数合并:加权合并两种搜索结果的分数
  4. 结果排序:按最终分数降序排列

2.4 SQLite存储引擎

系统使用SQLite作为本地存储引擎,集成sqlite-vec扩展:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 向量表结构
CREATE TABLE IF NOT EXISTS vectors (
id INTEGER PRIMARY KEY,
path TEXT NOT NULL,
chunk_index INTEGER NOT NULL,
embedding BLOB NOT NULL,
source TEXT NOT NULL,
model TEXT NOT NULL
);

// 全文检索表
CREATE VIRTUAL TABLE IF NOT EXISTS fts USING fts5(
path, content, source, model,
tokenize='porter unicode61'
);

存储优化

  • 增量更新:只更新变化的文件块
  • 向量压缩:使用二进制格式存储向量
  • 索引优化:为常用查询字段创建索引
  • 事务处理:确保数据一致性

3. 配置系统和工作流程

3.1 记忆配置解析

配置系统位于src/memory/backend-config.ts,支持多种配置选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
export interface MemoryBackendConfig {
provider: 'openai' | 'gemini' | 'local';
model: string;
sources: Array<'memory' | 'sessions'>;
sync: {
watch: boolean;
watchDebounceMs: number;
sessions: {
deltaBytes: number;
deltaMessages: number;
};
};
limits: {
maxResults: number;
maxInjectedChars: number;
};
}

3.2 工作流程

索引构建流程

  1. 文件发现:扫描工作空间目录,识别.md文件
  2. 文本提取:解析Markdown文件,提取纯文本内容
  3. 智能分块:按语义边界分割文本(段落、标题等)
  4. 向量计算:调用嵌入模型生成文本向量
  5. 索引存储:将向量和元数据存入SQLite

搜索查询流程

  1. 查询解析:分析用户查询意图
  2. 向量生成:为查询文本生成嵌入向量
  3. 并行搜索:同时执行向量搜索和全文检索
  4. 结果合并:应用混合算法合并搜索结果
  5. 片段提取:提取相关文本片段和位置信息

4. 工具集成和API设计

4.1 记忆工具实现

AI代理通过记忆工具访问记忆系统,位于src/agents/tools/memory-tool.ts

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
export function createMemorySearchTool(options: {
config?: OpenClawConfig;
agentSessionKey?: string;
}): AnyAgentTool | null {
return {
name: 'memory_search',
description: '语义搜索记忆文件,返回相关片段',
parameters: {
query: { type: 'string', description: '搜索查询' },
maxResults: { type: 'number', optional: true },
minScore: { type: 'number', optional: true }
},
execute: async (args) => {
// 调用记忆管理器执行搜索
const results = await memoryManager.search(args.query, {
maxResults: args.maxResults,
minScore: args.minScore
});
return formatSearchResults(results);
}
};
}

4.2 记忆搜索配置

记忆搜索配置解析位于src/agents/memory-search.ts,支持:

1
2
3
4
5
6
7
8
9
10
export interface MemorySearchConfig {
enabled: boolean;
sources: Array<'memory' | 'sessions'>;
extraPaths: string[];
experimental: {
sessionMemory: boolean;
};
provider: 'openai' | 'gemini' | 'local';
model: string;
}

5. 会话记忆系统

5.1 会话文件索引

系统自动索引会话历史文件,位于src/memory/session-files.ts

1
2
3
4
5
6
7
export async function buildSessionEntry(absPath: string): Promise<SessionFileEntry | null> {
// 1. 读取JSONL格式的会话文件
// 2. 提取用户和助手消息
// 3. 过滤敏感信息
// 4. 生成内容哈希
// 5. 构建索引条目
}

会话处理特点

  • 增量索引:只处理新增或修改的会话文件
  • 敏感信息过滤:自动过滤API密钥等敏感信息
  • 消息提取:只提取用户和助手的文本消息
  • 格式标准化:统一转换为可搜索的文本格式

5.2 会话记忆钩子

系统提供会话记忆钩子,位于src/hooks/bundled/session-memory/handler.ts

1
2
3
4
5
6
7
8
9
10
11
const saveSessionToMemory: HookHandler = async (event) => {
// 在/new命令触发时自动保存会话到记忆
if (event.type !== "command" || event.action !== "new") {
return;
}

// 1. 提取最近对话内容
// 2. 使用LLM生成描述性slug
// 3. 创建记忆文件
// 4. 保存会话摘要
};

LLM slug生成器:位于src/hooks/llm-slug-generator.ts,使用AI生成有意义的文件名:

1
2
3
4
5
6
7
8
9
export async function generateSlugViaLLM(params: {
sessionContent: string;
cfg: OpenClawConfig;
}): Promise<string | null> {
// 调用嵌入式Pi代理生成简短描述
const prompt = `Based on this conversation, generate a short 1-2 word filename slug...`;
const result = await runEmbeddedPiAgent({ prompt });
return extractSlugFromResponse(result);
}

6. 扩展和插件系统

6.1 QMD外部记忆集成

系统支持集成QMD(外部记忆系统),位于src/memory/qmd-manager.ts

1
2
3
4
5
6
7
8
9
10
11
12
export class QmdMemoryManager implements MemorySearchManager {
static async create(params: {
cfg: OpenClawConfig;
agentId: string;
resolved: ResolvedMemoryBackendConfig;
}): Promise<QmdMemoryManager | null> {
// 1. 解析QMD配置
// 2. 初始化QMD环境
// 3. 配置集合和路径
// 4. 启动定时更新
}
}

QMD集成特点

  • 外部进程调用:通过子进程调用QMD命令行工具
  • 集合管理:支持多个文档集合
  • 会话导出:自动导出会话到QMD可索引格式
  • 定时更新:定期更新索引和嵌入向量

6.2 插件槽位系统

插件系统位于src/plugins/slots.ts,记忆系统作为独占槽位实现:

1
2
3
4
5
6
7
export const SLOTS = {
memory: {
exclusive: true,
defaultPlugin: 'memory-core',
description: '记忆和检索系统'
}
} as const;

插件机制

  • 独占槽位:同一时间只能激活一个记忆插件
  • 自动切换:根据配置自动选择记忆实现
  • 向后兼容:确保插件切换不影响现有数据
  • 配置继承:插件继承基础配置选项

7. 性能优化策略

7.1 缓存机制

系统实现多层缓存优化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 1. 嵌入向量缓存
const embeddingCache = new LRUCache<string, number[]>({
max: 1000, // 缓存1000个嵌入向量
ttl: 3600000 // 1小时过期
});

// 2. 搜索结果缓存
const searchCache = new LRUCache<string, MemorySearchResult[]>({
max: 500, // 缓存500个查询结果
ttl: 300000 // 5分钟过期
});

// 3. 文件哈希缓存
const fileHashCache = new Map<string, string>();

7.2 批量处理

系统支持批量操作以提高性能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 批量嵌入计算
async function embedBatch(texts: string[]): Promise<number[][]> {
if (texts.length === 0) return [];

// 分批处理,避免内存溢出
const batchSize = 100;
const results: number[][] = [];

for (let i = 0; i < texts.length; i += batchSize) {
const batch = texts.slice(i, i + batchSize);
const embeddings = await provider.embedBatch(batch);
results.push(...embeddings);
}

return results;
}

7.3 增量索引

智能增量索引减少不必要的计算:

1
2
3
4
5
6
7
8
9
10
11
// 文件变化检测
function shouldReindexFile(filePath: string, stats: fs.Stats): boolean {
const cached = fileCache.get(filePath);
if (!cached) return true; // 新文件

// 检查文件大小和修改时间
if (stats.size !== cached.size) return true;
if (stats.mtimeMs > cached.mtimeMs + 1000) return true; // 1秒缓冲

return false;
}

8. 错误处理和监控

8.1 错误恢复机制

系统实现健壮的错误处理:

1
2
3
4
5
6
7
8
9
10
try {
await memoryManager.sync({ reason: 'scheduled' });
} catch (error) {
log.error('记忆同步失败', { error });

// 1. 记录错误详情
// 2. 尝试回滚部分操作
// 3. 标记需要完整重建
// 4. 下次启动时自动修复
}

8.2 健康检查

系统提供全面的健康状态监控:

1
2
3
4
5
6
7
8
9
10
11
12
export interface MemoryProviderStatus {
backend: string;
provider: string;
model: string;
files: number;
chunks: number;
dirty: boolean;
sources: MemorySource[];
sourceCounts: Array<{ source: MemorySource; files: number; chunks: number }>;
vector: { enabled: boolean; available: boolean };
custom?: Record<string, unknown>;
}

9. 实际应用场景

9.1 代码项目记忆

开发者可以使用记忆系统记录项目决策、API设计和实现细节:

1
2
3
4
5
# 记忆文件示例:2024-01-15-api-design.md
## API设计决策
- 使用RESTful风格,版本控制通过URL路径
- 认证使用JWT令牌,有效期24小时
- 错误响应格式:{ "error": { "code": "...", "message": "..." } }

9.2 会议记录索引

自动索引会议记录和讨论要点:

1
2
3
4
5
// 会议记忆搜索示例
const results = await memoryManager.search(
"上周关于微服务架构的讨论",
{ sources: ['memory', 'sessions'] }
);

9.3 知识库构建

逐步构建个人或团队知识库:

  1. 自动收集:会话历史自动保存
  2. 手动整理:重要信息手动添加到记忆
  3. 语义关联:相似主题自动关联
  4. 快速检索:自然语言搜索相关知识

10. 技术挑战和解决方案

10.1 向量搜索精度

挑战:传统向量搜索可能错过关键词精确匹配
解决方案:混合搜索算法结合向量相似度和全文检索

10.2 大规模数据索引

挑战:大量文件导致索引时间过长
解决方案:增量索引和智能变化检测

10.3 多模型支持

挑战:不同嵌入模型输出维度不同
解决方案:抽象层统一接口,支持模型特定配置

10.4 实时性要求

挑战:用户期望记忆立即更新
解决方案:后台异步索引,实时文件监控

11. 未来发展方向

11.1 增强功能

  1. 多模态记忆:支持图像、音频等非文本内容
  2. 时间线视图:按时间顺序组织记忆
  3. 自动分类:AI自动分类和标记记忆内容
  4. 知识图谱:构建记忆之间的语义关系图

11.2 性能优化

  1. 分布式索引:支持多机分布式记忆存储
  2. GPU加速:利用GPU加速向量计算
  3. 流式处理:实时流式处理大型文档
  4. 智能压缩:自适应向量压缩算法

11.3 生态系统

  1. 更多插件:支持更多外部记忆系统
  2. API扩展:提供更丰富的记忆操作API
  3. 可视化工具:记忆内容可视化浏览和编辑
  4. 协作功能:团队共享记忆和协作编辑

12. 总结

OpenClaw的记忆系统是一个设计精良、功能完整的AI代理记忆解决方案。通过深入分析其架构和实现,我们可以看到:

  1. 架构清晰:分层设计,职责分离明确
  2. 技术先进:采用最新的向量搜索和混合检索技术
  3. 扩展性强:插件化架构支持多种扩展
  4. 实用性好:紧密结合实际开发和工作流程
  5. 健壮可靠:完善的错误处理和监控机制

该系统不仅为OpenClaw平台提供了强大的记忆能力,也为其他AI应用构建长期记忆系统提供了宝贵的技术参考和实践经验。


相关文档链接

GitHub资源