memvid/memvid
GitHub: memvid/memvid
Memvid 是一个用 Rust 编写的 AI Agent 单文件记忆层,将向量检索、全文搜索和时间索打包为便携式文件,替代复杂的 RAG 管道和向量数据库,实现即时检索和长期记忆。
Stars: 13329 | Forks: 1117
Memvid 是一个面向 AI 智能体的单文件记忆层,具备即时检索和长期记忆功能。
持久化、版本化且便携的记忆存储,无需数据库。
官网
·
试用沙盒
·
文档
·
讨论
## 基准测试亮点
**🚀 准确率高于任何其他记忆系统:** 在 LoCoMo 上超越 SOTA +35%,拥有同类最佳的长程对话回忆与推理能力
**🧠 卓越的多跳与时间推理能力:** 多跳推理 +76%,时间推理 +56%(对比行业平均水平)
**⚡ 规模化下的超低延迟:** P50 为 0.025ms,P99 为 0.075ms,吞吐量比标准方案高 1,372 倍
**🔬 完全可复现的基准测试:** LoCoMo(10 段约 26K token 的对话),开源评估,LLM-as-Judge
## Memvid 是什么?
Memvid 是一个便携式 AI 记忆系统,它将您的数据、embeddings、搜索结构和元数据打包进单个文件中。
无需运行复杂的 RAG 流程或基于服务器的向量数据库,Memvid 支持直接从文件进行快速检索。
其结果是一个模型无关、无需基础设施的记忆层,赋予 AI 智能体持久的长期记忆,可随身携带至任何地方。
## 什么是 Smart Frames?
Memvid 从视频编码中汲取灵感,并非为了存储视频,而是为了**将 AI 记忆组织为一种仅追加、超高效的 Smart Frames 序列。**
Smart Frame 是一个不可变单元,存储内容以及时间戳、校验和和基本元数据。
Frame 以一种允许高效压缩、索引和并行读取的方式进行分组。
这种基于 Frame 的设计实现了:
- 仅追加写入,无需修改或损坏现有数据
- 对过去记忆状态的查询
- 时间轴式的知识演变检查
- 通过已提交的不可变 Frame 实现崩溃安全
- 利用 adapted 自视频编码的技术进行高效压缩
最终结果是单个文件,其行为类似于 AI 系统的可倒带记忆时间轴。
## 核心概念
- **动态记忆引擎 (Living Memory Engine)**
跨会话持续追加、分支和演化记忆。
- **Capsule 上下文 (`.mv2`)**
自包含、可共享的记忆 Capsule,包含规则和有效期。
- **时间旅行调试**
倒带、重放或分支任何记忆状态。
- **智能召回**
低于 5ms 的本地记忆访问,具备预测性缓存。
- **编解码智能**
随时间自动选择和升级压缩算法。
## 使用场景
Memvid 是一个便携、无服务器的记忆层,为 AI 智能体提供持久记忆和快速召回。因为它具有模型无关性、多模态性且可完全离线工作,开发者正将 Memvid 用于各种现实应用中。
- 长时运行 AI 智能体
- 企业知识库
- 优先离线 AI 系统
- 代码库理解
- 客户支持智能体
- 工作流自动化
- 销售与营销副驾驶
- 个人知识助手
- 医疗、法律和金融智能体
- 可审计与可调试的 AI 工作流
- 自定义应用
## SDK 与 CLI
使用您首选的语言运行 Memvid:
| Package | 安装 | 链接 |
| --------------- | --------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| **CLI** | `npm install -g memvid-cli` | [](https://www.npmjs.com/package/memvid-cli) |
| **Node.js SDK** | `npm install @memvid/sdk` | [](https://www.npmjs.com/package/@memvid/sdk) |
| **Python SDK** | `pip install memvid-sdk` | [](https://pypi.org/project/memvid-sdk/) |
| **Rust** | `cargo add memvid-core` | [](https://crates.io/crates/memvid-core) |
## 安装
### 环境要求
- **Rust 1.85.0+** — 从 [rustup.rs](https://rustup.rs) 安装
### 添加到您的项目
```
[dependencies]
memvid-core = "2.0"
```
### 特性标志
| 特性 | 描述 |
| ------------------- | ---------------------------------------------------------------- |
| `lex` | 基于 BM25 排序的全文搜索 (Tantivy) |
| `pdf_extract` | 纯 Rust PDF 文本提取 |
| `vec` | 向量相似度搜索 (HNSW + 通过 ONNX 实现的本地文本 embeddings) |
| `clip` | 用于图像搜索的 CLIP 视觉 embeddings |
| `whisper` | 使用 Whisper 进行音频转录 |
| `api_embed` | 云端 API embeddings (OpenAI) |
| `temporal_track` | 自然语言日期解析("last Tuesday") |
| `parallel_segments` | 多线程摄取 |
| `encryption` | 基于密码的加密 Capsule (.mv2e) |
| `symspell_cleanup` | 健壮的 PDF 文本修复(修复 "emp lo yee" -> "employee") |
根据需要启用特性:
```
[dependencies]
memvid-core = { version = "2.0", features = ["lex", "vec", "temporal_track"] }
```
## 快速开始
```
use memvid_core::{Memvid, PutOptions, SearchRequest};
fn main() -> memvid_core::Result<()> {
// Create a new memory file
let mut mem = Memvid::create("knowledge.mv2")?;
// Add documents with metadata
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()?;
// Search
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(())
}
```
## 构建
克隆仓库:
```
git clone https://github.com/memvid/memvid.git
cd memvid
```
以调试模式构建:
```
cargo build
```
以发布模式构建(已优化):
```
cargo build --release
```
使用特定特性构建:
```
cargo build --release --features "lex,vec,temporal_track"
```
## 运行测试
运行所有测试:
```
cargo test
```
运行测试并显示输出:
```
cargo test -- --nocapture
```
运行特定测试:
```
cargo test test_name
```
仅运行集成测试:
```
cargo test --test lifecycle
cargo test --test search
cargo test --test mutation
```
## 示例
`examples/` 目录包含可运行的示例:
### 基本用法
演示创建、存入、搜索和时间轴操作:
```
cargo run --example basic_usage
```
### PDF 摄取
摄取并搜索 PDF 文档(使用 "Attention Is All You Need" 论文):
```
cargo run --example pdf_ingestion
```
### CLIP 视觉搜索
使用 CLIP embeddings 进行图像搜索(需要 `clip` 特性):
```
cargo run --example clip_visual_search --features clip
```
### Whisper 转录
音频转录(需要 `whisper` 特性):
```
cargo run --example test_whisper --features whisper -- /path/to/audio.mp3
```
**可用模型:**
| Model | 大小 | 速度 | 用例 |
| --------------------- | ------ | ------- | ----------------------------------- |
| `whisper-small-en` | 244 MB | 最慢 | 最佳准确率(默认) |
| `whisper-tiny-en` | 75 MB | 快 | 均衡 |
| `whisper-tiny-en-q8k` | 19 MB | 最快 | 快速测试,资源受限 |
**模型选择:**
```
# 默认 (FP32 small,最高准确度)
cargo run --example test_whisper --features whisper -- audio.mp3
# Quantized tiny (体积减小 75%,速度更快)
MEMVID_WHISPER_MODEL=whisper-tiny-en-q8k cargo run --example test_whisper --features whisper -- audio.mp3
```
**编程配置:**
```
use memvid_core::{WhisperConfig, WhisperTranscriber};
// Default FP32 small model
let config = WhisperConfig::default();
// Quantized tiny model (faster, smaller)
let config = WhisperConfig::with_quantization();
// Specific model
let config = WhisperConfig::with_model("whisper-tiny-en-q8k");
let transcriber = WhisperTranscriber::new(&config)?;
let result = transcriber.transcribe_file("audio.mp3")?;
println!("{}", result.text);
```
## 文本 Embedding 模型
`vec` 特性包含使用 ONNX 模型的本地文本 embedding 支持。在使用本地文本 embeddings 之前,您需要手动下载模型文件。
### 快速开始:BGE-small(推荐)
下载默认的 BGE-small 模型(384 维,快速且高效):
```
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
```
### 可用模型
| Model | 维度 | 大小 | 最适合 |
| ----------------------- | ---------- | ------ | --------------- |
| `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;
// Use default model (BGE-small)
let config = TextEmbedConfig::default();
let embedder = LocalTextEmbedder::new(config)?;
let embedding = embedder.embed_text("hello world")?;
assert_eq!(embedding.len(), 384);
// Use different model
let config = TextEmbedConfig::bge_base();
let embedder = LocalTextEmbedder::new(config)?;
```
请参阅 `examples/text_embedding.rs` 以获取包含相似度计算和搜索排序的完整示例。
### 模型一致性
为了防止意外的模型混用(例如,使用 OpenAI embeddings 查询 BGE-small 索引),您可以将 Memvid 实例显式绑定到特定的模型名称:
```
// Bind the index to a specific model.
// If the index was previously created with a different model, this will return an error.
mem.set_vec_model("bge-small-en-v1.5")?;
```
此绑定是持久的。一旦设置,未来尝试使用不同模型名称的操作将快速失败并抛出 `ModelMismatch` 错误。
## API Embeddings (OpenAI)
`api_embed` 特性支持使用 OpenAI API 生成云端 embeddings。
### 设置
设置您的 OpenAI API key:
```
export OPENAI_API_KEY="sk-..."
```
### 用法
```
use memvid_core::api_embed::{OpenAIConfig, OpenAIEmbedder};
use memvid_core::types::embedding::EmbeddingProvider;
// Use default model (text-embedding-3-small)
let config = OpenAIConfig::default();
let embedder = OpenAIEmbedder::new(config)?;
let embedding = embedder.embed_text("hello world")?;
assert_eq!(embedding.len(), 1536);
// Use higher quality model
let config = OpenAIConfig::large(); // text-embedding-3-large (3072 dims)
let embedder = OpenAIEmbedder::new(config)?;
```
### 可用模型
| Model | 维度 | 最适合 |
| ------------------------ | ---------- | -------------------------- |
| `text-embedding-3-small` | 1536 | 默认,最快,最便宜 |
| `text-embedding-3-large` | 3072 | 最高质量 |
| `text-embedding-ada-002` | 1536 | 旧版模型 |
请参阅 `examples/openai_embedding.rs` 以获取完整示例。
## 文件格式
所有内容都存储在单个 `.mv2` 文件中:
```
┌────────────────────────────┐
│ Header (4KB) │ Magic, version, capacity
├────────────────────────────┤
│ Embedded WAL (1-64MB) │ Crash recovery
├────────────────────────────┤
│ Data Segments │ Compressed frames
├────────────────────────────┤
│ Lex Index │ Tantivy full-text
├────────────────────────────┤
│ Vec Index │ HNSW vectors
├────────────────────────────┤
│ Time Index │ Chronological ordering
├────────────────────────────┤
│ TOC (Footer) │ Segment offsets
└────────────────────────────┘
```
绝无 `.wal`、`.lock`、`.shm` 或附属文件。
有关完整的文件格式规范,请参阅 [MV2_SPEC.md](MV2_SPEC.md)。
## 支持
有问题或反馈?
邮箱:contact@memvid.com
**点亮 ⭐ 以表示支持**
## 许可证
Apache License 2.0 — 详情请参阅 [LICENSE](LICENSE) 文件。
标签:AI代理, CNCF毕业项目, LangChain, Memvid, Python, RAG替代方案, Ruby, Rust, 人工智能, 单文件存储, 即时检索, 可视化界面, 向量检索, 大模型工具, 持久化存储, 无后门, 无数据库, 无服务器, 本地优先, 用户模式Hook绕过, 知识库, 网络流量审计, 记忆层, 语义搜索, 轻量级, 轻量级存储, 通知系统, 长期记忆