深入浅出 Milvus 向量数据库:从核心原理到 Python 实战指南

(图片:象征着连接与多维空间的数据网络)

在生成式 AI(Generative AI)和大语言模型(LLM)爆发的今天,**"向量数据库"**成为了技术圈的高频词汇。无论是构建企业级的知识库问答系统(RAG),还是实现以图搜图、个性化推荐,向量数据库都是不可或缺的基础设施。

而在众多向量数据库中,Milvus 作为开源界的明星项目,凭借其云原生架构、极高的性能和良好的可扩展性,成为了许多开发者的首选。

本文将带你图文并茂地深入浅出 Milvus,从核心理论到结合真实 AI 嵌入模型 (Embedding Model) 的可执行 Python 实战,让你快速掌握这款强大的工具。


一、 为什么我们需要向量数据库?

在传统的数据库(如 MySQL、PostgreSQL)中,我们通常通过精确匹配(如 WHERE name = 'Alice')或简单的文本索引来进行搜索。

但在 AI 世界里,文本、图像、音频等非结构化数据被转换成了高维向量(Vector Embeddings) 。例如,一段话可能被大模型表示为包含数百个浮点数的数组。在这个数组空间里,语义相近的句子,它们的向量距离就越近

传统数据库无法高效处理这种"在高维空间中寻找最近邻居(Approximate Nearest Neighbor, ANN)"的问题,而这正是 Milvus 的强项。

Milvus 的核心使用场景

  1. 检索增强生成(RAG):给大模型外挂知识库,解决大模型胡说八道(幻觉)的问题。
  2. 多模态搜索:以图搜图、以音搜音。
  3. 推荐系统:寻找用户向量与商品向量的相似度。

二、 Milvus 的核心概念与架构图解

为了用好 Milvus,我们需要先理解它的几个核心理论概念。

1. 数据模型 (Data Model)

Milvus 的数据组织方式与关系型数据库有相似之处,但专为向量优化:

  • Collection(集合):相当于传统数据库的 Table(表)。
  • Entity(实体):相当于表中的一行数据(Row)。
  • Field(字段) :相当于列(Column),其中必须包含一个向量字段,也可以包含普通的标量字段(如 ID、文本内容、时间戳等)。

2. 距离度量 (Metric Types)

如何判断两个向量有多"像"?Milvus 支持多种距离度量方式:

  • L2 (欧氏距离) :计算两点间的直线距离。值越,越相似。
  • IP (内积) :计算向量投影。值越,越相似。
  • COSINE (余弦相似度) :计算向量间的夹角。值越,越相似(常用于 NLP 文本向量)。

3. Milvus 架构一览 (Mermaid 示意图)

Milvus 采用云原生架构,计算与存储分离。它可以单机部署,也可以在 K8s 上分布式部署。
存储层 Storage
执行节点 Worker Nodes
协调层 Coordinator Service
gRPC/REST
客户端 Python/Java/Go
Proxy 接入层
Root Coord
Query Coord
Data Coord
Query Node

负责实时查询和检索
Data Node

负责数据写入和持久化
Index Node

负责构建向量索引
对象存储 MinIO/S3

持久化数据
元数据 etcd


三、 Python 实战:结合真实 AI 模型的语义检索引擎

理论说完了,我们来写代码。

得益于 Milvus 2.4 版本引入的 Milvus Lite ,Python 开发者现在不需要安装 Docker ,直接通过 pip 安装即可在本地以文件形式运行 Milvus。

同时,为了体现"语义检索"的魔力,我们将使用真正的开源文本向量模型 sentence-transformers 来将文字转化为向量。

Step 1: 安装依赖包

我们需要安装 Milvus 的 Python 客户端,以及大名鼎鼎的 HuggingFace 向量化工具包:
(打开终端运行)

bash 复制代码
pip install pymilvus sentence-transformers

Step 2: 完整实战代码

创建一个名为 milvus_semantic_search.py 的文件,填入以下代码:

python 复制代码
from pymilvus import MilvusClient
from sentence_transformers import SentenceTransformer

# ==========================================
# 1. 初始化 AI Embedding 模型
# ==========================================
# 这里使用经典的轻量级开源模型,首次运行会自动下载 (约 80MB)
print("⏳ 正在加载开源 Embedding 模型...")
model = SentenceTransformer('all-MiniLM-L6-v2')
# 获取模型输出的向量维度 (该模型维度为 384)
dimension = model.get_sentence_embedding_dimension()
print(f"✅ 模型加载完成!向量维度: {dimension}")

# ==========================================
# 2. 初始化 Milvus 客户端 (Milvus Lite 模式)
# ==========================================
# 指定一个本地文件名,Milvus Lite 会在这个文件中存储所有数据
db_name = "milvus_blog_demo.db"
client = MilvusClient(db_name)
print(f"✅ 成功连接至本地 Milvus Lite 数据库: {db_name}")

# ==========================================
# 3. 创建集合 (Collection)
# ==========================================
collection_name = "tech_articles"

# 如果集合已经存在,先删除(方便反复测试)
if client.has_collection(collection_name):
    client.drop_collection(collection_name)
    print(f"♻️ 已清理旧的集合: {collection_name}")

client.create_collection(
    collection_name=collection_name,
    dimension=dimension,        # 必须与 AI 模型输出的维度一致
    metric_type="COSINE"        # 对于文本检索,通常推荐使用余弦相似度
)
print(f"✅ 集合 '{collection_name}' 创建成功!")

# ==========================================
# 4. 准备写入的数据并进行向量化
# ==========================================
# 我们的基础资料库
articles =[
    "Milvus 是一款强大的开源向量数据库,非常适合 RAG 架构。",
    "向量数据库通过 HNSW 等索引算法,能够实现毫秒级的近似最近邻搜索。",
    "Python 是一门广泛用于人工智能和数据科学的编程语言。",
    "Redis 也可以用来做缓存,但处理海量向量不如专业的向量数据库。",
    "今天天气真不错,适合出去踏青。"
]

print("⏳ 正在使用 AI 模型将文档转换为向量入库...")
# 真实调用大模型获取 Embeddings
vectors = model.encode(articles)

data =[]
for i, text in enumerate(articles):
    data.append({
        "id": i,                       # 实体 ID
        "vector": vectors[i].tolist(), # 向量字段必须是 list
        "text": text                   # 附带的标量数据(Payload)
    })

# ==========================================
# 5. 插入数据
# ==========================================
insert_res = client.insert(
    collection_name=collection_name,
    data=data
)
print(f"✅ 成功插入 {insert_res['insert_count']} 条测试数据!")

# ==========================================
# 6. 进行语义相似度搜索
# ==========================================
# 注意:用户的提问在字面上根本没有包含 "Milvus" 或 "数据库" 这几个字
query = "推荐一个好用的 AI 知识库存储工具"
print(f"\n🔍 接收到用户查询: '{query}'")
print("⏳ 正在转换查询向量并在 Milvus 中搜索...")

# 对用户的提问进行向量化
query_vector = model.encode([query])

search_res = client.search(
    collection_name=collection_name,
    data=query_vector.tolist(), # 待检索的 query 向量
    limit=2,                    # Top-K: 返回最相似的前 2 条结果
    output_fields=["text"],     # 在结果中一并返回原文文本
    search_params={"metric_type": "COSINE"}
)

# ==========================================
# 7. 打印结果
# ==========================================
print("\n🎉 搜索结果如下 (按语义相似度倒序排):")
for hits in search_res:
    for hit in hits:
        score = hit['distance']
        doc_text = hit['entity']['text']
        print(f"  ➜ [相似度: {score:.4f}] {doc_text}")
        
print("\n演示结束。本地目录下已生成文件:", db_name)

运行结果与语义分析

当你在终端运行 python milvus_semantic_search.py 时,你将看到如下输出:

text 复制代码
⏳ 正在加载开源 Embedding 模型...
✅ 模型加载完成!向量维度: 384
✅ 成功连接至本地 Milvus Lite 数据库: milvus_blog_demo.db
✅ 集合 'tech_articles' 创建成功!
⏳ 正在使用 AI 模型将文档转换为向量入库...
✅ 成功插入 5 条测试数据!

🔍 接收到用户查询: '推荐一个好用的 AI 知识库存储工具'
⏳ 正在转换查询向量并在 Milvus 中搜索...

🎉 搜索结果如下 (按语义相似度倒序排):
  ➜[相似度: 0.5487] Milvus 是一款强大的开源向量数据库,非常适合 RAG 架构。
  ➜[相似度: 0.3846] 向量数据库通过 HNSW 等索引算法,能够实现毫秒级的近似最近邻搜索。

演示结束。本地目录下已生成文件: milvus_blog_demo.db

为什么说这个结果非常惊艳?

仔细看用户的提问:"推荐一个好用的 AI 知识库存储工具 "。这句话里完全没有 出现"Milvus"或"数据库"等字眼。如果使用传统的 MySQL LIKE 或者 Elasticsearch 关键词匹配,是绝对搜不到第一句话的。

但是,通过 SentenceTransformer 提取的深层语义向量,再结合 Milvus 的高维空间余弦相似度计算,系统成功"理解"了**"AI 知识库存储工具"在概念上和"向量数据库"**是高度相关的!这就是 AI 时代检索引擎的真正威力。


四、 总结:从这里走向 RAG

通过上面的真实模型代码,我们完整跑通了文本 -> AI 模型向量化 -> 存入 Milvus -> 用户提问向量化 -> Milvus 语义召回的全流程。

如果你想在这个基础上构建一个完整的 ChatGPT 知识库问答助手(RAG),只需要再加最后一步:把 Milvus 搜出来的结果(如上面的第一句话),连同用户的问题一起丢给 LLM(如 OpenAI API 或 DeepSeek),让它总结一下输出即可。

  1. 专注高维:Milvus 完美解决了非结构化数据的大规模检索难题。
  2. 极简起步Milvus Lite 极大降低了初学者的门槛,开发体验如丝般顺滑。
  3. 架构灵活:当你从个人项目走向十亿级数据的企业项目时,你可以一行代码不改,直接将连接地址切换到分布式部署的 Milvus 集群。

赶紧打开代码编辑器,安装依赖,亲自感受一下语义检索的魅力吧!

相关推荐
布吉岛没有岛_1 小时前
MySQL 的学习
数据库·sql
gp3210261 小时前
mysql配置环境变量——(‘mysql‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件解决办法)
数据库·mysql·adb
SelectDB技术团队1 小时前
PostgreSQL + Apache Doris:构建用于实时分析的 HTAP 架构
数据库·postgresql·架构·实时数仓·湖仓一体·apache doris·selectdb
禁默1 小时前
金仓数据库SQL防火墙构建主动防御,让恶意SQL无处遁形
数据库·金仓
xgstb1 小时前
MySQL root用户密码忘记怎么办(Reset root account password)
数据库·mysql·adb
阿Y加油吧1 小时前
测试文章法撒发撒
python
2401_873587821 小时前
MySQL——索引
数据库·mysql
user_admin_god1 小时前
服务器安装向量数据库-Docker版本
服务器·数据库·docker
什么时候才能变强1 小时前
如何快速高效备份数据库
数据库