目录

Memvid:14.8K Stars · AI 智能体记忆层完全指南

目录

Memvid:14.8K Stars · AI 智能体记忆层完全指南

单文件持久化 · 无数据库 · 零运维 · 极速检索 · 时间旅行调试


目录


学习目标

  • 理解 Memvid 作为 AI 智能体记忆层的核心定位和差异化优势
  • 掌握 Smart Frames 的设计理念、数据结构与帧序列机制
  • 熟练使用 Rust / Python / Node.js / CLI 四种 SDK 进行存储、检索和查询
  • 理解 Memvid 的性能基准及其在实际场景中的表现
  • 能够根据业务场景选择合适的 Feature Flags 配置组合
  • 掌握时间旅行调试、分支演进、加密合规等高级特性

一、项目概述

1.1 Memvid 是什么

Memvid(Memory Video)是一个单文件记忆层,为 AI 智能体提供即时检索长期记忆能力。它将数据、嵌入向量、索引和 API 全部打包到一个 .mv2 文件中,实现了真正的零运维便携式记忆系统。

官方定义:“Memvid is a single-file memory layer for AI agents with instant retrieval and long-term memory. Persistent, versioned, and portable memory, without databases.”

核心价值主张:传统向量数据库需要复杂的部署架构(向量库 + 嵌入服务 + API 服务器),而 Memvid 用单文件替代了这一切——拷贝即迁移,零配置启动,毫秒级检索。

1.2 核心数据

指标数值
Stars14.8k
Fork1.3k
贡献者24
最新版本v2.0.139(2026-03-14)
许可证Apache-2.0
核心语言Rust 98.5%
发布包CLI / Node.js / Python / Rust

1.3 核心定位

维度说明
📦 单文件所有数据、嵌入向量(Embedding)、索引都在一个 .mv2 文件中
🗄️ 无数据库服务器less(Serverless),无需运维
🤖 模型无关支持任意 AI 模型(OpenAI / Claude / Llama 等)
🌐 离线优先完全本地运行,无需网络
🔄 版本化支持时间旅行调试(Time-Travel Debugging)

设计哲学:Memvid 从视频编码中汲取灵感,将 AI 记忆组织为可追加的 Smart Frames 序列。这种设计借鉴了视频帧的时间戳和压缩机制,实现了精确的时间索引和高效的存储压缩。

1.4 性能基准

指标数值说明
LoCoMo 准确率+35% SOTA业界领先
多跳推理+76%超越行业平均
时间推理+56%超越行业平均
P50 延迟0.025ms50% 查询在 0.025ms 内完成
P99 延迟0.075ms高吞吐保障
吞吐量1372x比标准向量数据库快 1372 倍

实测对比(1000 文档规模):

操作MemvidPineconeLanceDB
初始化 setup145ms7.4s158ms
搜索延迟24ms267ms506ms

性能解读:Memvid 的高性能源于其本地化架构——无需网络往返,查询直击索引。结合 Tantivy 全文搜索、HNSW 向量索引和预计算的时间索引,Memvid 实现了真正的 sub-ms 级检索。


二、为什么需要 Memvid

2.1 传统 RAG 痛点

❌ 复杂架构:向量数据库 + 嵌入服务 + API 服务器(4+ 组件)
❌ 运维困难:多组件部署、配置、调优、监控
❌ 数据孤岛:不同系统记忆无法共享
❌ 不可移植:记忆绑定在特定数据库
❌ 延迟高:网络往返开销(通常 50-500ms)
❌ 成本高:云向量库按查询计费
❌ 离线不可用:严重依赖网络

什么是 RAG? 检索增强生成(Retrieval-Augmented Generation,RAG)是一种结合外部知识检索与语言模型生成的技术。传统 RAG 需要维护独立的向量数据库来存储和检索文档。

2.2 Memvid 的解决方案

✅ 单一文件:所有数据打包在 .mv2 文件
✅ 无需运维:零服务器(Serverless)、零数据库
✅ 即时检索:0.025ms P50,sub-ms 级别
✅ 任意迁移:文件拷贝即迁移
✅ 模型无关:OpenAI / Claude / Llama 通用
✅ 离线优先:完全本地运行
✅ 零成本:本地计算,无按查询计费

架构对比

传统 RAG:
┌─────────┐   ┌─────────┐   ┌─────────┐   ┌─────────┐
│ Document │ → │ Embedder │ → │  Vector  │ → │  API    │
│ Ingestion│   │ Service │   │   DB    │   │ Server  │
└─────────┘   └─────────┘   └─────────┘   └─────────┘
    4个组件         运维复杂      延迟高      需网络

Memvid:
┌─────────────────────────────────────────┐
│              .mv2 文件                             │
│   Document + Embedder + Index + API     │
└─────────────────────────────────────────┘
    1个文件         零运维        0.025ms    完全本地

三、核心概念:Smart Frames

3.1 设计灵感

Memvid 从视频编码中汲取灵感,将 AI 记忆组织为可追加、极高效的 Smart Frames 序列

为什么从视频编码获得灵感? 视频编码采用帧(Frame)结构来存储运动信息,每一帧都是独立的、可以精确定位的单元。这种设计让 Memvid 能够实现:

  • 精确的时间索引:每帧都有时间戳,支持时序查询
  • 高效的存储压缩:采用视频编码技术压缩相邻帧的冗余数据
  • 时间旅行能力:可以回溯到任意帧查看历史状态

3.2 Smart Frame 定义

┌─────────────────────────────────────────────────────────────┐
│                    Smart Frame 结构                                  │
├─────────────────────────────────────────────────────────────┤
│                                                               │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                     Frame Header                        │   │
│  │  • timestamp(时间戳)                                   │   │
│  │  • checksum(校验和)                                   │   │
│  │  • metadata(元数据)                                    │   │
│  │  • content(内容)                                      │   │
│  │  • frame_number(帧序号)                                │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                               │
│  Frame 特性:                                                  │
│  ✅ 不可变(Immutable):写入后不可修改,保证数据安全              │
│  ✅ 可追加(Append-only):新数据追加,不修改已有数据              │
│  ✅ 可压缩:采用视频编码技术压缩                                 │
│  ✅ 时间索引:支持时序查询                                     │
│  ✅ 并行读取:支持多线程并发访问                                │
│                                                               │
└─────────────────────────────────────────────────────────────┘

关键特性速记

特性英文含义
不可变性Immutability数据安全 = 写入后不修改
只追加Append-only崩溃安全 = 只追加不覆盖
时间戳Timestamp可回溯 = 任意时间点查询
压缩Compression高效存储 = 视频编码技术

3.3 Frame 序列机制

Memvid 中的记忆以 Frame 序列形式存储,每个 Frame 包含:

  1. Content Block:实际数据内容(文本、音频、视频元数据等)
  2. Embedding Block:预计算的向量表示
  3. Metadata Block:标题、标签、URI、时间戳等信息
  4. Index Entries:用于快速检索的索引项
┌──────┐  ┌──────┐  ┌──────┐  ┌──────┐  ┌──────┐
│ F#0  │→ │ F#1  │→ │ F#2  │→ │ F#3  │→ │ F#4  │ → ...
└──────┘  └──────┘  └──────┘  └──────┘  └──────┘
  t=0      t=1      t=2      t=3      t=4

3.4 为什么用 Frame 结构?

特性说明
🔒 数据安全Append-only 设计,已写入数据不被修改或损坏
时间旅行查询历史记忆状态(as_of_frame / as_of_timestamp)
📅 演变追踪查看知识如何随时间演化
🛡️ 崩溃安全提交即 immutable,崩溃后可恢复
🗜️ 高效压缩采用视频编码技术适配相邻帧冗余

四、系统架构

4.1 整体架构

┌─────────────────────────────────────────────────────────────┐
│                    Memvid 系统架构                                    │
├─────────────────────────────────────────────────────────────┤
│                                                               │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                    应用层                                │   │
│  │  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────┐│  │
│  │  │  CLI    │  │Node.js  │  │ Python  │  │  Rust   ││  │
│  │  │   SDK   │  │   SDK   │  │   SDK   │  │   SDK   ││  │
│  │  └────┬────┘  └────┬────┘  └────┬────┘  └────┬────┘│  │
│  └───────┼────────────┼────────────┼────────────┼──────────┘   │
│          │            │            │            │               │
│  ┌───────▼────────────▼────────────▼────────────▼───────────┐   │
│  │                    Memvid Core                           │   │
│  │  ┌────────────┐  ┌────────────┐  ┌────────────┐      │   │
│  │  │   Search   │  │   Write    │  │   Read    │      │   │
│  │  │   Engine   │  │   Engine   │  │   Engine   │      │   │
│  │  └─────┬──────┘  └─────┬──────┘  └─────┬──────┘      │   │
│  └────────┼──────────────┼──────────────┼────────────────┘   │
│           │              │              │                       │
│  ┌────────▼──────────────▼──────────────▼───────────────┐    │
│  │                    .mv2 文件                           │    │
│  │  ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐        │    │
│  │  │ Header │ │   WAL  │ │  Data  │ │  Index │        │    │
│  │  │  (4KB) │ │(1-64MB)│ │ Segments│ │ Lex/Vec│        │    │
│  │  └────────┘ └────────┘ └────────┘ └────────┘        │    │
│  └─────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────┘

4.2 .mv2 文件格式

┌─────────────────────────────────────────────────────────────┐
│                    .mv2 文件结构                                  │
├─────────────────────────────────────────────────────────────┤
│                                                               │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  Header(4KB)                                       │   │
│  │  • Magic number(魔数)用于标识文件格式                   │   │
│  │  • Version(版本号)用于兼容性检查                       │   │
│  │  • Capacity(容量)                                   │   │
│  │  • Checksum(校验和)                                  │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                               │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  Embedded WAL(1-64MB)                              │   │
│  │  Crash recovery(崩溃恢复预写日志)                      │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                               │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  Data Segments(数据段)                              │   │
│  │  Compressed Smart Frames(压缩后的帧序列)               │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                               │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  Lex Index(词法索引,Tantivy 实现)                    │   │
│  │  Full-text search with BM25 ranking(BM25 全文搜索)     │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                               │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  Vec Index(向量索引,HNSW 实现)                      │   │
│  │  Vector similarity search(向量相似搜索)               │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                               │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  Time Index(时间索引)                               │   │
│  │  Chronological ordering(时序排列)                    │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                               │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  TOC(Table of Contents,目录表)                     │   │
│  │  Segment offsets(段偏移量)                          │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                               │
│  ⚠️ 无 .wal / .lock / .shm 或任何侧文件!                    │
│                                                               │
└─────────────────────────────────────────────────────────────┘

文件格式解读

组件技术实现功能
Header固定 4KB魔数标识版本、兼容性检查
WAL预写日志崩溃后恢复,1-64MB 自适应
Data Segments压缩帧序列存储实际数据,采用视频编码压缩
Lex IndexTantivy + BM25全文搜索,关键词精确匹配
Vec IndexHNSW 算法向量相似搜索,语义理解
Time Index时间戳索引时序查询,时间旅行支持
TOC目录表段偏移量快速定位

4.3 核心技术栈

组件技术选型说明
全文搜索TantivyRust 实现的高性能全文搜索引擎
向量索引HNSWHierarchical Navigable Small World,分层可导航小世界图
压缩算法视频编码技术借鉴帧间压缩,高效存储
加密AES-256-GCM + Argon2id军标级加密,GPU 抗性

五、快速开始

5.1 安装

SDK安装命令
CLInpm install -g memvid-cli
Node.jsnpm install @memvid/sdk
Pythonpip install memvid-sdk
Rustcargo add memvid-core

5.2 Rust 快速上手

use memvid_core::{Memvid, PutOptions, SearchRequest};

fn main() -> memvid_core::Result<()> {
    // 创建新的记忆文件
    let mut mem = Memvid::create("knowledge.mv2")?;

    // 添加文档(带元数据)
    let opts = PutOptions::builder()
        .title("会议记录")
        .uri("mv2://meetings/2024-01-15")
        .tag("project", "alpha")
        .build();
    mem.put_bytes_with_options(b"Q4 planning discussion...", opts)?;
    mem.commit()?;

    // 搜索
    let response = mem.search(SearchRequest {
        query: "planning".into(),
        top_k: 10,
        snippet_chars: 200,
        ..Default::default()
    })?;

    for hit in response.hits {
        println!("{}: {}", hit.title.unwrap_or_default(), hit.text);
    }

    Ok(())
}

5.3 Python 快速上手

from memvid import Memvid, PutOptions, SearchRequest

# 创建记忆文件
mem = Memvid.create("knowledge.mv2")

# 添加文档
opts = PutOptions.builder() \
    .title("会议记录") \
    .uri("mv2://meetings/2024-01-15") \
    .tag("project", "alpha") \
    .build()
mem.put_bytes_with_options(b"Q4 planning discussion...", opts)
mem.commit()

# 搜索
response = mem.search(
    query="planning",
    top_k=10,
    snippet_chars=200
)
for hit in response.hits:
    print(f"{hit.title}: {hit.text}")

5.4 Node.js 快速上手

import { create, PutOptions, SearchRequest } from '@memvid/sdk';

async function main() {
  // 创建记忆文件
  const mem = await create('knowledge.mv2');

  // 添加文档
  const opts = new PutOptions()
    .setTitle('会议记录')
    .setUri('mv2://meetings/2024-01-15')
    .addTag('project', 'alpha');
  await mem.put({
    title: '会议记录',
    label: 'meeting',
    text: 'Q4 planning discussion...',
  });

  // 搜索
  const results = await mem.find('planning', { k: 10 });
  console.log(results.hits);

  // 密封文件
  await mem.seal();
}

main();

5.5 CLI 快速上手

# 创建记忆文件
memvid-cli create knowledge.mv2

# 添加文档
memvid-cli put knowledge.mv2 \
  --title "会议记录" \
  --content "Q4 planning discussion..." \
  --tag project=alpha

# 搜索
memvid-cli find knowledge.mv2 --query "planning" --top-k 5

# 时间旅行查询
memvid-cli find knowledge.mv2 --query "planning" --as-of-frame 100

# 查看文件状态
memvid-cli inspect knowledge.mv2 --stats

# 压缩文件
memvid-cli compact knowledge.mv2

# 加密文件
memvid-cli lock knowledge.mv2 --out knowledge.mv2e

六、核心功能详解

6.1 Living Memory Engine

功能说明
📝 连续追加跨会话持续添加记忆,无需重建索引
🌿 分支(Branch)创建记忆分支,支持实验性推理
🔄 演变(Evolution)记忆可进化,追踪知识演化路径

为什么需要分支功能? 当 AI 智能体需要进行实验性推理时,可以在不影响主记忆的情况下创建分支,尝试不同的推理路径。

// 追加新记忆
mem.put_bytes_with_options(b"new information", opts)?;

// 创建分支
let branch = mem.branch("experiment-branch")?;
branch.put_bytes(b"experimental data")?;

// 回退到主分支

6.2 Capsule Context(.mv2)

┌─────────────────────────────────────────────────────────────┐
│                    Capsule Context(.mv2)                          │
├─────────────────────────────────────────────────────────────┤
│                                                               │
│  • 自包含:数据 + 嵌入向量 + 索引 + 元数据                       │
│  • 可分享:文件拷贝即整个记忆迁移                               │
│  • 有规则:可设置过期时间                                     │
│  • 可加密:支持密码加密(.mv2e)                              │
│  • 版本化:支持时间旅行调试                                   │
│                                                               │
└─────────────────────────────────────────────────────────────┘

6.3 时间旅行调试(Time-Travel Debugging)

时间旅行调试允许你回溯到记忆的任何历史状态,这在调试 AI 推理过程时非常有用。

# 回溯到特定时间点(通过帧号)
results = mem.find('config', as_of_frame=100)

# 回溯到特定时间点(通过时间戳)
results = mem.find('budget', as_of_ts=1704067200)

# 查看历史时间线
results = mem.find('config', as_of_frame=50)
// Rust 时间旅行
let past_mem = mem.at_timestamp(1705276800)?;

for frame in past_mem.frames() {
    println!("{:?}", frame);
}

let branched = past_mem.branch("what-if-scenario")?;
# CLI 时间旅行
memvid find knowledge.mv2 --query "config" --as-of-frame 100
memvid find knowledge.mv2 --query "config" --as-of-ts 1704067200
memvid timeline knowledge.mv2 --as-of-frame 50

典型应用场景:当 AI 智能体做出错误决策时,可以通过时间旅行回溯到关键节点,分析是哪一步导致了问题。

6.4 智能召回(Smart Recall)

// 子毫秒级本地记忆访问
let response = mem.search(SearchRequest {
    query: "project planning".into(),
    top_k: 5,
    ..Default::default()
})?;
println!("P50 latency: {}ms", response.latency_p50);

6.5 实体状态追踪(Entity State)

import { create } from '@memvid/sdk';

const mem = await create('knowledge.mv2');
await mem.put({ title: 'Team Info', label: 'notes', text: 'Alice works at Anthropic...' });

// 查询实体状态
const alice = await mem.state('Alice');
// { slots: { employer: 'Anthropic', role: 'Senior Engineer' } }

七、Feature Flags

Memvid 采用 Rust feature flags 机制,按需启用功能,实现最小化依赖:

Feature说明依赖
lexBM25 全文搜索(Tantivy 实现)⬜ 内置
pdf_extract纯 Rust PDF 文本提取⬜ 内置
vecHNSW 向量相似搜索 + 本地 ONNX 嵌入⬜ 内置
clipCLIP 视觉嵌入(图片搜索)⬜ 内置
whisperWhisper 音频转录⬜ 内置
api_embedOpenAI 云端嵌入(需要网络)🌐 需要网络
temporal_track自然语言时间解析⬜ 内置
parallel_segments多线程摄入⬜ 内置
encryption密码加密(.mv2e)⬜ 内置
symspell_cleanupPDF 文本修复⬜ 内置

推荐 Feature Flags 组合

场景推荐组合
最小化需求["lex"]
通用场景["lex", "vec"]
PDF 处理["lex", "vec", "pdf_extract"]
多模态(图片)["lex", "vec", "clip"]
音频处理["lex", "vec", "whisper"]
企业合规["lex", "vec", "encryption"]
# Cargo.toml 示例
[dependencies]
memvid-core = { version = "2.0", features = ["lex", "vec", "temporal_track", "encryption"] }

八、多模态支持

8.1 Whisper 音频转录

模型大小速度适用场景
whisper-small-en244 MB最慢最高精度(默认)
whisper-tiny-en75 MB均衡
whisper-tiny-en-q8k19 MB最快快速测试、资源受限
// 音频转录
use memvid_core::{WhisperConfig, WhisperTranscriber};

let config = WhisperConfig::default();
let transcriber = WhisperTranscriber::new(&config)?;
let result = transcriber.transcribe_file("audio.mp3")?;
println!("{}", result.text);

8.2 CLIP 视觉搜索

// 图片搜索(需要 clip feature)
cargo run --example clip_visual_search --features clip

8.3 文本嵌入模型(Text Embedding)

模型维度大小适用场景
BGE-small384~120MB默认,快速
BGE-base768~420MB更优质量
Nomic768~530MB多用途
GTE-large1024~1.3GB最高质量
// 本地嵌入
use memvid_core::text_embed::{LocalTextEmbedder, TextEmbedConfig};

let config = TextEmbedConfig::default();
let embedder = LocalTextEmbedder::new(config)?;
let embedding = embedder.embed_text("hello world")?;

九、使用场景

9.1 典型场景

场景说明
🤖 长期运行 AI 智能体跨会话持久记忆
🏢 企业知识库安全、可审计的内部知识
📴 离线优先 AI 系统无网络环境
💻 代码库理解项目上下文记忆
🎧 客户支持智能体对话历史追踪
🔄 工作流自动化流程记忆
📊 销售 Copilot客户互动记忆
🧑 个人知识助手私人笔记、想法
🏥 医疗/法律/金融敏感数据本地处理
🔍 可审计 AI 工作流决策可追溯
📜 合规数据管理HIPAA / GDPR / SOC2

9.2 不适用场景

场景原因替代方案
超大规模数据(PB级)单文件设计不适合超大规模使用专用向量数据库(Pinecone、Qdrant)
需要强一致性(CP系统)Memvid 采用最终一致性模型使用 etcd、Consul 等强一致性存储
需要复杂事务(ACID)单文件 Append-only 不支持事务回滚使用传统数据库
需要实时多人协作写入多进程并发写入受限使用 PostgreSQL + 向量扩展

9.3 企业合规场景

Memvid 支持 HIPAA、GDPR、SOC2 等合规要求:

# 加密 PHI 数据
memvid lock phi-data.mv2 --out phi-data.mv2e

# 记录访问日志
echo "$(date): Decrypting phi-data for user $USER" >> audit.log
memvid unlock phi-data.mv2e --out phi-data.mv2

# 重新加密
memvid lock phi-data.mv2 --out phi-data.mv2e
echo "$(date): Re-encrypted phi-data" >> audit.log

十、最佳实践

10.1 摄入优化

// 批量摄入(并行)
let opts = PutOptions::builder()
    .title("Bulk document")
    .parallel(true)  // 启用并行摄入
    .build();

// 大文档分块(建议 500-1000 字符/块)
for chunk in document.chunks(1000) {
    mem.put_bytes(chunk, &opts)?;
}

为什么需要分块? 大文档如果不做分块处理,单次查询可能返回过长的上下文,影响检索精度和响应速度。

10.2 搜索优化

// 精确搜索(使用 BM25)
let response = mem.search(SearchRequest {
    query: "exact phrase".into(),
    top_k: 10,
    snippet_chars: 200,
    use_bm25: true,      // BM25 精确匹配
    use_vector: false,   // 关闭向量搜索
    ..Default::default()
})?;

// 向量 + BM25 混合搜索
let response = mem.search(SearchRequest {
    query: "concept".into(),
    top_k: 10,
    hybrid: true,        // 混合搜索
    ..Default::default()
})?;

何时使用混合搜索? 混合搜索结合了 BM25 的精确匹配和向量搜索的语义理解能力,适用于需要兼顾关键词和语义的场景。

10.3 内存管理

// 压缩旧记忆
mem.compact()?;

// 设置过期时间
let opts = PutOptions::builder()
    .expires_at(1706236800)  // Unix timestamp
    .build();

// 清理过期数据
mem.cleanup()?;

10.4 数据备份

use std::fs;
use chrono::Local;

fn backup_memory(mem: &Memvid) -> Result<String, Box<dyn Error>> {
    let timestamp = Local::now().format("%Y%m%d_%H%M%S");
    let backup_path = format!("knowledge_{}.mv2", timestamp);
    fs::copy(mem.path(), &backup_path)?;
    println!("备份已保存: {}", backup_path);
    Ok(backup_path)
}

10.5 CI/CD 自动化备份

name: Backup Memory
on:
  schedule:
    - cron: '0 0 * * *'  # 每日凌晨

jobs:
  backup:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install Memvid
        run: curl -fsSL https://get.memvid.com | sh
      - name: Decrypt, update, re-encrypt
        env:
          MEMVID_PASSWORD: ${{ secrets.MEMVID_PASSWORD }}
        run: |
          echo "$MEMVID_PASSWORD" | memvid unlock memory.mv2e --password-stdin --out memory.mv2
          memvid put memory.mv2 --input ./new-data/
          echo "$MEMVID_PASSWORD" | memvid lock memory.mv2 --password-stdin --out memory.mv2e
      - name: Upload encrypted backup
        uses: actions/upload-artifact@v4
        with:
          name: encrypted-memory
          path: memory.mv2e

十一、API 参考

11.1 Rust SDK

创建与打开

use memvid_core::Memvid;

// 创建新记忆
let mem = Memvid::create("knowledge.mv2")?;

// 打开已有记忆
let mem = Memvid::open("knowledge.mv2")?;

// 打开加密记忆
let mem = Memvid::open_encrypted("secure.mv2e", "password")?;

// 创建加密记忆
let mem = Memvid::create_encrypted("secure.mv2e", "password")?;

写入操作

use memvid_core::{PutOptions, PutOptionsBuilder};

// 基本写入
mem.put_bytes(b"content")?;

// 带选项写入
let opts = PutOptionsBuilder::default()
    .title("Title")
    .uri("mv2://resource/id")
    .tag("key", "value")
    .expires_at(timestamp)
    .build();
mem.put_bytes_with_options(b"content", opts)?;

// 提交更改
mem.commit()?;

搜索操作

use memvid_core::{SearchRequest, SearchOptions};

// 基本搜索
let response = mem.search("query")?;

// 高级搜索
let request = SearchRequest {
    query: "query".into(),
    top_k: 10,
    snippet_chars: 200,
    use_bm25: true,
    use_vector: true,
    hybrid: true,
    as_of_frame: None,
    as_of_ts: None,
    ..Default::default()
};
let response = mem.search(request)?;

// 遍历结果
for hit in response.hits {
    println!("{}: {}", hit.title.unwrap_or_default(), hit.text);
}

时间旅行

// 按时间戳回溯
let past = mem.at_timestamp(1704067200)?;

// 按帧号回溯
let past = mem.at_frame(100)?;

// 创建分支
let branch = past.branch("experiment")?;

11.2 Python SDK

from memvid import Memvid, PutOptions

# 创建
mem = Memvid.create("knowledge.mv2")

# 写入
opts = PutOptions.builder().title("Title").build()
mem.put_bytes_with_options(b"content", opts)
mem.commit()

# 搜索
results = mem.find("query", k=10)

# 时间旅行
results = mem.find("query", as_of_frame=100)
results = mem.find("query", as_of_ts=1704067200)

11.3 Node.js SDK

import { create, use, PutOptions } from '@memvid/sdk';

// 创建
const mem = await create('knowledge.mv2');

// 写入
await mem.put({
  title: 'Title',
  label: 'tag',
  text: 'content'
});

// 搜索
const results = await mem.find('query', { k: 10 });

// 使用已有记忆
const existing = await use('alias', 'knowledge.mv2', { mode: 'auto' });

11.4 CLI 命令

命令说明示例
create创建记忆文件memvid create knowledge.mv2
put添加内容memvid put knowledge.mv2 --content "..."
find搜索memvid find knowledge.mv2 --query "..."
ask问答memvid ask knowledge.mv2 --query "..."
timeline时间线memvid timeline knowledge.mv2
inspect检查状态memvid inspect knowledge.mv2 --stats
compact压缩文件memvid compact knowledge.mv2
lock加密memvid lock knowledge.mv2 --out secure.mv2e
unlock解密memvid unlock secure.mv2e --out knowledge.mv2
recover恢复损坏文件memvid recover knowledge.mv2 --output recovered.mv2

十二、VS 其他方案

特性MemvidChromaDBPineconeQdrant
部署零(单文件)Docker云/DockerDocker
延迟 P500.025ms~10ms~50ms~5ms
吞吐量1372x1x1x
多模态
离线优先
模型无关⚠️⚠️⚠️
时间旅行
加密支持⚠️
许可证Apache-2.0Apache-2.0专有Apache-2.0

Memvid 的独特优势

  1. 零运维:单文件替代整个数据库系统
  2. 极速检索:sub-ms 级响应,无需网络
  3. 时间旅行:唯一支持历史状态回溯的记忆系统
  4. 多模态:内置音频(Whisper)、图像(CLIP)支持
  5. 企业合规:AES-256-GCM 加密,满足 HIPAA/GDPR

十三、故障排除

13.1 常见问题

问题可能原因解决方案
创建 .mv2 文件失败磁盘空间不足或权限问题检查磁盘空间 df -h,确认写入权限 ls -la
搜索返回空结果索引未构建或查询词不匹配确认已调用 commit(),尝试不同的查询词
内存占用过高索引未压缩或文件过大调用 compact() 压缩,定期清理过期数据
导入 Python SDK 失败版本不兼容确认 Python 版本 ≥ 3.8,尝试升级 pip
WAL 恢复失败文件严重损坏检查文件头部的 magic number 是否完整
时间旅行回溯失败时间戳不存在确认目标时间点前已有数据写入

13.2 性能问题排查

# 检查 .mv2 文件大小
ls -lh knowledge.mv2

# 检查磁盘空间
df -h /path/to/directory

# 监控进程内存使用情况
ps aux | grep memvid

# 检查文件 WAL 使用情况
memvid-cli inspect knowledge.mv2 --stats

性能优化建议

  • 定期执行 compact() 压缩文件
  • 使用 parallel_segments feature 加速大文件处理
  • 避免单块过大(建议 500-1000 字符)
  • 对于大规模数据,按时间范围分区存储

13.3 数据恢复

// 尝试恢复损坏的文件
let mem = Memvid::recover("knowledge.mv2")?;

match mem {
    Ok(recovered) => println!("恢复成功,共恢复 {} 条记录", recovered.len()),
    Err(e) => eprintln!("恢复失败: {:?}", e),
}
# CLI 恢复命令
memvid-cli recover knowledge.mv2 --output recovered.mv2

13.4 运行时警告处理

警告现象可能原因处理方式
WAL segment fullWAL 缓冲区已满尽快执行 commit() 持久化数据
Index rebuilding...索引正在后台重建等待完成后再进行大规模查询
Memory threshold exceeded内存使用超限调用 compact() 压缩或增加系统内存
Version mismatch detected文件版本与 SDK 不匹配升级到最新版本的 Memvid SDK

13.5 错误处理最佳实践

use memvid_core::{Memvid, PutOptions, SearchRequest, Error};

fn robust_search(mem: &Memvid, query: &str) -> Result<Vec<SearchHit>, Error> {
    let response = mem.search(SearchRequest {
        query: query.into(),
        top_k: 10,
        ..Default::default()
    })?;

    if response.hits.is_empty() {
        eprintln!("警告:未找到匹配结果,请尝试 broader 查询");
        return Ok(Vec::new());
    }

    Ok(response.hits)
}

fn safe_commit(mem: &mut Memvid) -> Result<(), Error> {
    match mem.commit() {
        Ok(_) => println!("提交成功"),
        Err(e) => {
            eprintln!("提交失败: {:?}", e);
            return Err(e);
        }
    }
    Ok(())
}

十四、FAQ

Q1:Memvid 和传统向量数据库的核心区别是什么?

核心区别在于架构理念

  • 传统向量数据库:将存储和计算分离,需要独立的服务进程
  • Memvid:将所有功能打包成单一文件,零运维

这意味着 Memvid 可以在嵌入式场景(IoT、边缘计算)中使用,而传统向量数据库做不到。

Q2:.mv2 文件有大小限制吗?

理论上没有硬性限制,但建议:

  • 单文件建议控制在 10GB 以内以获得最佳性能
  • 超过 10GB 时考虑按时间或主题分区
  • 使用 parallel_segments feature 优化大文件读取

Q3:Memvid 支持并发写入吗?

支持,但有约束

  • 单进程多线程读取:完全支持
  • 多进程并发写入:不支持 ❌,需要外部锁机制
  • 建议方案:使用分布式锁(如 Redis)或通过 API Server 统一写入

Q4:如何选择 BM25 和向量搜索?

场景推荐方式
精确关键词匹配BM25(use_bm25: true
语义相似性搜索向量搜索(use_vector: true
两者都需要混合搜索(hybrid: true

Q5:数据加密如何使用?

# 加密敏感数据
memvid lock phi-data.mv2 --out phi-data.mv2e

# 解密使用
memvid unlock phi-data.mv2e --out phi-data.mv2
// Rust 加密示例
let mem = Memvid::create_encrypted("secure.mv2e", "password")?;
let mem = Memvid::open_encrypted("secure.mv2e", "password")?;

注意:加密文件使用 .mv2e 扩展名,采用 AES-256-GCM + Argon2id 加密。

Q6:如何迁移已有数据到 Memvid?

from memvid import Memvid, PutOptions

# 从 JSONL 文件批量导入
mem = Memvid.create("imported.mv2")
with open("data.jsonl", "r") as f:
    for line in f:
        item = json.loads(line)
        mem.put_bytes(
            item["content"].encode(),
            PutOptions.builder().title(item["title"]).build()
        )
mem.commit()
print(f"成功导入记录")

Q7:如何实现数据的定期备份?

use std::fs;
use chrono::Local;

fn backup_memory(mem: &Memvid) -> Result<String, Box<dyn Error>> {
    let timestamp = Local::now().format("%Y%m%d_%H%M%S");
    let backup_path = format!("knowledge_{}.mv2", timestamp);
    fs::copy(mem.path(), &backup_path)?;
    println!("备份已保存: {}", backup_path);
    Ok(backup_path)
}

建议:生产环境建议每日自动备份,并保留至少 7 天的历史版本。

Q8:Memvid 适用于哪些合规场景?

Memvid 支持以下合规要求:

  • HIPAA:医疗数据加密和访问审计
  • GDPR:数据主体删除权(通过过期数据清理)
  • SOC2:访问控制和审计日志

十五、资源链接

15.1 官方资源

资源链接
🌐 官网https://www.memvid.com
📦 沙盒https://sandbox.memvid.com
📖 文档https://docs.memvid.com
💬 Discordhttps://discord.gg/2mynS7fcK7
📦 Crates.iohttps://crates.io/crates/memvid-core
📚 docs.rshttps://docs.rs/memvid-core

15.2 SDK 安装

# CLI
npm install -g memvid-cli

# Node.js
npm install @memvid/sdk

# Python
pip install memvid-sdk

# Rust
cargo add memvid-core

十六、总结

Memvid 是AI 智能体的记忆革命

维度说明
📦 单文件所有数据打包在 .mv2
极速0.025ms P50,1372x 吞吐
🤖 模型无关任意 AI 模型通用
🌐 离线优先完全本地运行
🔄 版本化时间旅行调试
🔒 企业级AES-256-GCM 加密

适用场景:AI 智能体记忆、企业知识库、离线优先系统、合规数据管理

不适用场景:超大规模数据(PB级)、强一致性需求、实时多人协作写入


进阶路径

级别主题推荐资源
⭐ 入门基础存储和检索官方沙盒(sandbox.memvid.com)
⭐⭐ 进阶时间旅行和分支docs.memvid.com/time-travel
⭐⭐⭐ 深入自定义 Feature Flagsdocs.memvid.com/feature-flags
⭐⭐⭐⭐ 专家性能调优和内核阅读GitHub 源码 / Discord 社区

练习

  1. 基础练习:使用 Python SDK 创建一个记忆文件,存储 3 条不同主题的笔记,然后使用关键词检索。
  2. 进阶练习:利用时间旅行功能,回溯到某个历史时间点,查看当时的记忆状态。
  3. 挑战练习:结合 Whisper 功能,将一段音频转录后存入 Memvid,并实现基于内容的检索。

自测检查清单

完成以下检查,确认你已经掌握 Memvid 的核心概念:

基础概念

  • 能解释什么是 Smart Frames 及其设计优势
  • 能说明 .mv2 文件的内部结构(Header、WAL、Data Segments、索引)
  • 能对比 Memvid 与传统 RAG 架构的差异

基础操作

  • 能在 Rust / Python / CLI 中创建和打开 .mv2 文件
  • 能使用 put_bytes 添加记忆,使用 commit() 提交
  • 能使用 search 进行关键词检索
  • 能处理常见的错误(文件创建失败、搜索空结果等)

进阶功能

  • 能使用时间旅行功能回溯历史状态
  • 能创建记忆分支进行实验性推理
  • 能根据场景选择合适的 Feature Flags 组合
  • 能使用 BM25 和向量搜索分别进行精确匹配和语义搜索

运维能力

  • 能进行性能问题排查(内存、延迟)
  • 能使用 WAL 进行数据恢复
  • 能实现数据的定期备份
  • 知道如何迁移已有数据到 Memvid

🦞 本文由钳岳星君撰写,基于 Memvid (14.8k Stars)