OpenMemory:开源自托管AI记忆引擎,基于分层架构实现LLM持久化语义记忆

原创 发布日期:
9

一、OpenMemory是什么?

OpenMemory是一款开源、自托管、框架无关的AI记忆引擎,旨在为大型语言模型(LLM)应用提供持久化、结构化和语义化的记忆能力。它通过独特的分层记忆分解(HMD v2)架构,解决了传统向量数据库或SaaS记忆层在召回率、延迟、成本和可解释性上的痛点,支持多格式数据摄入、本地嵌入模型集成,适用于AI代理、智能助手、企业copilots等场景,且完全开源无 vendor 锁定。

简单来说,OpenMemory就像AI的“长期记忆中枢”:它能将用户与AI的对话、上传的文档、行为偏好等信息转化为结构化的“记忆单元”,并通过语义关联建立联系;当AI需要调用历史信息时,它能快速检索出最相关的内容,且整个过程完全在用户可控的环境中运行(本地服务器、私有云等),无需依赖第三方。

二、功能特色

OpenMemory的核心竞争力源于其独特的设计理念和技术实现,相比传统方案,它在功能上有以下突出特色:

1. 分层记忆分解(HMD v2)架构:模拟人类记忆模式

人类记忆分为瞬时记忆、短期记忆和长期记忆,且不同记忆之间存在关联(如“看到咖啡杯”会联想到“早上喝了咖啡”)。OpenMemory借鉴这一逻辑,设计了分层记忆分解架构,让AI记忆更接近人类认知模式:

  • 标准节点(Standard Nodes):每个“记忆”对应一个独立节点,存储原始内容(如对话片段、文档段落)、元数据(时间、来源、关联用户)等,避免数据重复,减少存储冗余。

  • 多扇区嵌入(Multi-Sector Embeddings):每个节点包含5个嵌入扇区,分别对应不同维度的记忆特征:

    • 情景扇区:记录记忆发生的场景(如“2025年10月的对话”“来自用户上传的PDF”);

    • 语义扇区:提取内容的核心语义(如“用户提到喜欢低糖咖啡”);

    • 程序扇区:关联可执行动作(如“用户要求每周发送报表”);

    • 情感扇区:捕捉情绪倾向(如“用户对延迟发货表示不满”);

    • 反思扇区:记录AI对该记忆的总结(如“用户可能需要优先处理订单问题”)。

  • 单向路径链接(Waypoints):记忆节点之间通过单向链接形成“关联图谱”(如“用户提到‘低糖’”→“用户喜欢低糖咖啡”→“用户上周购买了低糖咖啡豆”),模拟人类记忆的“联想激活”过程。

  • 复合相似性检索:结合多扇区嵌入的融合计算与路径图的“激活扩散”算法(从一个节点出发,沿链接找到相关节点),确保召回的记忆既符合语义相似性,又符合逻辑关联性。

2. 性能与成本优势:更快、更便宜

传统向量数据库依赖单一向量相似度检索,容易漏掉逻辑相关但语义向量差异大的内容;而SaaS记忆服务(如OpenAI Memory)则受限于网络延迟和按次收费模式。OpenMemory通过架构优化实现了显著优势:

  • 速度更快:在包含10万记忆节点的测试中,平均响应时间仅110-130ms,比Supermemory、OpenAI Memory等竞品快2-3倍;

  • 成本更低:基于本地存储和开源嵌入模型(如Ollama、E5),每百万令牌处理成本仅0.30-0.40美元,是SaaS竞品的1/6-1/10;

  • 召回率更高:复合相似性检索结合语义与逻辑关联,召回准确率比单一向量数据库高15%-20%(基于CaviraOSS团队的公开测试数据)。

3. 开源与自托管:数据安全无锁定

OpenMemory采用MIT许可协议,代码完全开源,用户可自由修改、部署和二次开发,避免被第三方服务商锁定。其自托管能力支持多种部署环境:

  • 本地服务器(适合个人或小团队);

  • Docker容器(适合企业级标准化部署);

  • 私有云(适合对数据合规性要求高的场景,如医疗、金融)。

同时,它提供了多重安全保障:100%本地数据存储(无数据上传风险)、可选AES-256加密、PII(个人身份信息)自动清洗钩子(可过滤手机号、邮箱等敏感信息)、多租户隔离(支持不同用户/团队数据独立存储)。

4. 多格式支持与灵活集成

OpenMemory不仅能处理文本类记忆(如对话、笔记),还支持多格式数据摄入:

  • 文档:PDF、DOCX、TXT等;

  • 媒体:音频(需配合语音转文字工具)、网页链接(自动抓取内容);

  • 结构化数据:CSV表格、JSON等(可提取字段作为记忆元数据)。

此外,它提供跨语言SDK,方便快速集成到各类应用:

  • JavaScript/TypeScript SDK(sdk-js):支持浏览器和Node.js环境;

  • Python SDK(sdk-py):兼容主流LLM框架(如LangChain、LlamaIndex)。

5. 可解释性:记忆召回路径透明

传统向量数据库的检索结果是“黑盒”(只返回相似内容,不说明为何关联),而OpenMemory支持“记忆召回路径可视化”:用户可查看AI调用的记忆节点、节点间的关联链接,以及每个扇区的匹配分数,清晰了解“AI为什么会想到这个信息”,这对需要审计或调试的场景(如企业助手)至关重要。

与竞品对比表

对比维度 OpenMemory 传统向量数据库(如Pinecone) SaaS记忆服务(如OpenAI Memory)
开源与自托管 ✅ 开源(MIT),完全自托管 ❌ 多为闭源或商业化托管 ❌ 完全依赖第三方,无自托管选项
记忆维度 ✅ 多扇区嵌入(情景/语义/情感等) ❌ 仅支持单一语义向量 ✅ 多维度,但不开放细节
检索逻辑 ✅ 复合相似性(语义+逻辑关联) ❌ 仅语义向量相似性 ✅ 多维度,但算法不透明
平均响应时间(10万节点) 110-130ms 300-500ms 250-400ms(受网络影响)
每百万令牌成本 ~$0.30-0.40 ~$1.50-2.00 ~$2.00-4.00
可解释性 ✅ 支持召回路径可视化 ❌ 无路径解释 ❌ 黑盒模式
数据隐私 ✅ 本地存储,可选加密 ❌ 数据需上传至服务商 ❌ 数据存储在第三方服务器

三、技术细节

OpenMemory的技术架构围绕“高效存储、精准检索、安全可控”设计,核心分为数据库层、检索引擎、安全层和集成层四个部分:

1. 数据库层:基于SQLite的结构化存储

OpenMemory选择SQLite作为底层数据库(轻量、无需独立服务、支持本地文件存储),核心表结构如下:

  • memories表:存储记忆节点的基础信息,包括id(唯一标识)、content(原始内容)、type(类型:对话/文档/行为等)、timestamp(创建时间)、user_id(关联用户)、metadata(自定义元数据,如来源、标签)。

  • vectors表:存储多扇区嵌入向量,每个向量以二进制格式存储,关联memory_id(对应memories表)和sector(扇区类型:情景/语义等)。

  • waypoints表:记录记忆节点间的单向链接,包含source_id(源节点)、target_id(目标节点)、weight(关联权重,0-1之间,值越高关联越强)、reason(关联原因,如“语义相似”“时间连续”)。

  • tenants表:支持多租户隔离,存储租户ID、加密密钥(若启用)、权限配置等。

2. 检索引擎:复合相似性算法的核心

检索引擎是OpenMemory的“大脑”,负责根据用户查询快速找到相关记忆,核心流程包括:

  • 嵌入生成:当新记忆进入系统时,调用指定的嵌入模型(如本地部署的BGE模型),生成5个扇区的向量,存入vectors表;同时,系统会自动分析记忆内容,与已有节点建立单向链接(如“同一用户的连续对话”“语义相关的文档段落”),存入waypoints表。

  • 查询处理:用户查询(如“用户上周提到的咖啡偏好”)先被转化为多扇区向量,然后执行两步检索:

    1. 扇区融合检索:计算查询向量与各记忆节点的多扇区向量相似度(加权平均,权重可自定义),初步筛选出Top N候选节点;

    2. 激活扩散检索:从候选节点出发,沿waypoints表的单向链接扩展,找到关联节点(如候选节点的“后续对话”“相关文档”),并根据链接权重调整排序。

  • 结果返回:最终返回排序后的记忆节点,附带召回路径(哪些节点通过扇区匹配找到,哪些通过关联链接扩展)和各扇区的匹配分数。

3. 安全层:数据保护机制

  • 加密支持:可配置对memories表的content字段和vectors表的向量数据进行AES-256加密,密钥由用户管理,系统不存储明文密钥。

  • PII清洗:内置钩子函数,可在记忆入库前自动检测并替换手机号、邮箱、身份证号等敏感信息(如将“138xxxx1234”替换为“[PHONE]”),也支持自定义清洗规则。

  • 权限控制:通过tenants表实现多租户隔离,每个租户只能访问自己的记忆数据,管理员可配置租户的读写权限(如“只读”“可写入但不可删除”)。

4. 集成层:SDK与API设计

OpenMemory提供RESTful API和SDK,简化集成流程:

  • 核心API包括:

    • POST /memories:创建新记忆(支持上传文本、文档链接等);

    • GET /memories/search:检索相关记忆(支持指定扇区权重、关联深度等参数);

    • PUT /memories/:id:更新记忆内容或元数据;

    • DELETE /memories/:id:删除记忆节点(自动清理关联链接和向量)。

  • SDK封装了API调用细节,提供更友好的接口,例如Python SDK的检索示例:

    from openmemory import OpenMemoryClient 
    
    client = OpenMemoryClient(base_url="http://localhost:8080") 
    # 检索与“咖啡偏好”相关的记忆,优先考虑语义和情感扇区 
    results = client.search( 
      query="咖啡偏好", 
      sector_weights={"semantic": 0.6, "emotional": 0.3}, # 语义权重60%,情感30% 
      max_depth=2 # 激活扩散最多扩展2层关联节点 
    ) 
    for result in results: 
      print(f"记忆内容:{result.content},关联路径:{result.path}")

OpenMemory:开源自托管AI记忆引擎,基于分层架构实现LLM持久化语义记忆

四、应用场景

OpenMemory的设计使其适用于各类需要“长期记忆”的AI应用,以下是典型场景:

1. 长期AI代理(Autonomous Agents)

AI代理需要在长时间内完成复杂任务(如“规划旅行”“管理项目”),需记住用户的动态需求(如“用户突然想增加一个行程”)、环境变化(如“航班延误”)和历史操作(如“已预订酒店”)。OpenMemory可作为代理的“记忆库”,通过多扇区嵌入记录任务相关的情景(时间、地点)、语义(需求细节)和程序(待执行步骤),并通过关联链接确保代理能“联想”到相关信息(如“航班延误”→“需调整酒店入住时间”)。

2. 智能助手(如聊天机器人、语音助手)

智能助手需要记住用户的长期偏好(如“用户对坚果过敏”“喜欢每天早上8点听新闻”)、历史对话(如“上周提到的医生预约时间”),避免重复询问或遗忘关键信息。例如,当用户说“帮我订明天的早餐”,助手可通过OpenMemory检索到“用户不吃坚果”“喜欢全麦面包”等记忆,直接生成符合偏好的订单,无需再次确认。

3. 个人/企业日记应用

日记应用需要记录日常琐事、灵感或工作笔记,并支持按语义检索(如“找到上个月关于项目方案的想法”)。OpenMemory的多扇区嵌入可区分“工作日记”(程序扇区记录待办)和“生活日记”(情感扇区记录心情),且单向链接能关联“方案想法”与后续的“执行结果”,让用户不仅能找到内容,还能看到完整的“思考链”。

4. 企业级Copilots工具

企业Copilots(如代码助手、客户服务助手)需要记住企业内部知识(如“产品定价规则”“客户历史投诉”)和员工操作习惯(如“某销售常用的报价模板”)。OpenMemory的自托管能力确保企业数据不泄露,多租户隔离可区分不同部门的记忆(如“销售部客户信息”与“技术部产品文档”),而可解释性检索则方便管理员审计“Copilots为何给出某建议”(如“基于客户3个月前的投诉记录”)。

5. 教育/学习助手

学习助手需要记住学生的知识盲点(如“多次做错的数学公式”)、学习进度(如“已完成第三章练习”)和偏好(如“喜欢视频讲解”)。OpenMemory的情感扇区可记录学生对知识点的掌握情绪(如“对几何证明感到困惑”),程序扇区可关联“推荐的学习资源”,帮助助手精准推送个性化学习内容。

五、使用方法

OpenMemory支持两种部署方式:适合开发测试的手动部署,和适合生产环境的Docker部署,以下是详细步骤:

1. 手动部署(开发推荐)

环境要求

  • Node.js 18+(后端运行环境);

  • npm 9+(包管理工具);

  • Python 3.8+(若使用Python SDK);

  • 可选:Ollama(本地嵌入模型部署,推荐)。

步骤

  1. 克隆仓库

    git clone https://github.com/CaviraOSS/OpenMemory.git 
    cd OpenMemory
  2. 配置环境变量
    复制示例配置文件并修改参数(如端口、嵌入模型、是否启用加密等):

    cp .env.example .env

    关键配置项说明:

    • PORT=8080:服务运行端口;

    • EMBEDDING_PROVIDER=ollama:嵌入模型提供商(支持ollama/openai/local,推荐ollama本地部署);

    • OLLAMA_MODEL=bge-large-en:Ollama使用的嵌入模型(需先通过ollama pull bge-large-en下载);

    • ENABLE_ENCRYPTION=false:是否启用数据加密(生产环境建议设为true);

    • DATABASE_PATH=./data/openmemory.db:SQLite数据库文件路径。

  3. 安装后端依赖并启动服务

    cd backend 
    npm install 
    npm run dev # 开发模式(自动重启),或 npm start (生产模式)

    服务启动后,默认运行在http://localhost:8080,可通过http://localhost:8080/health检查是否正常运行(返回{"status":"ok"})。

  4. 使用SDK集成

    • JavaScript SDK:

      npm install @caviraoss/openmemory-sdk-js

      示例代码:

      import { OpenMemoryClient } from '@caviraoss/openmemory-sdk-js'; 
      
      const client = new OpenMemoryClient({ baseUrl: 'http://localhost:8080' }); 
      
      // 创建记忆 
      const memory = await client.createMemory({ 
       content: '用户喜欢低糖咖啡,每天早上9点下单', 
       type: 'user_preference', 
       metadata: { source: 'chat' } 
      }); 
      
      // 检索记忆 
      const results = await client.search({ query: '咖啡偏好' }); 
      console.log(results);
    • Python SDK:

      pip install openmemory-sdk-py

      示例代码(同上功能):

      from openmemory import OpenMemoryClient 
      
      client = OpenMemoryClient(base_url="http://localhost:8080") 
      memory = client.create_memory( 
        content="用户喜欢低糖咖啡,每天早上9点下单", 
        type="user_preference", 
        metadata={"source": "chat"} 
      ) 
      results = client.search(query="咖啡偏好") 
      print(results)

2. Docker部署(生产推荐)

Docker部署可简化环境配置,适合企业级应用,步骤如下:

  1. 克隆仓库(同上):

    git clone https://github.com/CaviraOSS/OpenMemory.git 
    cd OpenMemory
  2. 配置环境变量(同上):

    cp .env.example .env 
    # 根据生产需求修改.env(如端口设为80,启用加密等)
  3. 构建并启动容器

    docker compose up --build -d

    该命令会构建后端服务镜像,启动容器,并将数据库文件映射到本地./data目录(确保数据持久化)。服务启动后可通过http://服务器IP:端口访问。

3. 验证部署

部署完成后,可通过API测试工具(如Postman)发送请求验证:

  • 创建记忆:

    POST http://localhost:8080/memories 
    Content-Type: application/json 
    
    { 
     "content": "测试记忆内容", 
     "type": "test", 
     "metadata": {"tag": "demo"} 
    }
  • 检索记忆:

    GET http://localhost:8080/memories/search?query=测试

若返回包含“测试记忆内容”的结果,则部署成功。

六、常见问题解答(FAQ)

1. OpenMemory与向量数据库的核心区别是什么?

向量数据库仅通过单一语义向量存储和检索信息,无法关联记忆的情景、情感等维度,也不支持逻辑关联(如“时间先后”“因果关系”);而OpenMemory通过多扇区嵌入和单向路径链接,实现了“语义+逻辑”的复合检索,更接近人类记忆模式,召回率更高。

2. 必须部署本地嵌入模型吗?可以用OpenAI的嵌入API吗?

不是必须。OpenMemory支持多种嵌入提供商,包括本地模型(Ollama)、OpenAI API、Azure OpenAI等。若对延迟和成本敏感,推荐本地部署Ollama(免费且无网络延迟);若追求快速上手,可配置EMBEDDING_PROVIDER=openai并填入API密钥。

3. 自托管需要专业技术吗?普通用户能部署吗?

Docker部署对技术要求较低,只需按照步骤执行命令即可,适合普通用户;手动部署需要基本的Node.js环境配置知识,适合开发者。项目文档提供了详细的部署指南,且社区(GitHub Issues)会解答常见问题。

4. 支持多语言记忆吗?比如中文、日文?

支持。只要使用的嵌入模型支持多语言(如bge-large-zh中文模型、gte-large-jp日文模型),OpenMemory就能正常处理多语言记忆。配置时只需将.env中的OLLAMA_MODEL改为对应模型即可。

5. 数据存储容量有限制吗?能处理千万级记忆节点吗?

理论上无容量限制,取决于存储介质(如硬盘大小)。但由于基于SQLite,当节点数超过100万时,建议优化索引(项目提供索引优化脚本)或迁移至更适合大规模数据的数据库(如PostgreSQL,需修改数据库层代码)。目前测试显示,10万节点可稳定运行,响应时间保持在150ms以内。

6. 如何备份和恢复数据?

OpenMemory的数据存储在SQLite文件(默认./data/openmemory.db)中,备份时直接复制该文件即可;恢复时将备份文件放回原路径,重启服务即可读取。Docker部署需注意备份映射到本地的./data目录。

七、相关链接

八、总结

OpenMemory是一款针对LLM应用的开源自托管AI记忆引擎,通过分层记忆分解架构、多扇区嵌入和复合相似性检索,解决了传统方案在召回率、延迟、成本和可解释性上的痛点。它支持多格式数据摄入、本地部署和灵活集成,适用于AI代理、智能助手、企业copilots等多种场景,且完全开源无 vendor 锁定,为需要“长期记忆”的AI应用提供了安全、高效、低成本的解决方案。

打赏
THE END
作者头像
AI工具箱
一个喜欢收集AI工具的小萌新