🧠 一、什么是向量库(Vector Database)
向量库(Vector Database) 是一种专门用于 存储、索引和搜索向量(vector)数据 的数据库。
这些“向量”通常是由 AI 模型(例如 BERT、OpenAI Embeddings、CLIP、Sentence Transformers 等)将文本、图片、音频、视频或结构化数据 转化为高维数值表示(embedding) 后得到的。
每个向量可能有上百甚至上千个维度,比如:
[0.12, -0.08, 0.33, 0.91, ..., -0.27]🔍 二、为什么需要向量库?
普通数据库擅长 精确匹配(例如根据主键或字段值查询),
但在 AI 应用中,我们更多需要 语义匹配(Similarity Search)。
举例:
如果你搜索 “how to learn Python”
- 普通数据库:只能匹配完全相同的字符串。
- 向量数据库:能找到语义相近的句子,如 “best way to start coding in Python” 或 “Python beginner tutorials”。
因为它们的 embedding 向量在高维空间中彼此接近。
⚙️ 三、核心原理
- 数据向量化:
原始文本或图片 → 模型生成 embedding(如 768 维向量)。 - 索引构建(Indexing):
使用算法(如 HNSW、IVF、PQ 等)将大量向量组织起来,方便快速近似搜索。 - 相似度计算:
使用向量距离度量相似性(常用):- 余弦相似度(Cosine Similarity)
- 欧氏距离(Euclidean Distance)
- 内积(Dot Product)
- 近似最近邻搜索(ANN, Approximate Nearest Neighbor):
在亿级数据中快速找出与查询向量最接近的若干条。
🧩 四、主要功能
| 功能 | 说明 |
|---|---|
| 向量存储 | 存储高维 embedding 向量及元数据 |
| 相似度搜索 | 基于语义相似度的最近邻检索 |
| 混合搜索 | 向量搜索 + 结构化过滤(如标签、时间等) |
| 分片与分布式 | 支持大规模数据存储与并行搜索 |
| 索引管理 | 支持不同索引类型(HNSW、IVF、Flat 等) |
| 与 LLM 集成 | 可用于 RAG(检索增强生成)场景 |
💡 五、应用场景
| 场景 | 应用示例 |
|---|---|
| 语义搜索 | 搜索“意思相近”的文档或问题 |
| 智能问答(RAG) | 向量检索相关知识后再由大模型回答 |
| 推荐系统 | 找到与某商品相似的商品 |
| 去重 / 聚类 | 发现语义上重复的文本或图片 |
| 异常检测 | 识别与正常向量差异较大的样本 |
| 多模态检索 | 文字搜图、图搜文等跨模态检索 |
🏗️ 六、常见向量数据库产品
| 数据库 | 特点 | 开源/商用 |
|---|---|---|
| Milvus | 开源向量数据库之首,社区活跃,支持多种索引算法 | ✅ 开源 |
| Pinecone | 云原生托管服务,集成简单,专注 AI 搜索 | ☁️ 商用 |
| Weaviate | 支持混合搜索(语义+关键字),RESTful API | ✅ 开源 |
| FAISS | Facebook 开源的高性能相似度搜索库(常用于本地向量检索) | ✅ 开源 |
| Qdrant | Rust 编写,性能高,支持过滤查询和分布式扩展 | ✅ 开源 |
| Chroma | RAG 场景友好,LLM 应用中常用(如 LangChain) | ✅ 开源 |
🧠 七、与传统数据库的对比
| 特性 | 传统数据库 | 向量数据库 |
|---|---|---|
| 数据类型 | 文本、数值、结构化 | 高维浮点向量 |
| 查询方式 | 精确匹配(SQL) | 语义相似(embedding) |
| 应用场景 | CRUD、事务系统 | AI 搜索、推荐、RAG |
| 索引结构 | B+ 树、Hash | HNSW、IVF、PQ 等 |
| 查询结果 | 完全相同的行 | 最相似的 K 个向量 |
🚀 八、简单示例(以 Python + FAISS)
import faiss
import numpy as np
# 假设我们有3个向量
vectors = np.array([
[0.1, 0.2, 0.3],
[0.2, 0.1, 0.9],
[0.9, 0.8, 0.7]
]).astype('float32')
# 构建索引
index = faiss.IndexFlatL2(vectors.shape[1])
index.add(vectors)
# 查询向量
query = np.array([[0.1, 0.2, 0.31]]).astype('float32')
D, I = index.search(query, k=2)
print(I) # 返回最相似的向量索引
print(D) # 返回距离输出示例:
[[0 1]] [[0.0001 0.60]] 🧠 九、开源向量库--Milvus
https://milvus.io/docs/zh/quickstart.md
Milvus 是一个开源的向量数据库(Vector Database)
用于存储、索引和检索高维向量数据。
简单来说,它是一个专门为「相似度搜索」设计的数据库。
当你有几百万篇文章、图片、音频、文档的 embedding 向量时,
Milvus 可以在 毫秒级 内找出与查询向量最相似的内容。
🏗 十、Milvus 的核心功能
| 功能模块 | 说明 |
|---|---|
| 🧮 向量存储 | 存储高维向量(通常是 384 ~ 1536 维的浮点数组) |
| ⚙️ 索引构建 | 提供多种高效索引算法(如 IVF_FLAT、HNSW、DiskANN) |
| 🔍 相似度检索 | 支持余弦相似度、欧式距离、内积等检索方式 |
| 💾 标量字段 | 支持为向量附加元信息(如 id、title、tag 等) |
| 🌐 分布式扩展 | 支持分布式集群部署,海量数据检索性能优越 |
| 🧩 生态兼容 | 与 LangChain、LlamaIndex、Towhee、OpenAI API 等生态兼容 |
🧩 十一、Milvus 在 RAG 系统中的角色
RAG 流程回顾:
用户问题
↓
向量化 (Embedding)
↓
向量检索 (Milvus)
↓
上下文拼接
↓
调用大模型 (DeepSeek)
↓
回答输出在这个流程里,Milvus 负责第二步:向量检索
它让你的系统能“理解语义相似性”,比如:
“Spring Boot 连接数据库失败”
可能检索出
“解决 Spring Data JPA 连接 MySQL 报错的文章”
⚙️ 十二、Milvus 的基本架构
Milvus 本质上是一个 分布式服务系统,核心组件包括:
| 组件 | 说明 |
|---|---|
| Proxy | 负责接收客户端请求(类似 SQL 的网关) |
| QueryNode | 执行向量搜索与过滤操作 |
| DataNode | 负责数据写入与持久化 |
| IndexNode | 构建索引结构以提升检索速度 |
| Etcd | 存储元数据(管理集合、分区等) |
| MinIO | 存储底层数据文件(可替换为 S3、OSS 等) |
部署方式:
- ✅ Standalone 模式(开发测试)
- 🚀 Cluster 模式(生产环境)
🗄️ 十三、基本使用流程(以 Java SDK 为例)
下面是一个简化的使用示例:
1️⃣ 引入依赖
<dependency>
<groupId>io.milvus</groupId>
<artifactId>milvus-sdk-java</artifactId>
<version>2.4.0</version>
</dependency>2️⃣ 初始化连接
MilvusServiceClient milvusClient = new MilvusServiceClient(
ConnectParam.newBuilder()
.withHost("localhost")
.withPort(19530)
.build()
);3️⃣ 创建集合(类似于表)
FieldType idField = FieldType.newBuilder()
.withName("id")
.withDataType(DataType.Int64)
.withPrimaryKey(true)
.build();
FieldType vectorField = FieldType.newBuilder()
.withName("embedding")
.withDataType(DataType.FloatVector)
.withDimension(768) // 向量维度
.build();
CreateCollectionParam createCollectionParam = CreateCollectionParam.newBuilder()
.withCollectionName("blog_knowledge")
.addFieldType(idField)
.addFieldType(vectorField)
.build();
milvusClient.createCollection(createCollectionParam);
4️⃣ 插入数据
List<Long> ids = List.of(1L, 2L);
List<List<Float>> vectors = List.of(
Arrays.asList(0.1f, 0.2f, ...),
Arrays.asList(0.3f, 0.4f, ...)
);
InsertParam insertParam = InsertParam.newBuilder()
.withCollectionName("blog_knowledge")
.addField("id", ids)
.addField("embedding", vectors)
.build();
milvusClient.insert(insertParam);5️⃣ 相似度检索
List<List<Float>> queryVectors = List.of(userQueryVector);
SearchParam searchParam = SearchParam.newBuilder()
.withCollectionName("blog_knowledge")
.withMetricType(MetricType.COSINE)
.withTopK(5)
.withVectors(queryVectors)
.build();
SearchResults results = milvusClient.search(searchParam);结果中返回:
- 匹配的向量 ID
- 相似度得分
- 可用于拼接上下文内容
⚙️ 十四、Milvus 的索引类型简介
| 索引类型 | 特点 |
|---|---|
| IVF_FLAT | 经典分桶+暴力搜索,适合中小规模数据 |
| HNSW | 高性能图索引算法,适合实时检索 |
| DISKANN | 可在磁盘上运行,适合超大规模数据(>10亿条) |
| AUTOINDEX | 自动选择最优索引策略 |
🧰 十五、在 RAG 项目中的常见组合
| 组件 | 作用 |
|---|---|
| DeepSeek Embedding API | 生成向量 |
| Milvus | 存储和搜索向量 |
| Spring Boot | 封装 REST 服务 |
| MySQL | 存原始文章和元数据 |
| Redis | 缓存检索结果或上下文 |
| DeepSeek Chat API | 生成回答内容 |
📊 十六、性能与对比
| 数据库 | 类型 | 优点 |
|---|---|---|
| Milvus | 专业向量数据库 | 高性能、分布式、支持亿级数据 |
| Redis Vector | 内存数据库扩展 | 部署简单、延迟低 |
| FAISS | 本地库 | 轻量,适合离线处理 |
| Elasticsearch Vector | 搜索引擎扩展 | 可结合文本过滤搜索 |
✅ 十七、总结
| 方面 | Milvus 优势 |
|---|---|
| 性能 | 毫秒级相似度检索,支持亿级数据 |
| 易用性 | 官方 SDK 丰富(Java/Python/Go) |
| 扩展性 | 单机 → 分布式无缝切换 |
| 生态兼容 | 支持 LangChain、LlamaIndex、DeepSeek、OpenAI |
| 适用场景 | 文档检索、图片搜索、语义问答、推荐系统、RAG |