Skip to main content
Glama

Alaya

DOI License: MIT Rust crates.io docs.rs npm MCP alaya MCP server GitHub stars GitHub Sponsors CI

这是唯一一个具有神经科学基础记忆动态的记忆引擎——包含 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 美元。社区工具如 QMDmemsearch 通过用排名检索替代全上下文注入,减少了 70-96% 的浪费 (Levine, 2026)。

结构问题加剧了成本。 MEMORY.md 将决策、偏好和知识混杂在一个非结构化的块中。用户不得不独立发明 decision.md 文件、working-context.md 快照以及 12 层记忆架构 来进行补偿。周一你提到“Alice 管理认证团队”。周三你问“谁负责认证权限?”智能体通过文本相似度检索到两条记忆,但无法将它们关联起来 (Chawla, 2026)。

Alaya 如何解决这些问题

问题

基于文件的记忆

Alaya

Token 浪费

全上下文注入(约 35K token/消息)

排名检索仅返回 top-k 相关记忆

缺乏结构

所有内容都在一个文件中(用户发明 decision.md 变通方案)

三种类型化存储:片段、知识、偏好

无法遗忘

文件无限增长,直到手动清理

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 个记忆工具:

工具

功能

remember

存储对话消息(10 个片段后自动提示整合)

recall

使用混合检索(+ 类别加权)搜索记忆

learn

直接教授提取的知识——智能体提取事实并调用此工具

status

丰富的记忆统计:片段、知识细分、类别、图谱、嵌入

preferences

获取已学习的用户偏好

knowledge

获取提炼后的语义事实(+ 类别过滤)

maintain

运行记忆清理(去重、衰减)

purge

按会话、时间或全部删除记忆

categories

列出带有稳定性过滤的涌现类别

neighbors

通过扩散激活获取图谱邻居

node_category

节点所属的类别

import_claude_mem

从 claude-mem 数据库导入观察结果

import_claude_code

从 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%)

环境变量:

变量

默认值

描述

ALAYA_DB

~/.alaya/memory.db

SQLite 数据库路径

ALAYA_LLM_API_KEY

(无)

自动整合的 API 密钥(启用 ExtractionProvider)。需要 llm 特性。

ALAYA_LLM_API_URL

https://api.openai.com/v1/chat/completions

兼容 OpenAI 的聊天补全端点

ALAYA_LLM_MODEL

gpt-4o-mini

模型名称。任何小型/快速模型均可(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()?;

生命周期调度

方法

调用时机

功能

consolidate()

积累 10+ 个片段后

从片段中提取语义知识

perfume()

每次用户交互时

提取行为印象,结晶偏好

transform()

每日或每周

去重、LTD 链接衰减、修剪弱链接、发现类别

forget()

每日或每周

衰减检索强度,归档真正被遗忘的节点

purge()

用户请求时

按会话/时间/全部级联删除,并带有墓碑记录

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>>;
}

设计原则

  1. 记忆是一个过程,而非数据库。 每次检索都会改变被记忆的内容。图谱通过使用而重塑。

  2. 遗忘是一种功能。 Bjork 双重强度衰减将存储强度与检索强度分离。检索诱导遗忘 (RIF) 主动抑制竞争记忆。两者都能随时间提高检索质量。

  3. 偏好是涌现的,而非声明的。 行为模式通过 vasana(熏习)从积累的印象中结晶出来,无需 LLM。

  4. 智能体拥有身份。 Alaya 存储种子。智能体决定哪些种子重要以及如何呈现它们。

  5. 优雅降级。 没有嵌入?仅使用 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| FW

Alaya 是一个具有神经科学基础记忆动态的专用记忆引擎。它与其他系统的区别在于: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

Install Server
A
security – no known vulnerabilities
A
license - permissive license
-
quality - not tested

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