嵌入式 Go 向量数据库,零依赖实现 RAG 与相似检索
嵌入 Go 应用免运维独立数据库,类比 SQLite;内置多家嵌入模型开箱即用
方案简介
chromem-go 是一个可嵌入的 Go 向量数据库,提供类似 Chroma 的接口,且零第三方依赖,数据存于内存并可选持久化。它让开发者在 Go 应用中直接加入检索增强生成(RAG)等基于 embeddings 的功能,而无需运行独立的数据库服务——正如用 SQLite 替代 PostgreSQL/MySQL 那样。它不是连接 Chroma 的客户端库,也不是其 Go 复刻,而是独立数据库。项目重点不在百万级文档的规模或功能数量,而是为最常见场景提供简单性与高性能:在 2020 年中档 Intel 笔记本 CPU 上,查询 1000 个文档仅需 0.3 ms,10 万个文档约 40 ms。适合需要在 Go 应用内集成向量检索、又不希望维护独立数据库服务的开发者。
亮点与能力
- 零第三方库依赖
- 可嵌入(类似 SQLite,无客户端-服务器模型,无需维护单独数据库)
- 添加与查询文档时多线程处理,利用 Go 原生并发特性
- 实验性 WebAssembly 绑定
- 开箱即用支持多家嵌入提供商与模型:托管的 OpenAI(默认)、Azure OpenAI、GCP Vertex AI、Cohere、Mistral、Jina、mixedbread.ai;本地的 Ollama、llmman
- 提供 Chroma 同款核心接口,同时提供更 Go 惯用的替代方法
组成与分工
- chromem-go:核心嵌入式向量数据库,负责存储文档与 embeddings、执行最近邻搜索
- Go:宿主开发语言,库以 Go 包形式引入,利用原生并发
- OpenAI / Azure OpenAI / GCP Vertex AI / Cohere / Mistral / Jina / mixedbread.ai:托管嵌入模型提供商,自动为文档生成 embeddings
- Ollama / llmman:本地嵌入方案(Ollama 兼容 API),适合离线/私有化场景
- WebAssembly:实验性绑定,扩展运行环境
前置要求
- Go 开发环境
- 引入库:
go
import "github.com/philippgille/chromem-go"
- 若使用自动嵌入,需要配置对应提供商(如 OpenAI 默认,或本地 Ollama)的访问凭证/端点
实施步骤
1. 创建数据库
内存模式便于原型开发,之后可轻松加持久化。由于没有客户端-服务器分离,调用的是 DB 而非 client:
go
db := chromem.NewDB()
2. 创建集合
也可用 GetCollection、GetOrCreateCollection、DeleteCollection:
go
collection, _ := db.CreateCollection("all-my-documents", nil, nil)
3. 添加文档
传入唯一 ID、元数据与文档内容;嵌入会自动处理,也可自行提供 embeddings;还可用 AddConcurrently() 多线程添加:
go
_ = collection.Add(ctx,
[]string{"doc1", "doc2"},
nil,
[]map[string]string{{"source": "notion"}, {"source": "google-docs"}},
[]string{"This is document1", "This is document2"},
4. 查询相似文档
支持元数据过滤与内容包含过滤:
go
results, _ := collection.Query(ctx,
"This is a query document",
map[string]string{"metadata_field": "is_equal_to_this"},
map[string]string{"$contains": "search_string"},
5. 用于 RAG
把向量库检索到的相关内容随问题一起发给 LLM,使 LLM 能利用最新、精确的内容作答。examples 目录有可运行的示例代码。
使用与配置要点
- 原型阶段用内存模式
chromem.NewDB(),需要持久化时可轻松开启 - 元数据可用于查询过滤,
$contains用于文档内容包含过滤 - 验证成功:查询返回最相似的 n 个结果(最近邻搜索)
- 完整接口见 Godoc:https://pkg.go.dev/github.com/philippgille/chromem-go
- 也可跳过自动嵌入,直接添加自己的 embeddings
注意事项与常见问题
- 项目处于 beta、重度开发中,v1.0.0 之前的发布版本可能引入破坏性变更,所有变更记录在 CHANGELOG 中
- 刻意不覆盖 Chroma 100% 的 API 面,更新与删除文档方法尚在规划中
- 设计重点不在百万级文档规模,而是常见场景的简单与高性能
优缺点
- ✓ 零第三方依赖,嵌入使用
- ✓ 支持多线程与多嵌入厂商
- ✕ 项目处于 beta,可能有破坏性变更
- ✕ 不适合百万级文档规模
出处
本方案挖掘自开源项目 philippgille/chromem-go,方案内容与实施命令均来自其 README 原文。
本方案由真实开源项目挖掘整理,实施命令均来自其 README 原文,安装使用请遵循项目开源协议。