memvid/memvid

GitHub: memvid/memvid

Memvid 是一个用 Rust 编写的 AI Agent 单文件记忆层,将向量检索、全文搜索和时间索打包为便携式文件,替代复杂的 RAG 管道和向量数据库,实现即时检索和长期记忆。

Stars: 13329 | Forks: 1117

Social Cover (9)

memvid%2Fmemvid | Trendshift

Memvid 是一个面向 AI 智能体的单文件记忆层,具备即时检索和长期记忆功能。
持久化、版本化且便携的记忆存储,无需数据库。

官网 · 试用沙盒 · 文档 · 讨论

Crates.io docs.rs License

Stars Forks Issues Discord

## 基准测试亮点 **🚀 准确率高于任何其他记忆系统:** 在 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` | [![npm](https://img.shields.io/npm/v/memvid-cli?style=flat-square)](https://www.npmjs.com/package/memvid-cli) | | **Node.js SDK** | `npm install @memvid/sdk` | [![npm](https://img.shields.io/npm/v/@memvid/sdk?style=flat-square)](https://www.npmjs.com/package/@memvid/sdk) | | **Python SDK** | `pip install memvid-sdk` | [![PyPI](https://img.shields.io/pypi/v/memvid-sdk?style=flat-square)](https://pypi.org/project/memvid-sdk/) | | **Rust** | `cargo add memvid-core` | [![Crates.io](https://img.shields.io/crates/v/memvid-core?style=flat-square)](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绕过, 知识库, 网络流量审计, 记忆层, 语义搜索, 轻量级, 轻量级存储, 通知系统, 长期记忆