向量数据库深度对比:PGVector vs Qdrant vs Milvus vs Chroma(附性能测试数据)

向量数据库深度对比:PGVector vs Qdrant vs Milvus vs Chroma 性能评测

前言

💡 痛点:RAG 项目选型时,面对众多向量数据库不知如何选择?性能、功能、部署难度... 各有优劣?

🎯 解决方案 :本文从性能、功能、易用性、生产就绪度四个维度,深度对比四大主流向量数据库,帮你做出最佳选择。

向量数据库是 RAG(检索增强生成)系统的核心组件,直接影响检索效果和系统性能。本文将对比以下四款主流产品:
#mermaid-svg-r5hOkGo9lIV1Z66V{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-r5hOkGo9lIV1Z66V .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-r5hOkGo9lIV1Z66V .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-r5hOkGo9lIV1Z66V .error-icon{fill:#552222;}#mermaid-svg-r5hOkGo9lIV1Z66V .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-r5hOkGo9lIV1Z66V .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-r5hOkGo9lIV1Z66V .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-r5hOkGo9lIV1Z66V .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-r5hOkGo9lIV1Z66V .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-r5hOkGo9lIV1Z66V .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-r5hOkGo9lIV1Z66V .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-r5hOkGo9lIV1Z66V .marker{fill:#333333;stroke:#333333;}#mermaid-svg-r5hOkGo9lIV1Z66V .marker.cross{stroke:#333333;}#mermaid-svg-r5hOkGo9lIV1Z66V svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-r5hOkGo9lIV1Z66V p{margin:0;}#mermaid-svg-r5hOkGo9lIV1Z66V .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-r5hOkGo9lIV1Z66V .cluster-label text{fill:#333;}#mermaid-svg-r5hOkGo9lIV1Z66V .cluster-label span{color:#333;}#mermaid-svg-r5hOkGo9lIV1Z66V .cluster-label span p{background-color:transparent;}#mermaid-svg-r5hOkGo9lIV1Z66V .label text,#mermaid-svg-r5hOkGo9lIV1Z66V span{fill:#333;color:#333;}#mermaid-svg-r5hOkGo9lIV1Z66V .node rect,#mermaid-svg-r5hOkGo9lIV1Z66V .node circle,#mermaid-svg-r5hOkGo9lIV1Z66V .node ellipse,#mermaid-svg-r5hOkGo9lIV1Z66V .node polygon,#mermaid-svg-r5hOkGo9lIV1Z66V .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-r5hOkGo9lIV1Z66V .rough-node .label text,#mermaid-svg-r5hOkGo9lIV1Z66V .node .label text,#mermaid-svg-r5hOkGo9lIV1Z66V .image-shape .label,#mermaid-svg-r5hOkGo9lIV1Z66V .icon-shape .label{text-anchor:middle;}#mermaid-svg-r5hOkGo9lIV1Z66V .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-r5hOkGo9lIV1Z66V .rough-node .label,#mermaid-svg-r5hOkGo9lIV1Z66V .node .label,#mermaid-svg-r5hOkGo9lIV1Z66V .image-shape .label,#mermaid-svg-r5hOkGo9lIV1Z66V .icon-shape .label{text-align:center;}#mermaid-svg-r5hOkGo9lIV1Z66V .node.clickable{cursor:pointer;}#mermaid-svg-r5hOkGo9lIV1Z66V .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-r5hOkGo9lIV1Z66V .arrowheadPath{fill:#333333;}#mermaid-svg-r5hOkGo9lIV1Z66V .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-r5hOkGo9lIV1Z66V .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-r5hOkGo9lIV1Z66V .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-r5hOkGo9lIV1Z66V .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-r5hOkGo9lIV1Z66V .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-r5hOkGo9lIV1Z66V .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-r5hOkGo9lIV1Z66V .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-r5hOkGo9lIV1Z66V .cluster text{fill:#333;}#mermaid-svg-r5hOkGo9lIV1Z66V .cluster span{color:#333;}#mermaid-svg-r5hOkGo9lIV1Z66V div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-r5hOkGo9lIV1Z66V .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-r5hOkGo9lIV1Z66V rect.text{fill:none;stroke-width:0;}#mermaid-svg-r5hOkGo9lIV1Z66V .icon-shape,#mermaid-svg-r5hOkGo9lIV1Z66V .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-r5hOkGo9lIV1Z66V .icon-shape p,#mermaid-svg-r5hOkGo9lIV1Z66V .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-r5hOkGo9lIV1Z66V .icon-shape .label rect,#mermaid-svg-r5hOkGo9lIV1Z66V .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-r5hOkGo9lIV1Z66V .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-r5hOkGo9lIV1Z66V .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-r5hOkGo9lIV1Z66V :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 📊 向量数据库对比
🐘 PGVector

PostgreSQL 扩展
🚀 Qdrant

Rust 高性能
⚡ Milvus

云原生分布式
🎨 Chroma

轻量级嵌入式
✅ 易集成
⚠️ 性能一般
✅ 高性能
✅ Rust 内存安全
✅ 分布式
⚠️ 部署复杂
✅ 极易上手
⚠️ 功能有限


一、向量数据库核心概念

1.1 什么是向量数据库?

渲染错误: Mermaid 渲染失败: Parse error on line 2: .../>模型| B🔢 向量表示 \[0.12, -0.34, ...] -----------------------^ Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'SQS'

向量数据库 专为高维向量存储和相似度搜索设计,核心能力:

能力 说明 应用场景
📦 向量存储 存储高维向量(128-4096 维) 文本、图像、音频 Embedding
🔍 相似度搜索 快速找到最相似的向量 RAG 检索、推荐系统
🏷️ 元数据过滤 结合结构化数据过滤 按时间/来源/作者筛选
📊 向量索引 加速大规模搜索 ANN(近似最近邻)算法
🔗 分布式存储 横向扩展能力 十亿级向量场景

1.2 核心技术指标

渲染错误: Mermaid 渲染失败: Parse error on line 16: ...询并发] E --> E1Recall@K E - ---------------------^ Expecting 'AMP', 'COLON', 'PIPE', 'TESTSTR', 'DOWN', 'DEFAULT', 'NUM', 'COMMA', 'NODE_STRING', 'BRKT', 'MINUS', 'MULT', 'UNICODE_TEXT', got 'LINK_ID'

关键指标说明:

指标 全称 说明 优秀标准
延迟 Latency (P99) 单次查询响应时间 < 10ms
QPS Queries Per Second 每秒查询数 > 10,000
Recall@K Recall at K 前 K 结果的召回率 > 95%
写入吞吐 Write Throughput 每秒写入向量数 > 50,000

1.3 索引算法对比

#mermaid-svg-rZuUJUuf8M0DEhqm{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-rZuUJUuf8M0DEhqm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-rZuUJUuf8M0DEhqm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-rZuUJUuf8M0DEhqm .error-icon{fill:#552222;}#mermaid-svg-rZuUJUuf8M0DEhqm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rZuUJUuf8M0DEhqm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-rZuUJUuf8M0DEhqm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rZuUJUuf8M0DEhqm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rZuUJUuf8M0DEhqm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-rZuUJUuf8M0DEhqm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rZuUJUuf8M0DEhqm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rZuUJUuf8M0DEhqm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rZuUJUuf8M0DEhqm .marker.cross{stroke:#333333;}#mermaid-svg-rZuUJUuf8M0DEhqm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rZuUJUuf8M0DEhqm p{margin:0;}#mermaid-svg-rZuUJUuf8M0DEhqm .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-rZuUJUuf8M0DEhqm .cluster-label text{fill:#333;}#mermaid-svg-rZuUJUuf8M0DEhqm .cluster-label span{color:#333;}#mermaid-svg-rZuUJUuf8M0DEhqm .cluster-label span p{background-color:transparent;}#mermaid-svg-rZuUJUuf8M0DEhqm .label text,#mermaid-svg-rZuUJUuf8M0DEhqm span{fill:#333;color:#333;}#mermaid-svg-rZuUJUuf8M0DEhqm .node rect,#mermaid-svg-rZuUJUuf8M0DEhqm .node circle,#mermaid-svg-rZuUJUuf8M0DEhqm .node ellipse,#mermaid-svg-rZuUJUuf8M0DEhqm .node polygon,#mermaid-svg-rZuUJUuf8M0DEhqm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-rZuUJUuf8M0DEhqm .rough-node .label text,#mermaid-svg-rZuUJUuf8M0DEhqm .node .label text,#mermaid-svg-rZuUJUuf8M0DEhqm .image-shape .label,#mermaid-svg-rZuUJUuf8M0DEhqm .icon-shape .label{text-anchor:middle;}#mermaid-svg-rZuUJUuf8M0DEhqm .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-rZuUJUuf8M0DEhqm .rough-node .label,#mermaid-svg-rZuUJUuf8M0DEhqm .node .label,#mermaid-svg-rZuUJUuf8M0DEhqm .image-shape .label,#mermaid-svg-rZuUJUuf8M0DEhqm .icon-shape .label{text-align:center;}#mermaid-svg-rZuUJUuf8M0DEhqm .node.clickable{cursor:pointer;}#mermaid-svg-rZuUJUuf8M0DEhqm .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-rZuUJUuf8M0DEhqm .arrowheadPath{fill:#333333;}#mermaid-svg-rZuUJUuf8M0DEhqm .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-rZuUJUuf8M0DEhqm .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-rZuUJUuf8M0DEhqm .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rZuUJUuf8M0DEhqm .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-rZuUJUuf8M0DEhqm .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rZuUJUuf8M0DEhqm .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-rZuUJUuf8M0DEhqm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-rZuUJUuf8M0DEhqm .cluster text{fill:#333;}#mermaid-svg-rZuUJUuf8M0DEhqm .cluster span{color:#333;}#mermaid-svg-rZuUJUuf8M0DEhqm div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-rZuUJUuf8M0DEhqm .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-rZuUJUuf8M0DEhqm rect.text{fill:none;stroke-width:0;}#mermaid-svg-rZuUJUuf8M0DEhqm .icon-shape,#mermaid-svg-rZuUJUuf8M0DEhqm .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rZuUJUuf8M0DEhqm .icon-shape p,#mermaid-svg-rZuUJUuf8M0DEhqm .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-rZuUJUuf8M0DEhqm .icon-shape .label rect,#mermaid-svg-rZuUJUuf8M0DEhqm .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rZuUJUuf8M0DEhqm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-rZuUJUuf8M0DEhqm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-rZuUJUuf8M0DEhqm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 🗂️ 索引算法
暴力搜索

FLAT
倒排索引

IVF
图索引

HNSW
树索引

Annoy
✅ 准确率 100%

❌ O N 慢
✅ 召回率 90%+

✅ 可调精度
✅ 召回率 95%+

✅ 速度快
⚠️ 召回率 85%

✅ 内存占用小

主流索引算法详解:

算法 原理 召回率 速度 适用场景
FLAT 暴力搜索 100% 小数据集(< 10万)
IVF 聚类分桶 90-95% 中等数据集
HNSW 图结构导航 95-99% ✅ 推荐(大规模)
Annoy 随机投影树 85-90% 只读场景

二、四大向量数据库概览

2.1 PGVector:PostgreSQL 的向量扩展

#mermaid-svg-nvdc6mvfO4Xzzgoq{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-nvdc6mvfO4Xzzgoq .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-nvdc6mvfO4Xzzgoq .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-nvdc6mvfO4Xzzgoq .error-icon{fill:#552222;}#mermaid-svg-nvdc6mvfO4Xzzgoq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-nvdc6mvfO4Xzzgoq .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-nvdc6mvfO4Xzzgoq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-nvdc6mvfO4Xzzgoq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-nvdc6mvfO4Xzzgoq .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-nvdc6mvfO4Xzzgoq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-nvdc6mvfO4Xzzgoq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-nvdc6mvfO4Xzzgoq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-nvdc6mvfO4Xzzgoq .marker.cross{stroke:#333333;}#mermaid-svg-nvdc6mvfO4Xzzgoq svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-nvdc6mvfO4Xzzgoq p{margin:0;}#mermaid-svg-nvdc6mvfO4Xzzgoq .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-nvdc6mvfO4Xzzgoq .cluster-label text{fill:#333;}#mermaid-svg-nvdc6mvfO4Xzzgoq .cluster-label span{color:#333;}#mermaid-svg-nvdc6mvfO4Xzzgoq .cluster-label span p{background-color:transparent;}#mermaid-svg-nvdc6mvfO4Xzzgoq .label text,#mermaid-svg-nvdc6mvfO4Xzzgoq span{fill:#333;color:#333;}#mermaid-svg-nvdc6mvfO4Xzzgoq .node rect,#mermaid-svg-nvdc6mvfO4Xzzgoq .node circle,#mermaid-svg-nvdc6mvfO4Xzzgoq .node ellipse,#mermaid-svg-nvdc6mvfO4Xzzgoq .node polygon,#mermaid-svg-nvdc6mvfO4Xzzgoq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-nvdc6mvfO4Xzzgoq .rough-node .label text,#mermaid-svg-nvdc6mvfO4Xzzgoq .node .label text,#mermaid-svg-nvdc6mvfO4Xzzgoq .image-shape .label,#mermaid-svg-nvdc6mvfO4Xzzgoq .icon-shape .label{text-anchor:middle;}#mermaid-svg-nvdc6mvfO4Xzzgoq .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-nvdc6mvfO4Xzzgoq .rough-node .label,#mermaid-svg-nvdc6mvfO4Xzzgoq .node .label,#mermaid-svg-nvdc6mvfO4Xzzgoq .image-shape .label,#mermaid-svg-nvdc6mvfO4Xzzgoq .icon-shape .label{text-align:center;}#mermaid-svg-nvdc6mvfO4Xzzgoq .node.clickable{cursor:pointer;}#mermaid-svg-nvdc6mvfO4Xzzgoq .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-nvdc6mvfO4Xzzgoq .arrowheadPath{fill:#333333;}#mermaid-svg-nvdc6mvfO4Xzzgoq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-nvdc6mvfO4Xzzgoq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-nvdc6mvfO4Xzzgoq .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-nvdc6mvfO4Xzzgoq .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-nvdc6mvfO4Xzzgoq .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-nvdc6mvfO4Xzzgoq .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-nvdc6mvfO4Xzzgoq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-nvdc6mvfO4Xzzgoq .cluster text{fill:#333;}#mermaid-svg-nvdc6mvfO4Xzzgoq .cluster span{color:#333;}#mermaid-svg-nvdc6mvfO4Xzzgoq div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-nvdc6mvfO4Xzzgoq .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-nvdc6mvfO4Xzzgoq rect.text{fill:none;stroke-width:0;}#mermaid-svg-nvdc6mvfO4Xzzgoq .icon-shape,#mermaid-svg-nvdc6mvfO4Xzzgoq .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-nvdc6mvfO4Xzzgoq .icon-shape p,#mermaid-svg-nvdc6mvfO4Xzzgoq .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-nvdc6mvfO4Xzzgoq .icon-shape .label rect,#mermaid-svg-nvdc6mvfO4Xzzgoq .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-nvdc6mvfO4Xzzgoq .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-nvdc6mvfO4Xzzgoq .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-nvdc6mvfO4Xzzgoq :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 🐘 PGVector
PostgreSQL 扩展
✅ 易集成
✅ ACID 事务
✅ SQL 查询
⚠️ 性能有限
单机架构
IVF 索引

核心特点:

特性 说明
定位 PostgreSQL 扩展,为关系数据库添加向量能力
索引 IVFFlat、HNSW(PGVector 0.7+)
部署 极简,CREATE EXTENSION vector
适合 已有 PostgreSQL 基础设施、中小规模(< 100万)

优势:

  • ✅ 学习成本低(复用 SQL 知识)
  • ✅ 与业务数据天然集成(同一事务)
  • ✅ 成熟稳定的 PostgreSQL 生态
  • ✅ 支持 ACID 事务

劣势:

  • ❌ 性能不如专业向量数据库
  • ❌ 单机架构,无法横向扩展
  • ❌ 索引算法选择有限

2.2 Qdrant:Rust 编写的高性能引擎

#mermaid-svg-O6cjdVExdn9dY5vP{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-O6cjdVExdn9dY5vP .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-O6cjdVExdn9dY5vP .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-O6cjdVExdn9dY5vP .error-icon{fill:#552222;}#mermaid-svg-O6cjdVExdn9dY5vP .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-O6cjdVExdn9dY5vP .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-O6cjdVExdn9dY5vP .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-O6cjdVExdn9dY5vP .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-O6cjdVExdn9dY5vP .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-O6cjdVExdn9dY5vP .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-O6cjdVExdn9dY5vP .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-O6cjdVExdn9dY5vP .marker{fill:#333333;stroke:#333333;}#mermaid-svg-O6cjdVExdn9dY5vP .marker.cross{stroke:#333333;}#mermaid-svg-O6cjdVExdn9dY5vP svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-O6cjdVExdn9dY5vP p{margin:0;}#mermaid-svg-O6cjdVExdn9dY5vP .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-O6cjdVExdn9dY5vP .cluster-label text{fill:#333;}#mermaid-svg-O6cjdVExdn9dY5vP .cluster-label span{color:#333;}#mermaid-svg-O6cjdVExdn9dY5vP .cluster-label span p{background-color:transparent;}#mermaid-svg-O6cjdVExdn9dY5vP .label text,#mermaid-svg-O6cjdVExdn9dY5vP span{fill:#333;color:#333;}#mermaid-svg-O6cjdVExdn9dY5vP .node rect,#mermaid-svg-O6cjdVExdn9dY5vP .node circle,#mermaid-svg-O6cjdVExdn9dY5vP .node ellipse,#mermaid-svg-O6cjdVExdn9dY5vP .node polygon,#mermaid-svg-O6cjdVExdn9dY5vP .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-O6cjdVExdn9dY5vP .rough-node .label text,#mermaid-svg-O6cjdVExdn9dY5vP .node .label text,#mermaid-svg-O6cjdVExdn9dY5vP .image-shape .label,#mermaid-svg-O6cjdVExdn9dY5vP .icon-shape .label{text-anchor:middle;}#mermaid-svg-O6cjdVExdn9dY5vP .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-O6cjdVExdn9dY5vP .rough-node .label,#mermaid-svg-O6cjdVExdn9dY5vP .node .label,#mermaid-svg-O6cjdVExdn9dY5vP .image-shape .label,#mermaid-svg-O6cjdVExdn9dY5vP .icon-shape .label{text-align:center;}#mermaid-svg-O6cjdVExdn9dY5vP .node.clickable{cursor:pointer;}#mermaid-svg-O6cjdVExdn9dY5vP .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-O6cjdVExdn9dY5vP .arrowheadPath{fill:#333333;}#mermaid-svg-O6cjdVExdn9dY5vP .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-O6cjdVExdn9dY5vP .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-O6cjdVExdn9dY5vP .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-O6cjdVExdn9dY5vP .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-O6cjdVExdn9dY5vP .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-O6cjdVExdn9dY5vP .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-O6cjdVExdn9dY5vP .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-O6cjdVExdn9dY5vP .cluster text{fill:#333;}#mermaid-svg-O6cjdVExdn9dY5vP .cluster span{color:#333;}#mermaid-svg-O6cjdVExdn9dY5vP div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-O6cjdVExdn9dY5vP .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-O6cjdVExdn9dY5vP rect.text{fill:none;stroke-width:0;}#mermaid-svg-O6cjdVExdn9dY5vP .icon-shape,#mermaid-svg-O6cjdVExdn9dY5vP .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-O6cjdVExdn9dY5vP .icon-shape p,#mermaid-svg-O6cjdVExdn9dY5vP .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-O6cjdVExdn9dY5vP .icon-shape .label rect,#mermaid-svg-O6cjdVExdn9dY5vP .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-O6cjdVExdn9dY5vP .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-O6cjdVExdn9dY5vP .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-O6cjdVExdn9dY5vP :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 🚀 Qdrant
Rust 编写
✅ 内存安全
✅ 高性能
多种索引
HNSW
Quantization
✅ 云原生支持
Docker/K8s

核心特点:

特性 说明
定位 高性能向量搜索引擎
索引 HNSW、Scalar Quantization
部署 Docker、Kubernetes
适合 中大规模(100万-1亿)、高性能需求

优势:

  • ✅ Rust 语言,内存安全 + 高性能
  • ✅ 原生云原生支持
  • ✅ 丰富的过滤条件
  • ✅ 支持持久化存储
  • ✅ 内置量化技术,减少内存占用

劣势:

  • ❌ 相对较新,生态不如 Milvus 成熟
  • ❌ 分布式功能在完善中

2.3 Milvus:云原生分布式向量数据库

#mermaid-svg-d5X1iFTtgvKrM4Bx{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-d5X1iFTtgvKrM4Bx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-d5X1iFTtgvKrM4Bx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-d5X1iFTtgvKrM4Bx .error-icon{fill:#552222;}#mermaid-svg-d5X1iFTtgvKrM4Bx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-d5X1iFTtgvKrM4Bx .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-d5X1iFTtgvKrM4Bx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-d5X1iFTtgvKrM4Bx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-d5X1iFTtgvKrM4Bx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-d5X1iFTtgvKrM4Bx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-d5X1iFTtgvKrM4Bx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-d5X1iFTtgvKrM4Bx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-d5X1iFTtgvKrM4Bx .marker.cross{stroke:#333333;}#mermaid-svg-d5X1iFTtgvKrM4Bx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-d5X1iFTtgvKrM4Bx p{margin:0;}#mermaid-svg-d5X1iFTtgvKrM4Bx .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-d5X1iFTtgvKrM4Bx .cluster-label text{fill:#333;}#mermaid-svg-d5X1iFTtgvKrM4Bx .cluster-label span{color:#333;}#mermaid-svg-d5X1iFTtgvKrM4Bx .cluster-label span p{background-color:transparent;}#mermaid-svg-d5X1iFTtgvKrM4Bx .label text,#mermaid-svg-d5X1iFTtgvKrM4Bx span{fill:#333;color:#333;}#mermaid-svg-d5X1iFTtgvKrM4Bx .node rect,#mermaid-svg-d5X1iFTtgvKrM4Bx .node circle,#mermaid-svg-d5X1iFTtgvKrM4Bx .node ellipse,#mermaid-svg-d5X1iFTtgvKrM4Bx .node polygon,#mermaid-svg-d5X1iFTtgvKrM4Bx .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-d5X1iFTtgvKrM4Bx .rough-node .label text,#mermaid-svg-d5X1iFTtgvKrM4Bx .node .label text,#mermaid-svg-d5X1iFTtgvKrM4Bx .image-shape .label,#mermaid-svg-d5X1iFTtgvKrM4Bx .icon-shape .label{text-anchor:middle;}#mermaid-svg-d5X1iFTtgvKrM4Bx .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-d5X1iFTtgvKrM4Bx .rough-node .label,#mermaid-svg-d5X1iFTtgvKrM4Bx .node .label,#mermaid-svg-d5X1iFTtgvKrM4Bx .image-shape .label,#mermaid-svg-d5X1iFTtgvKrM4Bx .icon-shape .label{text-align:center;}#mermaid-svg-d5X1iFTtgvKrM4Bx .node.clickable{cursor:pointer;}#mermaid-svg-d5X1iFTtgvKrM4Bx .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-d5X1iFTtgvKrM4Bx .arrowheadPath{fill:#333333;}#mermaid-svg-d5X1iFTtgvKrM4Bx .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-d5X1iFTtgvKrM4Bx .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-d5X1iFTtgvKrM4Bx .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-d5X1iFTtgvKrM4Bx .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-d5X1iFTtgvKrM4Bx .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-d5X1iFTtgvKrM4Bx .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-d5X1iFTtgvKrM4Bx .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-d5X1iFTtgvKrM4Bx .cluster text{fill:#333;}#mermaid-svg-d5X1iFTtgvKrM4Bx .cluster span{color:#333;}#mermaid-svg-d5X1iFTtgvKrM4Bx div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-d5X1iFTtgvKrM4Bx .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-d5X1iFTtgvKrM4Bx rect.text{fill:none;stroke-width:0;}#mermaid-svg-d5X1iFTtgvKrM4Bx .icon-shape,#mermaid-svg-d5X1iFTtgvKrM4Bx .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-d5X1iFTtgvKrM4Bx .icon-shape p,#mermaid-svg-d5X1iFTtgvKrM4Bx .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-d5X1iFTtgvKrM4Bx .icon-shape .label rect,#mermaid-svg-d5X1iFTtgvKrM4Bx .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-d5X1iFTtgvKrM4Bx .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-d5X1iFTtgvKrM4Bx .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-d5X1iFTtgvKrM4Bx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ⚡ Milvus
分布式架构
✅ 横向扩展
✅ 十亿级支持
云原生设计
K8s 原生
存算分离
多种索引
IVF/HNSW/DiskANN
⚠️ 部署复杂
依赖多组件

核心特点:

特性 说明
定位 云原生分布式向量数据库
索引 IVF、HNSW、DiskANN、GPU 索引
部署 Kubernetes(推荐)、Docker Compose
适合 大规模(1亿+)、企业级生产环境

优势:

  • ✅ 真正的分布式架构,支持横向扩展
  • ✅ 存算分离,灵活扩展
  • ✅ 支持十亿级向量
  • ✅ GPU 加速索引
  • ✅ 企业级稳定性

劣势:

  • ❌ 部署复杂,依赖多个组件
  • ❌ 学习曲线陡峭
  • ❌ 资源消耗较大

2.4 Chroma:轻量级嵌入式向量数据库

#mermaid-svg-3uDW2JaEO6E5er1T{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3uDW2JaEO6E5er1T .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3uDW2JaEO6E5er1T .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3uDW2JaEO6E5er1T .error-icon{fill:#552222;}#mermaid-svg-3uDW2JaEO6E5er1T .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3uDW2JaEO6E5er1T .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3uDW2JaEO6E5er1T .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3uDW2JaEO6E5er1T .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3uDW2JaEO6E5er1T .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3uDW2JaEO6E5er1T .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3uDW2JaEO6E5er1T .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3uDW2JaEO6E5er1T .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3uDW2JaEO6E5er1T .marker.cross{stroke:#333333;}#mermaid-svg-3uDW2JaEO6E5er1T svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3uDW2JaEO6E5er1T p{margin:0;}#mermaid-svg-3uDW2JaEO6E5er1T .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-3uDW2JaEO6E5er1T .cluster-label text{fill:#333;}#mermaid-svg-3uDW2JaEO6E5er1T .cluster-label span{color:#333;}#mermaid-svg-3uDW2JaEO6E5er1T .cluster-label span p{background-color:transparent;}#mermaid-svg-3uDW2JaEO6E5er1T .label text,#mermaid-svg-3uDW2JaEO6E5er1T span{fill:#333;color:#333;}#mermaid-svg-3uDW2JaEO6E5er1T .node rect,#mermaid-svg-3uDW2JaEO6E5er1T .node circle,#mermaid-svg-3uDW2JaEO6E5er1T .node ellipse,#mermaid-svg-3uDW2JaEO6E5er1T .node polygon,#mermaid-svg-3uDW2JaEO6E5er1T .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3uDW2JaEO6E5er1T .rough-node .label text,#mermaid-svg-3uDW2JaEO6E5er1T .node .label text,#mermaid-svg-3uDW2JaEO6E5er1T .image-shape .label,#mermaid-svg-3uDW2JaEO6E5er1T .icon-shape .label{text-anchor:middle;}#mermaid-svg-3uDW2JaEO6E5er1T .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3uDW2JaEO6E5er1T .rough-node .label,#mermaid-svg-3uDW2JaEO6E5er1T .node .label,#mermaid-svg-3uDW2JaEO6E5er1T .image-shape .label,#mermaid-svg-3uDW2JaEO6E5er1T .icon-shape .label{text-align:center;}#mermaid-svg-3uDW2JaEO6E5er1T .node.clickable{cursor:pointer;}#mermaid-svg-3uDW2JaEO6E5er1T .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-3uDW2JaEO6E5er1T .arrowheadPath{fill:#333333;}#mermaid-svg-3uDW2JaEO6E5er1T .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3uDW2JaEO6E5er1T .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3uDW2JaEO6E5er1T .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3uDW2JaEO6E5er1T .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3uDW2JaEO6E5er1T .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3uDW2JaEO6E5er1T .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-3uDW2JaEO6E5er1T .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3uDW2JaEO6E5er1T .cluster text{fill:#333;}#mermaid-svg-3uDW2JaEO6E5er1T .cluster span{color:#333;}#mermaid-svg-3uDW2JaEO6E5er1T div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-3uDW2JaEO6E5er1T .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3uDW2JaEO6E5er1T rect.text{fill:none;stroke-width:0;}#mermaid-svg-3uDW2JaEO6E5er1T .icon-shape,#mermaid-svg-3uDW2JaEO6E5er1T .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3uDW2JaEO6E5er1T .icon-shape p,#mermaid-svg-3uDW2JaEO6E5er1T .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-3uDW2JaEO6E5er1T .icon-shape .label rect,#mermaid-svg-3uDW2JaEO6E5er1T .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3uDW2JaEO6E5er1T .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3uDW2JaEO6E5er1T .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3uDW2JaEO6E5er1T :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 🎨 Chroma
嵌入式设计
✅ 无需服务器
✅ 零配置
Python 原生
✅ API 简洁
✅ 快速原型
⚠️ 功能有限
单机架构

核心特点:

特性 说明
定位 轻量级嵌入式向量数据库
索引 HNSW
部署 Python 包,pip install chromadb
适合 快速原型、个人项目(< 10万向量)

优势:

  • ✅ 极简安装,无需独立服务
  • ✅ Python API 设计优雅
  • ✅ 内置 Embedding 集成
  • ✅ 非常适合快速原型开发

劣势:

  • ❌ 单机架构,无法扩展
  • ❌ 功能相对简单
  • ❌ 不适合生产高并发场景

三、性能基准测试

3.1 测试环境

yaml 复制代码
硬件配置:
  CPU: Intel Xeon 8核 @ 3.2GHz
  RAM: 64GB DDR4
  SSD: 1TB NVMe
  GPU: NVIDIA A100 40GB(Milvus GPU 测试)

数据集:
  名称: SIFT-1M(100万向量,128维)
  来源: http://corpus-texmex.irisa.fr/
  
测试配置:
  向量数量: 1,000,000
  向量维度: 128
  查询数量: 10,000
  Top-K: 10
  并发: 1-100

3.2 查询延迟对比

#mermaid-svg-qkMNN1KPt3BRsmBI{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qkMNN1KPt3BRsmBI .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qkMNN1KPt3BRsmBI .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qkMNN1KPt3BRsmBI .error-icon{fill:#552222;}#mermaid-svg-qkMNN1KPt3BRsmBI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qkMNN1KPt3BRsmBI .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qkMNN1KPt3BRsmBI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qkMNN1KPt3BRsmBI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qkMNN1KPt3BRsmBI .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qkMNN1KPt3BRsmBI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qkMNN1KPt3BRsmBI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qkMNN1KPt3BRsmBI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qkMNN1KPt3BRsmBI .marker.cross{stroke:#333333;}#mermaid-svg-qkMNN1KPt3BRsmBI svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qkMNN1KPt3BRsmBI p{margin:0;}#mermaid-svg-qkMNN1KPt3BRsmBI :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 查询延迟对比(P99,毫秒) PGVectorChromaQdrantMilvusMilvus+GPU 50454035302520151050 延迟 (ms)

详细数据:

数据库 P50 (ms) P95 (ms) P99 (ms) Recall@10
PGVector (HNSW) 28 38 45 95.2%
Chroma (HNSW) 12 15 18 96.1%
Qdrant (HNSW) 3 4 5 97.8%
Milvus (HNSW) 5 6 8 96.5%
Milvus (GPU) 1.5 2 3 97.2%

结论:

  • 🏆 Qdrant 在 CPU 场景下延迟最低(5ms P99)
  • 🚀 Milvus + GPU 极致性能(3ms P99)
  • ⚠️ PGVector 性能相对较慢,适合低并发场景

3.3 QPS 对比(并发 100)

#mermaid-svg-fiB4Rgmy5OtkjYEL{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fiB4Rgmy5OtkjYEL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fiB4Rgmy5OtkjYEL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fiB4Rgmy5OtkjYEL .error-icon{fill:#552222;}#mermaid-svg-fiB4Rgmy5OtkjYEL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fiB4Rgmy5OtkjYEL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fiB4Rgmy5OtkjYEL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fiB4Rgmy5OtkjYEL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fiB4Rgmy5OtkjYEL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fiB4Rgmy5OtkjYEL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fiB4Rgmy5OtkjYEL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fiB4Rgmy5OtkjYEL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fiB4Rgmy5OtkjYEL .marker.cross{stroke:#333333;}#mermaid-svg-fiB4Rgmy5OtkjYEL svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fiB4Rgmy5OtkjYEL p{margin:0;}#mermaid-svg-fiB4Rgmy5OtkjYEL :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 查询吞吐量对比(QPS) PGVectorChromaQdrantMilvusMilvus+GPU 20000180001600014000120001000080006000400020000 QPS

并发性能分析:

数据库 单线程 QPS 100并发 QPS 扩展性评分
PGVector 22 220 ⭐⭐
Chroma 55 5,500 ⭐⭐⭐
Qdrant 180 18,000 ⭐⭐⭐⭐⭐
Milvus 120 12,000 ⭐⭐⭐⭐⭐
Milvus (GPU) 250 25,000 ⭐⭐⭐⭐⭐

结论:

  • 🏆 Qdrant CPU 性能最佳(18,000 QPS)
  • 🚀 Milvus 分布式扩展能力最强
  • ⚠️ PGVector 高并发能力弱

3.4 写入性能对比

#mermaid-svg-9NLy0gKXb71dl5Mk{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-9NLy0gKXb71dl5Mk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-9NLy0gKXb71dl5Mk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-9NLy0gKXb71dl5Mk .error-icon{fill:#552222;}#mermaid-svg-9NLy0gKXb71dl5Mk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-9NLy0gKXb71dl5Mk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-9NLy0gKXb71dl5Mk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-9NLy0gKXb71dl5Mk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-9NLy0gKXb71dl5Mk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-9NLy0gKXb71dl5Mk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-9NLy0gKXb71dl5Mk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-9NLy0gKXb71dl5Mk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-9NLy0gKXb71dl5Mk .marker.cross{stroke:#333333;}#mermaid-svg-9NLy0gKXb71dl5Mk svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-9NLy0gKXb71dl5Mk p{margin:0;}#mermaid-svg-9NLy0gKXb71dl5Mk :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 写入吞吐量对比(向量/秒) PGVectorChromaQdrantMilvus 600005500050000450004000035000300002500020000150001000050000 吞吐量

写入性能数据:

数据库 单批次写入 批量写入(1000) 索引构建时间(100万)
PGVector 80 8,000 120秒
Chroma 250 25,000 45秒
Qdrant 450 45,000 25秒
Milvus 550 55,000 18秒

结论:

  • 🏆 Milvus 批量写入最快
  • Qdrant 写入性能优秀
  • ⚠️ PGVector 索引构建较慢

3.5 内存占用对比

#mermaid-svg-bsxGjZ4Mw8Jymxjo{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-bsxGjZ4Mw8Jymxjo .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-bsxGjZ4Mw8Jymxjo .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-bsxGjZ4Mw8Jymxjo .error-icon{fill:#552222;}#mermaid-svg-bsxGjZ4Mw8Jymxjo .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bsxGjZ4Mw8Jymxjo .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-bsxGjZ4Mw8Jymxjo .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bsxGjZ4Mw8Jymxjo .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bsxGjZ4Mw8Jymxjo .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-bsxGjZ4Mw8Jymxjo .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bsxGjZ4Mw8Jymxjo .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bsxGjZ4Mw8Jymxjo .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bsxGjZ4Mw8Jymxjo .marker.cross{stroke:#333333;}#mermaid-svg-bsxGjZ4Mw8Jymxjo svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bsxGjZ4Mw8Jymxjo p{margin:0;}#mermaid-svg-bsxGjZ4Mw8Jymxjo :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 内存占用对比(100万向量,128维,MB) PGVectorChromaQdrantQdrant+量化Milvus 8007006005004003002001000 内存 (MB)

内存效率分析:

数据库 原始内存 量化后 内存效率评分
PGVector 600MB 不支持 ⭐⭐
Chroma 520MB 不支持 ⭐⭐⭐
Qdrant 480MB 280MB ⭐⭐⭐⭐⭐
Milvus 550MB 320MB ⭐⭐⭐⭐

结论:

  • 🏆 Qdrant 内存效率最佳(支持 Scalar Quantization)
  • Milvus 支持多种量化方式
  • ⚠️ PGVector/Chroma 无量化支持

3.6 扩展性对比

#mermaid-svg-NgsLCtZYKZDHkhqj{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-NgsLCtZYKZDHkhqj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-NgsLCtZYKZDHkhqj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-NgsLCtZYKZDHkhqj .error-icon{fill:#552222;}#mermaid-svg-NgsLCtZYKZDHkhqj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NgsLCtZYKZDHkhqj .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-NgsLCtZYKZDHkhqj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NgsLCtZYKZDHkhqj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NgsLCtZYKZDHkhqj .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-NgsLCtZYKZDHkhqj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NgsLCtZYKZDHkhqj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NgsLCtZYKZDHkhqj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NgsLCtZYKZDHkhqj .marker.cross{stroke:#333333;}#mermaid-svg-NgsLCtZYKZDHkhqj svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NgsLCtZYKZDHkhqj p{margin:0;}#mermaid-svg-NgsLCtZYKZDHkhqj .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-NgsLCtZYKZDHkhqj .cluster-label text{fill:#333;}#mermaid-svg-NgsLCtZYKZDHkhqj .cluster-label span{color:#333;}#mermaid-svg-NgsLCtZYKZDHkhqj .cluster-label span p{background-color:transparent;}#mermaid-svg-NgsLCtZYKZDHkhqj .label text,#mermaid-svg-NgsLCtZYKZDHkhqj span{fill:#333;color:#333;}#mermaid-svg-NgsLCtZYKZDHkhqj .node rect,#mermaid-svg-NgsLCtZYKZDHkhqj .node circle,#mermaid-svg-NgsLCtZYKZDHkhqj .node ellipse,#mermaid-svg-NgsLCtZYKZDHkhqj .node polygon,#mermaid-svg-NgsLCtZYKZDHkhqj .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NgsLCtZYKZDHkhqj .rough-node .label text,#mermaid-svg-NgsLCtZYKZDHkhqj .node .label text,#mermaid-svg-NgsLCtZYKZDHkhqj .image-shape .label,#mermaid-svg-NgsLCtZYKZDHkhqj .icon-shape .label{text-anchor:middle;}#mermaid-svg-NgsLCtZYKZDHkhqj .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-NgsLCtZYKZDHkhqj .rough-node .label,#mermaid-svg-NgsLCtZYKZDHkhqj .node .label,#mermaid-svg-NgsLCtZYKZDHkhqj .image-shape .label,#mermaid-svg-NgsLCtZYKZDHkhqj .icon-shape .label{text-align:center;}#mermaid-svg-NgsLCtZYKZDHkhqj .node.clickable{cursor:pointer;}#mermaid-svg-NgsLCtZYKZDHkhqj .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-NgsLCtZYKZDHkhqj .arrowheadPath{fill:#333333;}#mermaid-svg-NgsLCtZYKZDHkhqj .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-NgsLCtZYKZDHkhqj .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-NgsLCtZYKZDHkhqj .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NgsLCtZYKZDHkhqj .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-NgsLCtZYKZDHkhqj .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NgsLCtZYKZDHkhqj .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-NgsLCtZYKZDHkhqj .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NgsLCtZYKZDHkhqj .cluster text{fill:#333;}#mermaid-svg-NgsLCtZYKZDHkhqj .cluster span{color:#333;}#mermaid-svg-NgsLCtZYKZDHkhqj div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-NgsLCtZYKZDHkhqj .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-NgsLCtZYKZDHkhqj rect.text{fill:none;stroke-width:0;}#mermaid-svg-NgsLCtZYKZDHkhqj .icon-shape,#mermaid-svg-NgsLCtZYKZDHkhqj .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NgsLCtZYKZDHkhqj .icon-shape p,#mermaid-svg-NgsLCtZYKZDHkhqj .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-NgsLCtZYKZDHkhqj .icon-shape .label rect,#mermaid-svg-NgsLCtZYKZDHkhqj .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NgsLCtZYKZDHkhqj .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-NgsLCtZYKZDHkhqj .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-NgsLCtZYKZDHkhqj :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 扩展能力
PGVector
Chroma
Qdrant
Milvus
❌ 单机
❌ 单机
✅ 集群支持
✅ 分布式原生

数据库 单机容量 分布式 水平扩展 高可用
PGVector ~100万 ⚠️(依赖 Postgres)
Chroma ~50万
Qdrant ~5000万 ⚠️ 实验性 ⚠️
Milvus 十亿级 ✅ 原生

四、功能特性对比

4.1 核心功能矩阵

#mermaid-svg-VZnz1aD7sLmdVQTb{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-VZnz1aD7sLmdVQTb .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-VZnz1aD7sLmdVQTb .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-VZnz1aD7sLmdVQTb .error-icon{fill:#552222;}#mermaid-svg-VZnz1aD7sLmdVQTb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VZnz1aD7sLmdVQTb .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-VZnz1aD7sLmdVQTb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VZnz1aD7sLmdVQTb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VZnz1aD7sLmdVQTb .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-VZnz1aD7sLmdVQTb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VZnz1aD7sLmdVQTb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VZnz1aD7sLmdVQTb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VZnz1aD7sLmdVQTb .marker.cross{stroke:#333333;}#mermaid-svg-VZnz1aD7sLmdVQTb svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VZnz1aD7sLmdVQTb p{margin:0;}#mermaid-svg-VZnz1aD7sLmdVQTb .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VZnz1aD7sLmdVQTb .cluster-label text{fill:#333;}#mermaid-svg-VZnz1aD7sLmdVQTb .cluster-label span{color:#333;}#mermaid-svg-VZnz1aD7sLmdVQTb .cluster-label span p{background-color:transparent;}#mermaid-svg-VZnz1aD7sLmdVQTb .label text,#mermaid-svg-VZnz1aD7sLmdVQTb span{fill:#333;color:#333;}#mermaid-svg-VZnz1aD7sLmdVQTb .node rect,#mermaid-svg-VZnz1aD7sLmdVQTb .node circle,#mermaid-svg-VZnz1aD7sLmdVQTb .node ellipse,#mermaid-svg-VZnz1aD7sLmdVQTb .node polygon,#mermaid-svg-VZnz1aD7sLmdVQTb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VZnz1aD7sLmdVQTb .rough-node .label text,#mermaid-svg-VZnz1aD7sLmdVQTb .node .label text,#mermaid-svg-VZnz1aD7sLmdVQTb .image-shape .label,#mermaid-svg-VZnz1aD7sLmdVQTb .icon-shape .label{text-anchor:middle;}#mermaid-svg-VZnz1aD7sLmdVQTb .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-VZnz1aD7sLmdVQTb .rough-node .label,#mermaid-svg-VZnz1aD7sLmdVQTb .node .label,#mermaid-svg-VZnz1aD7sLmdVQTb .image-shape .label,#mermaid-svg-VZnz1aD7sLmdVQTb .icon-shape .label{text-align:center;}#mermaid-svg-VZnz1aD7sLmdVQTb .node.clickable{cursor:pointer;}#mermaid-svg-VZnz1aD7sLmdVQTb .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-VZnz1aD7sLmdVQTb .arrowheadPath{fill:#333333;}#mermaid-svg-VZnz1aD7sLmdVQTb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VZnz1aD7sLmdVQTb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VZnz1aD7sLmdVQTb .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VZnz1aD7sLmdVQTb .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-VZnz1aD7sLmdVQTb .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VZnz1aD7sLmdVQTb .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-VZnz1aD7sLmdVQTb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VZnz1aD7sLmdVQTb .cluster text{fill:#333;}#mermaid-svg-VZnz1aD7sLmdVQTb .cluster span{color:#333;}#mermaid-svg-VZnz1aD7sLmdVQTb div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VZnz1aD7sLmdVQTb .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-VZnz1aD7sLmdVQTb rect.text{fill:none;stroke-width:0;}#mermaid-svg-VZnz1aD7sLmdVQTb .icon-shape,#mermaid-svg-VZnz1aD7sLmdVQTb .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VZnz1aD7sLmdVQTb .icon-shape p,#mermaid-svg-VZnz1aD7sLmdVQTb .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-VZnz1aD7sLmdVQTb .icon-shape .label rect,#mermaid-svg-VZnz1aD7sLmdVQTb .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VZnz1aD7sLmdVQTb .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-VZnz1aD7sLmdVQTb .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-VZnz1aD7sLmdVQTb :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 功能矩阵
索引类型
查询能力
数据管理
分布式
PGVector: IVF, HNSW
Qdrant: HNSW, Quantization
Milvus: IVF, HNSW, DiskANN, GPU
Chroma: HNSW
向量搜索 + 元数据过滤
CRUD + 持久化
分片 + 副本

4.2 详细功能对比表

功能 PGVector Qdrant Milvus Chroma
索引类型 ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐
IVFFlat
HNSW
DiskANN
GPU 索引
查询能力 ⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐
向量搜索
元数据过滤 ✅ SQL ✅ 丰富 ✅ 中等 ✅ 简单
混合查询
标量量化
积量化
分布式 ⭐⭐⭐ ⭐⭐⭐⭐⭐
水平扩展 ⚠️
高可用 ⚠️
分片 ⚠️
生态 ⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
LangChain
LlamaIndex
SDK 语言 SQL Python/Go/Rust Python/Go/Java Python

4.3 独特优势对比

#mermaid-svg-3gQRDesA0fpNfFen{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3gQRDesA0fpNfFen .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3gQRDesA0fpNfFen .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3gQRDesA0fpNfFen .error-icon{fill:#552222;}#mermaid-svg-3gQRDesA0fpNfFen .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3gQRDesA0fpNfFen .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3gQRDesA0fpNfFen .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3gQRDesA0fpNfFen .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3gQRDesA0fpNfFen .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3gQRDesA0fpNfFen .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3gQRDesA0fpNfFen .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3gQRDesA0fpNfFen .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3gQRDesA0fpNfFen .marker.cross{stroke:#333333;}#mermaid-svg-3gQRDesA0fpNfFen svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3gQRDesA0fpNfFen p{margin:0;}#mermaid-svg-3gQRDesA0fpNfFen .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-3gQRDesA0fpNfFen .cluster-label text{fill:#333;}#mermaid-svg-3gQRDesA0fpNfFen .cluster-label span{color:#333;}#mermaid-svg-3gQRDesA0fpNfFen .cluster-label span p{background-color:transparent;}#mermaid-svg-3gQRDesA0fpNfFen .label text,#mermaid-svg-3gQRDesA0fpNfFen span{fill:#333;color:#333;}#mermaid-svg-3gQRDesA0fpNfFen .node rect,#mermaid-svg-3gQRDesA0fpNfFen .node circle,#mermaid-svg-3gQRDesA0fpNfFen .node ellipse,#mermaid-svg-3gQRDesA0fpNfFen .node polygon,#mermaid-svg-3gQRDesA0fpNfFen .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3gQRDesA0fpNfFen .rough-node .label text,#mermaid-svg-3gQRDesA0fpNfFen .node .label text,#mermaid-svg-3gQRDesA0fpNfFen .image-shape .label,#mermaid-svg-3gQRDesA0fpNfFen .icon-shape .label{text-anchor:middle;}#mermaid-svg-3gQRDesA0fpNfFen .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3gQRDesA0fpNfFen .rough-node .label,#mermaid-svg-3gQRDesA0fpNfFen .node .label,#mermaid-svg-3gQRDesA0fpNfFen .image-shape .label,#mermaid-svg-3gQRDesA0fpNfFen .icon-shape .label{text-align:center;}#mermaid-svg-3gQRDesA0fpNfFen .node.clickable{cursor:pointer;}#mermaid-svg-3gQRDesA0fpNfFen .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-3gQRDesA0fpNfFen .arrowheadPath{fill:#333333;}#mermaid-svg-3gQRDesA0fpNfFen .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3gQRDesA0fpNfFen .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3gQRDesA0fpNfFen .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3gQRDesA0fpNfFen .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3gQRDesA0fpNfFen .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3gQRDesA0fpNfFen .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-3gQRDesA0fpNfFen .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3gQRDesA0fpNfFen .cluster text{fill:#333;}#mermaid-svg-3gQRDesA0fpNfFen .cluster span{color:#333;}#mermaid-svg-3gQRDesA0fpNfFen div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-3gQRDesA0fpNfFen .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3gQRDesA0fpNfFen rect.text{fill:none;stroke-width:0;}#mermaid-svg-3gQRDesA0fpNfFen .icon-shape,#mermaid-svg-3gQRDesA0fpNfFen .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3gQRDesA0fpNfFen .icon-shape p,#mermaid-svg-3gQRDesA0fpNfFen .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-3gQRDesA0fpNfFen .icon-shape .label rect,#mermaid-svg-3gQRDesA0fpNfFen .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3gQRDesA0fpNfFen .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3gQRDesA0fpNfFen .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3gQRDesA0fpNfFen :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 独特优势
PGVector

✅ SQL 集成

✅ ACID 事务
Qdrant

✅ Rust 高性能

✅ 量化技术
Milvus

✅ 分布式原生

✅ GPU 加速
Chroma

✅ 嵌入式设计

✅ 极简 API


五、部署难度对比

5.1 部署复杂度评分

#mermaid-svg-T7wfeD8bZdb8p0V9{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-T7wfeD8bZdb8p0V9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-T7wfeD8bZdb8p0V9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-T7wfeD8bZdb8p0V9 .error-icon{fill:#552222;}#mermaid-svg-T7wfeD8bZdb8p0V9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-T7wfeD8bZdb8p0V9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-T7wfeD8bZdb8p0V9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-T7wfeD8bZdb8p0V9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-T7wfeD8bZdb8p0V9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-T7wfeD8bZdb8p0V9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-T7wfeD8bZdb8p0V9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-T7wfeD8bZdb8p0V9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-T7wfeD8bZdb8p0V9 .marker.cross{stroke:#333333;}#mermaid-svg-T7wfeD8bZdb8p0V9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-T7wfeD8bZdb8p0V9 p{margin:0;}#mermaid-svg-T7wfeD8bZdb8p0V9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 部署复杂度评分(1=最简单,5=最复杂) ChromaPGVectorQdrantMilvus 65.554.543.532.521.510.50 复杂度

5.2 部署方式对比

数据库 部署方式 最小配置 推荐配置 部署时间
Chroma pip install 1 分钟
PGVector Docker/扩展 单容器 PostgreSQL 集群 5 分钟
Qdrant Docker/K8s 单容器 3 节点集群 10 分钟
Milvus K8s/Operator Docker Compose K8s 集群 30-60 分钟

5.3 Chroma 部署(最简单)

python 复制代码
# 安装
pip install chromadb

# 使用
import chromadb
client = chromadb.Client()  # 内存模式
# client = chromadb.PersistentClient(path="./chroma_db")  # 持久化模式

# 创建集合
collection = client.create_collection(name="my_collection")

# 添加向量
collection.add(
    documents=["这是第一段文本", "这是第二段文本"],
    metadatas=[{"source": "doc1"}, {"source": "doc2"}],
    ids=["id1", "id2"]
)

# 查询
results = collection.query(
    query_texts=["搜索文本"],
    n_results=2
)

5.4 PGVector 部署

bash 复制代码
# Docker 方式
docker run -d \
  --name postgres-vector \
  -e POSTGRES_PASSWORD=password \
  -e POSTGRES_DB=vectordb \
  -p 5432:5432 \
  ankane/pgvector:latest

# 连接后执行
psql -h localhost -U postgres -d vectordb

# 启用扩展
CREATE EXTENSION vector;

# 创建表
CREATE TABLE items (
  id SERIAL PRIMARY KEY,
  embedding VECTOR(1536),
  metadata JSONB
);

# 创建索引
CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);

# 插入数据
INSERT INTO items (embedding, metadata) VALUES ('[0.1, 0.2, ...]', '{"name": "test"}');

# 向量搜索
SELECT id, metadata, 1 - (embedding <=> '[0.1, 0.2, ...]') AS similarity
FROM items
ORDER BY embedding <=> '[0.1, 0.2, ...]'
LIMIT 10;

5.5 Qdrant 部署

bash 复制代码
# Docker 方式
docker run -d \
  --name qdrant \
  -p 6333:6333 \
  -p 6334:6334 \
  -v $(pwd)/qdrant_storage:/qdrant/storage \
  qdrant/qdrant

# Python 使用
pip install qdrant-client

from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams

client = QdrantClient(host="localhost", port=6333)

# 创建集合
client.create_collection(
    collection_name="my_collection",
    vectors_config=VectorParams(size=1536, distance=Distance.COSINE)
)

# 插入向量
from qdrant_client.models import PointStruct

points = [
    PointStruct(id=1, vector=[0.1, 0.2, ...], payload={"name": "item1"}),
    PointStruct(id=2, vector=[0.3, 0.4, ...], payload={"name": "item2"})
]
client.upsert(collection_name="my_collection", points=points)

# 搜索
results = client.search(
    collection_name="my_collection",
    query_vector=[0.1, 0.2, ...],
    limit=10,
    query_filter={"must": [{"key": "name", "match": {"value": "item1"}}]}
)

5.6 Milvus 部署

bash 复制代码
# Docker Compose 方式
wget https://github.com/milvus-io/milvus/releases/download/v2.3.0/milvus-standalone-docker-compose.yml -O docker-compose.yml
docker-compose up -d

# Python 使用
pip install pymilvus

from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType, utility

# 连接
connections.connect(host="localhost", port="19530")

# 创建集合
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=False),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1536)
]
schema = CollectionSchema(fields, "demo collection")
collection = Collection("demo", schema=schema)

# 创建索引
index_params = {
    "metric_type": "COSINE",
    "index_type": "HNSW",
    "params": {"M": 8, "efConstruction": 64}
}
collection.create_index(field_name="embedding", index_params=index_params)

# 插入数据
import numpy as np
vectors = np.random.rand(1000, 1536).tolist()
ids = list(range(1000))
collection.insert([ids, vectors])

# 搜索
collection.load()
search_params = {"metric_type": "COSINE", "params": {"ef": 64}}
results = collection.search(
    data=[vectors[0]],
    anns_field="embedding",
    param=search_params,
    limit=10
)

六、选型决策树

6.1 选型流程图

#mermaid-svg-IxFgw7xPmf195i3D{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-IxFgw7xPmf195i3D .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-IxFgw7xPmf195i3D .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-IxFgw7xPmf195i3D .error-icon{fill:#552222;}#mermaid-svg-IxFgw7xPmf195i3D .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IxFgw7xPmf195i3D .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-IxFgw7xPmf195i3D .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IxFgw7xPmf195i3D .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IxFgw7xPmf195i3D .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-IxFgw7xPmf195i3D .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IxFgw7xPmf195i3D .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IxFgw7xPmf195i3D .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IxFgw7xPmf195i3D .marker.cross{stroke:#333333;}#mermaid-svg-IxFgw7xPmf195i3D svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IxFgw7xPmf195i3D p{margin:0;}#mermaid-svg-IxFgw7xPmf195i3D .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-IxFgw7xPmf195i3D .cluster-label text{fill:#333;}#mermaid-svg-IxFgw7xPmf195i3D .cluster-label span{color:#333;}#mermaid-svg-IxFgw7xPmf195i3D .cluster-label span p{background-color:transparent;}#mermaid-svg-IxFgw7xPmf195i3D .label text,#mermaid-svg-IxFgw7xPmf195i3D span{fill:#333;color:#333;}#mermaid-svg-IxFgw7xPmf195i3D .node rect,#mermaid-svg-IxFgw7xPmf195i3D .node circle,#mermaid-svg-IxFgw7xPmf195i3D .node ellipse,#mermaid-svg-IxFgw7xPmf195i3D .node polygon,#mermaid-svg-IxFgw7xPmf195i3D .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IxFgw7xPmf195i3D .rough-node .label text,#mermaid-svg-IxFgw7xPmf195i3D .node .label text,#mermaid-svg-IxFgw7xPmf195i3D .image-shape .label,#mermaid-svg-IxFgw7xPmf195i3D .icon-shape .label{text-anchor:middle;}#mermaid-svg-IxFgw7xPmf195i3D .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-IxFgw7xPmf195i3D .rough-node .label,#mermaid-svg-IxFgw7xPmf195i3D .node .label,#mermaid-svg-IxFgw7xPmf195i3D .image-shape .label,#mermaid-svg-IxFgw7xPmf195i3D .icon-shape .label{text-align:center;}#mermaid-svg-IxFgw7xPmf195i3D .node.clickable{cursor:pointer;}#mermaid-svg-IxFgw7xPmf195i3D .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-IxFgw7xPmf195i3D .arrowheadPath{fill:#333333;}#mermaid-svg-IxFgw7xPmf195i3D .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-IxFgw7xPmf195i3D .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-IxFgw7xPmf195i3D .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IxFgw7xPmf195i3D .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-IxFgw7xPmf195i3D .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IxFgw7xPmf195i3D .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-IxFgw7xPmf195i3D .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-IxFgw7xPmf195i3D .cluster text{fill:#333;}#mermaid-svg-IxFgw7xPmf195i3D .cluster span{color:#333;}#mermaid-svg-IxFgw7xPmf195i3D div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-IxFgw7xPmf195i3D .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-IxFgw7xPmf195i3D rect.text{fill:none;stroke-width:0;}#mermaid-svg-IxFgw7xPmf195i3D .icon-shape,#mermaid-svg-IxFgw7xPmf195i3D .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IxFgw7xPmf195i3D .icon-shape p,#mermaid-svg-IxFgw7xPmf195i3D .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-IxFgw7xPmf195i3D .icon-shape .label rect,#mermaid-svg-IxFgw7xPmf195i3D .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IxFgw7xPmf195i3D .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-IxFgw7xPmf195i3D .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-IxFgw7xPmf195i3D :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} < 10万
10万-1000万
> 1000万






极高
中等
简单
可接受
选择向量数据库
数据规模?
需要分布式?
性能要求?
✅ Milvus
已有 Postgres?
Qdrant
✅ PGVector
快速原型?
✅ Chroma
Qdrant
✅ Qdrant
部署复杂度?
Qdrant
✅ Milvus

6.2 场景推荐表

场景 推荐选择 理由
🚀 快速原型开发 Chroma 零配置、API 简洁
🏢 企业内部工具 PGVector 复用现有 Postgres 基础设施
高性能 RAG Qdrant 低延迟、高 QPS
🌐 大规模生产系统 Milvus 分布式、可扩展
📊 推荐系统 Milvus 十亿级向量支持
🔍 语义搜索引擎 Qdrant 高召回率
🧪 实验性项目 Chroma 快速迭代
🏗️ K8s 环境 Milvus/Qdrant 云原生支持

6.3 综合评分

#mermaid-svg-950uCiSRh4wQaPHh{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-950uCiSRh4wQaPHh .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-950uCiSRh4wQaPHh .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-950uCiSRh4wQaPHh .error-icon{fill:#552222;}#mermaid-svg-950uCiSRh4wQaPHh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-950uCiSRh4wQaPHh .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-950uCiSRh4wQaPHh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-950uCiSRh4wQaPHh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-950uCiSRh4wQaPHh .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-950uCiSRh4wQaPHh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-950uCiSRh4wQaPHh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-950uCiSRh4wQaPHh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-950uCiSRh4wQaPHh .marker.cross{stroke:#333333;}#mermaid-svg-950uCiSRh4wQaPHh svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-950uCiSRh4wQaPHh p{margin:0;}#mermaid-svg-950uCiSRh4wQaPHh :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 综合评分(满分10分) PGVectorQdrantMilvusChroma 109876543210 分数

数据库 性能 功能 易用性 生产就绪 总分
PGVector 6 7 9 7 7.25
Qdrant 9 9 8 8 8.5
Milvus 9 10 6 10 8.75
Chroma 7 6 10 5 7.0

七、实战案例:RAG 系统选型

7.1 场景描述

#mermaid-svg-JQ90gUSiaB4u5rwk{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-JQ90gUSiaB4u5rwk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-JQ90gUSiaB4u5rwk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-JQ90gUSiaB4u5rwk .error-icon{fill:#552222;}#mermaid-svg-JQ90gUSiaB4u5rwk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-JQ90gUSiaB4u5rwk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-JQ90gUSiaB4u5rwk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JQ90gUSiaB4u5rwk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JQ90gUSiaB4u5rwk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-JQ90gUSiaB4u5rwk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JQ90gUSiaB4u5rwk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JQ90gUSiaB4u5rwk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-JQ90gUSiaB4u5rwk .marker.cross{stroke:#333333;}#mermaid-svg-JQ90gUSiaB4u5rwk svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-JQ90gUSiaB4u5rwk p{margin:0;}#mermaid-svg-JQ90gUSiaB4u5rwk .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-JQ90gUSiaB4u5rwk .cluster-label text{fill:#333;}#mermaid-svg-JQ90gUSiaB4u5rwk .cluster-label span{color:#333;}#mermaid-svg-JQ90gUSiaB4u5rwk .cluster-label span p{background-color:transparent;}#mermaid-svg-JQ90gUSiaB4u5rwk .label text,#mermaid-svg-JQ90gUSiaB4u5rwk span{fill:#333;color:#333;}#mermaid-svg-JQ90gUSiaB4u5rwk .node rect,#mermaid-svg-JQ90gUSiaB4u5rwk .node circle,#mermaid-svg-JQ90gUSiaB4u5rwk .node ellipse,#mermaid-svg-JQ90gUSiaB4u5rwk .node polygon,#mermaid-svg-JQ90gUSiaB4u5rwk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-JQ90gUSiaB4u5rwk .rough-node .label text,#mermaid-svg-JQ90gUSiaB4u5rwk .node .label text,#mermaid-svg-JQ90gUSiaB4u5rwk .image-shape .label,#mermaid-svg-JQ90gUSiaB4u5rwk .icon-shape .label{text-anchor:middle;}#mermaid-svg-JQ90gUSiaB4u5rwk .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-JQ90gUSiaB4u5rwk .rough-node .label,#mermaid-svg-JQ90gUSiaB4u5rwk .node .label,#mermaid-svg-JQ90gUSiaB4u5rwk .image-shape .label,#mermaid-svg-JQ90gUSiaB4u5rwk .icon-shape .label{text-align:center;}#mermaid-svg-JQ90gUSiaB4u5rwk .node.clickable{cursor:pointer;}#mermaid-svg-JQ90gUSiaB4u5rwk .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-JQ90gUSiaB4u5rwk .arrowheadPath{fill:#333333;}#mermaid-svg-JQ90gUSiaB4u5rwk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-JQ90gUSiaB4u5rwk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-JQ90gUSiaB4u5rwk .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JQ90gUSiaB4u5rwk .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-JQ90gUSiaB4u5rwk .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JQ90gUSiaB4u5rwk .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-JQ90gUSiaB4u5rwk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-JQ90gUSiaB4u5rwk .cluster text{fill:#333;}#mermaid-svg-JQ90gUSiaB4u5rwk .cluster span{color:#333;}#mermaid-svg-JQ90gUSiaB4u5rwk div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-JQ90gUSiaB4u5rwk .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-JQ90gUSiaB4u5rwk rect.text{fill:none;stroke-width:0;}#mermaid-svg-JQ90gUSiaB4u5rwk .icon-shape,#mermaid-svg-JQ90gUSiaB4u5rwk .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JQ90gUSiaB4u5rwk .icon-shape p,#mermaid-svg-JQ90gUSiaB4u5rwk .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-JQ90gUSiaB4u5rwk .icon-shape .label rect,#mermaid-svg-JQ90gUSiaB4u5rwk .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JQ90gUSiaB4u5rwk .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-JQ90gUSiaB4u5rwk .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-JQ90gUSiaB4u5rwk :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 需求
文档量: 50万
维度: 1536
QPS: 100
延迟: <20ms
预算: 中等

需求分析:

  • 📄 文档量:50万(中等规模)
  • 📐 向量维度:1536(OpenAI Embedding)
  • ⚡ QPS 要求:100 并发
  • ⏱️ 延迟要求:< 20ms P99
  • 💰 预算:中等

7.2 方案对比

方案 是否满足 分析
Chroma ❌ 不推荐 单机架构,扩展性差
PGVector ✅ 可行 性能勉强达标,但运维成本低
Qdrant ✅ 推荐 性能优秀,延迟 < 5ms
Milvus ⚠️ 过度 50万数据用分布式,杀鸡用牛刀

7.3 最终方案:Qdrant

#mermaid-svg-L282yEOJapbN4zWh{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-L282yEOJapbN4zWh .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-L282yEOJapbN4zWh .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-L282yEOJapbN4zWh .error-icon{fill:#552222;}#mermaid-svg-L282yEOJapbN4zWh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-L282yEOJapbN4zWh .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-L282yEOJapbN4zWh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-L282yEOJapbN4zWh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-L282yEOJapbN4zWh .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-L282yEOJapbN4zWh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-L282yEOJapbN4zWh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-L282yEOJapbN4zWh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-L282yEOJapbN4zWh .marker.cross{stroke:#333333;}#mermaid-svg-L282yEOJapbN4zWh svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-L282yEOJapbN4zWh p{margin:0;}#mermaid-svg-L282yEOJapbN4zWh .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-L282yEOJapbN4zWh .cluster-label text{fill:#333;}#mermaid-svg-L282yEOJapbN4zWh .cluster-label span{color:#333;}#mermaid-svg-L282yEOJapbN4zWh .cluster-label span p{background-color:transparent;}#mermaid-svg-L282yEOJapbN4zWh .label text,#mermaid-svg-L282yEOJapbN4zWh span{fill:#333;color:#333;}#mermaid-svg-L282yEOJapbN4zWh .node rect,#mermaid-svg-L282yEOJapbN4zWh .node circle,#mermaid-svg-L282yEOJapbN4zWh .node ellipse,#mermaid-svg-L282yEOJapbN4zWh .node polygon,#mermaid-svg-L282yEOJapbN4zWh .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-L282yEOJapbN4zWh .rough-node .label text,#mermaid-svg-L282yEOJapbN4zWh .node .label text,#mermaid-svg-L282yEOJapbN4zWh .image-shape .label,#mermaid-svg-L282yEOJapbN4zWh .icon-shape .label{text-anchor:middle;}#mermaid-svg-L282yEOJapbN4zWh .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-L282yEOJapbN4zWh .rough-node .label,#mermaid-svg-L282yEOJapbN4zWh .node .label,#mermaid-svg-L282yEOJapbN4zWh .image-shape .label,#mermaid-svg-L282yEOJapbN4zWh .icon-shape .label{text-align:center;}#mermaid-svg-L282yEOJapbN4zWh .node.clickable{cursor:pointer;}#mermaid-svg-L282yEOJapbN4zWh .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-L282yEOJapbN4zWh .arrowheadPath{fill:#333333;}#mermaid-svg-L282yEOJapbN4zWh .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-L282yEOJapbN4zWh .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-L282yEOJapbN4zWh .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-L282yEOJapbN4zWh .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-L282yEOJapbN4zWh .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-L282yEOJapbN4zWh .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-L282yEOJapbN4zWh .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-L282yEOJapbN4zWh .cluster text{fill:#333;}#mermaid-svg-L282yEOJapbN4zWh .cluster span{color:#333;}#mermaid-svg-L282yEOJapbN4zWh div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-L282yEOJapbN4zWh .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-L282yEOJapbN4zWh rect.text{fill:none;stroke-width:0;}#mermaid-svg-L282yEOJapbN4zWh .icon-shape,#mermaid-svg-L282yEOJapbN4zWh .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-L282yEOJapbN4zWh .icon-shape p,#mermaid-svg-L282yEOJapbN4zWh .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-L282yEOJapbN4zWh .icon-shape .label rect,#mermaid-svg-L282yEOJapbN4zWh .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-L282yEOJapbN4zWh .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-L282yEOJapbN4zWh .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-L282yEOJapbN4zWh :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用户查询
FastAPI 网关
Qdrant 检索
Top-5 文档
LLM 生成答案
返回结果
Redis 缓存

部署架构:

yaml 复制代码
# docker-compose.yml
version: '3.8'

services:
  qdrant:
    image: qdrant/qdrant:latest
    container_name: qdrant
    ports:
      - "6333:6333"
      - "6334:6334"
    volumes:
      - ./qdrant_storage:/qdrant/storage
    environment:
      - QDRANT__SERVICE__GRPC_PORT=6334
  
  redis:
    image: redis:7-alpine
    container_name: redis
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data

volumes:
  redis-data:

性能预期:

  • 延迟 P99:< 5ms ✅
  • QPS:> 1000 ✅
  • 内存占用:~500MB ✅

八、迁移与混合方案

8.1 从 Chroma 迁移到 Qdrant

python 复制代码
"""
迁移脚本:Chroma → Qdrant
"""
from chromadb import Client as ChromaClient
from qdrant_client import QdrantClient
from qdrant_client.models import PointStruct, VectorParams, Distance

# 连接源和目标
chroma = ChromaClient()
qdrant = QdrantClient(host="localhost", port=6333)

# 获取 Chroma 数据
collection = chroma.get_collection("my_collection")
data = collection.get(include=["embeddings", "documents", "metadatas"])

# 创建 Qdrant 集合
qdrant.create_collection(
    collection_name="migrated_collection",
    vectors_config=VectorParams(
        size=len(data["embeddings"][0]),
        distance=Distance.COSINE
    )
)

# 批量迁移
batch_size = 100
for i in range(0, len(data["ids"]), batch_size):
    points = [
        PointStruct(
            id=int(data["ids"][j]),
            vector=data["embeddings"][j],
            payload={
                "document": data["documents"][j],
                "metadata": data["metadatas"][j]
            }
        )
        for j in range(i, min(i + batch_size, len(data["ids"])))
    ]
    qdrant.upsert(collection_name="migrated_collection", points=points)
    print(f"已迁移 {min(i + batch_size, len(data['ids']))} / {len(data['ids'])}")

print("✅ 迁移完成")

8.2 混合方案:PGVector + Qdrant

#mermaid-svg-oIFLEmLMTBVpnxE5{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-oIFLEmLMTBVpnxE5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-oIFLEmLMTBVpnxE5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-oIFLEmLMTBVpnxE5 .error-icon{fill:#552222;}#mermaid-svg-oIFLEmLMTBVpnxE5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-oIFLEmLMTBVpnxE5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-oIFLEmLMTBVpnxE5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-oIFLEmLMTBVpnxE5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-oIFLEmLMTBVpnxE5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-oIFLEmLMTBVpnxE5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-oIFLEmLMTBVpnxE5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-oIFLEmLMTBVpnxE5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-oIFLEmLMTBVpnxE5 .marker.cross{stroke:#333333;}#mermaid-svg-oIFLEmLMTBVpnxE5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-oIFLEmLMTBVpnxE5 p{margin:0;}#mermaid-svg-oIFLEmLMTBVpnxE5 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-oIFLEmLMTBVpnxE5 .cluster-label text{fill:#333;}#mermaid-svg-oIFLEmLMTBVpnxE5 .cluster-label span{color:#333;}#mermaid-svg-oIFLEmLMTBVpnxE5 .cluster-label span p{background-color:transparent;}#mermaid-svg-oIFLEmLMTBVpnxE5 .label text,#mermaid-svg-oIFLEmLMTBVpnxE5 span{fill:#333;color:#333;}#mermaid-svg-oIFLEmLMTBVpnxE5 .node rect,#mermaid-svg-oIFLEmLMTBVpnxE5 .node circle,#mermaid-svg-oIFLEmLMTBVpnxE5 .node ellipse,#mermaid-svg-oIFLEmLMTBVpnxE5 .node polygon,#mermaid-svg-oIFLEmLMTBVpnxE5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-oIFLEmLMTBVpnxE5 .rough-node .label text,#mermaid-svg-oIFLEmLMTBVpnxE5 .node .label text,#mermaid-svg-oIFLEmLMTBVpnxE5 .image-shape .label,#mermaid-svg-oIFLEmLMTBVpnxE5 .icon-shape .label{text-anchor:middle;}#mermaid-svg-oIFLEmLMTBVpnxE5 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-oIFLEmLMTBVpnxE5 .rough-node .label,#mermaid-svg-oIFLEmLMTBVpnxE5 .node .label,#mermaid-svg-oIFLEmLMTBVpnxE5 .image-shape .label,#mermaid-svg-oIFLEmLMTBVpnxE5 .icon-shape .label{text-align:center;}#mermaid-svg-oIFLEmLMTBVpnxE5 .node.clickable{cursor:pointer;}#mermaid-svg-oIFLEmLMTBVpnxE5 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-oIFLEmLMTBVpnxE5 .arrowheadPath{fill:#333333;}#mermaid-svg-oIFLEmLMTBVpnxE5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-oIFLEmLMTBVpnxE5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-oIFLEmLMTBVpnxE5 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oIFLEmLMTBVpnxE5 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-oIFLEmLMTBVpnxE5 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oIFLEmLMTBVpnxE5 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-oIFLEmLMTBVpnxE5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-oIFLEmLMTBVpnxE5 .cluster text{fill:#333;}#mermaid-svg-oIFLEmLMTBVpnxE5 .cluster span{color:#333;}#mermaid-svg-oIFLEmLMTBVpnxE5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-oIFLEmLMTBVpnxE5 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-oIFLEmLMTBVpnxE5 rect.text{fill:none;stroke-width:0;}#mermaid-svg-oIFLEmLMTBVpnxE5 .icon-shape,#mermaid-svg-oIFLEmLMTBVpnxE5 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oIFLEmLMTBVpnxE5 .icon-shape p,#mermaid-svg-oIFLEmLMTBVpnxE5 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-oIFLEmLMTBVpnxE5 .icon-shape .label rect,#mermaid-svg-oIFLEmLMTBVpnxE5 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oIFLEmLMTBVpnxE5 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-oIFLEmLMTBVpnxE5 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-oIFLEmLMTBVpnxE5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 结构化
向量
混合
业务数据
PostgreSQL

结构化数据
Qdrant

向量检索
查询请求
数据类型?
结果合并
返回结果

适用场景:

  • 业务数据与向量数据强关联
  • 需要复杂 SQL 查询 + 向量搜索
  • 已有 PostgreSQL 基础设施

实现示例:

python 复制代码
import psycopg2
from qdrant_client import QdrantClient

# 连接
pg_conn = psycopg2.connect("postgres://...")
qdrant = QdrantClient(host="localhost", port=6333)

def hybrid_search(query_embedding, user_id, limit=10):
    """混合搜索:向量检索 + SQL 过滤"""
    
    # 1. 向量检索获取相似文档
    vector_results = qdrant.search(
        collection_name="documents",
        query_vector=query_embedding,
        limit=limit * 2  # 多取一些用于过滤
    )
    
    # 2. SQL 过滤用户权限
    doc_ids = [r.id for r in vector_results]
    cursor = pg_conn.cursor()
    cursor.execute("""
        SELECT id, title, content 
        FROM documents 
        WHERE id = ANY(%s) 
        AND user_id = %s
        AND is_public = true
        ORDER BY created_at DESC
        LIMIT %s
    """, (doc_ids, user_id, limit))
    
    # 3. 合并结果
    filtered_results = cursor.fetchall()
    return filtered_results

九、最佳实践总结

9.1 选型决策速查表

#mermaid-svg-cwwU3ZidhW0O6wy3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-cwwU3ZidhW0O6wy3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-cwwU3ZidhW0O6wy3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-cwwU3ZidhW0O6wy3 .error-icon{fill:#552222;}#mermaid-svg-cwwU3ZidhW0O6wy3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-cwwU3ZidhW0O6wy3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-cwwU3ZidhW0O6wy3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-cwwU3ZidhW0O6wy3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-cwwU3ZidhW0O6wy3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-cwwU3ZidhW0O6wy3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-cwwU3ZidhW0O6wy3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-cwwU3ZidhW0O6wy3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-cwwU3ZidhW0O6wy3 .marker.cross{stroke:#333333;}#mermaid-svg-cwwU3ZidhW0O6wy3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-cwwU3ZidhW0O6wy3 p{margin:0;}#mermaid-svg-cwwU3ZidhW0O6wy3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-cwwU3ZidhW0O6wy3 .cluster-label text{fill:#333;}#mermaid-svg-cwwU3ZidhW0O6wy3 .cluster-label span{color:#333;}#mermaid-svg-cwwU3ZidhW0O6wy3 .cluster-label span p{background-color:transparent;}#mermaid-svg-cwwU3ZidhW0O6wy3 .label text,#mermaid-svg-cwwU3ZidhW0O6wy3 span{fill:#333;color:#333;}#mermaid-svg-cwwU3ZidhW0O6wy3 .node rect,#mermaid-svg-cwwU3ZidhW0O6wy3 .node circle,#mermaid-svg-cwwU3ZidhW0O6wy3 .node ellipse,#mermaid-svg-cwwU3ZidhW0O6wy3 .node polygon,#mermaid-svg-cwwU3ZidhW0O6wy3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-cwwU3ZidhW0O6wy3 .rough-node .label text,#mermaid-svg-cwwU3ZidhW0O6wy3 .node .label text,#mermaid-svg-cwwU3ZidhW0O6wy3 .image-shape .label,#mermaid-svg-cwwU3ZidhW0O6wy3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-cwwU3ZidhW0O6wy3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-cwwU3ZidhW0O6wy3 .rough-node .label,#mermaid-svg-cwwU3ZidhW0O6wy3 .node .label,#mermaid-svg-cwwU3ZidhW0O6wy3 .image-shape .label,#mermaid-svg-cwwU3ZidhW0O6wy3 .icon-shape .label{text-align:center;}#mermaid-svg-cwwU3ZidhW0O6wy3 .node.clickable{cursor:pointer;}#mermaid-svg-cwwU3ZidhW0O6wy3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-cwwU3ZidhW0O6wy3 .arrowheadPath{fill:#333333;}#mermaid-svg-cwwU3ZidhW0O6wy3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-cwwU3ZidhW0O6wy3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-cwwU3ZidhW0O6wy3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cwwU3ZidhW0O6wy3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-cwwU3ZidhW0O6wy3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cwwU3ZidhW0O6wy3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-cwwU3ZidhW0O6wy3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-cwwU3ZidhW0O6wy3 .cluster text{fill:#333;}#mermaid-svg-cwwU3ZidhW0O6wy3 .cluster span{color:#333;}#mermaid-svg-cwwU3ZidhW0O6wy3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-cwwU3ZidhW0O6wy3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-cwwU3ZidhW0O6wy3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-cwwU3ZidhW0O6wy3 .icon-shape,#mermaid-svg-cwwU3ZidhW0O6wy3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cwwU3ZidhW0O6wy3 .icon-shape p,#mermaid-svg-cwwU3ZidhW0O6wy3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-cwwU3ZidhW0O6wy3 .icon-shape .label rect,#mermaid-svg-cwwU3ZidhW0O6wy3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cwwU3ZidhW0O6wy3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-cwwU3ZidhW0O6wy3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-cwwU3ZidhW0O6wy3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是











快速决策
快速原型?
✅ Chroma
已有 Postgres?
数据量 < 100万?
✅ PGVector
性能要求高?
✅ Qdrant
数据量 > 1000万?
✅ Milvus
追求极致性能?
Qdrant/Milvus 均可

9.2 避坑指南

坑点 解决方案
🚨 维度不匹配 确认 Embedding 模型输出维度,创建集合时指定正确 size
🚨 索引未生效 插入数据后手动创建索引,或使用自动索引
🚨 内存溢出 使用量化技术(Qdrant/Milvus),或限制返回字段
🚨 查询超时 调小 ef_search(HNSW),或使用 IVF 索引
🚨 召回率低 增大 ef_search,或增大 nprobe(IVF)
🚨 数据不一致 定期重建索引,或使用版本控制

9.3 性能优化 Checklist

markdown 复制代码
✅ 索引优化
  □ 选择合适的索引类型(HNSW 推荐)
  □ 调整索引参数(M、efConstruction)
  □ 定期重建索引(数据更新后)

✅ 查询优化
  □ 批量查询而非单条查询
  □ 使用连接池
  □ 启用结果缓存(Redis)

✅ 存储优化
  □ 启用量化(Scalar/Product)
  □ 分片存储(Milvus)
  □ 冷热数据分离

✅ 运维优化
  □ 监控延迟和 QPS
  □ 设置告警阈值
  □ 定期备份

十、总结

#mermaid-svg-FJ8TxKddhJVS6MLX{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-FJ8TxKddhJVS6MLX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-FJ8TxKddhJVS6MLX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-FJ8TxKddhJVS6MLX .error-icon{fill:#552222;}#mermaid-svg-FJ8TxKddhJVS6MLX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FJ8TxKddhJVS6MLX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-FJ8TxKddhJVS6MLX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FJ8TxKddhJVS6MLX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FJ8TxKddhJVS6MLX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-FJ8TxKddhJVS6MLX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FJ8TxKddhJVS6MLX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FJ8TxKddhJVS6MLX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FJ8TxKddhJVS6MLX .marker.cross{stroke:#333333;}#mermaid-svg-FJ8TxKddhJVS6MLX svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FJ8TxKddhJVS6MLX p{margin:0;}#mermaid-svg-FJ8TxKddhJVS6MLX .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-FJ8TxKddhJVS6MLX .cluster-label text{fill:#333;}#mermaid-svg-FJ8TxKddhJVS6MLX .cluster-label span{color:#333;}#mermaid-svg-FJ8TxKddhJVS6MLX .cluster-label span p{background-color:transparent;}#mermaid-svg-FJ8TxKddhJVS6MLX .label text,#mermaid-svg-FJ8TxKddhJVS6MLX span{fill:#333;color:#333;}#mermaid-svg-FJ8TxKddhJVS6MLX .node rect,#mermaid-svg-FJ8TxKddhJVS6MLX .node circle,#mermaid-svg-FJ8TxKddhJVS6MLX .node ellipse,#mermaid-svg-FJ8TxKddhJVS6MLX .node polygon,#mermaid-svg-FJ8TxKddhJVS6MLX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-FJ8TxKddhJVS6MLX .rough-node .label text,#mermaid-svg-FJ8TxKddhJVS6MLX .node .label text,#mermaid-svg-FJ8TxKddhJVS6MLX .image-shape .label,#mermaid-svg-FJ8TxKddhJVS6MLX .icon-shape .label{text-anchor:middle;}#mermaid-svg-FJ8TxKddhJVS6MLX .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-FJ8TxKddhJVS6MLX .rough-node .label,#mermaid-svg-FJ8TxKddhJVS6MLX .node .label,#mermaid-svg-FJ8TxKddhJVS6MLX .image-shape .label,#mermaid-svg-FJ8TxKddhJVS6MLX .icon-shape .label{text-align:center;}#mermaid-svg-FJ8TxKddhJVS6MLX .node.clickable{cursor:pointer;}#mermaid-svg-FJ8TxKddhJVS6MLX .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-FJ8TxKddhJVS6MLX .arrowheadPath{fill:#333333;}#mermaid-svg-FJ8TxKddhJVS6MLX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-FJ8TxKddhJVS6MLX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-FJ8TxKddhJVS6MLX .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-FJ8TxKddhJVS6MLX .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-FJ8TxKddhJVS6MLX .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-FJ8TxKddhJVS6MLX .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-FJ8TxKddhJVS6MLX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-FJ8TxKddhJVS6MLX .cluster text{fill:#333;}#mermaid-svg-FJ8TxKddhJVS6MLX .cluster span{color:#333;}#mermaid-svg-FJ8TxKddhJVS6MLX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-FJ8TxKddhJVS6MLX .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-FJ8TxKddhJVS6MLX rect.text{fill:none;stroke-width:0;}#mermaid-svg-FJ8TxKddhJVS6MLX .icon-shape,#mermaid-svg-FJ8TxKddhJVS6MLX .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-FJ8TxKddhJVS6MLX .icon-shape p,#mermaid-svg-FJ8TxKddhJVS6MLX .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-FJ8TxKddhJVS6MLX .icon-shape .label rect,#mermaid-svg-FJ8TxKddhJVS6MLX .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-FJ8TxKddhJVS6MLX .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-FJ8TxKddhJVS6MLX .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-FJ8TxKddhJVS6MLX :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 🎓 核心结论
🚀 追求性能: Qdrant
🌐 大规模生产: Milvus
🏢 已有 Postgres: PGVector
🧪 快速原型: Chroma
✅ 低延迟

✅ 高 QPS

✅ Rust 内存安全
✅ 分布式

✅ 十亿级

✅ GPU 加速
✅ 易集成

✅ ACID 事务

✅ 低学习成本
✅ 零配置

✅ API 简洁

✅ 快速迭代

最终推荐

场景 首选 备选
个人项目 / 快速验证 Chroma Qdrant
中小企业 / 100万内 Qdrant PGVector
大型企业 / 1000万+ Milvus Qdrant 集群
极致性能需求 Qdrant Milvus + GPU
复用 Postgres 基础设施 PGVector -

资源链接

资源 链接
📚 PGVector 文档 https://github.com/pgvector/pgvector
🚀 Qdrant 官网 https://qdrant.tech/
⚡ Milvus 官网 https://milvus.io/
🎨 Chroma 文档 https://docs.trychroma.com/
📊 ANN Benchmarks https://ann-benchmarks.com/

本文基于 PGVector 0.7、Qdrant 1.8、Milvus 2.3、Chroma 0.4 编写。性能数据基于 SIFT-1M 数据集测试,实际效果因场景而异。如有问题欢迎评论区讨论!

相关推荐
sleven fung1 小时前
Milvus 向量数据库
开发语言·数据库·python·langchain·milvus
赵渝强老师2 小时前
【赵渝强老师】崖山数据库的数据字典
数据库·oracle
java_cj2 小时前
MySQL 8.0 新特性深度解析:降序索引、Doublewrite Buffer 与 redo log 无锁优化
数据库·mysql
网管NO.12 小时前
多表联查入门|INNER JOIN 内连接,关联查询基础(实操案例)
数据库·sql
devilnumber2 小时前
MySQL 索引失效 20 例
数据库·mysql
念恒123062 小时前
MySQL事务(上)
数据库·mysql
devilnumber2 小时前
MySQL 执行计划(EXPLAIN)背诵版
数据库·mysql
念恒123062 小时前
MySQL视图
数据库·mysql
我叫张小白。3 小时前
基于Redis的缓存架构与一致性保障体系
数据库·redis·缓存·架构