alaya
Alaya
这是唯一一个具有神经科学基础记忆动态的记忆引擎——包含 Bjork 双重强度遗忘、检索诱导抑制和赫布共激活机制——且是一个零依赖、可嵌入的 Rust 库。
Alaya(梵语:alaya-vijnana,意为“阿赖耶识/藏识”)是一个可嵌入的 Rust 库。仅需一个 SQLite 文件。无需外部服务。你的智能体可以存储对话、检索重要信息,并让其余信息逐渐淡出。图谱会像生物记忆一样通过使用而重塑。
let alaya = Alaya::open("memory.db")?;
alaya.episodes().store(&episode)?; // store
let results = alaya.knowledge().query(&query)?; // retrieve
alaya.lifecycle().consolidate(&provider)?; // distill knowledge
alaya.lifecycle().transform()?; // dedup, LTD, discover categories
alaya.lifecycle().forget()?; // decay what's stale
let cats = alaya.admin().categories(None)?; // emergent ontology
alaya.admin().purge(PurgeFilter::Session("s1"))?; // cascade delete + tombstones问题所在
大多数 AI 智能体将记忆视为纯文本文件。OpenClaw 写入 MEMORY.md。Claudesidian 写入 Obsidian。手动构建的系统则写入 JSON 或 Markdown。起初这很有效。
但随着文件增长,上下文窗口被填满。智能体将所有内容转储到提示词中,并寄希望于大模型能找到重点。
代价是可衡量的。 OpenClaw 在每条消息中注入约 35,600 个 token 的工作区文件,其中 93.5% 是无关紧要的 (#9157)。重度用户报告每月 token 成本高达 3,600 美元。社区工具如 QMD 和 memsearch 通过用排名检索替代全上下文注入,减少了 70-96% 的浪费 (Levine, 2026)。
结构问题加剧了成本。 MEMORY.md 将决策、偏好和知识混杂在一个非结构化的块中。用户不得不独立发明 decision.md 文件、working-context.md 快照以及 12 层记忆架构 来进行补偿。周一你提到“Alice 管理认证团队”。周三你问“谁负责认证权限?”智能体通过文本相似度检索到两条记忆,但无法将它们关联起来 (Chawla, 2026)。
Alaya 如何解决这些问题
问题 | 基于文件的记忆 | Alaya |
Token 浪费 | 全上下文注入(约 35K token/消息) | 排名检索仅返回 top-k 相关记忆 |
缺乏结构 | 所有内容都在一个文件中(用户发明 | 三种类型化存储:片段、知识、偏好 |
无法遗忘 | 文件无限增长,直到手动清理 | Bjork 双重强度衰减将存储强度与检索强度分离;检索诱导遗忘 (RIF) 主动抑制竞争记忆 |
缺乏关联 | 纯文本文件,记忆间无链接 | 赫布共检索增强 (LTP/LTD):共同检索的记忆会加强连接;扩散激活寻找间接关联 |
偏好脆弱 | 智能体编写的摘要,容易漂移 | 隐式偏好通过 vasana(熏习)从积累的印象中自然涌现,无需 LLM;在阈值处结晶 |
依赖 LLM | 没有 LLM 无法运行 | 在各个层面优雅降级。没有嵌入?仅使用 BM25。没有 LLM?片段照常积累。每项功能均可独立选择 |
入门指南
MCP 服务器(推荐用于智能体)
将 Alaya 记忆添加到任何兼容 MCP 的智能体(Claude Desktop, Claude Code, Cursor, Cline 等)的最快方法:
通过 npm(无需 Rust 工具链)
添加到你的 Claude Code 配置 (~/.claude/claude_code_config.json) 中:
{
"mcpServers": {
"alaya": {
"command": "npx",
"args": ["-y", "alaya-mcp"]
}
}
}或者用于 Claude Desktop / 其他 MCP 客户端(带有可选的 LLM 自动整合功能):
{
"mcpServers": {
"alaya": {
"command": "npx",
"args": ["-y", "alaya-mcp"],
"env": {
"ALAYA_LLM_API_KEY": "sk-...",
"ALAYA_LLM_API_URL": "https://api.openai.com/v1/chat/completions",
"ALAYA_LLM_MODEL": "gpt-4o-mini"
}
}
}
}从源码构建(需要 Rust 1.75+)
git clone https://github.com/SecurityRonin/alaya.git
cd alaya
cargo build --release --features "mcp llm"然后添加到你的 MCP 配置中:
{
"mcpServers": {
"alaya": {
"command": "/path/to/alaya/target/release/alaya-mcp"
}
}
}ALAYA_LLM_* 环境变量是可选的——没有它们,服务器将在提示模式下工作(提醒智能体在 10 个片段后调用 learn)。如果配置了 API 密钥并启用了 llm 特性,它将自动进行整合。
就是这样。你的智能体现在拥有 13 个记忆工具:
工具 | 功能 |
| 存储对话消息(10 个片段后自动提示整合) |
| 使用混合检索(+ 类别加权)搜索记忆 |
| 直接教授提取的知识——智能体提取事实并调用此工具 |
| 丰富的记忆统计:片段、知识细分、类别、图谱、嵌入 |
| 获取已学习的用户偏好 |
| 获取提炼后的语义事实(+ 类别过滤) |
| 运行记忆清理(去重、衰减) |
| 按会话、时间或全部删除记忆 |
| 列出带有稳定性过滤的涌现类别 |
| 通过扩散激活获取图谱邻居 |
| 节点所属的类别 |
| 从 claude-mem 数据库导入观察结果 |
| 从 Claude Code JSONL 文件导入对话历史 |
请参阅 docs/mcp-quickstart.md 获取包含示例交互和推荐系统提示词的完整指南。
数据存储在 ~/.alaya/memory.db 中(可通过 ALAYA_DB 环境变量覆盖)。单个 SQLite 文件,无需外部服务。
交互示例 — 你的智能体使用 Alaya 时所见:
Agent: [calls remember(content="User prefers dark mode", role="user", session_id="s1")]
Alaya: Stored episode 1 in session 's1'
Agent: [calls recall(query="user preferences")]
Alaya: Found 1 memories:
1. [user] (score: 0.847) User prefers dark mode
Agent: [calls status()]
Alaya: Memory Status:
Episodes: 1 (1 this session, 1 unconsolidated)
Knowledge: none
Categories: 0
Preferences: 0 crystallized, 0 impressions accumulating
Graph: 0 links
Embedding coverage: 0/1 nodes (0%)环境变量:
变量 | 默认值 | 描述 |
|
| SQLite 数据库路径 |
| (无) | 自动整合的 API 密钥(启用 |
|
| 兼容 OpenAI 的聊天补全端点 |
|
| 模型名称。任何小型/快速模型均可(GPT-4o-mini, Haiku, Gemini Flash 等) |
Rust 库
用于将 Alaya 直接嵌入到 Rust 应用程序中:
[dependencies]
alaya = "0.2.2"快速开始 (Rust)
use alaya::{Alaya, NewEpisode, Role, EpisodeContext, Query, NoOpProvider};
// Open a persistent database (or use open_in_memory() for tests)
let alaya = Alaya::open("memory.db")?;
// Store a conversation episode
alaya.episodes().store(&NewEpisode {
content: "I've been learning Rust for about six months now".into(),
role: Role::User,
session_id: "session-1".into(),
timestamp: 1740000000,
context: EpisodeContext::default(),
embedding: None, // pass Some(vec![...]) if you have embeddings
})?;
// Query with hybrid retrieval (BM25 + vector + graph + RRF)
let results = alaya.knowledge().query(&Query::simple("Rust experience"))?;
for mem in &results {
println!("[{:.2}] {}", mem.score, mem.content);
}
// Get crystallized preferences
let prefs = alaya.admin().preferences(Some("communication_style"))?;
// Run lifecycle (NoOpProvider works without an LLM)
alaya.lifecycle().consolidate(&NoOpProvider)?;
alaya.lifecycle().transform()?;
alaya.lifecycle().forget()?;运行演示
该演示通过带注释的输出展示了所有 11 项功能,且无需外部依赖:
git clone https://github.com/SecurityRonin/alaya.git
cd alaya
cargo run --example demo架构
Alaya 是一个库,而不是框架。你的智能体拥有对话循环、LLM 和嵌入模型。Alaya 拥有记忆。
Your Agent Alaya
───────── ─────
Via MCP (stdio): alaya-mcp binary
remember(content, role, session) ──▶ episodic store + graph links
recall(query, boost_category?) ──▶ BM25 + vector + graph → RRF → rerank
learn(facts, session_id?) ──▶ agent-driven knowledge extraction
status() ──▶ rich stats (episodes, knowledge, graph, embeddings)
preferences(domain?) ──▶ crystallized behavioral patterns
knowledge(type?, category?) ──▶ consolidated semantic nodes
maintain() ──▶ dedup + decay
purge(scope) ──▶ selective or full deletion
categories(min_stability?) ──▶ emergent ontology with hierarchy
neighbors(node, depth?) ──▶ graph spreading activation
node_category(node_id) ──▶ category assignment lookup
import_claude_mem(path?) ──▶ import from claude-mem.db
import_claude_code(path) ──▶ import from Claude Code JSONL
Via Rust library: Alaya coordinator
alaya.episodes().store(ep) ──▶ episodic store + graph links
alaya.knowledge().query(q) ──▶ BM25 + vector + graph → RRF → rerank
alaya.admin().preferences(domain?) ──▶ crystallized behavioral patterns
alaya.knowledge().filter(f?) ──▶ consolidated semantic nodes
alaya.admin().categories(min?) ──▶ emergent ontology with hierarchy
alaya.admin().subcategories(id) ──▶ children of a parent category
alaya.graph().neighbors(node, d) ──▶ graph spreading activation
alaya.admin().node_category(id) ──▶ category assignment lookup
alaya.set_embedding_provider(p) ──▶ auto-embed in store + query
alaya.set_extraction_provider(p) ──▶ enable auto-consolidation
alaya.lifecycle().consolidate(p) ──▶ episodes → semantic knowledge
alaya.knowledge().learn(nodes) ──▶ provider-less knowledge injection
alaya.lifecycle().auto_consolidate() ──▶ extract + learn (needs ExtractionProvider)
alaya.lifecycle().perfume(i, p) ──▶ impressions → preferences
alaya.lifecycle().transform() ──▶ dedup, LTD, prune, split categories
alaya.lifecycle().forget() ──▶ Bjork strength decay + archival
alaya.admin().purge(scope) ──▶ cascade deletion + tombstones三种存储
存储 | 类比 | 目的 |
片段 (Episodic) | 海马体 | 包含完整上下文的原始对话事件 |
语义 (Semantic) | 新皮层 | 通过整合提取的提炼知识 |
隐式 (Implicit) | 阿赖耶识 | 通过熏习涌现的偏好和习惯 |
检索流水线
flowchart LR
Q[Query] --> BM25[BM25 / FTS5]
Q --> VEC[Vector / Cosine]
Q --> GR[Graph Neighbors]
BM25 --> RRF[Reciprocal Rank Fusion]
VEC --> RRF
GR --> RRF
RRF --> RR[Context-Weighted Reranking]
RR --> SA[Spreading Activation + Enrichment]
SA --> RIF[Retrieval-Induced Forgetting]
RIF --> OUT[Top 3-5 Results<br/>Episodes + Semantic + Preferences]生命周期流程
流程 | 灵感来源 | 功能 |
整合 (Consolidation) | CLS 理论 (McClelland et al.) | 将片段提炼为语义知识 |
熏习 (Perfuming) | Vasana (瑜伽行派心理学) | 积累印象,结晶偏好 |
转换 (Transformation) | 转依 (Asraya-paravrtti) | 去重、LTD 链接衰减、修剪、发现类别 |
遗忘 (Forgetting) | Bjork & Bjork (1992) | 衰减检索强度,归档弱节点 |
RIF | Anderson et al. (1994) | 检索诱导遗忘抑制竞争记忆 |
涌现本体 (Emergent Ontology) | Vikalpa (概念构建) | 从聚类中涌现层级类别;过宽时自动拆分 |
集成指南
实现 ConsolidationProvider
ConsolidationProvider 特性将 Alaya 连接到你的 LLM 以进行知识提取:
use alaya::*;
struct MyProvider { /* your LLM client */ }
impl ConsolidationProvider for MyProvider {
fn extract_knowledge(&self, episodes: &[Episode]) -> Result<Vec<NewSemanticNode>> {
// Ask your LLM: "What facts/relationships can you extract?"
todo!()
}
fn extract_impressions(&self, interaction: &Interaction) -> Result<Vec<NewImpression>> {
// Ask your LLM: "What behavioral signals does this contain?"
todo!()
}
fn detect_contradiction(&self, a: &SemanticNode, b: &SemanticNode) -> Result<bool> {
// Ask your LLM: "Do these two facts contradict each other?"
todo!()
}
}在没有 LLM 时使用 NoOpProvider。片段会积累,BM25 检索无需整合即可工作。
实现 ExtractionProvider(自动整合)
ExtractionProvider 特性支持无需手动调用 consolidate() 的自动知识提取。配置后,MCP 服务器会在 10 个未整合的片段后自动进行整合:
use alaya::*;
struct MyExtractor { /* your LLM client */ }
impl ExtractionProvider for MyExtractor {
fn extract(&self, episodes: &[Episode]) -> Result<Vec<NewSemanticNode>> {
// Ask your LLM: "Extract facts from these conversations"
todo!()
}
}
let mut alaya = Alaya::open("memory.db")?;
alaya.set_extraction_provider(Box::new(MyExtractor { /* ... */ }));
// Now auto_consolidate() works without a ConsolidationProvider
let report = alaya.lifecycle().auto_consolidate()?;llm 特性标志提供了一个即用型的 LlmExtractionProvider,它调用任何兼容 OpenAI 的 API:
use alaya::LlmExtractionProvider;
let provider = LlmExtractionProvider::builder()
.api_key("sk-...")
.model("gpt-4o-mini") // default; any small model works
.build()?;生命周期调度
方法 | 调用时机 | 功能 |
| 积累 10+ 个片段后 | 从片段中提取语义知识 |
| 每次用户交互时 | 提取行为印象,结晶偏好 |
| 每日或每周 | 去重、LTD 链接衰减、修剪弱链接、发现类别 |
| 每日或每周 | 衰减检索强度,归档真正被遗忘的节点 |
| 用户请求时 | 按会话/时间/全部级联删除,并带有墓碑记录 |
API 参考
impl Alaya {
// Open / create
pub fn open(path: impl AsRef<Path>) -> Result<Self>;
pub fn open_in_memory() -> Result<Self>;
// Providers (on coordinator)
pub fn set_embedding_provider(&mut self, provider: Box<dyn EmbeddingProvider>);
pub fn set_extraction_provider(&mut self, provider: Box<dyn ExtractionProvider>);
// Sub-manager accessors
pub fn episodes(&self) -> Episodes<'_>;
pub fn knowledge(&self) -> Knowledge<'_>;
pub fn lifecycle(&self) -> Lifecycle<'_>;
pub fn graph(&self) -> Graph<'_>;
pub fn admin(&self) -> Admin<'_>;
}
impl Episodes<'_> {
pub fn store(&self, episode: &NewEpisode) -> Result<EpisodeId>;
pub fn by_session(&self, session_id: &str) -> Result<Vec<Episode>>;
pub fn unconsolidated(&self, limit: u32) -> Result<Vec<Episode>>;
}
impl Knowledge<'_> {
pub fn query(&self, q: &Query) -> Result<Vec<ScoredMemory>>;
pub fn learn(&self, nodes: Vec<NewSemanticNode>) -> Result<ConsolidationReport>;
pub fn filter(&self, filter: Option<KnowledgeFilter>) -> Result<Vec<SemanticNode>>;
}
impl Lifecycle<'_> {
pub fn consolidate(&self, provider: &dyn ConsolidationProvider) -> Result<ConsolidationReport>;
pub fn auto_consolidate(&self) -> Result<ConsolidationReport>;
pub fn transform(&self) -> Result<TransformationReport>;
pub fn forget(&self) -> Result<ForgettingReport>;
pub fn perfume(&self, interaction: &Interaction, provider: &dyn ConsolidationProvider) -> Result<PerfumingReport>;
pub fn dream(&self, provider: &dyn ConsolidationProvider, interaction: Option<&Interaction>) -> Result<DreamReport>;
}
impl Admin<'_> {
pub fn status(&self) -> Result<MemoryStatus>;
pub fn purge(&self, filter: PurgeFilter) -> Result<PurgeReport>;
pub fn preferences(&self, domain: Option<&str>) -> Result<Vec<Preference>>;
pub fn categories(&self, min_stability: Option<f32>) -> Result<Vec<Category>>;
pub fn subcategories(&self, parent_id: CategoryId) -> Result<Vec<Category>>;
pub fn node_category(&self, node_id: NodeId) -> Result<Option<Category>>;
}设计原则
记忆是一个过程,而非数据库。 每次检索都会改变被记忆的内容。图谱通过使用而重塑。
遗忘是一种功能。 Bjork 双重强度衰减将存储强度与检索强度分离。检索诱导遗忘 (RIF) 主动抑制竞争记忆。两者都能随时间提高检索质量。
偏好是涌现的,而非声明的。 行为模式通过 vasana(熏习)从积累的印象中结晶出来,无需 LLM。
智能体拥有身份。 Alaya 存储种子。智能体决定哪些种子重要以及如何呈现它们。
优雅降级。 没有嵌入?仅使用 BM25。没有 LLM?片段照常积累。每项功能均可独立工作。
研究基础
架构基于神经科学、佛教心理学和信息检索。详细映射请参阅 docs/theoretical-foundations.md。
神经科学: 赫布 LTP/LTD (Hebb 1949, Bliss & Lomo 1973), 互补学习系统 (McClelland et al. 1995), 扩散激活 (Collins & Loftus 1975), 编码特异性 (Tulving & Thomson 1973), 双重强度遗忘 (Bjork & Bjork 1992), 检索诱导遗忘 (Anderson et al. 1994), 工作记忆限制 (Cowan 2001)。
瑜伽行派佛教心理学: 阿赖耶识 (Alaya-vijnana), 种子 (bija), 熏习 (vasana), 转依 (asraya-paravrtti), 唯识 (vijnaptimatrata)。
信息检索: 倒数排名融合 (RRF, Cormack et al. 2009), 基于 FTS5 的 BM25, 余弦相似度向量搜索。
与替代方案的比较
graph LR
AGENT["AI Agent"]
subgraph SIMPLE["Simple"]
FILE["File-Based<br/><i>MEMORY.md<br/>OpenClaw</i>"]
end
subgraph INTEGRATED["Integrated"]
FW["Framework Memory<br/><i>LangChain · CrewAI<br/>Letta</i>"]
CODE["Coding Agent<br/><i>Beads · Engram<br/>via MCP</i>"]
end
subgraph ENGINES["Memory Engines"]
DED["Dedicated Systems<br/><i><b>Alaya</b> · Vestige<br/>mem0 · Zep</i>"]
end
subgraph INFRA["Infrastructure"]
VDB["Vector DBs<br/><i>Pinecone · Chroma<br/>Weaviate</i>"]
end
RESEARCH["Research<br/><i>Generative Agents<br/>SYNAPSE · HippoRAG</i>"]
AGENT <--> FILE
AGENT <--> FW
AGENT <--> CODE
AGENT <--> DED
DED -.->|storage| VDB
FW -.->|storage| VDB
RESEARCH -.->|ideas| DED
RESEARCH -.->|ideas| FWAlaya 是一个具有神经科学基础记忆动态的专用记忆引擎。它与其他系统的区别在于:Bjork 双重强度遗忘(分离存储与检索强度)、检索诱导遗忘(检索 A 会抑制竞争的 B 和 C)、赫布共检索增强 (LTP/LTD) 以及无需 LLM 的隐式偏好涌现——所有这些都集成在一个可嵌入的 Rust + SQLite 库中。最接近的同行是:Vestige (Rust, FSRS-6, 扩散激活) 和 SYNAPSE (统一的片段-语义图谱,侧向抑制)。
为什么选择 Alaya 而不是...
替代方案 | 擅长之处 | Alaya 的优势 |
MEMORY.md | 零配置 | 排名检索(非全上下文注入)、类型化存储、Bjork 双重强度衰减 |
mem0 | 带有自动提取的托管云记忆 | 仅限本地(单个 SQLite 文件)、无 API 密钥、赫布图谱动态、RIF 抑制 |
Zep | 生产就绪,支持云/自托管 | 无外部服务、赫布共检索图谱、无需 LLM 的隐式偏好涌现 |
Vestige | Rust, FSRS-6 间隔重复 | Bjork 双重强度(非 FSRS)、RIF、赫布 LTP/LTD、vasana 偏好结晶 |
LangChain Memory | 框架集成,多种后端 | 框架无关、七种生命周期操作、优雅降级至仅 BM25 |
完整比较:90+ 个系统,基于 CoALA 分类法 (Sumers et al., 2024)
[交互式
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/SecurityRonin/alaya'
If you have feedback or need assistance with the MCP directory API, please join our Discord server