第十章:记忆系统与知识管理
记忆存储架构
记忆系统是 OpenClaw 实现持续学习和个性化服务的核心基础设施。它模拟了人类的记忆机制,将信息分为短期记忆和长期记忆两个层级进行管理,使得 AI 智能体能够在会话间保持连贯的知识和用户偏好。
短期记忆
短期记忆存储当前会话中的对话历史和临时上下文,具有较高的读写速度但容量有限。其生命周期与用户会话绑定,当会话结束时,短期记忆会被压缩和归纳,重要信息会迁移到长期记忆中。
// 短期记忆配置
import { defineMemoryConfig } from 'openclaw/memory';
export default defineMemoryConfig({
shortTerm: {
provider: 'redis',
ttl: 3600, // 1 小时过期
maxTokens: 8000, // 上下文窗口
compression: true, // 启用上下文压缩
strategy: 'sliding', // 滑动窗口策略
},
longTerm: {
provider: 'postgres',
embedding: {
model: 'text-embedding-3-small',
dimensions: 1536,
},
index: {
type: 'hnsw', // 高效最近邻搜索
m: 16,
efConstruction: 200,
},
},
});
长期记忆
长期记忆使用向量数据库存储,通过语义搜索实现高效检索。它不直接存储原始文本,而是将文本转换为向量嵌入后再存储,支持基于相似度的相关性检索。
QMD 记忆搜索实现原理
QMD(Query Memory Database)是 OpenClaw 自研的高效记忆检索引擎,其工作流程如下:
- 用户输入查询文本
- 文本通过嵌入模型转换为向量
- 在向量数据库中执行近似最近邻搜索(ANN)
- 对检索结果进行相关性重排序
- 结合上下文权重对结果进行融合
// QMD 查询引擎实现
class QMDEngine {
private embeddingModel: EmbeddingModel;
private vectorStore: VectorStore;
private ranker: RelevanceRanker;
async query(input: string, options: {
topK: number;
timeDecay: number;
sessionBoost: number;
}): Promise<MemoryResult[]> {
// 1. 生成查询向量
const queryVector = await this.embeddingModel.embed(input);
// 2. 向量检索
const candidates = await this.vectorStore.search(queryVector, {
topK: options.topK * 2,
});
// 3. 相关性重排序(融合时间衰减和会话权重)
const ranked = this.ranker.rerank(candidates, {
queryVector,
timeDecay: options.timeDecay,
sessionBoost: options.sessionBoost,
});
// 4. 返回 Top-K 结果
return ranked.slice(0, options.topK);
}
}
知识库集成
OpenClaw 的知识库系统支持从多种数据源导入知识,并将其统一为向量索引供检索使用:
| 数据源类型 | 支持格式 | 处理方式 | 更新策略 |
|---|---|---|---|
| 文档文件 | PDF, Markdown, TXT | 文本提取后分段嵌入 | 定期重建索引 |
| FAQ 问答对 | JSON, CSV, YAML | 直接嵌入问答对 | 增量更新 |
| 数据库 | PostgreSQL, MySQL | 定时同步 + CDC | 实时同步 |
| 网页 | HTML, Wiki | 爬取后清洗嵌入 | 按需刷新 |
# knowledge-base-config.yaml
knowledgeBases:
product-docs:
type: document
source:
- path: ./docs/product-manual.pdf
- path: ./docs/faq.md
- path: ./docs/api-reference/
chunking:
strategy: semantic
maxChunkSize: 512
overlap: 64
embedding:
model: text-embedding-3-small
customer-faq:
type: faq
source:
path: ./data/faq-entries.json
sync:
schedule: '0 3 * * *'
incremental: true
记忆检索与相关性排序
检索结果的相关性直接决定了 AI 回答的质量。OpenClaw 采用了多阶段排序策略来确保检索精度:
- 第一阶段——向量相似度:计算查询向量与记忆向量的余弦相似度,快速筛选候选集
- 第二阶段——时间衰减:根据记忆创建时间进行加权衰减,较新的记忆获得更高权重
- 第三阶段——会话上下文:考虑当前会话的上下文主题,与当前话题相关的记忆获得额外加分
- 第四阶段——用户偏好:根据用户历史交互行为,对特定类型的记忆进行个性化加权
// 相关性排序算法
function rankMemories(
memories: MemoryItem[],
query: QueryContext
): MemoryItem[] {
return memories
.map((mem) => {
let score = mem.similarity;
// 时间衰减因子
const ageHours = (Date.now() - mem.createdAt) / 3600000;
const timeDecay = Math.exp(-ageHours / (24 * query.timeDecayDays));
score *= 0.6 + 0.4 * timeDecay;
// 会话主题匹配加分
if (mem.topics.some((t) => query.topics.includes(t))) {
score *= 1.3;
}
return { ...mem, score };
})
.sort((a, b) => b.score - a.score);
}
实战:为客服 Bot 配置产品知识库
以下是一个完整的客服知识库配置方案:
# production-knowledge-config.yaml
memory:
shortTerm:
provider: redis
ttl: 7200
longTerm:
provider: qdrant
collection: customer-memory
embedding:
model: text-embedding-3-small
knowledgeBases:
products:
type: document
source:
- path: ./knowledge/products/
chunking:
strategy: semantic
match:
minScore: 0.75
topK: 5
policies:
type: faq
source:
path: ./knowledge/policies.json
match:
minScore: 0.85
topK: 3
retrieval:
strategy: hybrid
weights:
semantic: 0.7
keyword: 0.3
rerank:
enabled: true
model: cross-encoder/ms-marco-MiniLM-L-6-v2
记忆管理最佳实践
- 定期清理过期记忆:设置合理 TTL 自动清理短期记忆中的无关信息,避免存储膨胀
- 分级存储策略:热点记忆放在 Redis 等高速存储中,冷数据迁移到低成本存储
- 隐私保护:对包含个人身份信息的记忆进行脱敏处理,遵守数据保护法规
- 记忆合并与去重:定期对相似度高的记忆进行合并,减少冗余并提升检索效率
- 建立反馈回路:根据用户对回答的满意度反馈调整检索权重,持续优化记忆召回质量
- 监控检索指标:关注命中率、平均检索延迟和用户满意度等核心指标,及时发现和定位问题
良好的记忆管理能够让 AI 智能体随着使用时间的增长变得越来越懂用户,实现真正的个性化智能服务。