向量数据库深度解析:从原理到实战,构建企业级 AI 知识检索底座
-
- [一、引言:为什么 AI 时代离不开向量数据库?](#一、引言:为什么 AI 时代离不开向量数据库?)
- [二、核心原理:Embedding + 相似度检索](#二、核心原理:Embedding + 相似度检索)
-
- [2.1 什么是向量(Embedding)?](#2.1 什么是向量(Embedding)?)
- [2.2 相似度检索算法](#2.2 相似度检索算法)
- 三、主流向量数据库选型对比
-
- [3.1 选型矩阵](#3.1 选型矩阵)
- [3.2 选型决策树](#3.2 选型决策树)
- 四、企业级架构设计
-
- [4.1 典型 RAG 向量检索架构](#4.1 典型 RAG 向量检索架构)
- [4.2 微服务架构(生产环境)](#4.2 微服务架构(生产环境))
- [4.3 混合检索架构(向量 + 关键词)](#4.3 混合检索架构(向量 + 关键词))
- [五、完整实战:基于 Milvus 构建知识检索系统](#五、完整实战:基于 Milvus 构建知识检索系统)
-
- [5.1 环境准备](#5.1 环境准备)
- [5.2 核心代码:Python 客户端](#5.2 核心代码:Python 客户端)
- [5.3 文档入库流水线](#5.3 文档入库流水线)
- [5.4 RAG 问答接口](#5.4 RAG 问答接口)
- 六、性能优化与调优指南
-
- [6.1 索引参数调优](#6.1 索引参数调优)
- [6.2 查询优化技巧](#6.2 查询优化技巧)
- 七、监控与运维
-
- [7.1 关键监控指标](#7.1 关键监控指标)
- [7.2 Milvus 运维命令](#7.2 Milvus 运维命令)
- 八、典型应用场景
- 九、总结与演进路线
- 参考资料
一、引言:为什么 AI 时代离不开向量数据库?
大模型时代,AI 应用面临一个核心挑战:如何让 AI 理解你的私有知识?
传统数据库(MySQL、MongoDB)按"精确匹配"检索:查"苹果手机",只能返回含这三个字的结果。但 AI 需要的是"语义理解"------用户说"iPhone 手机",系统也要把苹果手机相关内容找出来。
向量数据库解决的正是这个问题:
将文本、图片、代码等内容转化为高维向量(Embedding),在向量空间中进行相似度检索,实现语义级别的匹配。
本文将从原理、选型、架构到完整实战,带你构建企业级的 AI 向量检索底座。
二、核心原理:Embedding + 相似度检索
2.1 什么是向量(Embedding)?
#mermaid-svg-ZttVx4aDbdiX3HZk{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-ZttVx4aDbdiX3HZk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ZttVx4aDbdiX3HZk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ZttVx4aDbdiX3HZk .error-icon{fill:#552222;}#mermaid-svg-ZttVx4aDbdiX3HZk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ZttVx4aDbdiX3HZk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ZttVx4aDbdiX3HZk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ZttVx4aDbdiX3HZk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ZttVx4aDbdiX3HZk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ZttVx4aDbdiX3HZk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ZttVx4aDbdiX3HZk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ZttVx4aDbdiX3HZk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ZttVx4aDbdiX3HZk .marker.cross{stroke:#333333;}#mermaid-svg-ZttVx4aDbdiX3HZk svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ZttVx4aDbdiX3HZk p{margin:0;}#mermaid-svg-ZttVx4aDbdiX3HZk .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ZttVx4aDbdiX3HZk .cluster-label text{fill:#333;}#mermaid-svg-ZttVx4aDbdiX3HZk .cluster-label span{color:#333;}#mermaid-svg-ZttVx4aDbdiX3HZk .cluster-label span p{background-color:transparent;}#mermaid-svg-ZttVx4aDbdiX3HZk .label text,#mermaid-svg-ZttVx4aDbdiX3HZk span{fill:#333;color:#333;}#mermaid-svg-ZttVx4aDbdiX3HZk .node rect,#mermaid-svg-ZttVx4aDbdiX3HZk .node circle,#mermaid-svg-ZttVx4aDbdiX3HZk .node ellipse,#mermaid-svg-ZttVx4aDbdiX3HZk .node polygon,#mermaid-svg-ZttVx4aDbdiX3HZk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ZttVx4aDbdiX3HZk .rough-node .label text,#mermaid-svg-ZttVx4aDbdiX3HZk .node .label text,#mermaid-svg-ZttVx4aDbdiX3HZk .image-shape .label,#mermaid-svg-ZttVx4aDbdiX3HZk .icon-shape .label{text-anchor:middle;}#mermaid-svg-ZttVx4aDbdiX3HZk .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ZttVx4aDbdiX3HZk .rough-node .label,#mermaid-svg-ZttVx4aDbdiX3HZk .node .label,#mermaid-svg-ZttVx4aDbdiX3HZk .image-shape .label,#mermaid-svg-ZttVx4aDbdiX3HZk .icon-shape .label{text-align:center;}#mermaid-svg-ZttVx4aDbdiX3HZk .node.clickable{cursor:pointer;}#mermaid-svg-ZttVx4aDbdiX3HZk .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ZttVx4aDbdiX3HZk .arrowheadPath{fill:#333333;}#mermaid-svg-ZttVx4aDbdiX3HZk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ZttVx4aDbdiX3HZk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ZttVx4aDbdiX3HZk .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZttVx4aDbdiX3HZk .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ZttVx4aDbdiX3HZk .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZttVx4aDbdiX3HZk .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ZttVx4aDbdiX3HZk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ZttVx4aDbdiX3HZk .cluster text{fill:#333;}#mermaid-svg-ZttVx4aDbdiX3HZk .cluster span{color:#333;}#mermaid-svg-ZttVx4aDbdiX3HZk 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-ZttVx4aDbdiX3HZk .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ZttVx4aDbdiX3HZk rect.text{fill:none;stroke-width:0;}#mermaid-svg-ZttVx4aDbdiX3HZk .icon-shape,#mermaid-svg-ZttVx4aDbdiX3HZk .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZttVx4aDbdiX3HZk .icon-shape p,#mermaid-svg-ZttVx4aDbdiX3HZk .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ZttVx4aDbdiX3HZk .icon-shape .label rect,#mermaid-svg-ZttVx4aDbdiX3HZk .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZttVx4aDbdiX3HZk .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ZttVx4aDbdiX3HZk .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ZttVx4aDbdiX3HZk :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 向量空间
原始数据
768维
768维
768维
Embedding 模型
384维浮点向量
文本:'苹果是一种水果'
文本:'iPhone 是苹果公司的产品'
文本:'香蕉是热带水果'
📍 苹果(水果)
📍 iPhone(产品)
📍 香蕉(水果)
-0.02, 0.15, -0.33, ..., 0.07
-0.15, 0.22, 0.11, ..., -0.04
-0.01, 0.14, -0.30, ..., 0.09
关键特性:
| 特性 | 说明 |
|---|---|
| 语义相近 → 向量相近 | "苹果"与"香蕉"向量距离近,但与"iPhone"向量距离远 |
| 维度固定 | bge-large 输出 1024 维,每个位置有固定语义含义 |
| 可计算 | 支持余弦相似度、欧氏距离、内积等数学运算 |
2.2 相似度检索算法
#mermaid-svg-tKKTlkGRVtqfOXU5{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-tKKTlkGRVtqfOXU5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-tKKTlkGRVtqfOXU5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-tKKTlkGRVtqfOXU5 .error-icon{fill:#552222;}#mermaid-svg-tKKTlkGRVtqfOXU5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tKKTlkGRVtqfOXU5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-tKKTlkGRVtqfOXU5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tKKTlkGRVtqfOXU5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tKKTlkGRVtqfOXU5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-tKKTlkGRVtqfOXU5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tKKTlkGRVtqfOXU5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tKKTlkGRVtqfOXU5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tKKTlkGRVtqfOXU5 .marker.cross{stroke:#333333;}#mermaid-svg-tKKTlkGRVtqfOXU5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tKKTlkGRVtqfOXU5 p{margin:0;}#mermaid-svg-tKKTlkGRVtqfOXU5 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-tKKTlkGRVtqfOXU5 .cluster-label text{fill:#333;}#mermaid-svg-tKKTlkGRVtqfOXU5 .cluster-label span{color:#333;}#mermaid-svg-tKKTlkGRVtqfOXU5 .cluster-label span p{background-color:transparent;}#mermaid-svg-tKKTlkGRVtqfOXU5 .label text,#mermaid-svg-tKKTlkGRVtqfOXU5 span{fill:#333;color:#333;}#mermaid-svg-tKKTlkGRVtqfOXU5 .node rect,#mermaid-svg-tKKTlkGRVtqfOXU5 .node circle,#mermaid-svg-tKKTlkGRVtqfOXU5 .node ellipse,#mermaid-svg-tKKTlkGRVtqfOXU5 .node polygon,#mermaid-svg-tKKTlkGRVtqfOXU5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-tKKTlkGRVtqfOXU5 .rough-node .label text,#mermaid-svg-tKKTlkGRVtqfOXU5 .node .label text,#mermaid-svg-tKKTlkGRVtqfOXU5 .image-shape .label,#mermaid-svg-tKKTlkGRVtqfOXU5 .icon-shape .label{text-anchor:middle;}#mermaid-svg-tKKTlkGRVtqfOXU5 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-tKKTlkGRVtqfOXU5 .rough-node .label,#mermaid-svg-tKKTlkGRVtqfOXU5 .node .label,#mermaid-svg-tKKTlkGRVtqfOXU5 .image-shape .label,#mermaid-svg-tKKTlkGRVtqfOXU5 .icon-shape .label{text-align:center;}#mermaid-svg-tKKTlkGRVtqfOXU5 .node.clickable{cursor:pointer;}#mermaid-svg-tKKTlkGRVtqfOXU5 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-tKKTlkGRVtqfOXU5 .arrowheadPath{fill:#333333;}#mermaid-svg-tKKTlkGRVtqfOXU5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-tKKTlkGRVtqfOXU5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-tKKTlkGRVtqfOXU5 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tKKTlkGRVtqfOXU5 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-tKKTlkGRVtqfOXU5 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tKKTlkGRVtqfOXU5 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-tKKTlkGRVtqfOXU5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-tKKTlkGRVtqfOXU5 .cluster text{fill:#333;}#mermaid-svg-tKKTlkGRVtqfOXU5 .cluster span{color:#333;}#mermaid-svg-tKKTlkGRVtqfOXU5 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-tKKTlkGRVtqfOXU5 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-tKKTlkGRVtqfOXU5 rect.text{fill:none;stroke-width:0;}#mermaid-svg-tKKTlkGRVtqfOXU5 .icon-shape,#mermaid-svg-tKKTlkGRVtqfOXU5 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tKKTlkGRVtqfOXU5 .icon-shape p,#mermaid-svg-tKKTlkGRVtqfOXU5 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-tKKTlkGRVtqfOXU5 .icon-shape .label rect,#mermaid-svg-tKKTlkGRVtqfOXU5 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tKKTlkGRVtqfOXU5 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-tKKTlkGRVtqfOXU5 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-tKKTlkGRVtqfOXU5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ANN 细分算法
核心检索算法
推荐
推荐
推荐
推荐
暴力搜索
Brute Force
倒排索引
Inverted Index
近似最近邻
ANN Algorithm
HNSW
图算法
内存型 / 高效
IVF
聚类分片
内存+磁盘
DiskANN
磁盘型 / 海量
FLAT
暴力精确
数据量小
数据量 < 10万
数据量 10万~1000万
低延迟
数据量 1000万~1亿
数据量 > 1亿
成本敏感
算法对比:
| 算法 | 原理 | 时间复杂度 | 空间占用 | 召回率 | 适用场景 |
|---|---|---|---|---|---|
| FLAT(暴力) | 遍历全量计算 | O(N) | 低 | 100% | <10 万条 |
| IVF | K-Means 聚类后搜索最近中心 | O(√N) | 中 | 90-95% | 中大规模 |
| HNSW | 分层小世界图,贪心遍历 | O(logN) | 高 | 95-99% | 高并发低延迟 |
| DiskANN | 磁盘索引 + 内存图 | O(logN) | 极低 | 90-95% | 超大规模 |
三、主流向量数据库选型对比
3.1 选型矩阵
| 数据库 | 部署方式 | 索引算法 | 多模态 | 混合检索 | 分布式 | 适合场景 |
|---|---|---|---|---|---|---|
| Milvus | 独立服务 | HNSW/IVF/DiskANN | ✅ | ✅ | ✅ 原生 | 企业级大规模检索 |
| pgvector | PostgreSQL 插件 | HNSW/IVFFlat | ❌ | ✅ 原生SQL | ⚠️ 需分片 | 已有 PG 生态团队 |
| Pinecone | 全托管 SaaS | 自研 | ✅ | ✅ | ✅ | 快速上线·无运维 |
| Weaviate | 容器化 | HNSW | ✅ | ✅ GraphQL | ✅ | 多模态 AI 应用 |
| Qdrant | 容器化 | HNSW | ✅ | ✅ | ✅ | 高性能·Rust 内核 |
| Chroma | 嵌入式 | 简单 | ❌ | ❌ | ❌ | 原型验证·小数据 |
| Faiss | 库级 | IVF/HNSW | ❌ | ❌ | ⚠️ | 算法研究·深度定制 |
3.2 选型决策树
#mermaid-svg-SErED4RtTD5zPjJ7{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-SErED4RtTD5zPjJ7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-SErED4RtTD5zPjJ7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-SErED4RtTD5zPjJ7 .error-icon{fill:#552222;}#mermaid-svg-SErED4RtTD5zPjJ7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SErED4RtTD5zPjJ7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-SErED4RtTD5zPjJ7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SErED4RtTD5zPjJ7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SErED4RtTD5zPjJ7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-SErED4RtTD5zPjJ7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SErED4RtTD5zPjJ7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SErED4RtTD5zPjJ7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SErED4RtTD5zPjJ7 .marker.cross{stroke:#333333;}#mermaid-svg-SErED4RtTD5zPjJ7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SErED4RtTD5zPjJ7 p{margin:0;}#mermaid-svg-SErED4RtTD5zPjJ7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-SErED4RtTD5zPjJ7 .cluster-label text{fill:#333;}#mermaid-svg-SErED4RtTD5zPjJ7 .cluster-label span{color:#333;}#mermaid-svg-SErED4RtTD5zPjJ7 .cluster-label span p{background-color:transparent;}#mermaid-svg-SErED4RtTD5zPjJ7 .label text,#mermaid-svg-SErED4RtTD5zPjJ7 span{fill:#333;color:#333;}#mermaid-svg-SErED4RtTD5zPjJ7 .node rect,#mermaid-svg-SErED4RtTD5zPjJ7 .node circle,#mermaid-svg-SErED4RtTD5zPjJ7 .node ellipse,#mermaid-svg-SErED4RtTD5zPjJ7 .node polygon,#mermaid-svg-SErED4RtTD5zPjJ7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-SErED4RtTD5zPjJ7 .rough-node .label text,#mermaid-svg-SErED4RtTD5zPjJ7 .node .label text,#mermaid-svg-SErED4RtTD5zPjJ7 .image-shape .label,#mermaid-svg-SErED4RtTD5zPjJ7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-SErED4RtTD5zPjJ7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-SErED4RtTD5zPjJ7 .rough-node .label,#mermaid-svg-SErED4RtTD5zPjJ7 .node .label,#mermaid-svg-SErED4RtTD5zPjJ7 .image-shape .label,#mermaid-svg-SErED4RtTD5zPjJ7 .icon-shape .label{text-align:center;}#mermaid-svg-SErED4RtTD5zPjJ7 .node.clickable{cursor:pointer;}#mermaid-svg-SErED4RtTD5zPjJ7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-SErED4RtTD5zPjJ7 .arrowheadPath{fill:#333333;}#mermaid-svg-SErED4RtTD5zPjJ7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-SErED4RtTD5zPjJ7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-SErED4RtTD5zPjJ7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SErED4RtTD5zPjJ7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-SErED4RtTD5zPjJ7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SErED4RtTD5zPjJ7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-SErED4RtTD5zPjJ7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-SErED4RtTD5zPjJ7 .cluster text{fill:#333;}#mermaid-svg-SErED4RtTD5zPjJ7 .cluster span{color:#333;}#mermaid-svg-SErED4RtTD5zPjJ7 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-SErED4RtTD5zPjJ7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-SErED4RtTD5zPjJ7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-SErED4RtTD5zPjJ7 .icon-shape,#mermaid-svg-SErED4RtTD5zPjJ7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SErED4RtTD5zPjJ7 .icon-shape p,#mermaid-svg-SErED4RtTD5zPjJ7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-SErED4RtTD5zPjJ7 .icon-shape .label rect,#mermaid-svg-SErED4RtTD5zPjJ7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SErED4RtTD5zPjJ7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-SErED4RtTD5zPjJ7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-SErED4RtTD5zPjJ7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
是
否
否
是
否
是
否
是
否
开始选型
是否已有 PostgreSQL?
数据量 < 500万?
选择 pgvector
最小化迁移成本
考虑 Milvus / Qdrant
独立扩展性更好
是否需要全托管 SaaS?
选择 Pinecone
零运维·快速上线
是否需要多模态?
(文本+图片+音频)
选择 Weaviate
原生多模态支持
数据量 > 1亿?
选择 Milvus
分布式·企业级
选择 Qdrant
高性能·轻量
四、企业级架构设计
4.1 典型 RAG 向量检索架构
#mermaid-svg-Xig3UFVPZUQAn5Rq{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-Xig3UFVPZUQAn5Rq .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Xig3UFVPZUQAn5Rq .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Xig3UFVPZUQAn5Rq .error-icon{fill:#552222;}#mermaid-svg-Xig3UFVPZUQAn5Rq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Xig3UFVPZUQAn5Rq .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Xig3UFVPZUQAn5Rq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Xig3UFVPZUQAn5Rq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Xig3UFVPZUQAn5Rq .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Xig3UFVPZUQAn5Rq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Xig3UFVPZUQAn5Rq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Xig3UFVPZUQAn5Rq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Xig3UFVPZUQAn5Rq .marker.cross{stroke:#333333;}#mermaid-svg-Xig3UFVPZUQAn5Rq svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Xig3UFVPZUQAn5Rq p{margin:0;}#mermaid-svg-Xig3UFVPZUQAn5Rq .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Xig3UFVPZUQAn5Rq .cluster-label text{fill:#333;}#mermaid-svg-Xig3UFVPZUQAn5Rq .cluster-label span{color:#333;}#mermaid-svg-Xig3UFVPZUQAn5Rq .cluster-label span p{background-color:transparent;}#mermaid-svg-Xig3UFVPZUQAn5Rq .label text,#mermaid-svg-Xig3UFVPZUQAn5Rq span{fill:#333;color:#333;}#mermaid-svg-Xig3UFVPZUQAn5Rq .node rect,#mermaid-svg-Xig3UFVPZUQAn5Rq .node circle,#mermaid-svg-Xig3UFVPZUQAn5Rq .node ellipse,#mermaid-svg-Xig3UFVPZUQAn5Rq .node polygon,#mermaid-svg-Xig3UFVPZUQAn5Rq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Xig3UFVPZUQAn5Rq .rough-node .label text,#mermaid-svg-Xig3UFVPZUQAn5Rq .node .label text,#mermaid-svg-Xig3UFVPZUQAn5Rq .image-shape .label,#mermaid-svg-Xig3UFVPZUQAn5Rq .icon-shape .label{text-anchor:middle;}#mermaid-svg-Xig3UFVPZUQAn5Rq .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Xig3UFVPZUQAn5Rq .rough-node .label,#mermaid-svg-Xig3UFVPZUQAn5Rq .node .label,#mermaid-svg-Xig3UFVPZUQAn5Rq .image-shape .label,#mermaid-svg-Xig3UFVPZUQAn5Rq .icon-shape .label{text-align:center;}#mermaid-svg-Xig3UFVPZUQAn5Rq .node.clickable{cursor:pointer;}#mermaid-svg-Xig3UFVPZUQAn5Rq .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Xig3UFVPZUQAn5Rq .arrowheadPath{fill:#333333;}#mermaid-svg-Xig3UFVPZUQAn5Rq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Xig3UFVPZUQAn5Rq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Xig3UFVPZUQAn5Rq .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Xig3UFVPZUQAn5Rq .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Xig3UFVPZUQAn5Rq .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Xig3UFVPZUQAn5Rq .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Xig3UFVPZUQAn5Rq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Xig3UFVPZUQAn5Rq .cluster text{fill:#333;}#mermaid-svg-Xig3UFVPZUQAn5Rq .cluster span{color:#333;}#mermaid-svg-Xig3UFVPZUQAn5Rq 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-Xig3UFVPZUQAn5Rq .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Xig3UFVPZUQAn5Rq rect.text{fill:none;stroke-width:0;}#mermaid-svg-Xig3UFVPZUQAn5Rq .icon-shape,#mermaid-svg-Xig3UFVPZUQAn5Rq .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Xig3UFVPZUQAn5Rq .icon-shape p,#mermaid-svg-Xig3UFVPZUQAn5Rq .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Xig3UFVPZUQAn5Rq .icon-shape .label rect,#mermaid-svg-Xig3UFVPZUQAn5Rq .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Xig3UFVPZUQAn5Rq .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Xig3UFVPZUQAn5Rq .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Xig3UFVPZUQAn5Rq :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 🤖 大模型
🔍 检索服务
💾 向量数据库
🔄 数据加工流水线
📥 数据源
知识库文档
PDF/DOC/Markdown
产品手册
工单记录
代码仓库
文档解析
Unstructured / LangChain
文本分块
(Chunking)
512-2048 tokens
Embedding 向量化
bge-large-zh / m3e
元数据提取
(标题/分类/时间)
Milvus / pgvector
向量字段
768/1024/1536 维
标量字段
metadata / tags
索引
HNSW / IVF
用户 Query
Query Embedding
向量相似度检索
Top-K ANN
混合检索
BM25 + Vector
重排序
Cross-Encoder
Rerank
RAG Prompt
检索结果作为上下文
生成回答
4.2 微服务架构(生产环境)
#mermaid-svg-JF27t2fCmoipKhps{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-JF27t2fCmoipKhps .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-JF27t2fCmoipKhps .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-JF27t2fCmoipKhps .error-icon{fill:#552222;}#mermaid-svg-JF27t2fCmoipKhps .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-JF27t2fCmoipKhps .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-JF27t2fCmoipKhps .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JF27t2fCmoipKhps .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JF27t2fCmoipKhps .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-JF27t2fCmoipKhps .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JF27t2fCmoipKhps .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JF27t2fCmoipKhps .marker{fill:#333333;stroke:#333333;}#mermaid-svg-JF27t2fCmoipKhps .marker.cross{stroke:#333333;}#mermaid-svg-JF27t2fCmoipKhps svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-JF27t2fCmoipKhps p{margin:0;}#mermaid-svg-JF27t2fCmoipKhps .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-JF27t2fCmoipKhps .cluster-label text{fill:#333;}#mermaid-svg-JF27t2fCmoipKhps .cluster-label span{color:#333;}#mermaid-svg-JF27t2fCmoipKhps .cluster-label span p{background-color:transparent;}#mermaid-svg-JF27t2fCmoipKhps .label text,#mermaid-svg-JF27t2fCmoipKhps span{fill:#333;color:#333;}#mermaid-svg-JF27t2fCmoipKhps .node rect,#mermaid-svg-JF27t2fCmoipKhps .node circle,#mermaid-svg-JF27t2fCmoipKhps .node ellipse,#mermaid-svg-JF27t2fCmoipKhps .node polygon,#mermaid-svg-JF27t2fCmoipKhps .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-JF27t2fCmoipKhps .rough-node .label text,#mermaid-svg-JF27t2fCmoipKhps .node .label text,#mermaid-svg-JF27t2fCmoipKhps .image-shape .label,#mermaid-svg-JF27t2fCmoipKhps .icon-shape .label{text-anchor:middle;}#mermaid-svg-JF27t2fCmoipKhps .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-JF27t2fCmoipKhps .rough-node .label,#mermaid-svg-JF27t2fCmoipKhps .node .label,#mermaid-svg-JF27t2fCmoipKhps .image-shape .label,#mermaid-svg-JF27t2fCmoipKhps .icon-shape .label{text-align:center;}#mermaid-svg-JF27t2fCmoipKhps .node.clickable{cursor:pointer;}#mermaid-svg-JF27t2fCmoipKhps .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-JF27t2fCmoipKhps .arrowheadPath{fill:#333333;}#mermaid-svg-JF27t2fCmoipKhps .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-JF27t2fCmoipKhps .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-JF27t2fCmoipKhps .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JF27t2fCmoipKhps .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-JF27t2fCmoipKhps .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JF27t2fCmoipKhps .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-JF27t2fCmoipKhps .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-JF27t2fCmoipKhps .cluster text{fill:#333;}#mermaid-svg-JF27t2fCmoipKhps .cluster span{color:#333;}#mermaid-svg-JF27t2fCmoipKhps 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-JF27t2fCmoipKhps .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-JF27t2fCmoipKhps rect.text{fill:none;stroke-width:0;}#mermaid-svg-JF27t2fCmoipKhps .icon-shape,#mermaid-svg-JF27t2fCmoipKhps .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JF27t2fCmoipKhps .icon-shape p,#mermaid-svg-JF27t2fCmoipKhps .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-JF27t2fCmoipKhps .icon-shape .label rect,#mermaid-svg-JF27t2fCmoipKhps .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JF27t2fCmoipKhps .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-JF27t2fCmoipKhps .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-JF27t2fCmoipKhps :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 🔄 ETL 流水线
🔢 Embedding 服务
💾 向量数据库集群
⚡ 缓存层
🖥 业务服务层
🌐 API 网关
缓存未命中
Nginx / Kong
RAG API Service
(Spring Boot / FastAPI)
Query 向量化服务
(缓存 Embedding 结果)
Redis
Query → Embedding 缓存
热门结果缓存
Milvus Proxy
Milvus Query Node x2
Milvus Index Node
MinIO / S3
向量存储
ETCD
服务发现
Embedding API
(bge-large-zh-v1.5)
ONNX Runtime
本地推理加速
Kafka
文档变更事件
Spark / Flink
批量向量化
4.3 混合检索架构(向量 + 关键词)
#mermaid-svg-Ud7xiSjAcKKNYxRR{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-Ud7xiSjAcKKNYxRR .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Ud7xiSjAcKKNYxRR .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Ud7xiSjAcKKNYxRR .error-icon{fill:#552222;}#mermaid-svg-Ud7xiSjAcKKNYxRR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Ud7xiSjAcKKNYxRR .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Ud7xiSjAcKKNYxRR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Ud7xiSjAcKKNYxRR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Ud7xiSjAcKKNYxRR .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Ud7xiSjAcKKNYxRR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Ud7xiSjAcKKNYxRR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Ud7xiSjAcKKNYxRR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Ud7xiSjAcKKNYxRR .marker.cross{stroke:#333333;}#mermaid-svg-Ud7xiSjAcKKNYxRR svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Ud7xiSjAcKKNYxRR p{margin:0;}#mermaid-svg-Ud7xiSjAcKKNYxRR .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Ud7xiSjAcKKNYxRR .cluster-label text{fill:#333;}#mermaid-svg-Ud7xiSjAcKKNYxRR .cluster-label span{color:#333;}#mermaid-svg-Ud7xiSjAcKKNYxRR .cluster-label span p{background-color:transparent;}#mermaid-svg-Ud7xiSjAcKKNYxRR .label text,#mermaid-svg-Ud7xiSjAcKKNYxRR span{fill:#333;color:#333;}#mermaid-svg-Ud7xiSjAcKKNYxRR .node rect,#mermaid-svg-Ud7xiSjAcKKNYxRR .node circle,#mermaid-svg-Ud7xiSjAcKKNYxRR .node ellipse,#mermaid-svg-Ud7xiSjAcKKNYxRR .node polygon,#mermaid-svg-Ud7xiSjAcKKNYxRR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Ud7xiSjAcKKNYxRR .rough-node .label text,#mermaid-svg-Ud7xiSjAcKKNYxRR .node .label text,#mermaid-svg-Ud7xiSjAcKKNYxRR .image-shape .label,#mermaid-svg-Ud7xiSjAcKKNYxRR .icon-shape .label{text-anchor:middle;}#mermaid-svg-Ud7xiSjAcKKNYxRR .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Ud7xiSjAcKKNYxRR .rough-node .label,#mermaid-svg-Ud7xiSjAcKKNYxRR .node .label,#mermaid-svg-Ud7xiSjAcKKNYxRR .image-shape .label,#mermaid-svg-Ud7xiSjAcKKNYxRR .icon-shape .label{text-align:center;}#mermaid-svg-Ud7xiSjAcKKNYxRR .node.clickable{cursor:pointer;}#mermaid-svg-Ud7xiSjAcKKNYxRR .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Ud7xiSjAcKKNYxRR .arrowheadPath{fill:#333333;}#mermaid-svg-Ud7xiSjAcKKNYxRR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Ud7xiSjAcKKNYxRR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Ud7xiSjAcKKNYxRR .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Ud7xiSjAcKKNYxRR .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Ud7xiSjAcKKNYxRR .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Ud7xiSjAcKKNYxRR .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Ud7xiSjAcKKNYxRR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Ud7xiSjAcKKNYxRR .cluster text{fill:#333;}#mermaid-svg-Ud7xiSjAcKKNYxRR .cluster span{color:#333;}#mermaid-svg-Ud7xiSjAcKKNYxRR 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-Ud7xiSjAcKKNYxRR .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Ud7xiSjAcKKNYxRR rect.text{fill:none;stroke-width:0;}#mermaid-svg-Ud7xiSjAcKKNYxRR .icon-shape,#mermaid-svg-Ud7xiSjAcKKNYxRR .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Ud7xiSjAcKKNYxRR .icon-shape p,#mermaid-svg-Ud7xiSjAcKKNYxRR .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Ud7xiSjAcKKNYxRR .icon-shape .label rect,#mermaid-svg-Ud7xiSjAcKKNYxRR .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Ud7xiSjAcKKNYxRR .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Ud7xiSjAcKKNYxRR .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Ud7xiSjAcKKNYxRR :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 🔍 混合检索架构
- 向量化
- 关键词提取
ANN 搜索
倒排索引
用户 Query:
'如何配置防火墙规则'
Query Embedding
关键词: 防火墙, 配置
向量索引
HNSW
全文索引
Elasticsearch
向量候选集
Top 100
文本候选集
Top 100
结果融合
RRF 算法
Reciprocal Rank Fusion
Cross-Encoder
重排序
最终 Top 5
送入 LLM
五、完整实战:基于 Milvus 构建知识检索系统
5.1 环境准备
yaml
# docker-compose.yml
version: '3.8'
services:
etcd:
image: quay.io/coreos/etcd:v3.5.5
environment:
- ETCD_AUTO_COMPACTION_MODE=revision
- ETCD_AUTO_COMPACTION_RETENTION=1000
minio:
image: minio/minio:RELEASE.2023-03-20T20-16-18Z
environment:
MINIO_ACCESS_KEY: minioadmin
MINIO_SECRET_KEY: minioadmin
command: minio server /minio_data
milvus:
image: milvusdb/milvus:v2.3.3
environment:
ETCD_ENDPOINTS: etcd:2379
MINIO_ADDRESS: minio:9000
ports:
- "19530:19530"
- "9091:9091"
depends_on:
- etcd
- minio
bash
# 启动服务
docker-compose up -d
5.2 核心代码:Python 客户端
python
# vector_store.py - 向量数据库操作封装
from pymilvus import (
connections, Collection, FieldSchema,
CollectionSchema, DataType, utility
)
from sentence_transformers import SentenceTransformer
import numpy as np
class KnowledgeVectorStore:
"""基于 Milvus 的知识库向量存储"""
def __init__(self, collection_name="knowledge_base"):
self.collection_name = collection_name
# 加载中文 Embedding 模型
self.embedder = SentenceTransformer('BAAI/bge-large-zh-v1.5')
self.dim = 1024 # bge-large-zh 输出维度
# 连接 Milvus
connections.connect(alias="default", host="localhost", port="19530")
self._init_collection()
def _init_collection(self):
"""初始化集合(表)结构"""
if utility.has_collection(self.collection_name):
self.collection = Collection(self.collection_name)
return
# 定义字段 schema
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=8192),
FieldSchema(name="source", dtype=DataType.VARCHAR, max_length=512),
FieldSchema(name="category", dtype=DataType.VARCHAR, max_length=128),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=self.dim),
]
schema = CollectionSchema(fields, "知识库向量存储")
self.collection = Collection(self.collection_name, schema)
# 创建 HNSW 索引(高召回率 + 低延迟)
index_params = {
"index_type": "HNSW",
"metric_type": "COSINE", # 余弦相似度
"params": {
"M": 16, # 图节点连接数
"efConstruction": 200 # 构建时搜索范围
}
}
self.collection.create_index("embedding", index_params)
self.collection.load()
def add_documents(self, texts: list[str], sources: list[str], categories: list[str]):
"""批量添加文档"""
# 向量化
embeddings = self.embedder.encode(texts, normalize_embeddings=True)
entities = [
texts,
sources,
categories,
embeddings.tolist()
]
insert_result = self.collection.insert(entities)
self.collection.flush()
return insert_result.primary_keys
def search(self, query: str, top_k: int = 5, category: str = None) -> list[dict]:
"""语义检索"""
# Query 向量化
query_embedding = self.embedder.encode([query], normalize_embeddings=True)
# 构建过滤条件(标量过滤)
expr = f'category == "{category}"' if category else None
# 搜索参数
search_params = {
"metric_type": "COSINE",
"params": {"ef": 64} # 查询时搜索范围
}
results = self.collection.search(
data=query_embedding.tolist(),
anns_field="embedding",
param=search_params,
limit=top_k,
expr=expr,
output_fields=["content", "source", "category"]
)
# 格式化结果
hits = []
for hits_group in results:
for hit in hits_group:
hits.append({
"content": hit.entity.get("content"),
"source": hit.entity.get("source"),
"category": hit.entity.get("category"),
"score": round(hit.distance, 4)
})
return hits
def hybrid_search(self, query: str, keywords: list[str], top_k: int = 5):
"""混合检索:向量 + 关键词"""
# 1. 向量检索
vector_results = self.search(query, top_k=top_k * 2)
# 2. 关键词匹配加分
for result in vector_results:
text = result["content"].lower()
keyword_score = sum(1 for kw in keywords if kw.lower() in text)
result["hybrid_score"] = result["score"] + keyword_score * 0.1
# 3. 按融合分数重排
vector_results.sort(key=lambda x: x["hybrid_score"], reverse=True)
return vector_results[:top_k]
5.3 文档入库流水线
python
# etl_pipeline.py - 文档处理流水线
import os
from langchain.document_loaders import PyPDFLoader, TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from vector_store import KnowledgeVectorStore
class DocumentETLPipeline:
"""文档 ETL 流水线:解析 → 分块 → 向量化 → 入库"""
def __init__(self):
self.vector_store = KnowledgeVectorStore()
# 分块策略:512 tokens,重叠 50 tokens
self.splitter = RecursiveCharacterTextSplitter(
chunk_size=512,
chunk_overlap=50,
separators=["\n\n", "\n", "。", ";", " "]
)
def process_pdf(self, file_path: str, category: str = "manual"):
"""处理 PDF 文档"""
loader = PyPDFLoader(file_path)
documents = loader.load()
# 提取文本并分块
all_chunks = []
for doc in documents:
chunks = self.splitter.split_text(doc.page_content)
all_chunks.extend(chunks)
# 批量入库
sources = [os.path.basename(file_path)] * len(all_chunks)
categories = [category] * len(all_chunks)
ids = self.vector_store.add_documents(all_chunks, sources, categories)
print(f"✅ 成功导入 {len(ids)} 个文档块到知识库")
return ids
def process_directory(self, dir_path: str, category: str = "knowledge"):
"""批量处理目录"""
for root, _, files in os.walk(dir_path):
for file in files:
if file.endswith('.pdf'):
self.process_pdf(os.path.join(root, file), category)
elif file.endswith('.md') or file.endswith('.txt'):
self.process_text(os.path.join(root, file), category)
# 使用示例
if __name__ == "__main__":
pipeline = DocumentETLPipeline()
pipeline.process_directory("./docs/security_manuals", category="security")
5.4 RAG 问答接口
python
# rag_service.py - RAG 问答服务
from vector_store import KnowledgeVectorStore
import openai
class RAGService:
"""RAG 检索增强生成服务"""
SYSTEM_PROMPT = """你是云安全领域的专家助手。请基于以下参考资料回答用户问题。
如果参考资料不足以回答问题,请明确告知用户。
参考资料:
{context}
用户问题:{question}
请用中文回答,保持专业且易懂。"""
def __init__(self):
self.vector_store = KnowledgeVectorStore()
self.llm_client = openai.OpenAI(api_key="your-api-key")
def answer(self, question: str, category: str = None) -> dict:
"""完整 RAG 流程"""
# 1. 向量检索
retrieved_docs = self.vector_store.search(
query=question,
top_k=5,
category=category
)
if not retrieved_docs:
return {
"answer": "未找到相关知识,请尝试其他关键词。",
"sources": []
}
# 2. 构建上下文
context = "\n\n---\n\n".join([
f"[来源: {doc['source']}]\n{doc['content']}"
for doc in retrieved_docs
])
# 3. 调用 LLM
response = self.llm_client.chat.completions.create(
model="gpt-4",
messages=[{
"role": "user",
"content": self.SYSTEM_PROMPT.format(
context=context,
question=question
)
}],
temperature=0.3,
max_tokens=2048
)
return {
"answer": response.choices[0].message.content,
"sources": [doc["source"] for doc in retrieved_docs],
"retrieved_chunks": retrieved_docs
}
# 使用示例
if __name__ == "__main__":
rag = RAGService()
result = rag.answer("如何配置 WAF 的 CC 防护规则?", category="security")
print(result["answer"])
六、性能优化与调优指南
6.1 索引参数调优
#mermaid-svg-jYjJFsoftxS1yGRP{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-jYjJFsoftxS1yGRP .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jYjJFsoftxS1yGRP .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jYjJFsoftxS1yGRP .error-icon{fill:#552222;}#mermaid-svg-jYjJFsoftxS1yGRP .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jYjJFsoftxS1yGRP .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jYjJFsoftxS1yGRP .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jYjJFsoftxS1yGRP .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jYjJFsoftxS1yGRP .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jYjJFsoftxS1yGRP .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jYjJFsoftxS1yGRP .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jYjJFsoftxS1yGRP .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jYjJFsoftxS1yGRP .marker.cross{stroke:#333333;}#mermaid-svg-jYjJFsoftxS1yGRP svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jYjJFsoftxS1yGRP p{margin:0;}#mermaid-svg-jYjJFsoftxS1yGRP .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-jYjJFsoftxS1yGRP .cluster-label text{fill:#333;}#mermaid-svg-jYjJFsoftxS1yGRP .cluster-label span{color:#333;}#mermaid-svg-jYjJFsoftxS1yGRP .cluster-label span p{background-color:transparent;}#mermaid-svg-jYjJFsoftxS1yGRP .label text,#mermaid-svg-jYjJFsoftxS1yGRP span{fill:#333;color:#333;}#mermaid-svg-jYjJFsoftxS1yGRP .node rect,#mermaid-svg-jYjJFsoftxS1yGRP .node circle,#mermaid-svg-jYjJFsoftxS1yGRP .node ellipse,#mermaid-svg-jYjJFsoftxS1yGRP .node polygon,#mermaid-svg-jYjJFsoftxS1yGRP .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jYjJFsoftxS1yGRP .rough-node .label text,#mermaid-svg-jYjJFsoftxS1yGRP .node .label text,#mermaid-svg-jYjJFsoftxS1yGRP .image-shape .label,#mermaid-svg-jYjJFsoftxS1yGRP .icon-shape .label{text-anchor:middle;}#mermaid-svg-jYjJFsoftxS1yGRP .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-jYjJFsoftxS1yGRP .rough-node .label,#mermaid-svg-jYjJFsoftxS1yGRP .node .label,#mermaid-svg-jYjJFsoftxS1yGRP .image-shape .label,#mermaid-svg-jYjJFsoftxS1yGRP .icon-shape .label{text-align:center;}#mermaid-svg-jYjJFsoftxS1yGRP .node.clickable{cursor:pointer;}#mermaid-svg-jYjJFsoftxS1yGRP .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-jYjJFsoftxS1yGRP .arrowheadPath{fill:#333333;}#mermaid-svg-jYjJFsoftxS1yGRP .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jYjJFsoftxS1yGRP .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jYjJFsoftxS1yGRP .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jYjJFsoftxS1yGRP .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-jYjJFsoftxS1yGRP .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jYjJFsoftxS1yGRP .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-jYjJFsoftxS1yGRP .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jYjJFsoftxS1yGRP .cluster text{fill:#333;}#mermaid-svg-jYjJFsoftxS1yGRP .cluster span{color:#333;}#mermaid-svg-jYjJFsoftxS1yGRP 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-jYjJFsoftxS1yGRP .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-jYjJFsoftxS1yGRP rect.text{fill:none;stroke-width:0;}#mermaid-svg-jYjJFsoftxS1yGRP .icon-shape,#mermaid-svg-jYjJFsoftxS1yGRP .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jYjJFsoftxS1yGRP .icon-shape p,#mermaid-svg-jYjJFsoftxS1yGRP .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-jYjJFsoftxS1yGRP .icon-shape .label rect,#mermaid-svg-jYjJFsoftxS1yGRP .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jYjJFsoftxS1yGRP .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-jYjJFsoftxS1yGRP .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-jYjJFsoftxS1yGRP :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 索引参数调优决策
< 100万
100万~1000万
> 1000万
< 50ms
50~200ms
> 200ms
< 90%
90-95%
> 95%
开始调优
数据量?
HNSW
M=16, efConstruction=200
ef=64
HNSW
M=32, efConstruction=400
ef=128
IVF_FLAT / IVF_SQ8
nlist=4096, nprobe=128
延迟要求?
增加 ef / nprobe
提升召回率
当前参数即可
降低 ef / nprobe
或换 IVF_PQ
召回率?
检查数据质量
增加索引复杂度
微调参数
✅ 达标
参数速查表:
| 参数 | 含义 | 调优方向 |
|---|---|---|
M (HNSW) |
每层图节点最大连接数 | 增大 → 召回率↑,内存↑ |
efConstruction |
构建索引时搜索范围 | 增大 → 图质量↑,构建时间↑ |
ef |
查询时搜索范围 | 增大 → 召回率↑,延迟↑ |
nlist (IVF) |
聚类中心数 | 增大 → 精度↑,内存↑ |
nprobe |
查询时搜索的聚类中心 | 增大 → 召回率↑,延迟↑ |
6.2 查询优化技巧
python
# 1. 标量过滤 + 向量检索(减少搜索空间)
results = collection.search(
data=[query_embedding],
anns_field="embedding",
param=search_params,
limit=top_k,
expr="category == 'security' AND status == 'active'", # 先过滤再检索
output_fields=["content", "source"]
)
# 2. Query 缓存(避免重复 Embedding)
import hashlib
def cached_search(query: str):
query_hash = hashlib.md5(query.encode()).hexdigest()
cached = redis.get(f"embedding:{query_hash}")
if cached:
return json.loads(cached)
embedding = embedder.encode(query)
redis.setex(f"embedding:{query_hash}", 3600, json.dumps(embedding.tolist()))
return embedding
# 3. 批量查询(减少 RPC 往返)
batch_results = collection.search(
data=[emb1, emb2, emb3, ...], # 批量传入
anns_field="embedding",
param=search_params,
limit=top_k
)
七、监控与运维
7.1 关键监控指标
#mermaid-svg-XvSG94lu78bAakfb{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-XvSG94lu78bAakfb .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-XvSG94lu78bAakfb .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-XvSG94lu78bAakfb .error-icon{fill:#552222;}#mermaid-svg-XvSG94lu78bAakfb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-XvSG94lu78bAakfb .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-XvSG94lu78bAakfb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-XvSG94lu78bAakfb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-XvSG94lu78bAakfb .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-XvSG94lu78bAakfb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-XvSG94lu78bAakfb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-XvSG94lu78bAakfb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-XvSG94lu78bAakfb .marker.cross{stroke:#333333;}#mermaid-svg-XvSG94lu78bAakfb svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-XvSG94lu78bAakfb p{margin:0;}#mermaid-svg-XvSG94lu78bAakfb .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-XvSG94lu78bAakfb .cluster-label text{fill:#333;}#mermaid-svg-XvSG94lu78bAakfb .cluster-label span{color:#333;}#mermaid-svg-XvSG94lu78bAakfb .cluster-label span p{background-color:transparent;}#mermaid-svg-XvSG94lu78bAakfb .label text,#mermaid-svg-XvSG94lu78bAakfb span{fill:#333;color:#333;}#mermaid-svg-XvSG94lu78bAakfb .node rect,#mermaid-svg-XvSG94lu78bAakfb .node circle,#mermaid-svg-XvSG94lu78bAakfb .node ellipse,#mermaid-svg-XvSG94lu78bAakfb .node polygon,#mermaid-svg-XvSG94lu78bAakfb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-XvSG94lu78bAakfb .rough-node .label text,#mermaid-svg-XvSG94lu78bAakfb .node .label text,#mermaid-svg-XvSG94lu78bAakfb .image-shape .label,#mermaid-svg-XvSG94lu78bAakfb .icon-shape .label{text-anchor:middle;}#mermaid-svg-XvSG94lu78bAakfb .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-XvSG94lu78bAakfb .rough-node .label,#mermaid-svg-XvSG94lu78bAakfb .node .label,#mermaid-svg-XvSG94lu78bAakfb .image-shape .label,#mermaid-svg-XvSG94lu78bAakfb .icon-shape .label{text-align:center;}#mermaid-svg-XvSG94lu78bAakfb .node.clickable{cursor:pointer;}#mermaid-svg-XvSG94lu78bAakfb .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-XvSG94lu78bAakfb .arrowheadPath{fill:#333333;}#mermaid-svg-XvSG94lu78bAakfb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-XvSG94lu78bAakfb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-XvSG94lu78bAakfb .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XvSG94lu78bAakfb .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-XvSG94lu78bAakfb .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XvSG94lu78bAakfb .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-XvSG94lu78bAakfb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-XvSG94lu78bAakfb .cluster text{fill:#333;}#mermaid-svg-XvSG94lu78bAakfb .cluster span{color:#333;}#mermaid-svg-XvSG94lu78bAakfb 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-XvSG94lu78bAakfb .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-XvSG94lu78bAakfb rect.text{fill:none;stroke-width:0;}#mermaid-svg-XvSG94lu78bAakfb .icon-shape,#mermaid-svg-XvSG94lu78bAakfb .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XvSG94lu78bAakfb .icon-shape p,#mermaid-svg-XvSG94lu78bAakfb .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-XvSG94lu78bAakfb .icon-shape .label rect,#mermaid-svg-XvSG94lu78bAakfb .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XvSG94lu78bAakfb .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-XvSG94lu78bAakfb .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-XvSG94lu78bAakfb :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 🚨 告警规则
📊 核心监控指标
检索延迟
P50 / P95 / P99
QPS
每秒查询数
召回率
Recall@K
索引构建时间
Full / Incremental
内存使用
Collection 级别
数据一致性
写入延迟 / 可见性
P99 > 500ms
Recall@10 < 90%
内存使用率 > 80%
QPS 突增 > 300%
7.2 Milvus 运维命令
bash
# 查看集合信息
milvus_cli > show collection -c knowledge_base
# 查看索引构建进度
milvus_cli > show index_progress -c knowledge_base
# 数据备份
milvus-backup create -n backup_$(date +%Y%m%d)
# 性能分析
milvus_cli > search -c knowledge_base -v "[0.1, 0.2, ...]" --output_fields score
# 监控端点
curl http://localhost:9091/metrics # Prometheus 格式指标
八、典型应用场景
#mermaid-svg-qqJEf9CNYa2ue8dL{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-qqJEf9CNYa2ue8dL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qqJEf9CNYa2ue8dL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qqJEf9CNYa2ue8dL .error-icon{fill:#552222;}#mermaid-svg-qqJEf9CNYa2ue8dL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qqJEf9CNYa2ue8dL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qqJEf9CNYa2ue8dL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qqJEf9CNYa2ue8dL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qqJEf9CNYa2ue8dL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qqJEf9CNYa2ue8dL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qqJEf9CNYa2ue8dL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qqJEf9CNYa2ue8dL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qqJEf9CNYa2ue8dL .marker.cross{stroke:#333333;}#mermaid-svg-qqJEf9CNYa2ue8dL svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qqJEf9CNYa2ue8dL p{margin:0;}#mermaid-svg-qqJEf9CNYa2ue8dL .edge{stroke-width:3;}#mermaid-svg-qqJEf9CNYa2ue8dL .section--1 rect,#mermaid-svg-qqJEf9CNYa2ue8dL .section--1 path,#mermaid-svg-qqJEf9CNYa2ue8dL .section--1 circle,#mermaid-svg-qqJEf9CNYa2ue8dL .section--1 polygon,#mermaid-svg-qqJEf9CNYa2ue8dL .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .section--1 text{fill:#ffffff;}#mermaid-svg-qqJEf9CNYa2ue8dL .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .edge-depth--1{stroke-width:17;}#mermaid-svg-qqJEf9CNYa2ue8dL .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled circle,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:lightgray;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:#efefef;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-0 rect,#mermaid-svg-qqJEf9CNYa2ue8dL .section-0 path,#mermaid-svg-qqJEf9CNYa2ue8dL .section-0 circle,#mermaid-svg-qqJEf9CNYa2ue8dL .section-0 polygon,#mermaid-svg-qqJEf9CNYa2ue8dL .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-qqJEf9CNYa2ue8dL .section-0 text{fill:black;}#mermaid-svg-qqJEf9CNYa2ue8dL .node-icon-0{font-size:40px;color:black;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-qqJEf9CNYa2ue8dL .edge-depth-0{stroke-width:14;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled circle,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:lightgray;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:#efefef;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-1 rect,#mermaid-svg-qqJEf9CNYa2ue8dL .section-1 path,#mermaid-svg-qqJEf9CNYa2ue8dL .section-1 circle,#mermaid-svg-qqJEf9CNYa2ue8dL .section-1 polygon,#mermaid-svg-qqJEf9CNYa2ue8dL .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .section-1 text{fill:black;}#mermaid-svg-qqJEf9CNYa2ue8dL .node-icon-1{font-size:40px;color:black;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .edge-depth-1{stroke-width:11;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled circle,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:lightgray;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:#efefef;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-2 rect,#mermaid-svg-qqJEf9CNYa2ue8dL .section-2 path,#mermaid-svg-qqJEf9CNYa2ue8dL .section-2 circle,#mermaid-svg-qqJEf9CNYa2ue8dL .section-2 polygon,#mermaid-svg-qqJEf9CNYa2ue8dL .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .section-2 text{fill:#ffffff;}#mermaid-svg-qqJEf9CNYa2ue8dL .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .edge-depth-2{stroke-width:8;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled circle,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:lightgray;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:#efefef;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-3 rect,#mermaid-svg-qqJEf9CNYa2ue8dL .section-3 path,#mermaid-svg-qqJEf9CNYa2ue8dL .section-3 circle,#mermaid-svg-qqJEf9CNYa2ue8dL .section-3 polygon,#mermaid-svg-qqJEf9CNYa2ue8dL .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .section-3 text{fill:black;}#mermaid-svg-qqJEf9CNYa2ue8dL .node-icon-3{font-size:40px;color:black;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .edge-depth-3{stroke-width:5;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled circle,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:lightgray;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:#efefef;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-4 rect,#mermaid-svg-qqJEf9CNYa2ue8dL .section-4 path,#mermaid-svg-qqJEf9CNYa2ue8dL .section-4 circle,#mermaid-svg-qqJEf9CNYa2ue8dL .section-4 polygon,#mermaid-svg-qqJEf9CNYa2ue8dL .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .section-4 text{fill:black;}#mermaid-svg-qqJEf9CNYa2ue8dL .node-icon-4{font-size:40px;color:black;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .edge-depth-4{stroke-width:2;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled circle,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:lightgray;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:#efefef;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-5 rect,#mermaid-svg-qqJEf9CNYa2ue8dL .section-5 path,#mermaid-svg-qqJEf9CNYa2ue8dL .section-5 circle,#mermaid-svg-qqJEf9CNYa2ue8dL .section-5 polygon,#mermaid-svg-qqJEf9CNYa2ue8dL .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .section-5 text{fill:black;}#mermaid-svg-qqJEf9CNYa2ue8dL .node-icon-5{font-size:40px;color:black;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .edge-depth-5{stroke-width:-1;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled circle,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:lightgray;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:#efefef;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-6 rect,#mermaid-svg-qqJEf9CNYa2ue8dL .section-6 path,#mermaid-svg-qqJEf9CNYa2ue8dL .section-6 circle,#mermaid-svg-qqJEf9CNYa2ue8dL .section-6 polygon,#mermaid-svg-qqJEf9CNYa2ue8dL .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .section-6 text{fill:black;}#mermaid-svg-qqJEf9CNYa2ue8dL .node-icon-6{font-size:40px;color:black;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .edge-depth-6{stroke-width:-4;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled circle,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:lightgray;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:#efefef;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-7 rect,#mermaid-svg-qqJEf9CNYa2ue8dL .section-7 path,#mermaid-svg-qqJEf9CNYa2ue8dL .section-7 circle,#mermaid-svg-qqJEf9CNYa2ue8dL .section-7 polygon,#mermaid-svg-qqJEf9CNYa2ue8dL .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .section-7 text{fill:black;}#mermaid-svg-qqJEf9CNYa2ue8dL .node-icon-7{font-size:40px;color:black;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .edge-depth-7{stroke-width:-7;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled circle,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:lightgray;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:#efefef;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-8 rect,#mermaid-svg-qqJEf9CNYa2ue8dL .section-8 path,#mermaid-svg-qqJEf9CNYa2ue8dL .section-8 circle,#mermaid-svg-qqJEf9CNYa2ue8dL .section-8 polygon,#mermaid-svg-qqJEf9CNYa2ue8dL .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .section-8 text{fill:black;}#mermaid-svg-qqJEf9CNYa2ue8dL .node-icon-8{font-size:40px;color:black;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .edge-depth-8{stroke-width:-10;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled circle,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:lightgray;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:#efefef;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-9 rect,#mermaid-svg-qqJEf9CNYa2ue8dL .section-9 path,#mermaid-svg-qqJEf9CNYa2ue8dL .section-9 circle,#mermaid-svg-qqJEf9CNYa2ue8dL .section-9 polygon,#mermaid-svg-qqJEf9CNYa2ue8dL .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .section-9 text{fill:black;}#mermaid-svg-qqJEf9CNYa2ue8dL .node-icon-9{font-size:40px;color:black;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .edge-depth-9{stroke-width:-13;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled circle,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:lightgray;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:#efefef;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-10 rect,#mermaid-svg-qqJEf9CNYa2ue8dL .section-10 path,#mermaid-svg-qqJEf9CNYa2ue8dL .section-10 circle,#mermaid-svg-qqJEf9CNYa2ue8dL .section-10 polygon,#mermaid-svg-qqJEf9CNYa2ue8dL .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .section-10 text{fill:black;}#mermaid-svg-qqJEf9CNYa2ue8dL .node-icon-10{font-size:40px;color:black;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .edge-depth-10{stroke-width:-16;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled circle,#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:lightgray;}#mermaid-svg-qqJEf9CNYa2ue8dL .disabled text{fill:#efefef;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-root rect,#mermaid-svg-qqJEf9CNYa2ue8dL .section-root path,#mermaid-svg-qqJEf9CNYa2ue8dL .section-root circle,#mermaid-svg-qqJEf9CNYa2ue8dL .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-qqJEf9CNYa2ue8dL .section-root text{fill:#ffffff;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-root span{color:#ffffff;}#mermaid-svg-qqJEf9CNYa2ue8dL .section-2 span{color:#ffffff;}#mermaid-svg-qqJEf9CNYa2ue8dL .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-qqJEf9CNYa2ue8dL .edge{fill:none;}#mermaid-svg-qqJEf9CNYa2ue8dL .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-qqJEf9CNYa2ue8dL :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 向量数据库\n应用场景
智能客服
企业知识库问答
工单智能分流
客服话术推荐
内容检索
以图搜图
以文搜图
视频内容检索
代码智能
代码语义搜索
重复代码检测
相似 Bug 发现
安全领域
威胁情报关联
异常行为检测
日志模式匹配
推荐系统
语义商品推荐
个性化内容
用户兴趣建模
九、总结与演进路线
#mermaid-svg-ejo4KUdjhk2KzO6v{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-ejo4KUdjhk2KzO6v .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ejo4KUdjhk2KzO6v .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ejo4KUdjhk2KzO6v .error-icon{fill:#552222;}#mermaid-svg-ejo4KUdjhk2KzO6v .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ejo4KUdjhk2KzO6v .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ejo4KUdjhk2KzO6v .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ejo4KUdjhk2KzO6v .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ejo4KUdjhk2KzO6v .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ejo4KUdjhk2KzO6v .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ejo4KUdjhk2KzO6v .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ejo4KUdjhk2KzO6v .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ejo4KUdjhk2KzO6v .marker.cross{stroke:#333333;}#mermaid-svg-ejo4KUdjhk2KzO6v svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ejo4KUdjhk2KzO6v p{margin:0;}#mermaid-svg-ejo4KUdjhk2KzO6v .edge{stroke-width:3;}#mermaid-svg-ejo4KUdjhk2KzO6v .section--1 rect,#mermaid-svg-ejo4KUdjhk2KzO6v .section--1 path,#mermaid-svg-ejo4KUdjhk2KzO6v .section--1 circle,#mermaid-svg-ejo4KUdjhk2KzO6v .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .section--1 text{fill:#ffffff;}#mermaid-svg-ejo4KUdjhk2KzO6v .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .edge-depth--1{stroke-width:17;}#mermaid-svg-ejo4KUdjhk2KzO6v .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ejo4KUdjhk2KzO6v .lineWrapper line{stroke:#ffffff;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled circle,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:lightgray;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:#efefef;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-0 rect,#mermaid-svg-ejo4KUdjhk2KzO6v .section-0 path,#mermaid-svg-ejo4KUdjhk2KzO6v .section-0 circle,#mermaid-svg-ejo4KUdjhk2KzO6v .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-ejo4KUdjhk2KzO6v .section-0 text{fill:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .node-icon-0{font-size:40px;color:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-ejo4KUdjhk2KzO6v .edge-depth-0{stroke-width:14;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-ejo4KUdjhk2KzO6v .lineWrapper line{stroke:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled circle,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:lightgray;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:#efefef;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-1 rect,#mermaid-svg-ejo4KUdjhk2KzO6v .section-1 path,#mermaid-svg-ejo4KUdjhk2KzO6v .section-1 circle,#mermaid-svg-ejo4KUdjhk2KzO6v .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .section-1 text{fill:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .node-icon-1{font-size:40px;color:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .edge-depth-1{stroke-width:11;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ejo4KUdjhk2KzO6v .lineWrapper line{stroke:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled circle,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:lightgray;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:#efefef;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-2 rect,#mermaid-svg-ejo4KUdjhk2KzO6v .section-2 path,#mermaid-svg-ejo4KUdjhk2KzO6v .section-2 circle,#mermaid-svg-ejo4KUdjhk2KzO6v .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .section-2 text{fill:#ffffff;}#mermaid-svg-ejo4KUdjhk2KzO6v .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .edge-depth-2{stroke-width:8;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ejo4KUdjhk2KzO6v .lineWrapper line{stroke:#ffffff;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled circle,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:lightgray;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:#efefef;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-3 rect,#mermaid-svg-ejo4KUdjhk2KzO6v .section-3 path,#mermaid-svg-ejo4KUdjhk2KzO6v .section-3 circle,#mermaid-svg-ejo4KUdjhk2KzO6v .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .section-3 text{fill:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .node-icon-3{font-size:40px;color:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .edge-depth-3{stroke-width:5;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ejo4KUdjhk2KzO6v .lineWrapper line{stroke:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled circle,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:lightgray;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:#efefef;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-4 rect,#mermaid-svg-ejo4KUdjhk2KzO6v .section-4 path,#mermaid-svg-ejo4KUdjhk2KzO6v .section-4 circle,#mermaid-svg-ejo4KUdjhk2KzO6v .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .section-4 text{fill:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .node-icon-4{font-size:40px;color:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .edge-depth-4{stroke-width:2;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ejo4KUdjhk2KzO6v .lineWrapper line{stroke:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled circle,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:lightgray;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:#efefef;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-5 rect,#mermaid-svg-ejo4KUdjhk2KzO6v .section-5 path,#mermaid-svg-ejo4KUdjhk2KzO6v .section-5 circle,#mermaid-svg-ejo4KUdjhk2KzO6v .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .section-5 text{fill:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .node-icon-5{font-size:40px;color:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .edge-depth-5{stroke-width:-1;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ejo4KUdjhk2KzO6v .lineWrapper line{stroke:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled circle,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:lightgray;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:#efefef;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-6 rect,#mermaid-svg-ejo4KUdjhk2KzO6v .section-6 path,#mermaid-svg-ejo4KUdjhk2KzO6v .section-6 circle,#mermaid-svg-ejo4KUdjhk2KzO6v .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .section-6 text{fill:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .node-icon-6{font-size:40px;color:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .edge-depth-6{stroke-width:-4;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ejo4KUdjhk2KzO6v .lineWrapper line{stroke:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled circle,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:lightgray;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:#efefef;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-7 rect,#mermaid-svg-ejo4KUdjhk2KzO6v .section-7 path,#mermaid-svg-ejo4KUdjhk2KzO6v .section-7 circle,#mermaid-svg-ejo4KUdjhk2KzO6v .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .section-7 text{fill:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .node-icon-7{font-size:40px;color:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .edge-depth-7{stroke-width:-7;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ejo4KUdjhk2KzO6v .lineWrapper line{stroke:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled circle,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:lightgray;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:#efefef;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-8 rect,#mermaid-svg-ejo4KUdjhk2KzO6v .section-8 path,#mermaid-svg-ejo4KUdjhk2KzO6v .section-8 circle,#mermaid-svg-ejo4KUdjhk2KzO6v .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .section-8 text{fill:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .node-icon-8{font-size:40px;color:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .edge-depth-8{stroke-width:-10;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ejo4KUdjhk2KzO6v .lineWrapper line{stroke:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled circle,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:lightgray;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:#efefef;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-9 rect,#mermaid-svg-ejo4KUdjhk2KzO6v .section-9 path,#mermaid-svg-ejo4KUdjhk2KzO6v .section-9 circle,#mermaid-svg-ejo4KUdjhk2KzO6v .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .section-9 text{fill:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .node-icon-9{font-size:40px;color:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .edge-depth-9{stroke-width:-13;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ejo4KUdjhk2KzO6v .lineWrapper line{stroke:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled circle,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:lightgray;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:#efefef;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-10 rect,#mermaid-svg-ejo4KUdjhk2KzO6v .section-10 path,#mermaid-svg-ejo4KUdjhk2KzO6v .section-10 circle,#mermaid-svg-ejo4KUdjhk2KzO6v .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .section-10 text{fill:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .node-icon-10{font-size:40px;color:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .edge-depth-10{stroke-width:-16;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ejo4KUdjhk2KzO6v .lineWrapper line{stroke:black;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled circle,#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:lightgray;}#mermaid-svg-ejo4KUdjhk2KzO6v .disabled text{fill:#efefef;}#mermaid-svg-ejo4KUdjhk2KzO6v .section-root rect,#mermaid-svg-ejo4KUdjhk2KzO6v .section-root path,#mermaid-svg-ejo4KUdjhk2KzO6v .section-root circle{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-ejo4KUdjhk2KzO6v .section-root text{fill:#ffffff;}#mermaid-svg-ejo4KUdjhk2KzO6v .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-ejo4KUdjhk2KzO6v .edge{fill:none;}#mermaid-svg-ejo4KUdjhk2KzO6v .eventWrapper{filter:brightness(120%);}#mermaid-svg-ejo4KUdjhk2KzO6v :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} V1 基础向量检索 FLAT / IVF 索引 单一模态文本 V2 近似最近邻优化 HNSW 图索引 多模态支持 V3 混合检索 向量 + 关键词 标量过滤 + ANN V4 企业级特性 分布式 / 高可用 实时增量更新 V5 AI Native 与 LLM 深度集成 自适应索引 查询理解优化 向量数据库技术演进路线
核心要点回顾:
-
Embedding 是桥梁:好的 Embedding 模型决定检索质量的上限,bge、m3e、e5 是当前中文场景的最优选择。
-
索引算法是杠杆:HNSW 适合大多数场景,超大规模考虑 DiskANN,精确检索用 FLAT。
-
混合检索是标配:纯向量检索解决不了关键词精确匹配问题,BM25 + Vector + Rerank 是工业界标准。
-
数据质量是根本:分块策略、元数据标注、去重清洗,比索引参数调优更重要。
-
监控不能省:召回率、延迟、QPS 是三大黄金指标,必须纳入日常监控。
参考资料
- Milvus 官方文档
- pgvector GitHub
- HNSW 论文 - Efficient and robust approximate nearest neighbor search
- BGE Embedding 模型 - BAAI
- LangChain VectorStore 集成
- RAG 最佳实践 - Microsoft
本文首发于 CSDN,转载请注明出处。如有技术交流,欢迎评论区留言。