-推荐关注-
安装milvus数据库
安装SDK
新建collection
准备数据
插入数据
语义搜索
表达式查询
删除实体(数据)
Milvus是一款由Zilliz公司开发的开源向量数据库,专为处理大规模向量数据设计。它主要用于存储、索引和管理由深度神经网络和其他机器学习模型生成的嵌入向量,适用于图像、视频、音频和文本等非结构化数据的特征表示。
安装milvus数据库
目前,Milvus 有三种部署选项:Milvus Lite、Milvus Standalone 和 Milvus Distributed。
先使用Milvus Standalone方式安装,官方提供了Docker Compose 配置
milvus的安装:详见:为AI而生的向量数据库 - milvus(二) | 单机Standalone安装
docker的安装:详见:Docker在Windows环境(WSL2)的安装
1.下载docker compose脚本:wget -O milvus-standalone-docker-compose-gpu.yml https://github.com/milvus-io/milvus/releases/download/v2.4.6/milvus-standalone-docker-compose-gpu.yml
2.启动docker
3.启动服务:docker compose -f milvus-standalone-docker-compose-gpu.yml up -d
安装SDK
当前版本的 Milvus 支持 Python、Node.js、GO 和 Java SDK。
我们现在安装Python版本SDK
pip install -U pymilvus
新建collection
在 Milvus 中,我们需要一个 Collections 来存储向量及其相关元数据。你可以把它(Collections )想象成传统 SQL 数据库中的表格。创建 Collections 时,可以定义 Schema 和索引参数来配置向量规格,如维度、索引类型和距离度量类型。此外,还有一些复杂的概念来优化索引以提高向量搜索性能。现在,我们使用默认设置。
主键和向量字段使用默认名称("id "和 "vector")。
度量类型为默认值(COSINE):余弦相似度。
余弦相似度:见 人工智能小白到高手:余弦相似度(Cosine Similarity)的简单理解
主键字段接受整数,且不自动递增
from pymilvus import MilvusClient, model, utility
# 连接数据库
client = MilvusClient(uri="http://localhost:19530", token="root:Milvus")
# 新建Collections 来存储向量及其相关元数据
if client.has_collection(collection_name="demo_collection"):
client.drop_collection(collection_name="demo_collection")
client.create_collection(
collection_name="demo_collection",
dimension=768, # 向量维度 768维
)
准备数据
我们需要通过下载 embedding 模型为文本生成embedding 向量。使用pymilvus[model]
库中的功能可以完成
首先,安装模型库:pip install "pymilvus[model]"
使用默认模型生成Embedding向量 。Milvus 以字典列表的形式插入,每个字典代表一条数据记录,称为**实体(entity)**。
Embedding是什么?详见:一文说清楚人工智能的嵌入(Embedding)是什么
# 加载默认Embedding模型
embedding_fn = model.DefaultEmbeddingFunction()
# 定义一个文本的列表
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.",
]
# 把文本编码为Embedding
vectors = embedding_fn.encode_documents(docs)
print("嵌入后的向量维度:", embedding_fn.dim, vectors[0].shape) # 维度数量: 768 (768,)
# 生成需要插入的数据格式
data = [
{"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
for i in range(len(vectors))
]
print("数据 :", len(data), "条, 所有字段: ", data[0].keys())
print("向量维度:", len(data[0]["vector"]))
# 输出:
# 嵌入后的向量维度: 768 (768,)
# 数据 :3 条, 所有字段: dict_keys(['id', 'vector', 'text', 'subject'])
# 向量维度: 768
插入数据
res = client.insert(
collection_name="demo_collection",
data=data
)
print("插入数据结果:", res)
# 插入数据结果: {'insert_count': 3, 'ids': [0, 1, 2]}
语义搜索
把查询文本转为embedding 向量,并在 Milvus 上执行向量相似度搜索来进行语义搜索。
# 将查询文本转为embedding
query_vectors = embedding_fn.encode_queries(["Who is Alan Turing?"])
print("查询向量维度:", len(query_vectors[0]))
res = client.search(
collection_name="demo_collection", # 目标 collection
data=query_vectors, # 查询文本的向量
limit=2, # 返回的实体数
output_fields=["id", "text", "subject"], # 指定返回的字段
)
print("search结果:", res)
# 查询向量维度: 768
# search结果:data: ["[{'id': 2, 'distance': 0.5859944820404053, 'entity': {'id': 2, 'text': 'Born in Maida Vale, London, Turing was raised in southern England.', 'subject': 'history'}}, {'id': 1, 'distance': 0.5118255019187927, 'entity': {'id': 1, 'text': 'Alan Turing was the first person to conduct substantial research in AI.', 'subject': 'history'}}]"]
data:
[
[
{
'id': 2,
'distance': 0.5859944820404053,
'entity': {
'id': 2,
'text': 'Born in Maida Vale, London, Turing was raised in southern England.',
'subject': 'history'
}
},
{
'id': 1,
'distance': 0.5118255019187927,
'entity': {
'id': 1,
'text': 'Alan Turing was the first person to conduct substantial research in AI.',
'subject': 'history'
}
}
]
]
表达式查询
用于检索与某个条件(如过滤表达式或与某些 id 匹配)相匹配的所有实体。(类似SQL的where条件)
如:通过"subject == 'history'"筛选:
res = client.query(
collection_name="demo_collection",
filter="subject == 'history'",
output_fields=["id", "text", "subject"],
)
print("query结果:", res)
# query结果:data: ["{'id': 0, 'text': 'Artificial intelligence was founded as an academic discipline in 1956.', 'subject': 'history'}", "{'id': 1, 'text': 'Alan Turing was the first person to conduct substantial research in AI.', 'subject': 'history'}", "{'id': 2, 'text': 'Born in Maida Vale, London, Turing was raised in southern England.', 'subject': 'history'}"]
[
"{'id': 0, 'text': 'Artificial intelligence was founded as an academic discipline in 1956.', 'subject': 'history'}",
"{'id': 1, 'text': 'Alan Turing was the first person to conduct substantial research in AI.', 'subject': 'history'}",
"{'id': 2, 'text': 'Born in Maida Vale, London, Turing was raised in southern England.', 'subject': 'history'}"
]
通过主键直接检索实体:
res = client.query(
collection_name="demo_collection",
ids=[0, 2],
output_fields=["vector", "text", "subject"],
)
删除实体(数据)
如果想清除数据,可以删除指定主键的实体,或删除与特定过滤表达式匹配的所有实体。
res = client.delete(collection_name="demo_collection", ids=[0, 2])
res = client.delete(
collection_name="demo_collection",
filter="subject == 'history'",
)
print("删除数据结果:", res)
往日文章:
--END--