Milvus 基本使用

  1. 1. Milvus向量嵌入
    1. 1.1. 安装依赖
    2. 1.2. 定义向量生成模型
    3. 1.3. 准备嵌入数据
    4. 1.4. 初始化client
    5. 1.5. 创建集合
    6. 1.6. 创建索引
    7. 1.7. 查看索引信息
    8. 1.8. 向集合插入数据
    9. 1.9. 查看集合数据
    10. 1.10. 搜索数据
    11. 1.11. 删除数据

Milvus向量嵌入

Milvus 是一个向量库,可用于AI的文本检索,本文使用官方文档例子,例子语言为python

安装依赖

1
pip3 install pymilvus FlagEmbedding

定义向量生成模型

此处使用默认轻量级模型,也可通过milvus_model.hybrid.BGEM3EmbeddingFunctionj加载指定模型

1
2
# 这将下载 "all-MiniLM-L6-v2",一个轻量级模型。
ef = model.DefaultEmbeddingFunction()

准备嵌入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 生成嵌入的数据
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.",
]

# 文本库向量
embeddings = ef.encode_documents(docs)

# 查询向量
query_embedding = ef.encode_documents(["where was Turing born?"])

entities = [{"id": index_id, "vector": embeddings[index_id], "source": docs[index_id]}
for index_id in range(len(docs))]

初始化client

也是简单的事

1
2
3
client = MilvusClient(
uri="http://HOST:PORT"
)

创建集合

需要先定义schema, 然后直接创建即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 添加字段schema
schema = MilvusClient.create_schema(
auto_id=False,
enable_dynamic_field=True,
)
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=768)
schema.add_field(field_name="source", datatype=DataType.VARCHAR, max_length=500)


# 3. 创建集合
client.create_collection(
collection_name="customized_setup",
schema=schema,
)

创建索引

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
index_params = MilvusClient.prepare_index_params()


index_params.add_index(
field_name="vector", # 要索引的标量字段的名称
metric_type="COSINE", # 所选择的距离度量方式(此处为余弦相似度)
index_type="IVF_FLAT", # 要创建的索引类型,此处为近似近邻索引
index_name="vector_index",# 要创建的索引的名称
nlist=1024 # 指定nlist参数,IVF_FLAT 索引将一个向量空间划分为 nlist 个簇
)

# 创建索引
client.create_index(
collection_name="customized_setup",
index_params=index_params
)

查看索引信息

1
2
3
4
5
6
# 查看索引信息
res = client.describe_index(
collection_name="customized_setup",
index_name="vector_index"
)
print(res)

向集合插入数据

1
2
3
4
5
6
7
# 向集合插入数据
res = client.insert(
"customized_setup",
entities
)

print(res)

查看集合数据

1
2
3
4
5
6
7
8
9
10
client.load_collection("customized_setup")
client.load_collection("customized_setup")

res = client.get(
collection_name="customized_setup", # 集合名称
ids=[0, 1, 2],
output_fields=["source", "vector"]
)
for i in res:
print(i)

搜索数据

1
2
3
4
5
6
7
8
9
10
# 根据向量搜索最接近的数据
res = client.search(
collection_name="customized_setup", # 集合名称
data=query_embedding, # 查询语句向量
limit=1, # 返回数据限制
output_fields=["source"] # 输出字段
)

for result in res:
print(result)

删除数据

1
2
3
4
5
6
7
8
# 删除数据
res = client.delete(
collection_name='customized_setup',
ids=[0, 1, 2],
)

print("Entities deleted from partitionA: ", res['delete_count'])