向量数据库 快速入门

本章节以 Python 语言的使用方式为例,主要介绍如何生成稀疏向量,并写入向量数据库进行混合检索。

相关产品
向量数据库 产品页,含版本规格、价格与购买入口。

注意:说明:

注意:如需使用稀疏向量,至少需要升级 Python SDK 至1.4.5版本,使用 Embedding 文本与稀疏向量混合检索则需升级至1.5.0或更高版本。

一、步骤1:安装 SDK

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

二、步骤2:导入依赖

import tcvectordbfrom tcvectordb.model.document import AnnSearch, WeightedRerank, RRFRerank, KeywordSearch, SearchParamsfrom tcvectordb.model.enum import FieldType, IndexType, MetricType, ReadConsistencyfrom tcvectordb.model.index import Index, VectorIndex, FilterIndex, HNSWParams, SparseVector, SparseIndexfrom tcvdb_text.encoder import BM25Encoderfrom 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. 定义索引结构。

注意:说明:

# 定义集合的索引结构,包括稠密向量索引、稀疏向量索引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(SparseIndex(name='sparse_vector', field_type=FieldType.SparseVector, index_type=IndexType.SPARSE_INVERTED, metric_type=MetricType.IP))

2. 创建集合。

# 创建 Collectioncoll_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 接口写入数据库。# 初始化稀疏向量 Encoderbm25 = 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=[[1169440797, 0.49708903298018964], [1075178782, 0.5029109670198104]], terminate_after=4000, cutoff_frequency=0.1, ), ], 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=[[1169440797, 0.49708903298018964], [1075178782, 0.5029109670198104]], ), ], 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('向量数据库'), terminate_after=4000, cutoff_frequency=0.1, ), ], 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)

执行上述混合检索后,以 RRF Rerank 为例,返回结果如下:

{'id': '0001', 'score': 0.032786883413791656}

赞 (0)
上一篇 4天前
下一篇 4天前