
Milvus 向量数据库:核心原理与 Python 实战
本文介绍 Milvus 向量数据库的核心概念及架构,通过 Python 结合 sentence-transformers 模型实现语义检索实战。内容涵盖数据模型、距离度量、Milvus Lite 部署方式,以及完整的代码示例,展示如何将文本向量化并存储至 Milvus,实现基于余弦相似度的语义搜索,为构建 RAG 系统奠定基础。

本文介绍 Milvus 向量数据库的核心概念及架构,通过 Python 结合 sentence-transformers 模型实现语义检索实战。内容涵盖数据模型、距离度量、Milvus Lite 部署方式,以及完整的代码示例,展示如何将文本向量化并存储至 Milvus,实现基于余弦相似度的语义搜索,为构建 RAG 系统奠定基础。


(图片:象征着连接与多维空间的数据网络)
在生成式 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,我们需要先理解它的几个核心理论概念。
Milvus 的数据组织方式与关系型数据库有相似之处,但专为向量优化:
如何判断两个向量有多'像'?Milvus 支持多种距离度量方式:
Milvus 采用云原生架构,计算与存储分离。它可以单机部署,也可以在 K8s 上分布式部署。
理论说完了,我们来写代码。
得益于 Milvus 2.4 版本引入的 Milvus Lite,Python 开发者现在不需要安装 Docker,直接通过 pip 安装即可在本地以文件形式运行 Milvus。
同时,为了体现'语义检索'的魔力,我们将使用真正的开源文本向量模型 sentence-transformers 来将文字转化为向量。
我们需要安装 Milvus 的 Python 客户端,以及大名鼎鼎的 HuggingFace 向量化工具包:
pip install pymilvus sentence-transformers
创建一个名为 milvus_semantic_search.py 的文件,填入以下代码:
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 时,你将看到如下输出:
⏳ 正在加载开源 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 时代检索引擎的真正威力。
通过上面的真实模型代码,我们完整跑通了文本 -> AI 模型向量化 -> 存入 Milvus -> 用户提问向量化 -> Milvus 语义召回的全流程。
如果你想在这个基础上构建一个完整的 ChatGPT 知识库问答助手(RAG),只需要再加最后一步:把 Milvus 搜出来的结果(如上面的第一句话),连同用户的问题一起丢给 LLM(如 OpenAI API 或 DeepSeek),让它总结一下输出即可。
Milvus Lite 极大降低了初学者的门槛,开发体验如丝般顺滑。
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online