编程 chromem-go:纯 Go 嵌入式向量数据库,像 SQLite 一样给应用加上 RAG

2026-07-05 22:24:58 +0800 CST views 7

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说明
云端OpenAItext-embedding-3-small(默认)
云端Azure OpenAI企业级 Azure 部署
云端GCP Vertex AIGoogle Cloud
云端Cohereembed-v3
云端Mistralmistral-embed
云端Jinajina-embeddings-v3
本地Ollamanomic-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 笔记本上:

文档数量查询耗时内存分配分配次数
1000.09 ms5 KB95
1,0000.52 ms13 KB141
5,0002.1 ms47 KB173
25,0009.9 ms212 KB208
100,00039.6 ms810 KB232

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-goQdrantPineconepgvector
语言纯 GoRustSaaSC
部署嵌入进程独立服务云服务PostgreSQL 扩展
依赖需要容器需要账号需要 PostgreSQL
CGO不需要N/AN/A需要
适用场景中小规模嵌入式大规模服务全托管已有 PG 的项目

安装

go get github.com/philippgille/chromem-go@latest

小结

如果你的 Go 应用需要向量搜索能力,但又不想引入外部服务,chromem-go 是目前最好的选择。零依赖、纯 Go、可嵌入——就像 SQLite 让每个应用都能用上关系型数据库一样,chromem-go 让每个 Go 应用都能用上向量搜索。

项目地址:https://github.com/philippgille/chromem-go

推荐文章

html文本加载动画
2024-11-19 06:24:21 +0800 CST
mysql时间对比
2024-11-18 14:35:19 +0800 CST
Vue3中如何处理状态管理?
2024-11-17 07:13:45 +0800 CST
程序员茄子在线接单