向量库入门及milvus的基础使用
Published on Oct 31, 2025, with 4 view(s) and 0 comment(s)
Ai 摘要:向量库是专门存储和检索高维向量数据的数据库,通过AI模型将文本、图像等内容转化为向量表示。其核心在于语义相似度搜索,能理解查询意图而非仅匹配字面。支持多种索引算法实现高效近似最近邻搜索,广泛应用于RAG、推荐系统和多模态检索等AI场景。相比传统数据库,向量库专为处理embedding和语义匹配需求设计。

🧠 一、什么是向量库(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 向量在高维空间中彼此接近

⚙️ 三、核心原理

  1. 数据向量化
    原始文本或图片 → 模型生成 embedding(如 768 维向量)。
  2. 索引构建(Indexing)
    使用算法(如 HNSW、IVF、PQ 等)将大量向量组织起来,方便快速近似搜索。
  3. 相似度计算
    使用向量距离度量相似性(常用):
    • 余弦相似度(Cosine Similarity)
    • 欧氏距离(Euclidean Distance)
    • 内积(Dot Product)
  4. 近似最近邻搜索(ANN, Approximate Nearest Neighbor)
    在亿级数据中快速找出与查询向量最接近的若干条。

🧩 四、主要功能

功能说明
向量存储存储高维 embedding 向量及元数据
相似度搜索基于语义相似度的最近邻检索
混合搜索向量搜索 + 结构化过滤(如标签、时间等)
分片与分布式支持大规模数据存储与并行搜索
索引管理支持不同索引类型(HNSW、IVF、Flat 等)
与 LLM 集成可用于 RAG(检索增强生成)场景

💡 五、应用场景

场景应用示例
语义搜索搜索“意思相近”的文档或问题
智能问答(RAG)向量检索相关知识后再由大模型回答
推荐系统找到与某商品相似的商品
去重 / 聚类发现语义上重复的文本或图片
异常检测识别与正常向量差异较大的样本
多模态检索文字搜图、图搜文等跨模态检索

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

数据库特点开源/商用
Milvus开源向量数据库之首,社区活跃,支持多种索引算法✅ 开源
Pinecone云原生托管服务,集成简单,专注 AI 搜索☁️ 商用
Weaviate支持混合搜索(语义+关键字),RESTful API✅ 开源
FAISSFacebook 开源的高性能相似度搜索库(常用于本地向量检索)✅ 开源
QdrantRust 编写,性能高,支持过滤查询和分布式扩展✅ 开源
ChromaRAG 场景友好,LLM 应用中常用(如 LangChain)✅ 开源

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

特性传统数据库向量数据库
数据类型文本、数值、结构化高维浮点向量
查询方式精确匹配(SQL)语义相似(embedding)
应用场景CRUD、事务系统AI 搜索、推荐、RAG
索引结构B+ 树、HashHNSW、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