向量数据库深度对比: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 数据集测试,实际效果因场景而异。如有问题欢迎评论区讨论!