简单学习 --> Milvus

Milvus是什么?

1. 向量与嵌入 (Vector & Embedding)

  • 技术定义:向量是神经网络模型的输出格式。它将复杂的非结构化数据(如文本、图片、音频)转化为一串固定长度的数字(特征坐标),从而对语义信息进行高维编码。

  • 简单举例

    • 传统的关键词匹配就像通过"长相"找人,如果搜"番茄炒蛋",就找不到"西红柿炒鸡蛋"。

    • 而向量(Embedding)就像是给菜品做"基因鉴定"或赋予它一个"语义坐标"。"番茄炒蛋"和"西红柿炒鸡蛋"虽然字面不同,但在高维空间里的坐标极其接近。向量数据库就是通过计算坐标距离来寻找最相关的信息。

2. Milvus Lite (轻量版向量数据库)

  • 技术定义pymilvus 库中自带的嵌入式版本,数据直接存储在本地单文件中(如 .db),无需搭建复杂的 Docker 或 Kubernetes 集群,非常适合在 Jupyter Notebook、本地脚本或小型客户端应用中快速调试。

  • 简单举例

    • 标准版 Milvus 就像是一个巨大的中央冷链仓库(需要配置服务器、网络和专业运维)。

    • Milvus Lite 就像是一个随身携带的便携式车载冰箱。只要在代码里写一句 MilvusClient("my_demo.db"),它就在你的电脑里开辟了一个私人小仓库,开箱即用。

3. Collection (集合)

  • 技术定义:Milvus 中用于存储实体(Entities)的容器,相当于关系型数据库(如 MySQL)中的表(Table)。创建时需要指定向量的维度(Dimension)和度量类型(Metric Type)。

  • 简单举例

    • 假设你要做一个"智能图书检索系统",你可以创建一个名为 book_collection 的集合。

    • 在创建时,你告诉系统:"这张表里存的图书特征向量都是 768 维的,并且使用'余弦相似度(COSINE)'来判断两本书的意思是否接近。"

4. Entity (实体) 与标量 (Scalar)

  • 技术定义 :集合中的每一行数据称为一个实体(Entity)。它包含唯一标识 id、高维特征 vector,以及其他非向量字段(称为标量字段,如文本、分类标签等)。

  • 简单举例

    • 在图书集合中,一本书就是一个实体。

    • 这本书包含:id(ISBN号)、vector(整本书内容的语义坐标)、text(书名与简介),以及 subject(图书分类,比如 "历史" 或 "生物")。其中 subjecttext 就是标量。

Milvus怎么用?

第一步:环境安装与客户端初始化

安装轻量级客户端,并创建一个本地数据库文件。

复制代码
# 1. 安装 pymilvus 核心库及模型扩展
# pip install -U pymilvus "pymilvus[model]"

from pymilvus import MilvusClient

# 2. 初始化客户端:指定本地数据库文件名(文件不存在会自动创建)
client = MilvusClient("milvus_demo.db")

第二步:创建 Collection(建表)

定义集合名称和向量的维度。

复制代码
# 如果已有重名集合,先将其删除(清空旧数据)
if client.has_collection(collection_name="demo_collection"):
    client.drop_collection(collection_name="demo_collection")

# 创建新集合:只需要指定名称和维度(这里使用 768 维)
client.create_collection(
    collection_name="demo_collection",
    dimension=768  # 向量维度,必须与后面生成的 Embedding 模型匹配
)
# 注:默认的主键字段名为 "id"(整数),向量字段名为 "vector",度量类型为余弦相似度(COSINE)

第三步:向量化与数据插入

利用内置模型将文本转化为数字向量,并打包成实体存入数据库。

复制代码
from pymilvus import model

# 1. 加载默认的轻量级向量化模型(会自动下载约50MB的预训练模型)
embedding_fn = model.DefaultEmbeddingFunction()

# 2. 准备原始文本数据
docs = [
    "Artificial intelligence was founded as an academic discipline in 1956.",
    "Alan Turing was the first person to conduct substantial research in AI.",
    "Born in Maida Vale, London, Turing was raised in southern England."
]

# 3. 将文本转化为 768 维的向量列表
vectors = embedding_fn.encode_documents(docs)

# 4. 组装成 Milvus 要求的字典列表(实体列表)
data = [
    {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
    for i in range(len(vectors))
]

# 5. 插入数据
res = client.insert(collection_name="demo_collection", data=data)
print("插入成功:", res)

第四步:语义搜索 (Vector Search)

不依赖关键词完全匹配,而是根据查询的"含义"寻找最接近的答案。

复制代码
# 1. 将用户的查询问题转化为向量
query_vectors = embedding_fn.encode_queries(["Who is Alan Turing?"])

# 2. 执行向量相似度搜索
res = client.search(
    collection_name="demo_collection",
    data=query_vectors,             # 查询向量
    limit=2,                        # 返回最相似的前 2 条数据 (Top-K)
    output_fields=["text", "subject"]  # 指定需要返回的原始字段
)

print("搜索结果:", res)
# 举例解释:即使文本里没有直接包含"Who is"的字眼,系统也能凭借"Alan Turing"的语义距离,精准找出最相关的历史记录。

第五步:带元数据过滤的搜索 (Hybrid Search)

在做向量搜索的同时,加上传统数据库的条件筛选。

复制代码
# 再插入几条"生物学"主题的数据
biology_docs = [
    "Machine learning has been used for drug design.",
    "Computational synthesis with AI algorithms predicts molecular properties."
]
bio_vectors = embedding_fn.encode_documents(biology_docs)
bio_data = [
    {"id": 3 + i, "vector": bio_vectors[i], "text": biology_docs[i], "subject": "biology"}
    for i in range(len(biology_docs))
]
client.insert(collection_name="demo_collection", data=bio_data)

# 执行带条件过滤的语义搜索
res = client.search(
    collection_name="demo_collection",
    data=embedding_fn.encode_queries(["tell me AI related information"]),
    filter="subject == 'biology'",  # 强过滤条件:只要生物学分类下的数据
    limit=2,
    output_fields=["text", "subject"]
)
print("过滤搜索结果:", res)
# 简单举例:这就像你在地图软件里搜"附近好吃的川菜"(语义搜索),同时勾选了"只看有免费停车位的商家"(标量过滤)。

第六步:数据管理(查询、删除与持久化)

复制代码
# 1. 属性查询 (Query):纯标签筛选,不计算向量距离
res_query = client.query(
    collection_name="demo_collection",
    filter="subject == 'history'",
    output_fields=["text"]
)

# 2. 根据主键 ID 直接删除数据
client.delete(collection_name="demo_collection", ids=[0, 2])

# 3. 数据持久化与重新加载:
# 因为数据全在 "milvus_demo.db" 文件中,程序关闭后数据不会丢失。
# 下次启动时只需再次执行 client = MilvusClient("milvus_demo.db") 即可直接读取历史数据。

进阶与生产环境迁移

当你需要处理大规模数据或追求高可用架构时,Milvus 的一大优势是代码迁移成本极低。你只需要将本地文件的初始化代码,修改为远端服务器的地址和凭证,其余的搜索、插入、过滤等代码完全无需修改:

复制代码
# 从本地轻量版切换为生产级集群版
client = MilvusClient(uri="http://your-k8s-cluster:19530", token="root:Milvus")
相关推荐
Cosolar1 小时前
Milvus向量数据库学习手册
数据库·学习·架构·milvus
i建模1 小时前
Milvus 和neo4j对比
neo4j·milvus
魔法阵维护师2 小时前
从零开发游戏需要学习的c#模块,第二十六章(多种敌人与基础 AI)
学习·游戏·c#
内蒙深海大鲨鱼2 小时前
mysql学习
学习·mysql·oracle
我想我不够好。2 小时前
第六感 qw咬住减少cd wCD时间
学习
sakiko_2 小时前
Swift学习笔记33-多线程与UI渲染
笔记·学习·swiftui·swift
飞yu流星2 小时前
SSRF学习笔记
笔记·学习
想你依然心痛2 小时前
HarmonyOS 6 悬浮导航 + 沉浸光感:打造鸿蒙智能体驱动的沉浸式语言学习伙伴
学习·华为·ar·harmonyos·智能体
爱喝水的鱼丶2 小时前
SAP-ABAP:条件判断与循环控制语句(7篇) 第三篇:循环基础:for、while、do-while三种循环的差异与适用场景
运维·学习·性能优化·sap·abap·erp