Memvid 单文件 AI 记忆层深度指南:.mv2 格式、智能帧与 Rust 实战
【免费下载链接】memvidMemory layer for AI Agents. Replace complex RAG pipelines with a serverless, single-file memory layer. Give your agents instant retrieval and long-term memory.项目地址: https://gitcode.com/GitHub_Trending/me/memvid
Memvid 是一个面向 AI Agent 的单文件内存层:数据、嵌入向量、全文检索索引、时序索引与元数据全部打包进一个.mv2文件,无需数据库、无需外部服务,即可获得即时的本地检索与长期记忆。本文以官方日语版 README(docs/i18n/README.ja.md)为骨架,结合仓库源码与 MV2_SPEC.md 格式规范,完整讲解其设计理念、功能特性、安装配置、Rust API 实战、构建测试、嵌入模型部署与单文件格式细节,读完即可上手构建自己的可移植 AI 记忆系统。
一、Memvid 是什么?
Memvid 是一个可移植的 AI 记忆系统,它把数据、嵌入向量、检索结构和元数据封装进单个文件。与维护复杂 RAG 管道或基于服务器的向量数据库不同,Memvid 允许直接从文件进行高速检索。
其结果是:一个模型无关、无需基础设施的记忆层,让 AI Agent 拥有随处可用的持久长期记忆。官方 README 将其定位为 "Memory layer for AI Agents",替代复杂 RAG 管道,提供 serverless 的单文件记忆层。
核心概念(コアコンセプト)
| 概念 | 说明 | 源码对应 |
|---|---|---|
| Living Memory Engine(成长式记忆引擎) | 跨会话持续追加、分叉、演化记忆 | src/memvid/mutation.rs(put/commit 系列) |
カプセル・コンテキスト(.mv2胶囊) | 可设置规则与有效期的自包含、可共享记忆胶囊 | MV2_SPEC.md 格式规范 |
| タイムトラベル・デバッグ(时间旅行调试) | 可回退、重放或分叉任意记忆状态 | src/replay/ 与SearchRequest.as_of_frame/as_of_ts |
| スマート・リコール(智能召回) | 预测式缓存,本地记忆访问 < 5ms | src/memvid/sketch.rs(sketch 预过滤) |
| コーデック・インテリジェンス(编解码智能) | 自动选择压缩方式,随版本升级 | Frameencoding字段(Raw/Zstd/Lz4) |
智能帧(Smart Frames)设计
Memvid 借鉴视频编码技术(不是为了存视频),而是以追加(append-only)优化的高效智能帧序列组织 AI 记忆:
- 智能帧是不可变(immutable)单元,内容连同时间戳、校验和、基础元数据一起存储;
- 帧被分组以便高效压缩、索引与并行读取;
- 支持对历史记忆状态的查询(time-travel);
- 以时间线形式检查知识如何演化;
- 通过已提交的不可变帧实现崩溃容错;
- 借鉴视频编码的高效压缩。
最终产物是一个单一文件,如同 AI 系统的"可回退记忆时间线"。核心 API 支持:
- 追加数据而不修改/损坏已有数据(
put_bytes/put_bytes_with_options); - 对历史状态查询(
as_of_frame/as_of_ts); - 时间线检查(
timeline())。
使用场景(ユースケース)
Memvid 为 AI Agent 提供持久记忆与快速召回,模型无关、多模态、完全离线。官方列出的典型场景包括:长期运行的 AI Agent、企业知识库、离线优先 AI 系统、代码库理解、客户支持 Agent、工作流自动化、销售/营销辅助、个人知识助手、医疗/法律/金融垂直 Agent、可审计可调试的 AI 工作流、以及自定义应用。
二、SDK 与 CLI 一览
| 包 | 安装方式 | 说明 |
|---|---|---|
| CLI | npm install -g memvid-cli | 命令行工具 |
| Node.js SDK | npm install @memvid/sdk | Node 客户端 |
| Python SDK | pip install memvid-sdk | Python 客户端 |
| Rust | cargo add memvid-core | 核心库(本仓库) |
本文聚焦 Rust 核心库memvid-core,其版本信息见 Cargo.toml(当前2.0.140,edition 2024,rust-version 1.85.0,Apache-2.0)。
三、安装与环境要求(Rust)
前提条件
- Rust 1.85.0+(由 Cargo.toml 中
rust-version = "1.85.0"与 rust-toolchain.toml 锁定),可从 rustup 安装。
添加到项目
[dependencies] memvid-core = "2.0"功能特性(Feature Flags)
| 特性 | 说明 | 底层依赖(见 Cargo.toml[features]) |
|---|---|---|
lex | 基于 BM25 的全文检索(Tantivy) | dep:tantivy |
pdf_extract | 纯 Rust PDF 文本提取 | dep:pdf-extract |
vec | 向量相似度检索(HNSW + ONNX 本地文本嵌入) | dep:ort、dep:hnsw、dep:ndarray、dep:tokenizers、dep:space等 |
clip | CLIP 视觉嵌入(图像检索) | vec+dep:image、dep:rayon |
whisper | Whisper 语音转写(Candle 推理) | dep:symphonia、dep:candle-*、dep:hf-hub等 |
temporal_track | 自然语言日期解析(如 "last Tuesday") | —(纯逻辑实现) |
parallel_segments | 多线程数据摄入 | dep:num_cpus、dep:crossbeam-channel |
encryption | 基于密码的加密胶囊(.mv2e) | dep:argon2、dep:aes-gcm、dep:zeroize |
此外还有default = ["lex", "pdf_extract", "simd"],以及extractous、pdf_oxide、pdfium、temporal_enrich、logic_mesh(DistilBERT-NER 实体关系图)、replay、symspell_cleanup、api_embed(OpenAI 等 API 嵌入)、simd、metal/cuda/accelerate(Whisper GPU 加速)等可选特性。按需启用:
[dependencies] memvid-core = { version = "2.0", features = ["lex", "vec", "temporal_track"] }注意:
vec、clip、whisper等特性会引入较重的 ML 依赖链(ONNX Runtime / Candle),首次编译耗时较长。
四、快速上手(Quick Start)
官方快速上手示例(与 examples/basic_usage.rs 一致的模式):
use memvid_core::{Memvid, PutOptions, SearchRequest}; fn main() -> memvid_core::Result<()> { // 创建新的记忆文件 let mut mem = Memvid::create("knowledge.mv2")?; // 带元数据追加文档 let opts = PutOptions::builder() .title("Meeting Notes") .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(()) }核心 API 与源码印证
创建与打开:Memvid::create(path)创建带内嵌 WAL 与空 TOC 的新.mv2文件,并在句柄生命周期内独占锁定文件(见 src/memvid/lifecycle.rs);Memvid::open(path)用于重新打开已有文件。
写入:put_bytes(payload)追加原始字节;put_bytes_with_options(payload, options)附带元数据/选项(src/memvid/mutation.rs)。写入后必须调用commit()持久化(CommitMode::Full)。
PutOptions 完整参数(见 src/types/options.rs):
| 参数 | 默认 | 说明 |
|---|---|---|
timestamp | None | 自定义时间戳 |
track/kind | None | 轨道/类型标签 |
uri | None | mv2://层级路径 |
title | None | 展示标题 |
tags/labels | 空 | 标签与分类 |
extra_metadata | 空 | 自定义键值元数据 |
enable_embedding | false | 是否生成本地嵌入 |
auto_tag | true | 自动打标签 |
extract_dates | true | 自动提取日期 |
extract_triplets | true | 抽取主谓宾三元组(MemoryCards,O(1) 实体查询与图查询) |
no_raw | false | 不存原始二进制,仅存提取文本 + SHA256 |
dedup | false | 按 BLAKE3 内容哈希去重,重复则返回已存在帧序号 |
instant_index | true | 即时索引(WAL 追加后软提交,<1s 可搜) |
extraction_budget_ms | 350ms | 文本提取时间预算,0 表示无预算 |
tag(key, value)同时写入extra_metadata与tags,这与 MV2 帧的tags: Map<String, String>结构对应。
检索:mem.search(SearchRequest{..})返回SearchResponse。完整字段见 src/types/search.rs:
query、top_k、snippet_chars、cursor(分页游标);uri/scope(限定 URI 或命名空间,如mv2://docs/);as_of_frame/as_of_ts(时间旅行:只看某一帧/时间点之前的记忆);no_sketch(禁用 sketch 预过滤);acl_context/acl_enforcement_mode(audit审计 /enforce强制执行);temporal(temporal_track特性下的自然语言时间过滤)。
响应包含hits(含frame_id、uri、title、text片段、score、metadata)、total_hits、elapsed_ms、engine(Tantivy / LexFallback / Hybrid)与next_cursor。若未启用lex特性,search会返回LexNotEnabled错误(src/memvid/search/mod.rs)。
五、构建(Build)
克隆仓库后:
git clone https://github.com/memvid/memvid.git cd memvid- 调试构建:
cargo build - 发布构建(优化):
cargo build --release - 指定特性构建:
cargo build --release --features "lex,vec,temporal_track"
当前仓库的仓库地址为
GitHub_Trending/me/memvid,克隆命令中的地址请以你实际拉取到的远端为准。
六、运行测试(Testing)
# 全部测试 cargo test # 带标准输出 cargo test -- --nocapture # 指定测试 cargo test test_name # 仅集成测试 cargo test --test lifecycle cargo test --test search cargo test --test mutation仓库 tests/ 下还包含crash_recovery.rs(崩溃恢复)、doctor_recovery.rs(doctor 修复)、encryption_capsule.rs(加密胶囊)、replay_integrity.rs(时间旅行完整性)、single_file.rs(单文件保证)、xlsx_structured.rs等集成测试,可直接验证上述 API 行为。
七、可运行示例(Examples)
examples/ 目录提供开箱即用的示例代码:
| 示例 | 命令 | 说明 |
|---|---|---|
| 基本用法 | cargo run --example basic_usage | create / put / search / timeline / reopen / verify 全流程 |
| PDF 摄入 | cargo run --example pdf_ingestion | 摄入论文 PDF(如 "Attention Is All You Need")并检索 |
| CLIP 图像检索 | cargo run --example clip_visual_search --features clip | 基于 CLIP 嵌入的图像搜索 |
| Whisper 转写 | cargo run --example test_whisper --features whisper | 音频转文字 |
| 文本嵌入 | cargo run --example text_embedding --features vec | 完整嵌入、相似度计算与检索排序 |
| OpenAI 嵌入 | cargo run --example openai_embedding --features api_embed | API 型嵌入(需网络) |
basic_usage 详解
examples/basic_usage.rs 展示了完整生命周期:
Memvid::create(&path)创建记忆文件;put_bytes/put_bytes_with_options写入多篇文档(title、uri、tags);mem.commit()提交持久化;mem.stats()查看frame_count及 lex/vec/time 索引是否存在;mem.search(SearchRequest{..})检索,支持scope: Some("mv2://docs/")限定范围;mem.timeline(TimelineQuery::default())按时间顺序浏览全部帧;drop(mem)后Memvid::open(&path)重新打开,验证持久化;Memvid::verify(&path, false)校验文件完整性。
pdf_ingestion 详解
examples/pdf_ingestion.rs 演示将 PDF 二进制直接交给put_bytes_with_options:Memvid 会自动完成文本提取(pdf_extract/pdf_oxide等特性)、分块(chunking)、索引,随后用 "attention mechanism"、"transformer architecture" 等查询即可命中论文内容。PDF 提取后还可用symspell_cleanup特性修复断词问题(见 Cargo.toml 注释)。
八、文本嵌入模型(Text Embedding Models)
vec特性通过ONNX Runtime 本地推理生成文本嵌入(src/text_embed.rs),完全离线、无需云 API。使用前需手动下载模型文件。
推荐:BGE-small(默认)
mkdir -p ~/.cache/memvid/text-models # 下载 ONNX 模型 curl -L 'https://huggingface.co/BAAI/bge-small-en-v1.5/resolve/main/onnx/model.onnx' \ -o ~/.cache/memvid/text-models/bge-small-en-v1.5.onnx # 下载 tokenizer curl -L 'https://huggingface.co/BAAI/bge-small-en-v1.5/resolve/main/tokenizer.json' \ -o ~/.cache/memvid/text-models/bge-small-en-v1.5_tokenizer.json模型列表(源码注册表一致,见 src/text_embed.rsTEXT_EMBED_MODELS)
| 模型 | 维度 | 大小 | 适用场景 |
|---|---|---|---|
bge-small-en-v1.5 | 384 | ~120MB | 默认(快、轻量) |
bge-base-en-v1.5 | 768 | ~420MB | 需要更高精度 |
nomic-embed-text-v1.5 | 768 | ~530MB | 多用途任务 |
gte-large | 1024 | ~1.3GB | 最高精度 |
其他模型下载
# BGE-base (768 维) curl -L 'https://huggingface.co/BAAI/bge-base-en-v1.5/resolve/main/onnx/model.onnx' \ -o ~/.cache/memvid/text-models/bge-base-en-v1.5.onnx curl -L 'https://huggingface.co/BAAI/bge-base-en-v1.5/resolve/main/tokenizer.json' \ -o ~/.cache/memvid/text-models/bge-base-en-v1.5_tokenizer.json # Nomic (768 维) curl -L 'https://huggingface.co/nomic-ai/nomic-embed-text-v1.5/resolve/main/onnx/model.onnx' \ -o ~/.cache/memvid/text-models/nomic-embed-text-v1.5.onnx curl -L 'https://huggingface.co/nomic-ai/nomic-embed-text-v1.5/resolve/main/tokenizer.json' \ -o ~/.cache/memvid/text-models/nomic-embed-text-v1.5_tokenizer.json # GTE-large (1024 维) curl -L 'https://huggingface.co/thenlper/gte-large/resolve/main/onnx/model.onnx' \ -o ~/.cache/memvid/text-models/gte-large.onnx curl -L 'https://huggingface.co/thenlper/gte-large/resolve/main/tokenizer.json' \ -o ~/.cache/memvid/text-models/gte-large_tokenizer.json在代码中使用
use memvid_core::text_embed::{LocalTextEmbedder, TextEmbedConfig}; use memvid_core::types::embedding::EmbeddingProvider; // 使用默认模型 (BGE-small) let config = TextEmbedConfig::default(); let embedder = LocalTextEmbedder::new(config)?; let embedding = embedder.embed_text("hello world")?; assert_eq!(embedding.len(), 384); // 更换模型 let config = TextEmbedConfig::bge_base(); let embedder = LocalTextEmbedder::new(config)?;源码补充说明(src/text_embed.rs):
TextEmbedConfig::default()默认模型目录为系统缓存目录下的memvid/text-models,与上述~/.cache/memvid/text-models一致;- 提供便捷构造函数:
bge_small()、bge_base()、nomic()、gte_large(); - 所有模型
max_tokens = 512(BERT 系标准序列长度); - 内置嵌入缓存(默认容量 1000 条)与模型空闲卸载(5 分钟无活动自动卸载);
- macOS 上会自动抑制 ONNX Runtime 初始化时的 "Context leak detected" 噪音警告。
完整示例(相似度计算 + 检索排序)见 examples/text_embedding.rs。
九、单文件格式(.mv2 文件构成)
一切内容都收拢在单个.mv2文件中:
┌────────────────────────────┐ │ ヘッダー (4KB) │ 魔数、版本、容量 ├────────────────────────────┤ │ 組み込みWAL (1-64MB) │ 崩溃恢复 ├────────────────────────────┤ │ データセグメント │ 压缩帧 ├────────────────────────────┤ │ 全文検索インデックス (Lex) │ Tantivy 全文检索 ├────────────────────────────┤ │ ベクトルインデックス (Vec) │ HNSW 向量 ├────────────────────────────┤ │ タイムインデックス │ 时序排序 ├────────────────────────────┤ │ TOC (フッター) │ 段偏移目录 └────────────────────────────┘不生成任何.wal、.lock、.shm等侧车文件。完整格式规范见 MV2_SPEC.md(当前版本 2.1),以下为要点。
头部(Header,4096 字节)
前 4KB 固定布局(全部多字节整数为 little-endian):magic(MV2\0)、version、spec_major=2、spec_minor=1、footer_offset(TOC 偏移)、wal_offset(恒为 4096)、wal_size、wal_checkpoint_pos、wal_sequence、toc_checksum(TOC 段的 SHA-256)及 4016 字节保留区。
内嵌 WAL(崩溃恢复)
WAL 从字节 4096 开始,容量随目标文件大小递增:
| 文件容量 | WAL 大小 |
|---|---|
| < 100 MB | 1 MB |
| < 1 GB | 4 MB |
| < 10 GB | 16 MB |
| >= 10 GB | 64 MB |
WAL 条目格式:sequence(u64) +entry_type(u8) +payload_len(u32) +payload+checksum(CRC32)。条目类型:0x01帧追加、0x02帧更新、0x03帧删除(墓碑)、0x04索引更新。检查点(checkpoint)在WAL 占用达 75% 或每 1000 笔事务时触发,将 WAL 条目刷入数据段;seal()强制立即检查点;恢复时重放sequence > wal_checkpoint_pos的条目。put_many批量模式还支持wal_pre_size_bytes预分配 WAL 以避免批量中途扩容导致的 O(file_size) 搬移(见 src/types/options.rs)。
帧结构(Frame)
每个帧表示一条内容,字段包括:frame_id(u64 单调递增)、uri(mv2://层级路径)、title、created_at(Unix 秒)、encoding(0=Raw、1=Zstd、2=Lz4)、payload(压缩内容)、payload_checksum(未压缩负载 SHA-256)、tags(键值对)、status(0=active、1=tombstoned)。
数据段与段类型
帧按段分组存储:0x01数据段(帧)、0x02Lex 索引段、0x03Vec 索引段、0x04时间索引段。段头含 magic、version、segment_type、frame_count、compressed 标志与 32 字节校验和。
时间索引
启用了时间旅行(time-travel)的时序查询。条目为frame_id(8) +timestamp(8) +offset(8,数据段内字节偏移),魔数MVTI。对应 src/io/time_index.rs 与 src/memvid/timeline.rs。
Lex 全文索引(Tantivy)
启用lex特性后内嵌 Tantivy 索引段,索引字段:body、title、uri、tags(扁平化),支持BM25 排序、短语查询、布尔操作符、日期范围过滤(对应 src/search/tantivy/ 与 src/lex.rs 的 LexFallback 实现)。
Vec 向量索引(HNSW)
启用vec特性后内嵌 HNSW 索引段:维度 384(BGE-small)、余弦相似度、M=16、ef_construction=200(对应 src/vec.rs,另提供 src/vec_pq.rs 的 PQ 量化版本)。
TOC(目录,文件末尾)
TOC 是最后一个段,由头部footer_offset指向:magicMVTC、version、segment_count、SegmentDescriptor[](segment_type + offset + length + SHA-256)、IndexManifests 与 32 字节校验和。自描述:仅凭 TOC 即可解析整个文件。
URI 方案
所有内容通过mv2://URI 寻址:mv2://[track/][path/]name,例如mv2://meetings/2024-01-15、mv2://docs/api/reference.md、mv2://media/photo.png。
格式不变量(Invariants)
- 单文件保证:无
.wal、.shm、.lock等侧车文件; - 只追加帧:已有帧绝不在原位置修改;
- 确定性:相同 API 调用产生相同字节;
- 崩溃安全:WAL 保证异常终止下的持久性;
- 自描述:TOC 包含解析文件所需的全部元数据。
版本历史
| 版本 | 变更 |
|---|---|
| 2.1 | 当前版本,内嵌 WAL、temporal track 支持 |
| 2.0 | 单文件格式,移除外部索引 |
| 1.x | 遗留格式(已弃用) |
十、进阶能力:加密胶囊(.mv2e)与时间旅行
密码加密胶囊(encryption特性)
启用encryption特性后(依赖 Argon2 + AES-GCM + zeroize),可将.mv2锁定为密码加密的.mv2e胶囊:lock_file加密、unlock_file解密(流式/一次性两种模式,解密后校验MV2\0魔数并原子写入),详见 src/encryption/capsule.rs 与 src/encryption/。对应集成测试 tests/encryption_capsule.rs。
时间旅行与重放(replay特性)
SearchRequest.as_of_frame/as_of_ts让检索"回到过去"只看某时间点之前的记忆;src/replay/ 提供完整的会话重放引擎,支持对任意记忆状态回退、重放或分叉——这正是"タイムトラベル・デバッグ"的落地实现。相关验证见 tests/replay_integrity.rs。
十一、支持与许可
- 反馈与支持邮箱:contact@memvid.com
- 许可:Apache License 2.0,详见 LICENSE。
【免费下载链接】memvidMemory layer for AI Agents. Replace complex RAG pipelines with a serverless, single-file memory layer. Give your agents instant retrieval and long-term memory.项目地址: https://gitcode.com/GitHub_Trending/me/memvid
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考