跳转至

Neuromem(长期记忆组件)

Neuromem 是长期记忆(Long-term Memory)的组件实现,Memory Service 即由 Neuromem 对外提供服务封装。业务侧统一通过 Service API 调用 memory_service 完成写入与检索,无需直接依赖 Neuromem 的内部实现。

  • 代码位置(组件/服务):packages/sage-middleware/src/sage/middleware/services/memory/ 与其子模块
  • 与服务的关系:Memory Service = Neuromem 的服务化封装;Function 中通过 self.call_service["memory_service"] 调用

本页包含:

  • 服务示例(如何在 Function 中调用由 Neuromem 提供的 Memory Service)
  • 组件设计(Neuromem 的核心分层与关键子模块)
  • 部分组件层 API(按模块粒度与稳定调用面汇总)

一、服务示例(面向使用者)

在环境里注册 Memory Service(由工厂函数返回服务实例),然后在 Function 中进行存取与检索。示例接口与调用风格与仓库保持一致。

# 环境侧:注册服务(可按需在工厂内初始化集合等)
from sage.core.api.local_environment import LocalEnvironment
from sage.middleware.services.memory import MemoryService  # 以仓库 README 示例为准

def memory_service_factory():
    service = MemoryService()
    # 可选:初始化集合(示例出现在仓库 README)
    # service.create_collection(
    #     name="qa_collection",
    #     backend_type="VDB",
    #     description="QA pipeline memory"
    # )
    return service

env = LocalEnvironment("neuromem_demo")
env.register_service("memory_service", memory_service_factory)
# Function 侧:通过 Service API 访问 Memory Service
from sage.core.api.function.base_function import BaseFunction

class ConversationMemory(BaseFunction):
    def execute(self, data):
        session_id = data.get("session_id", "default")
        content = data.get("content", "")
        vector = data.get("vector")

        # 1) 写入长期记忆(由 Neuromem 组件承载)
        memory_id = self.call_service["memory_service"].store_memory(
            content=content,
            vector=vector,
            session_id=session_id,
            memory_type="conversation",
            metadata={"source": "user_input"}
        )

        # 2) 相似检索(方法名以实现为准,示例与仓库示例一致)
        # 注意:参数命名在不同实现中可能为 top_k 或 limit
        results = self.call_service["memory_service"].search_memories(
            query_vector=vector,
            session_id=session_id,
            limit=5
        )

        return {"memory_id": memory_id, "related": results}

要点:

  • Function/Service 中统一使用 self.call_service / self.call_service_async 访问
  • Memory Service 对接向量(VDB)、KV、Graph 等后端,Function 无需关心内部细节

二、组件设计(Neuromem 内部分层与职责)

Neuromem 采用“编排服务 + 基础集合 + 引擎/后端”的分层方式实现,支持在服务层提供稳定能力,同时允许组件层按需替换底层后端。

flowchart LR
  App[调用方:Function/Service]
  MS["Memory Service<br/>(服务封装)"]
  subgraph Neuromem[Neuromem 组件]
    MM["MemoryManager<br/>(核心管理/路由)"]
    subgraph Collections[Memory Collection 层]
      BC["base_collection.py<br/>(基础抽象)"]
      KVC[kv_collection.py]
      VDBC[vdb_collection.py]
      GC[graph_collection.py]
    end
    subgraph Engines["引擎/后端适配"]
      MD["storage_engine/metadata_storage.py"]
      GI["search_engine/graph_index/"]
      HI["search_engine/hybrid_index/"]
      KV["kv(在对应服务中实现)"]
      VDB["vdb(在对应服务中实现)"]
    end
  end
  Stores[实际后端:<br/>KV / VDB / Graph 等]

  App --> MS --> Neuromem
  Neuromem --> Stores

  MM --> Collections
  Collections --> Engines
  • MemoryManager(memory_manager.py)

    • 统一管理写入/检索的流程编排,将请求路由到对应集合/后端
  • Memory Collection 层(memory_collection/)

    • base_collection.py:集合抽象基类
    • kv_collection.py / vdb_collection.py / graph_collection.py:面向不同后端的集合实现
  • 引擎/后端适配(storage_engine/ 与 search_engine/)

    • metadata_storage.py:元数据存储
    • graph_index/、hybrid_index/:图与混合检索相关索引

    • 与 KV/VDB 的落地引擎迁移到了各自服务模块(遵循单一职责)

      • 在 Memory Service 中仅保留“编排与抽象”
      • KV/VDB 具体存储与索引在 kv/vdb 服务中实现

三、部分组件层 API(按模块粒度汇总)

说明:

  • 下列为稳定“面向组件”的职责/接口面向,尽量避免硬编码具体签名;以仓库实际实现为准
  • 对上统一通过 Memory Service 的服务接口(store_memory/search_memories 等)

1) Memory Service(服务层,对上暴露)

  • 常用方法(依据仓库示例)

    • store_memory(content, vector, session_id, memory_type, metadata)
    • search_memories(query_vector, session_id, limit/top_k, filters)
    • retrieve_memories(...)(如实现提供)
  • 作用:将 Neuromem 的能力服务化,屏蔽 KV/VDB/Graph 的细节

2) MemoryManager(组件核心)

  • 职责:解析写入/检索请求,将其分发到合适的 Collection 与后端
  • 行为:维护集合/索引/元数据一致性;聚合后端结果

3) Collections(memory_collection/)

  • base_collection.py:集合抽象(提供集合级能力的统一接口)
  • kv_collection.py / vdb_collection.py / graph_collection.py:不同后端集合的适配器
  • 典型行为:集合创建/加载、集合内对象/向量读写、索引/检索委托

4) Engines(storage_engine/ 与 search_engine/)

  • metadata_storage.py:元数据读写
  • graph_index/、hybrid_index/:图与混合检索索引能力
  • 与 KV/VDB 的具体存储/检索引擎在各自服务模块维护

四、实践建议

  • 编程模型:只在 Function/Service 中调用 memory_service;组件内部细节交由 Neuromem 处理
  • 性能:大批量写入/检索时优先使用批接口(若实现提供);避免在 execute 中过细粒度频繁阻塞
  • 可测试性:可在环境内注册 Mock 服务,利用相同 Service API 验证业务逻辑