Milvus 使用
Milvus记录:
1、安装
Python:
$ pip install -U pymilvus #pymilvus 中包含的一个 python 库,可以嵌入到客户端应用程序中
$ pip install "pymilvus[model]" #该软件包包含 PyTorch 等基本 ML 工具
Java:
<dependency>
<groupId>io.milvus</groupId>
<artifactId>milvus-sdk-java</artifactId>
<version>2.5.3</version>
</dependency>
Go:
$ go get -u github.com/milvus-io/milvus-sdk-go/v2
2、度量类型
Milvus 支持这些类型的相似性度量:
欧氏距离 (L2):
原理:值越小表示相似度越高。
范围:[0, ∞);
选择:欧氏距离测量的是连接两点的线段的长度。当选择欧氏距离作为距离度量时,Milvus 只计算应用平方根之前的值。
内积 (IP):
原理:数值越大,表示相似度越高。
范围:[-1, 1];
选择:两个 Embeddings 之间的 IP 距离,如果需要比较非标准化数据,或者需要考虑幅度和角度,IP 会更有用。如果使用 IP 计算嵌入式之间的相似性,必须对嵌入式进行归一化处理。归一化后,内积等于余弦相似度。
余弦相似度 (COSINE):
原理:数值越大,表示相似度越高。
范围:[-1, 1];
选择:余弦相似度使用两组向量之间角度的余弦来衡量它们的相似程度。用 1 减去它们的余弦相似度,就可以得到两个向量之间的余弦距离。
JACCARD:
原理:数值越小,表示相似度越高。
范围:[0, 1];
选择:JACCARD 相似性系数衡量两个样本集之间的相似性,定义为定义集的交集的卡方值除以它们的联合的卡方值。它只适用于有限样本集。
HAMMING:
原理:值越小,表示相似度越高。
范围:0,dim(向量)] [0, dim(vector);
选择:HAMMING 距离测量二进制数据字符串。两个长度相等的字符串之间的距离是比特不同的比特位置数。
BM25 (专门为稀疏向量的全文检索而设计):
原理:根据词频、反转文档频率和文档规范化对相关性进行评分。
范围:[0, ∞);
选择:BM25 是一种广泛使用的文本相关性测量方法,专门用于全文检索。
要素:
术语频率 (TF):衡量术语在文档中出现的频率。虽然较高的频率通常表示较高的重要性,但 BM25 使用饱和参数 k1 来防止过于频繁的术语主导相关性得分。
反向文档频率(IDF):反映术语在整个语料库中的重要性。在较少文档中出现的术语会获得较高的 IDF 值,这表明其对相关性的贡献更大。
文档长度归一化:较长的文档由于包含较多的术语,往往得分较高。BM25 通过对文档长度进行归一化处理来减轻这种偏差,参数 b 控制这种归一化处理的强度。
3、CRUD
插入数据:
res = client.insert(collection_name="demo_collection", data=data)
collection_name:数据库名称
data:数据内容,常见data = [{"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"} for i in range(len(vectors))]
向量搜索:
res = client.search(
collection_name="demo_collection", # 数据库名称
data=query_vectors, # 查询向量数据
limit=2, # 设置返回结果条数
output_fields=["text", "subject"], # 设置返回字段
)
根据插入的字段类型去匹配检索字段,选择返回字段
带元数据过滤的向量搜索:
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"],
)
查询:
res = client.query(
collection_name="demo_collection",
filter="subject == 'history'",
output_fields=["text", "subject"],
)
删除实体:
根据id删除:
res = client.delete(collection_name="demo_collection", ids=[0, 2])
根据过滤条件进行删除:
res = client.delete(
collection_name="demo_collection",
filter="subject == 'biology'",
)
删除 Collections:
client.drop_collection(collection_name="demo_collection")
4、检索
混合检索,使用BGEM-3(采用稀疏、稠密检索,可配置化权重,bgem3中文语言检索效果较好,可docker部署也可以本地化代码部署使用)
5、排序
结果集可进行Rerank排序,可使用GTE进行

浙公网安备 33010602011771号