memory
约 1521 字大约 5 分钟
2025-09-08
概述
记忆管理模块是RWKV Agent Kit的核心组件,提供了智能的记忆存储、检索和管理功能。基于A-Mem和HippoRAG论文的研究成果,实现了动态记忆组织和神经生物学启发的检索机制。
MemoryManager
记忆管理器是记忆系统的主要接口。
use rwkv_agent_kit::prelude::*;
// 创建记忆管理器
let config = Config::default();
let db = Arc::new(VectorGraphDB::new(config.clone()).await?);
let memory_manager = MemoryManager::new(db, config).await?;构造方法
new(db: Arc<VectorGraphDB>, config: Config) -> Result<Self>
创建新的记忆管理器实例。
参数:
db: 向量图数据库实例config: 系统配置
返回值:
Result<MemoryManager>: 记忆管理器实例
记忆操作
create_memory(&self, memory: &Memory) -> Result<Uuid>
创建新的记忆。
参数:
memory: 记忆对象
返回值:
Result<Uuid>: 记忆的唯一标识符
示例:
let attributes = MemoryAttributes {
keywords: vec!["机器学习".to_string()],
tags: vec!["技术".to_string()],
importance: 0.8,
..Default::default()
};
let content = "用户询问了关于机器学习的基础概念";
let embedding = memory_manager.generate_embedding(content).await?;
let memory = Memory::new(
content.to_string(),
MemoryType::Knowledge,
embedding,
attributes
);
let memory_id = memory_manager.create_memory(&memory).await?;get_memory(&self, id: &Uuid) -> Result<Option<Memory>>
根据ID获取记忆。
参数:
id: 记忆的唯一标识符
返回值:
Result<Option<Memory>>: 记忆对象(如果存在)
update_memory(&self, id: &Uuid, memory: &Memory) -> Result<()>
更新现有记忆。
参数:
id: 记忆的唯一标识符memory: 更新后的记忆对象
delete_memory(&self, id: &Uuid) -> Result<()>
删除记忆。
参数:
id: 记忆的唯一标识符
记忆检索
retrieve_memories(&self, query: &Query, context: &Context) -> Result<Vec<Memory>>
检索相关记忆。
参数:
query: 查询对象context: 上下文信息
返回值:
Result<Vec<Memory>>: 相关记忆列表
示例:
let query = Query {
text: "机器学习算法".to_string(),
query_type: QueryType::Semantic,
filters: QueryFilters {
memory_types: Some(vec![MemoryType::Knowledge]),
tags: Some(vec!["技术".to_string()]),
importance_range: Some((0.5, 1.0)),
..Default::default()
},
limit: Some(10),
weights: QueryWeights {
semantic_weight: 0.7,
keyword_weight: 0.2,
recency_weight: 0.1,
..Default::default()
},
..Default::default()
};
let context = Context::default();
let memories = memory_manager.retrieve_memories(&query, &context).await?;search_by_keywords(&self, keywords: &[String]) -> Result<Vec<Memory>>
基于关键词搜索记忆。
参数:
keywords: 关键词列表
返回值:
Result<Vec<Memory>>: 匹配的记忆列表
search_by_semantic(&self, text: &str, threshold: f32) -> Result<Vec<Memory>>
基于语义相似度搜索记忆。
参数:
text: 查询文本threshold: 相似度阈值
返回值:
Result<Vec<Memory>>: 语义相似的记忆列表
记忆连接
create_connection(&self, from_id: &Uuid, to_id: &Uuid, connection_type: ConnectionType, strength: f32) -> Result<()>
在两个记忆之间创建连接。
参数:
from_id: 源记忆IDto_id: 目标记忆IDconnection_type: 连接类型strength: 连接强度
示例:
memory_manager.create_connection(
&memory_id_1,
&memory_id_2,
ConnectionType::Semantic,
0.8
).await?;get_connections(&self, memory_id: &Uuid) -> Result<Vec<MemoryConnection>>
获取记忆的所有连接。
参数:
memory_id: 记忆ID
返回值:
Result<Vec<MemoryConnection>>: 连接列表
update_connection_strength(&self, from_id: &Uuid, to_id: &Uuid, new_strength: f32) -> Result<()>
更新连接强度。
记忆演化
evolve_memories(&self) -> Result<()>
执行记忆演化过程,包括重要性调整和连接更新。
// 定期执行记忆演化
memory_manager.evolve_memories().await?;decay_memories(&self, decay_rate: f32) -> Result<()>
应用记忆衰减。
参数:
decay_rate: 衰减率
consolidate_memories(&self) -> Result<()>
合并相似的记忆。
嵌入生成
generate_embedding(&self, text: &str) -> Result<Vec<f32>>
为文本生成嵌入向量。
参数:
text: 输入文本
返回值:
Result<Vec<f32>>: 嵌入向量
Memory
记忆对象表示单个记忆项。
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Memory {
pub id: Uuid,
pub content: String,
pub memory_type: MemoryType,
pub embedding: Vec<f32>,
pub attributes: MemoryAttributes,
pub metadata: MemoryMetadata,
pub connections: MemoryConnections,
}构造方法
new(content: String, memory_type: MemoryType, embedding: Vec<f32>, attributes: MemoryAttributes) -> Self
创建新的记忆对象。
示例:
let memory = Memory::new(
"用户喜欢喝咖啡".to_string(),
MemoryType::UserPreference,
embedding,
MemoryAttributes {
keywords: vec!["咖啡".to_string(), "偏好".to_string()],
importance: 0.6,
..Default::default()
}
);方法
update_importance(&mut self, new_importance: f32)
更新记忆重要性。
add_keyword(&mut self, keyword: String)
添加关键词。
add_tag(&mut self, tag: String)
添加标签。
is_similar_to(&self, other: &Memory, threshold: f32) -> bool
检查与另一个记忆的相似度。
MemoryType
记忆类型枚举。
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum MemoryType {
/// 用户个人信息
UserProfile,
/// 用户偏好
UserPreference,
/// 对话历史
Conversation,
/// 知识信息
Knowledge,
/// 任务相关
Task,
/// 情感记忆
Emotional,
/// 程序性记忆
Procedural,
/// 情景记忆
Episodic,
/// 语义记忆
Semantic,
}MemoryAttributes
记忆属性结构。
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MemoryAttributes {
/// 关键词列表
pub keywords: Vec<String>,
/// 标签列表
pub tags: Vec<String>,
/// 重要性分数 (0.0-1.0)
pub importance: f32,
/// 情感倾向 (-1.0到1.0)
pub emotional_valence: f32,
/// 置信度 (0.0-1.0)
pub confidence: f32,
/// 访问频率
pub access_frequency: u32,
/// 最后访问时间
pub last_accessed: DateTime<Utc>,
/// 自定义属性
pub custom_attributes: HashMap<String, Value>,
}Query
查询对象用于记忆检索。
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Query {
/// 查询文本
pub text: String,
/// 查询类型
pub query_type: QueryType,
/// 过滤条件
pub filters: QueryFilters,
/// 结果限制
pub limit: Option<usize>,
/// 偏移量
pub offset: Option<usize>,
/// 排序方式
pub sort_by: Option<SortBy>,
/// 权重配置
pub weights: QueryWeights,
}QueryType
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum QueryType {
/// 语义搜索
Semantic,
/// 关键词搜索
Keyword,
/// 混合搜索
Hybrid,
/// 图遍历搜索
Graph,
}完整示例
use rwkv_agent_kit::prelude::*;
use std::sync::Arc;
use tokio;
#[tokio::main]
async fn main() -> Result<()> {
// 创建配置和数据库
let mut config = Config::default();
config.database.url = "sqlite:memory_test.db".to_string();
let db = Arc::new(VectorGraphDB::new(config.clone()).await?);
let memory_manager = MemoryManager::new(db, config).await?;
// 创建记忆
let content = "用户是一名Rust开发者,专注于系统编程";
let embedding = memory_manager.generate_embedding(content).await?;
let attributes = MemoryAttributes {
keywords: vec!["Rust".to_string(), "开发者".to_string(), "系统编程".to_string()],
tags: vec!["用户信息".to_string(), "技能".to_string()],
importance: 0.9,
emotional_valence: 0.2,
confidence: 0.95,
..Default::default()
};
let memory = Memory::new(
content.to_string(),
MemoryType::UserProfile,
embedding,
attributes
);
let memory_id = memory_manager.create_memory(&memory).await?;
println!("创建记忆: {}", memory_id);
// 创建相关记忆
let related_content = "用户最近在学习异步编程";
let related_embedding = memory_manager.generate_embedding(related_content).await?;
let related_memory = Memory::new(
related_content.to_string(),
MemoryType::Knowledge,
related_embedding,
MemoryAttributes {
keywords: vec!["异步编程".to_string(), "学习".to_string()],
importance: 0.7,
..Default::default()
}
);
let related_id = memory_manager.create_memory(&related_memory).await?;
// 创建记忆连接
memory_manager.create_connection(
&memory_id,
&related_id,
ConnectionType::Semantic,
0.8
).await?;
// 检索记忆
let query = Query {
text: "Rust编程".to_string(),
query_type: QueryType::Semantic,
filters: QueryFilters {
memory_types: Some(vec![MemoryType::UserProfile, MemoryType::Knowledge]),
importance_range: Some((0.5, 1.0)),
..Default::default()
},
limit: Some(5),
weights: QueryWeights {
semantic_weight: 0.8,
keyword_weight: 0.2,
..Default::default()
},
..Default::default()
};
let context = Context::default();
let results = memory_manager.retrieve_memories(&query, &context).await?;
println!("找到 {} 条相关记忆:", results.len());
for memory in results {
println!("- {}", memory.content);
println!(" 重要性: {:.2}", memory.attributes.importance);
println!(" 关键词: {:?}", memory.attributes.keywords);
}
// 执行记忆演化
memory_manager.evolve_memories().await?;
Ok(())
}