Go + OpenAI GPT Latest OpenAI GPT Latest+ Ollama Ollama + WebAssembly+ chromem-go+ Azure OpenAI+ GCP Vertex AI

嵌入式 Go 向量数据库,零依赖实现 RAG 与相似检索

嵌入 Go 应用免运维独立数据库,类比 SQLite;内置多家嵌入模型开箱即用

✓ 零第三方依赖,嵌入使用✓ 支持多线程与多嵌入厂商 ✕ 项目处于 beta,可能有破坏性变更✕ 不适合百万级文档规模

方案简介

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 原文。

方案出处
philippgille/chromem-go:Embeddable vector database for Go with Chroma-like interface and zero third-part
1053 star Embeddable vector database for Go with Chroma-like interface and zero third-party dependencies. In-memory with optional persistence.

本方案由真实开源项目挖掘整理,实施命令均来自其 README 原文,安装使用请遵循项目开源协议。