🧠 一、什么是向量库(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): 在亿级数据中快速找出与查询向量最接近的若干条。

🧩 四、主要功能

💡 五、应用场景

🏗️ 六、常见向量数据库产品

🧠 七、与传统数据库的对比

🚀 八、简单示例(以 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]] 🧠 九、开源向量库--Milvushttps://milvus.io/docs/zh/quickstart.md

Milvus 是一个开源的向量数据库(Vector Database) 用于存储、索引和检索高维向量数据。

简单来说,它是一个专门为「相似度搜索」设计的数据库。 当你有几百万篇文章、图片、音频、文档的 embedding 向量时, Milvus 可以在 毫秒级 内找出与查询向量最相似的内容。

🏗 十、Milvus 的核心功能

🧩 十一、Milvus 在 RAG 系统中的角色

RAG 流程回顾:

用户问题 ↓ 向量化 (Embedding) ↓ 向量检索 (Milvus) ↓ 上下文拼接 ↓ 调用大模型 (DeepSeek) ↓ 回答输出在这个流程里,Milvus 负责第二步:向量检索 它让你的系统能“理解语义相似性”,比如:

“Spring Boot 连接数据库失败” 可能检索出 “解决 Spring Data JPA 连接 MySQL 报错的文章”

⚙️ 十二、Milvus 的基本架构

Milvus 本质上是一个 分布式服务系统,核心组件包括:

部署方式:

  • ✅ Standalone 模式(开发测试)
  • 🚀 Cluster 模式(生产环境)

🗄️ 十三、基本使用流程(以 Java SDK 为例)

下面是一个简化的使用示例:

1️⃣ 引入依赖

io.milvus milvus-sdk-java 2.4.0 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 ids = List.of(1L, 2L); List> 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> 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 的索引类型简介

🧰 十五、在 RAG 项目中的常见组合

📊 十六、性能与对比

✅ 十七、总结