快速开始

最近更新时间:2024-09-29 10:49:11

我的收藏
本章节以 Python 语言的使用方式为例,主要介绍如何生成稀疏向量,并写入向量数据库进行混合检索。
说明:
如需使用稀疏向量,需要升级 Python SDK 至1.4.4或更高版本。

步骤1:安装 SDK

## 安装稀疏向量工具包
pip3 install tcvdb-text
## 安装腾讯云向量数据库 Python SDK
pip3 install tcvectordb==1.4.4

步骤2:导入依赖

import tcvectordb from tcvectordb.model.document import AnnSearch, WeightedRerank, RRFRerank, KeywordSearch, SearchParams from tcvectordb.model.enum import FieldType, IndexType, MetricType, ReadConsistency from tcvectordb.model.index import Index, VectorIndex, FilterIndex, HNSWParams, SparseVector from tcvdb_text.encoder import BM25Encoder
from typing import List

步骤3:创建客户端

创建一个客户端对象,并创建 SparseVectorEncoder。
vdb_url = 'YOUR CONNECTION URL' vdb_key = 'YOUR CONNECTION KEY' client = tcvectordb.RPCVectorDBClient( url=vdb_url, key=vdb_key, username='root', read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)

步骤4:创建 Database

db_name ='db-test-sparse-vec'
db = client.create_database(db_name)

步骤5:创建包含稀疏向量的 Collection

1. 定义索引结构。
说明:
每个集合仅支持定义1个稀疏向量字段,每条稀疏向量最多支持1024个非空值。
目前稀疏向量的字段名固定为“sparse_vector”,暂不支持自定义。
稀疏向量字段无需指定数据维度,会根据写入的数据自动判断。
# 定义集合的索引结构,包括稠密向量索引、稀疏向量索引
index = Index()
index.add(FilterIndex('id', FieldType.String, IndexType.PRIMARY_KEY))
index.add(VectorIndex(name='vector', dimension=3, index_type=IndexType.HNSW, metric_type=MetricType.IP, params=HNSWParams(m=16, efconstruction=200)))
index.add(VectorIndex(name='sparse_vector',
field_type=FieldType.SparseVector,
index_type=IndexType.SPARSE_INVERTED,
metric_type=MetricType.IP))
2. 创建集合。
# 创建 Collection
coll_name = 'coll-sparse-vec'
res = db.create_collection(
name=coll_name,
shard=1,
replicas=1,
description='test collection',
index=index
)

步骤6:插入带有 Sparse Vector 的数据

说明:
腾讯云向量数据库提供了的 tcvdb-text 工具包,可以基于原始文本快速生成稀疏向量。若业务需要自己生成稀疏向量,也可以直接写入生成好的稀疏向量数值。
直接写入稀疏向量
使用 tcvdb-text 工具包写入稀疏向量
client.upsert( database_name=db_name, collection_name=coll_name, documents=[{ "id": "0001", "vector": [0.21241, -0.9182, 0.8769], "sparse_vector": [[2502995674, 0.7129621405718145], [1574737055, 0.7129621405718145], [1169440797, 0.8324318718845897]] }] )
调用 encode_texts 接口将原始文本转化为稀疏向量,并通过 upsert 接口写入数据库。
# 初始化稀疏向量 Encoder
bm25 = BM25Encoder.default('zh')

# 根据文本内容,生成对应的稀疏向量
texts = ['腾讯云向量数据库(Tencent Cloud VectorDB)是一款全托管的自研企业级分布式数据库服务',
'腾讯云向量数据库可以和大语言模型 LLM 配合使用']
sparse_vectors: List[SparseVector] = bm25.encode_texts(texts)

# 写入包含稀疏向量的 Document 数据
client.upsert( database_name=db_name, collection_name=coll_name, documents=[ { "id": "0000", "vector": [0.1273, 0.0871, -0.6573], "sparse_vector": sparse_vectors[0] }, { "id": "0001", "vector": [0.9172, 0.7612, 0.5523], "sparse_vector": sparse_vectors[1] } ] )

步骤7:稠密向量 + 稀疏向量混合检索

调用 Python SDK 接口 hybrid_search 进行混合检索。
ann 参数:指定稠密向量相似性检索的相关规则。
match 参数:指定稀疏向量关键字检索的相关规则。其中,用于检索的稀疏向量可以调用腾讯云向量数据库提供的 tcvdb-text 工具生成,也可以直接传入用户自己生成的稀疏向量数值。
rerank 参数:指定重排序的规则及参数。
说明:
hybrid_search 接口暂不支持批量检索操作。
直接传入稀疏向量数值进行混合检索
使用 tcvdb-text 工具包生成稀疏向量并进行混合检索
# 执行混合检索,并使用指定权重(Weighted)的Rerank方法 doc_lists = client.hybrid_search( database_name=db_name, collection_name=coll_name, ann=[ AnnSearch( field_name="vector", data=[0.3123, 0.43, 0.213], ), ], match=[ KeywordSearch( field_name="sparse_vector", data=bm25.encode_queries('向量数据库'), ), ], rerank=WeightedRerank( field_list=['vector', 'sparse_vector'], weight=[0.9, 0.1], ), retrieve_vector=False, limit=1, ) for i, docs in enumerate(doc_lists): print(i) for doc in docs: print(doc) # 执行混合检索,并使用RRF的Rerank方法 doc_lists = client.hybrid_search( database_name=db_name, collection_name=coll_name, ann=[ AnnSearch( field_name="vector", data=[0.3123, 0.43, 0.213], ), ], match=[ KeywordSearch( field_name="sparse_vector", data=bm25.encode_queries('向量数据库'), ), ], rerank=RRFRerank(k=60), retrieve_vector=False, limit=1, ) for i, docs in enumerate(doc_lists): print(i) for doc in docs: print(doc)
请注意在进行混合检索时,需要使用 encode_quires 函数生成文本对应的稀疏向量,这与写入数据时使用的 encode_texts 函数不同。
# 执行混合检索,并使用指定权重(Weighted)的Rerank方法 doc_lists = client.hybrid_search( database_name=db_name, collection_name=coll_name, ann=[ AnnSearch( field_name="vector", data=[0.3123, 0.43, 0.213], ), ], match=[ KeywordSearch( field_name="sparse_vector", data=bm25.encode_quires('向量数据库'), ), ], rerank=WeightedRerank( field_list=['vector', 'sparse_vector'], weight=[0.9, 0.1], ), retrieve_vector=False, limit=1, ) for i, docs in enumerate(doc_lists): print(i) for doc in docs: print(doc) # 执行混合检索,并使用RRF的Rerank方法 doc_lists = client.hybrid_search( database_name=db_name, collection_name=coll_name, ann=[ AnnSearch( field_name="vector", data=[0.3123, 0.43, 0.213], ), ], match=[ KeywordSearch( field_name="sparse_vector", data=bm25.encode_quires('向量数据库'), ), ], rerank=RRFRerank(k=60), retrieve_vector=False, limit=1, ) for i, docs in enumerate(doc_lists): print(i) for doc in docs: print(doc)
执行上述混合检索后,以 RRF Rerank 为例,返回结果如下:
{'id': '0001', 'score': 0.032786883413791656}