Hotdry.
ai-systems

基于 Memori 开源引擎构建日志结构化合并的多代理记忆层

用 Memori 实现 LLM 代理的持久上下文、多代理协作、高效检索与版本化,支持一行代码 SQL 存储。

在多代理 LLM 系统(如 CrewAI 或 AutoGen)中,代理间的协作依赖持久、可检索的记忆层,但传统向量数据库成本高、检索不精确,且缺乏版本化支持。日志结构化合并(LSM)树理念 —— 追加式写入、后台合并、高效范围查询 —— 完美契合代理记忆需求:对话日志 append-only 存储,后台智能合并优化检索,支持多代理共享或隔离上下文。本文基于开源 Memori 引擎,构建高效记忆层,实现持久上下文、多代理协作、高效检索与版本化。

LSM-like 记忆引擎的核心机制

Memori 采用 SQL-native 存储(SQLite/PostgreSQL/MySQL),将对话日志作为不可变记录追加,避免频繁更新开销,类似 LSM 的 memtable → sstable 流程。“Memori 通过拦截 LLM 调用,在预调用阶段检索相关记忆注入上下文,后调用阶段提取实体存储。”1 其架构分为三层:

  1. 追加存储层:每轮交互后,Memory Agent 使用 LLM 提取实体(事实、偏好、技能、规则、上下文),分类存入 SQL 表。支持全文本搜索索引,确保日志不可变,提供天然版本化(时间戳 + 会话 ID)。

  2. 检索层:双模式并行 ——Conscious 模式(即时注入短时工作记忆)和 Auto 模式(动态查询长时记忆)。预调用时,Retrieval Agent 根据当前消息语义检索 Top-K 相关片段,注入系统提示。

  3. 合并层:后台 Conscious Agent 每 6 小时分析模式,将高频 / 关键记忆从长时提升至短时(promote),模拟 LSM compaction,优化下次检索命中率。

此设计零向量 DB,成本降 80-90%,数据全自控,无锁入。

多代理协作层的集成实现

Memori 原生支持 LiteLLM callback,轻松集成多代理框架,实现共享记忆池或用户隔离。

CrewAI 示例(共享任务记忆):

from memori import Memori
from crewai import Agent, Task, Crew

memori = Memori(
    database_conn="postgresql://user:pass@localhost/memori",
    conscious_ingest=True,  # 短时注入
    auto_ingest=True,       # 动态检索
    openai_api_key="sk-..."
)
memori.enable()  # 拦截所有 LLM 调用

# 定义代理
researcher = Agent(role="研究员", goal="...", llm="gpt-4o-mini")  # 自动记忆注入
writer = Agent(role="撰稿人", goal="...", llm="gpt-4o-mini")

crew = Crew(agents=[researcher, writer], tasks=[...])
result = crew.kickoff()

代理协作中,researcher 检索共享历史,writer 获益于已提取实体。命名空间 MEMORI_MEMORY_NAMESPACE="crew-prod" 隔离不同 Crew。

AutoGen 示例(群聊持久化): 类似配置,group chat 记忆跨会话持久:

from memori import Memori
# ... 同上 memori.enable()
from autogen import AssistantAgent, UserProxyAgent, GroupChat

groupchat = GroupChat(agents=[...], messages=[], max_round=10)
manager = GroupChatManager(groupchat)
# 对话自动记录/检索

多用户隔离user_id 参数分区表,如 FastAPI 示例中 memori.get_context(user_id="alice")

高效检索与版本化的落地参数

核心参数配置

  • conscious_ingest=True:启用短时记忆,阈值 max_tokens_inject=2000,优先高频实体。
  • auto_ingest=True:动态检索,top_k=5,语义相似度 >0.7,结合 BM25 + LLM rerank。
  • DB 连接:生产用 PG postgresql://...,索引 CREATE INDEX ON memories USING GIN(to_tsvector('english', content))
  • 命名空间:namespace="multi-agent-v1",版本化查询 SELECT * FROM memories WHERE session_id=... ORDER BY timestamp DESC LIMIT 10

监控与阈值

指标 阈值 监控 SQL
注入延迟 <500ms EXPLAIN ANALYZE SELECT ...
存储增长 日增 <1GB SELECT COUNT(*) FROM memories WHERE date_trunc('day', timestamp)=CURRENT_DATE
检索命中率 >80% 日志 retrieval_recall
LLM 提取准确 >90% 采样人工校验

异常时,回滚:memori.disable() 降级无记忆,或 auto_ingest=False 只用 conscious。

规模化清单

  1. 初始化:pip install memorisdk,Env MEMORI_DATABASE_CONNECTION_STRING=...
  2. 迁移:memori.migrate() 建表 / 索引。
  3. 测试:模拟 1000 会话,测 QPS >10,延迟 <1s。
  4. 部署:Docker + PG,备份 pg_dump memori_db | gzip
  5. 扩展:分片 namespace,支持 10k+ 代理。

风险与优化

风险:LLM 提取幻觉 → 引入规则校验,如实体去重;SQL 膨胀 → 定时 VACUUM + TTL DELETE WHERE timestamp < NOW() - INTERVAL '30 days'

Memori v3 预告企业 fabric,进一步强化多代理支持。

资料来源

(正文字数:约 1050 字)

Footnotes

  1. Memori GitHub README

查看归档