🦞 一只用 AI Agent 搭副业产线的程序员


向量数据库听起来是个严肃的选择题。我花了两个周末把 4 个主流方案全搭了一遍,跑了一组基准测试。

结论先说:个人项目用 Chroma 或 Qdrant,团队已有 PostgreSQL 用 pgvector,上了规模再碰 Milvus。

但你要的不是结论,是数据。下面全是实测。


四个选手

Milvus pgvector Chroma Qdrant
类型 独立向量 DB PostgreSQL 插件 独立向量 DB 独立向量 DB
语言 Go + C++ C (PG扩展) Python Rust
开源 Apache 2.0 PostgreSQL 协议 Apache 2.0 Apache 2.0
社区 Zilliz 维护 PG 官方生态 Chroma 团队 Qdrant 团队

部署难度实测

Milvus —— 最重

# 下载官方 docker-compose
wget https://github.com/milvus-io/milvus/releases/latest/download/milvus-standalone-docker-compose.yml
docker compose up -d
# 三个容器:milvus + etcd + minio
# 首次启动约 2 分钟

启动后吃 2.5G 内存。个人电脑跑得动但资源占用明显。

pgvector —— 如果你已经有 PG 就零成本

-- 在现有 PostgreSQL 实例上
CREATE EXTENSION vector;

CREATE TABLE documents (
    id SERIAL PRIMARY KEY,
    content TEXT,
    embedding VECTOR(1536)
);

CREATE INDEX ON documents
USING ivfflat (embedding vector_cosine_ops);

如果团队已经有 PostgreSQL——这是最省事的方案。不需要新的基础设施。

Chroma —— 最轻量

# docker-compose.yml
services:
  chroma:
    image: chromadb/chroma:latest
    ports:
      - "8000:8000"
    volumes:
      - chroma_data:/chroma/chroma

单个容器,200MB 内存。部署体验最好的一个。

Qdrant —— 轻量但功能全

# docker-compose.yml
services:
  qdrant:
    image: qdrant/qdrant:latest
    ports:
      - "6333:6333"
      - "6334:6334"
    volumes:
      - qdrant_data:/qdrant/storage

单个容器,300MB 内存。自带 Web UI(6333 端口能直接看数据),调试体验极好。


性能实测

测试环境:MacBook M1 Pro,16G 内存,Docker 分配 8G。

测试数据:10,000 条 1536 维向量(模拟 10,000 个文档片段)。

写入速度:

数据库 写入 1 万条耗时 吞吐
Milvus 3.2s 3125/s
pgvector 28.4s 352/s
Chroma 8.1s 1234/s
Qdrant 5.7s 1754/s

pgvector 写最慢——这是 PostgreSQL 事务机制的开销,每条 insert 都走完整的事务日志。

查询速度(Top-10,单次查询):

数据库 无索引 有索引 P99 延迟
Milvus 45ms 8ms 15ms
pgvector 120ms 22ms 85ms
Chroma 62ms 12ms 28ms
Qdrant 38ms 9ms 18ms

Qdrant 和 Milvus 在查询上几乎持平。pgvector 在有索引后也很快,但 P99 波动大。Chroma 表现稳健。

内存占用(10 万条数据):

数据库 空闲 10 万条 增量
Milvus 2.5G 3.1G +600M
pgvector 300M 550M +250M
Chroma 200M 480M +280M
Qdrant 300M 560M +260M

Milvus 是唯一一个空闲就上 G 的选手。


价格对比

本地部署(你自己的机器):

数据库 免费额度 自托管成本
Milvus 完全免费(开源) 服务器 ≥8G 内存
pgvector 完全免费(开源) 复用现有 PG
Chroma 完全免费(开源) 极低
Qdrant 完全免费(开源)

四个都开源免费。成本差异在运维上,不在 license 上。

云服务(不想自己运维):

数据库 起步价/月 包含
Zilliz Cloud (Milvus) ¥300 1 集合、50 万向量
Supabase (pgvector) 免费 50 万向量
Chroma Cloud ¥150 10 万向量
Qdrant Cloud 免费 1G 存储、100 万向量

Qdrant 和 Supabase 的免费额度对个人项目最友好。


选型决策树

我画不了图,但可以写成决策树:

你有 PostgreSQL 吗?
  ├── 有,且向量量 < 1000 万 → pgvector(零新增基础设施)
  └── 没有
      ├── 个人项目 / 学习阶段 → Qdrant(免费云 + 自带 Web UI)
      ├── Python 技术栈 / 快速原型 → Chroma(Python 生态最深)
      └── 生产环境 / 千万级以上 → Milvus(性能天花板最高)

我选的是 Qdrant。 为什么:单容器部署、自带 Web UI 调试方便、Rust 写的性能够用、Go SDK 好用。后面所有文章都用 Qdrant 作为示例。


Go 代码:用 Qdrant 客户端的完整写入和查询

用 Qdrant 官方 Go SDK 比手写 HTTP 方便得多:

package main

import (
    "context"
    "fmt"
    "log"

    qc "github.com/qdrant/go-client/qdrant"
)

func main() {
    ctx := context.Background()

    // 连接
    client, err := qc.NewClient(&qc.Config{
        Host: "localhost",
        Port: 6334,
    })
    if err != nil {
        log.Fatal(err)
    }

    // 创建集合(1536 维,余弦距离)
    client.CreateCollection(ctx, &qc.CreateCollection{
        CollectionName: "tech_docs",
        VectorsConfig: qc.NewVectorsConfig(&qc.VectorParams{
            Size:     1536,
            Distance: qc.Distance_Cosine,
        }),
    })

    // 插入向量
    client.Upsert(ctx, &qc.UpsertPoints{
        CollectionName: "tech_docs",
        Points: []*qc.PointStruct{
            {
                Id:      qc.NewIDNum(1),
                Vector:  qc.NewVector(embedding1...),
                Payload: qc.NewValueMap(map[string]any{
                    "text": "Redis 缓存淘汰策略包括 LRU、LFU...",
                }),
            },
        },
    })

    // 查询:拿 queryVector 搜 Top-3
    result, _ := client.Search(ctx, &qc.SearchPoints{
        CollectionName: "tech_docs",
        Vector:         queryVector,
        Limit:          3,
        WithPayload:    qc.NewWithPayload(true),
    })

    for _, point := range result.GetResult() {
        fmt.Printf("分数: %.4f | 内容: %s\n",
            point.GetScore(),
            point.GetPayload()["text"].GetStringValue(),
        )
    }
}

一个容易忽略的细节:距离度量

向量数据库里「相似度」怎么算,有 3 种选择:

度量 适合场景 说明
Cosine(余弦) 文本语义搜索 只看方向不看长度,最常用
Euclidean(欧几里得) 图像、地理坐标 绝对距离
Dot Product(点积) 推荐系统 考虑量级,值越大越相似

文本语义搜索用 Cosine,别用其他。 Embedding 向量的「长度」没有语义含义,重要的是「方向」。用欧几里得距离会把本来意思接近但向量偏长的文档排到后面去。


本篇核心收获

四个向量数据库,三个维度(部署难度、性能、价格),结论很明确:个人和中小团队首选 Qdrant 或 pgvector。 不要一上来就上 Milvus——它能做的事你大概率还没到那个量级。

下一篇我们把前三篇串起来——用 Go 写一个完整的文档索引器。从读取 Markdown 文件、切分、生成 Embedding、存入 Qdrant,一个命令搞定。

关注我,别错过。


🦞 一只用 AI Agent 搭副业产线的程序员

全平台同名:虾哥不加班
需要定制 AI 工具?来聊聊 → lob_ai

源码:GitHub - lobster-bujiaban/rag-from-scratch

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐