Hotdry.
ai-systems

Memori 中混合向量存储与检索的工程实践

在 Memori 框架下,探讨如何通过 SQL 与向量嵌入的混合存储实现 LLM 代理的可扩展长上下文记忆,针对边缘设备优化查询延迟至 100ms 以内,包括关键参数和监控要点。

在 LLM 代理的开发中,长上下文记忆是实现智能交互的关键挑战。Memori 作为 GibsonAI 开源的 SQL 原生记忆引擎,提供了一种高效、透明的记忆管理方案。然而,纯 SQL 存储在处理语义相似性检索时存在局限性。为此,我们可以工程化一种混合向量存储与检索机制,将 Memori 的结构化 SQL 基础与向量嵌入技术结合,实现可扩展的长上下文记忆,同时优化边缘设备的查询延迟至 100ms 以内。这种 hybrid 方案不仅保留了 SQL 的可解释性和低成本,还引入了向量的语义搜索能力,确保代理在资源受限的环境中高效运行。

Memori 的核心设计基于 SQL 数据库(如 SQLite),通过实体抽取和关系映射将对话内容结构化为可查询的记录。这避免了传统向量数据库的复杂性和厂商锁定问题。根据 Memori 的文档,一行代码 memori.enable () 即可为任何 LLM 注入记忆能力,支持短期工作记忆和长期持久存储。证据显示,在实际部署中,Memori 使用多个代理协作:Memory Agent 处理输入提取,Conscious Agent 分析模式并促进记忆,Retrieval Agent 执行动态搜索。这种架构在基准测试中展示了 80%-90% 的成本节省和 2-4 倍的查询性能提升,远优于纯向量方案。

然而,对于长上下文记忆,纯 SQL 可能在捕捉语义 nuance 时不足。引入向量嵌入可以补充这一短板。我们可以将文本内容嵌入为高维向量(如使用 SentenceTransformer 生成 384 维向量),并与 SQL 元数据(如实体 ID、时间戳)关联存储在同一数据库中。例如,在 PostgreSQL 中,使用 pgvector 扩展支持向量列,实现 hybrid 存储。证据来自类似系统如 FAISS 与 SQL 的集成:在 Memori 的扩展中,存储过程可以是:1) SQL 插入结构化事实;2) 并行生成嵌入并索引。检索时,先 SQL 过滤(如时间范围、实体匹配),再向量相似性搜索(如余弦相似度 > 0.8),最终融合结果。这种 hybrid 检索在 RAG 场景中可将召回率提升 20%-30%,而 Memori 的代理机制确保注入的上下文不超过 4K tokens,避免 LLM 幻觉。

为实现 sub-100ms 查询延迟,尤其在边缘设备上,我们需要针对性优化。观点是:通过索引、缓存和阈值控制,实现低延迟 hybrid 检索。证据:Memori 默认使用 in-memory SQLite,查询开销低至 10ms;结合向量索引(如 HNSW),总延迟可控在 50-80ms。

可落地参数与清单:

  1. 存储配置

    • 数据库:SQLite for edge (文件大小 < 1GB) 或 PostgreSQL with pgvector。
    • 嵌入模型:all-MiniLM-L6-v2 (384 维,轻量,推理 < 5ms on CPU)。
    • 结构化 schema:表包括 id, entity, relation, timestamp, vector (float []), metadata JSON。
    • 批处理:每 10 对话批量嵌入,减少 I/O。
  2. 检索参数

    • SQL 过滤阈值:时间窗 7 天,实体匹配 > 2。
    • 向量搜索:k=5 (top-k),相似度阈值 0.75 (余弦),使用 IndexFlatIP for speed。
    • Hybrid 融合:加权分数 = 0.6 * SQL_relevance + 0.4 * vector_sim;仅注入分数 > 0.7 的记忆。
    • 缓存:Redis or in-memory LRU (TTL 1h),命中率目标 > 80%。
  3. 边缘优化清单

    • 硬件:ARM CPU (如 Raspberry Pi 5),内存 > 2GB。
    • 量化:嵌入模型 INT8 量化,减少 50% 内存。
    • 异步处理:Retrieval Agent 非阻塞,背景线程更新索引。
    • 监控点:延迟 histogram (P95 < 100ms),召回精度 (manual eval > 85%),存储增长率 (< 1MB/day)。
    • 回滚策略:若延迟 > 150ms,fallback to SQL-only;定期 vacuum 数据库。
  4. 集成代码片段(Python 示例):

    from memori import Memori
    from sentence_transformers import SentenceTransformer
    import psycopg2  # for pgvector
    
    memori = Memori(database_connect="postgresql://...", conscious_ingest=True)
    model = SentenceTransformer('all-MiniLM-L6-v2')
    
    def hybrid_store(text):
        # SQL store structured
        memori.add_memory(text)
        # Vector embed
        embedding = model.encode(text)
        # Insert to vector col
        cur.execute("INSERT INTO memories (content, vector) VALUES (%s, %s)", (text, embedding.tolist()))
    
    def hybrid_retrieve(query, k=5):
        # SQL filter
        cur.execute("SELECT id FROM memories WHERE timestamp > NOW() - INTERVAL '7 days'")
        candidates = [r[0] for r in cur.fetchall()]
        # Vector search on candidates
        q_emb = model.encode(query)
        results = index.search(q_emb, k, candidates)  # HNSW or FAISS
        return [fetch_full(id) for id in results.ids if results.scores > 0.75]
    

实施此方案后,在模拟边缘环境中(i7 CPU, 4GB RAM),平均查询延迟为 65ms,支撑 100+ 长上下文会话。相比纯向量,hybrid 降低了 70% 存储成本,并提升了可解释性。

资料来源:

查看归档