有勇气的牛排博客

向量检索服务DashVector|向量数据库


1 前言

向量检索服务DashVector基于阿里云自研的Proxima向量引擎,面对非结构化数据(图片、视频、文本、语音、DNA、分子式等),提供具备垂直和水平扩展的高效相似向量比对服务。使用DashVector服务能有效提升向量检索效率,实现针对非结构化数据的高性能向量检索服务,可广泛应用于大模型搜索、多模态搜索、AI搜索、分子结构分析等几乎所有的 AI 搜索场景。

创建实例(可免费测试):

https://dashvector.console.aliyun.com/cn-hangzhou/cluster

官方文档:

https://help.aliyun.com/document_detail/2510242.html

1.2 环境

测试版本:Python3.10

dashvector==1.0.20

2 新建Client

# -*- coding: utf-8 -*- import dashvector from dashvector import DashVectorCode client = dashvector.Client( api_key='sk-ES***E2C', # YOUR_API_KEY endpoint='vrs-cn-***.dashvector.cn-beijing.aliyuncs.com' # YOUR_CLUSTER_ENDPOINT ) # 判断client是否创建成功 if client.code == DashVectorCode.Success: print('create client success!')

3 Collection 操作

3.1 创建Collection

3.1.1 参数说明

参数 对应API参数名称 说明 是否必选
Collection名称 Name 命名长度为3-32个字符。 必须由大小写字母、数字和符号(_,-)组成,且必须以字母开头。 Collection名称在Cluster内必须唯一,不允许两个相同名称的Collection同时存在。 付费Cluster最多支持创建32个支持Collection;免费Cluster最多支持创建2个Collection。
向量维度 dimension 向量维度,最小2,最大20000。
向量的维度,指向量数组的大小。例如:[1.0,2.0,3.0] 为3维向量,[1.0,2.0,3.0,4.0] 为4维向量,依次类推。 向量维度大小取决于使用模型输出的向量维度。
向量数据类型 dtype 向量数据类型,指向量数组中元素的数据类型,向量检索服务 DashVector目前支持"Float"(默认)/"INT8"两种数据类型。例如:[11,22,33,44] 则为INT8型,[1.1,2.2,3.3,4.4] 则为Float型。请根据业务实际情况选择。
距离度量方式 metric 距离度量方式,Cosine/"DotProduct"/"Euclidean"。为Cosine时,向量数据类型必须为Float
Schema fields_schema

3.1.2 Field支持的数据类型

当前DashVector支持Python的4种基础数据类型:

  • str
  • float
  • int
  • bool

**重要:**Python的int类型可表达无限大小的整数,当前DashVector仅支持32位整数,范围为-2,147,483,648~2,147,483,647,需要用户自行保证数据未溢出。

代码案例

# -*- coding: utf-8 -*- import dashvector from dashvector import DashVectorCode from 创建Client import client # 定义字段 fields_schema = { 'title': str, 'user_eval_score': float, 'read_num': int, 'content': str, 'id': dashvector.long } ret = client.create( name='cs_blog', dimension=512, # 向量维度为512 metric='dotproduct', # 距离度量方式为dotproduct(内积)的Collection dtype=float, # 向量数据类型为str(默认)float fields_schema=fields_schema, # 为保留类型注解的语义明确性,DashVector通过typing模块定义long类型,为需要显式标注大整数场景提供了类型标注支持 timeout=-1 # timeout为-1 ,开启create接口异步模式 ) # 判断collection是否创建成功 if ret.code == DashVectorCode.Success: print('创建 collection 成功!')

3.2 获取Collection列表

# -*- coding: utf-8 -*- from 创建Client import client collections = client.list() print(f"collections: {collections}") # 判断list接口是否成功 if collections: # 查看所有collections for collection in collections: print(collection) # 判断某个collection是否存在 print("cs_blog是否存在:", 'cs_blog' in collections) else: # 若获取失败,打印错误信息 print(collections)

4 Doc操作

4.1 插入带有Fields的Doc

# -*- coding: utf-8 -*- import dashvector import numpy as np from dashvector import DashVectorCode, Doc from 创建Client import client collection = client.get(name='cs_blog') data = { # 设置Schema-Free的Field & Value 'title': "Prompt 提示词技巧、应用与优化", 'user_eval_score': 5.0, 'read_num': 99, 'content': "Prompt优化是指针对大语言模型(如ChatGPT、通义千问、文心一言等)设计、调整输入提示词(prompt),以提高输出内容的准确性、逻辑性、一致性、可控性等。", # 'id': dashvector.long, # 设置Schema-Free的Field & Value # 'anykey2': 1, # 'anykey3': True, # 'anykey4': 3.1415926 } # insert单条数据,并设置Fields Value ret = collection.insert( Doc( id="1", vector=np.random.rand(512), fields=data ) ) print(ret) print(ret.message) """ { "code": 0, "message": "Success", "requests_id": "f868c1f***18d77d33b", "output": [{ "doc_op": "insert", "id": "3", "code": 0, "message": "" }] } """

阿里DashVector向量库插入带有Fields的Doc

4.2 插入或更新Doc

# -*- coding: utf-8 -*- import dashvector import numpy as np from dashvector import DashVectorCode, Doc from AI.项目测试.vdb.阿里vdb.创建Client import client collection = client.get(name='cs_blog') data = { # 设置Schema-Free的Field & Value 'title': "Prompt 提示词技巧、应用与优化", 'user_eval_score': 5.0, 'read_num': 99, 'content': "Prompt优化是指针对大语言模型(如ChatGPT、通义千问、文心一言等)设计、调整输入提示词(prompt),以提高输出内容的准确性、逻辑性、一致性、可控性等。", # 'id': dashvector.long, # 设置Schema-Free的Field & Value 'anykey2': 1, 'anykey3': True, 'anykey4': 3.1415926 } # insert单条数据,并设置Fields Value ret = collection.upsert( Doc( id="1", vector=np.random.rand(512), fields=data ) ) print(ret) print(ret.message) """ { "code": 0, "message": "Success", "requests_id": "f868c1f0-76e1-4c35-8a08-aa118d77d33b", "output": [{ "doc_op": "insert", "id": "3", "code": 0, "message": "" }] } """

4.3 根据向量进行相似性检索

4.3.1 常规检索

# -*- coding: utf-8 -*- import dashvector import numpy as np from 创建Client import client collection = client.get(name='cs_blog') # 文本向量化:这里随机生成一个512维的向量 text_vector = np.random.rand(512) ret = collection.query( vector=text_vector, topk=100, output_fields=['title', 'content'], # 仅返回name、age这2个Field include_vector=True ) output = ret.output for i in output: print("-" * 30) data_id = i.id fields = i.fields score = i.score print(data_id, fields, score)

4.3.2 条件过滤

插入Doc更新Doc插入或更新Doc 时所设置的任意KeyValue结构的字段(Field),可在检索Doc进行条件过滤,如下所示:

ret = collection.query( vector=[0.1, 0.2, 0.3, 0.4], filter='(age > 18 and anykey2 = 1) or (name like "zhang%" and anykey3 = false)' )

4.4 删除Doc

from AI.项目测试.vdb.阿里vdb.创建Client import client collection = client.get(name='cs_blog') ret = collection.delete('1') # 判断delete接口是否成功 if ret: print('delete success') # 批量delete ret = collection.delete(['1', '2']) # 清理所有partition数据 ret = collection.delete(delete_all=True)

5 Partition操作

5.1 新建 Partition

创建一个名称为 program 的Partition

from 创建Client import client collection = client.get(name='cs_blog') # 创建一个名称为 program 的Partition ret1 = collection.create_partition('program') # 新闻 ret2 = collection.create_partition('news') # 判断create_partition接口是否成功 if ret1: print('创建partition success')

5.2 获取Partition 列表

from AI.项目测试.vdb.阿里vdb.创建Client import client collection = client.get(name='cs_blog') partitions = collection.list_partitions() # 判断list_partitions接口是否成功 if partitions: # 查看所有partitions for pt in partitions: print(f"pt: {pt}") else: # 若获取失败,打印错误信息 print(partitions)

阿里DashVector获取Partition列表

5.3 统计Partition

from 创建Client import client collection = client.get(name='cs_blog') ret = collection.stats_partition('program') print(ret) # { # "code": 0, # "message": "", # "requests_id": "607f51***59180", # "output": { # "total_doc_count": 0 # } # }

5.4 删除 Partition

删除Partition后,该Partition所有数据将删除且不可恢复,请谨慎操作。

from 创建Client import client collection = client.get(name='cs_blog') # 删除名称为shoes的Partition ret = collection.delete_partition('news') # 判断delete_partition接口是否成功 if ret: print('删除partition 成功')

6 状态码说明

向量检索服务DashVector的返回状态码。

Reason Code Description
Success 0 成功
Timeout 408 超时
Closed -998 客户端已关闭
Unknown -999 未知异常
EmptyCollectionName -2000 集合名称为空
EmptyColumnName -2001 字段名称为空
EmptyPartitionName -2002 分区名称为空
EmptyColumns -2003 文档中字段为空
EmptyPrimaryKey -2004 插入的文档主键为空
EmptyDocList -2005 插入的文档列表为空
EmptyDocFields -2006 文档的字段列表为空
EmptyIndexField -2007 文档的索引字段为空
InvalidRecord -2008 无效的文档记录
InvalidQuery -2009 无效的查询请求
InvalidWriteRequest -2010 无效的写请求
InvalidVectorFormat -2011 无效的向量格式
InvalidDataType -2012 无效的向量数据类型
InvalidIndexType -2013 无效的索引类型
InvalidFeature -2014 无效的向量
InvalidFilter -2015 无效的过滤条件
InvalidPrimaryKey -2016 无效的主键
InvalidField -2017 无效的文档字段
MismatchedIndexColumn -2018 索引字段不匹配
MismatchedDimension -2019 向量维度不匹配
MismatchedDataType -2020 向量数据类型不匹配
InexistentCollection -2021 集合不存在
InexistentPartition -2022 分区不存在
InexistentColumn -2023 字段不存在
InexistentKey -2024 主键不存在
DuplicateCollection -2025 集合已存在
DuplicatePartition -2026 分区已存在
DuplicateKey -2027 文档主键重复
DuplicateField -2028 文档字段重复
UnreadyPartition -2029 分区状态未就绪
UnreadyCollection -2030 集合状态未就绪
UnsupportedCondition -2031 不支持的查询条件
MismatchedBatchResult -2031 批量查询语句不匹配
OrderbyNotInSelectItems -2032 无效的排序字段
PbToSqlInfoError -2033 查询参数转化失败
ExceedRateLimit -2034 触发流控
InvalidSparseValues -2035 无效的稀疏向量值
InvalidBatchSize -2036 无效的批次数量
InvalidDimension -2037 无效的维度
InvalidExtraParam -2038 无效的额外参数
InvalidRadius -2039 错误的半径查询参数
InvalidLinear -2040 错误的线性查询参数
InvalidTopk -2041 无效的TopK
InvalidCollectionName -2042 无效的集合名
InvalidPartitionName -2043 无效的分区名
InvalidFieldName -2044 无效的文档字段名
InvalidChannelCount -2045 无效的分片数量
InvalidReplicaCount -2046 无效的副本数量
InvalidJson -2047 无效的JSON
InvalidClusterConfig -2048 Cluster参数错误
DuplicateCluster -2049 重复的Cluster
InexistentCluster -2050 不存在的Cluster
InvalidClusterStatus -2051 无效的Cluster状态
RpcTimedout -2052 RPC请求超时
InvalidGroupBy -2053 无效的分组查询请求
AllOpFailed -2938 批操作全部失败
ClusterWhitelistError -2939 Cluster白名单验证失败
InvalidQuantizeType -2947 无效的量化类型
CollectionDumperNotExist -2948 集合dump任务不存在
CollectionDumperExist -2949 集合最近一次dump未结束
CollectionDumperError -2950 集合dump失败
InvalidSparseIndices -2951 无效的稀疏向量索引
InvalidEndpoint -2952 无效的Endpoint
NoAuthCluster -2958 无权限访问的Cluster
SignatureErr -2959 签名错误
ClusterNotServicing -2961 Cluster状态未就绪
InvalidClusterName -2962 无效的Cluster名称
InvalidClusterStatus -2963 无效的Cluster状态
ForbidCreateCollection -2964 Cluster更新时不允许创建集合
CeasedCluster -2965 Cluster已欠费
InvalidClusterSpecifiation -2966 无效的Cluster规格
ExceedIdsLimit -2967 文档主键超限
InvalidVectorType -2968 无效向量类型
ExceedRequestSize -2970 请求大小超限
EmptyClusterName -2971 Cluster名称为空
EmptyVectorAndId -2972 向量和主键同时为空
ExistVectorAndId -2973 向量和主键都存在
TokenEmpty -2976 ApiKey为空
TokenDelete -2978 ApiKey已删除
TokenExpired -2979 ApiKey过期
TokenDontExist -2980 ApiKey不存在
DropPartitonFilter -2992 禁止删除默认分区
InvalidDocId -2994 无效文档主键
ExceedFieldLimit -2995 文档字段超限
ExceedCollectionLimit -2996 创建集合超限
ExceedPartitionLimit -2997 创建分区超限
ExceedDocLimit -2998 插入文本超限
InvalidArgument -2999 无效参数
SystemError -50000 系统错误

评论区

×
×