chromem-go:纯 Go 嵌入式向量数据库,像 SQLite 一样给应用加上 RAG
1000 篇文档 0.3 毫秒查询,100000 篇 40 毫秒——零依赖,纯 Go,嵌入你的应用。
2026 年,几乎所有后端应用都在考虑集成 AI 能力。RAG(检索增强生成)是最实用的 AI 集成方式——不需要微调模型,只需把文档喂给向量数据库,就能让 LLM 基于私有数据回答问题。
Go 生态的向量数据库选择不多:Pinecone 是 SaaS,Qdrant 是 Rust 写的独立服务,pgvector 需要跑 PostgreSQL,Faiss 需要 CGO。
chromem-go 填补了这个空白:一个纯 Go、零依赖、可嵌入的向量数据库。就像 SQLite 之于关系型数据库,让你在 Go 应用中直接使用向量搜索,无需部署任何外部服务。
为什么需要嵌入式向量数据库?
传统向量数据库(Pinecone、Qdrant、Milvus)都是客户端-服务器架构:Go 应用 → gRPC/HTTP → 向量数据库服务(独立进程/容器)。
这意味着额外的部署、运维、网络延迟、故障恢复……对于一个"只是想给应用加个 RAG"的需求来说,太重了。
chromem-go 的方案是嵌入式:
db := chromem.NewDB() // 直接在进程内创建
collection, _ := db.CreateCollection("docs", nil, nil)
// 没有网络调用,没有外部服务
整个过程中没有启动任何外部服务。嵌入向量在进程内计算,存储在内存中,搜索也在进程内完成。
快速上手
package main
import (
"context"
"fmt"
"runtime"
"github.com/philippgille/chromem-go"
)
func main() {
ctx := context.Background()
db := chromem.NewDB()
collection, _ := db.CreateCollection("knowledge", nil, nil)
collection.AddDocuments(ctx, []chromem.Document{
{
ID: "1",
Content: "Go 1.26 引入了全新的垃圾回收器 Green Tea GC",
Metadata: map[string]string{"topic": "runtime"},
},
{
ID: "2",
Content: "Go 1.27 将修复泛型类型推断的限制",
Metadata: map[string]string{"topic": "generics"},
},
{
ID: "3",
Content: "SIMD 支持是 Go 1.26 的实验性特性",
Metadata: map[string]string{"topic": "performance"},
},
}, runtime.NumCPU())
results, _ := collection.Query(ctx,
"Go 语言有什么性能优化新特性?",
1, nil, nil,
)
fmt.Printf("相似度: %.4f\n内容: %s\n标签: %s\n",
results[0].Similarity,
results[0].Content,
results[0].Metadata["topic"],
)
}
核心特性
零依赖
go.mod 里没有任何第三方依赖。没有 CGO,没有 C++ 绑定,没有外部服务:
- 交叉编译:
GOOS=linux GOARCH=arm64 go build直接通过 - Docker 镜像:可以用 scratch 镜像,最终二进制只有几 MB
- WASM 支持:有实验性的 WebAssembly 绑定
多模型嵌入支持
内置 9 种嵌入模型 Provider:
| 类型 | Provider | 说明 |
|---|---|---|
| 云端 | OpenAI | text-embedding-3-small(默认) |
| 云端 | Azure OpenAI | 企业级 Azure 部署 |
| 云端 | GCP Vertex AI | Google Cloud |
| 云端 | Cohere | embed-v3 |
| 云端 | Mistral | mistral-embed |
| 云端 | Jina | jina-embeddings-v3 |
| 本地 | Ollama | nomic-embed-text 等 |
| 本地 | LocalAI | 兼容 OpenAI API |
| 自定义 | chromem.EmbeddingFunc | 实现接口即可 |
完全离线运行示例:
embeddingFunc := chromem.NewEmbeddingFuncOllama("nomic-embed-text", "http://localhost:11434")
collection, _ := db.CreateCollection("local-docs", nil, embeddingFunc)
性能基准
在中端 2020 年 Intel i5 笔记本上:
| 文档数量 | 查询耗时 | 内存分配 | 分配次数 |
|---|---|---|---|
| 100 | 0.09 ms | 5 KB | 95 |
| 1,000 | 0.52 ms | 13 KB | 141 |
| 5,000 | 2.1 ms | 47 KB | 173 |
| 25,000 | 9.9 ms | 212 KB | 208 |
| 100,000 | 39.6 ms | 810 KB | 232 |
10 万篇文档只需 40 毫秒,内存分配不到 1MB。
持久化与备份
// 持久化到磁盘(gob 格式,可选 gzip 压缩)
db, _ := chromem.NewDB("./data/vector.db")
// 导出整个数据库到单文件(可加密)
file, _ := os.Create("backup.gob.gz")
db.Export(file, encryptionKey)
// 从备份恢复
db2 := chromem.NewDB()
file, _ := os.Open("backup.gob.gz")
db2.Import(file, encryptionKey)
并发处理
// AddDocuments 自动并发处理,利用所有 CPU 核心
collection.AddDocuments(ctx, documents, runtime.NumCPU())
过滤查询
// 元数据精确匹配
results, _ := collection.Query(ctx, "Go 性能优化", 5,
map[string]string{"topic": "performance"}, nil)
// 内容过滤
results, _ := collection.Query(ctx, "GC 优化", 5,
nil, map[string]string{"$contains": "Green Tea"})
实战:构建 Go 知识库 RAG
用 chromem-go + Ollama 构建本地知识库问答系统:
package main
import (
"context"
"fmt"
"log"
"runtime"
"github.com/philippgille/chromem-go"
)
func main() {
ctx := context.Background()
// 1. 使用 Ollama 本地嵌入模型(无需 API Key)
embedFn := chromem.NewEmbeddingFuncOllama(
"nomic-embed-text",
"http://localhost:11434",
)
db := chromem.NewDB()
collection, _ := db.CreateCollection("go-knowledge", nil, embedFn)
// 2. 导入知识文档
docs := []chromem.Document{
{
ID: "go126-gc",
Content: "Go 1.26 的 Green Tea GC 将 GC 开销降低了 40%。",
Metadata: map[string]string{"version": "1.26", "category": "runtime"},
},
{
ID: "go126-simd",
Content: "Go 1.26 实验性引入 archsimd 包,支持 AVX2/SSE 向量指令。",
Metadata: map[string]string{"version": "1.26", "category": "performance"},
},
}
collection.AddDocuments(ctx, docs, runtime.NumCPU())
// 3. 语义搜索
results, _ := collection.Query(ctx, "Go 有什么性能优化?", 3, nil, nil)
for _, r := range results {
fmt.Printf("[%.2f] %s (%s)\n", r.Similarity, r.Content, r.Metadata["category"])
}
}
chromem-go vs 其他方案
| 特性 | chromem-go | Qdrant | Pinecone | pgvector |
|---|---|---|---|---|
| 语言 | 纯 Go | Rust | SaaS | C |
| 部署 | 嵌入进程 | 独立服务 | 云服务 | PostgreSQL 扩展 |
| 依赖 | 零 | 需要容器 | 需要账号 | 需要 PostgreSQL |
| CGO | 不需要 | N/A | N/A | 需要 |
| 适用场景 | 中小规模嵌入式 | 大规模服务 | 全托管 | 已有 PG 的项目 |
安装
go get github.com/philippgille/chromem-go@latest
小结
如果你的 Go 应用需要向量搜索能力,但又不想引入外部服务,chromem-go 是目前最好的选择。零依赖、纯 Go、可嵌入——就像 SQLite 让每个应用都能用上关系型数据库一样,chromem-go 让每个 Go 应用都能用上向量搜索。
项目地址:https://github.com/philippgille/chromem-go