一、产品理解及总结
今天测评的是一款名为DashVector的向量检索服务,由阿里云通义实验室自主研发,基于高效的Proxima内核引擎,提供了一种云原生、全托管且具备水平拓展能力的服务,专为各类AI应用场景解决高效向量检索难题。
经过两天对其产品文档的研读和实操效果的总结如下:
在功能特性方面:能够实现多维度高精度检索,灵活调整算法以满足不同场景下的精度和性能平衡需求。实时在线更新能力使得大规模向量索引构建与查询无缝衔接,做到即时落盘与动态更新。同时,通过工程优化和算法调优,我能够在保证高性能的同时降低成本,实现对多种场景的良好适配,包括处理超大规模索引构建与检索,以及支持“标签+向量”的组合检索。
在实例类型上:我提供了性能型、存储型和免费试用三种选项。性能型适用于高并发低延迟场景;存储型拥有更大存储容量,适合大规模数据管理,并具有较高性价比;而免费试用则方便用户测试和体验。
关于计费方式:目前我仅支持按量付费,即创建后每小时根据实例规格单价、计费时长和副本数量自动扣费,计费周期精确到秒。用户可以按需选择合适的实例类型,充分利用我的强大功能,为电商智能搜索推荐、AI问答系统、多模态搜索、视频检索以及分子检测筛选等场景提供有力支撑。
二、实操体验及步骤
结合阿里云向量检索服务DashVector与ModelScope的中文CLIP多模态模型,实现基于“文本搜图片”的实时跨模态检索功能。整个实践过程主要分为两个关键阶段:
一、图片数据Embedding入库阶段
首先从多模态牧歌数据集的验证集中获取图片,并通过调用ModelScope上训练精良的中文CLIP模型接口将其转化为高维向量表示。随后,将这些生成的图片向量写入到DashVector服务中存储。同时为了便于后续展示,原始图片数据也将被编码后一并入库。
二、文本Query检索阶段
在完成图片数据的向量化及入库之后,用户可输入任意文本进行检索。系统会再次利用相同的CLIP模型计算该文本的Embedding向量,然后通过DashVector服务提供的检索API对接口,高效地搜索出与输入文本最相似的图片。
在实操前,需确保已完成以下准备:
开通并向量检索服务DashVector并创建API-KEY。
准备相应的Python环境,安装dashvector、modelscope及其依赖库。(可用notebook)
使用MsDataset加载多模态牧歌数据集作为图片素材来源。
实操步骤如下:
通过以下步骤,即可构建一个基于多模态模型和向量检索技术的实时文本图像检索系统,有效提升图文检索场景的表现效果。
(一)申请和进入服务台
点击试用选择自己的实例名称确认相关协议,点击试用并进入服务台
服务台网址:https://dashvector.console.aliyun.com/cn-hangzhou/overview
(二)了解服务台基本架构并创建API-key
浏览服务台看到有cluster下有一个实例,并且点击创建api-key
(三)应用魔搭社区notebook进行结合
打开魔搭社区https://modelscope.cn/my/mynotebook/preset,启动CPU环境,打开终端输入以下命令
# 安装 dashvector 客户端pip3 install dashvector # Python需要更新到3.7以上pip install --upgrade pip # 安装 modelscopepip3 install --upgrade modelscope -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
(四)准备数据
调用ModelScope的数据集接口获取
frommodelscope.msdatasetsimportMsDatasetdataset=MsDataset.load("muge", split="validation")
(五)图片数据Embedding入库
输入如下代码,同时注意API-KAY及CLUSTER_ENDPOINT要从下述图片位置寻找相关代码
importtorchfrommodelscope.utils.constantimportTasksfrommodelscope.pipelinesimportpipelinefrommodelscope.msdatasetsimportMsDatasetfromdashvectorimportClient, Doc, DashVectorException, DashVectorCodefromPILimportImageimportbase64importiodefimage2str(image): image_byte_arr=io.BytesIO() image.save(image_byte_arr, format='PNG') image_bytes=image_byte_arr.getvalue() returnbase64.b64encode(image_bytes).decode() if__name__=='__main__': # 初始化 dashvector clientclient=Client( api_key='{your-dashvector-api-key}', endpoint='{your-dashvector-cluster-endpoint}' ) # 创建集合:指定集合名称和向量维度, CLIP huge 模型产生的向量统一为 1024 维rsp=client.create('muge_embedding', 1024) ifnotrsp: raiseDashVectorException(rsp.code, reason=rsp.message) # 批量生成图片Embedding,并完成向量入库collection=client.get('muge_embedding') pipe=pipeline(task=Tasks.multi_modal_embedding, model='damo/multi-modal_clip-vit-huge-patch14_zh', model_revision='v1.0.0') ds=MsDataset.load("muge", split="validation") BATCH_COUNT=10TOTAL_DATA_NUM=len(ds) print(f"Start indexing muge validation data, total data size: {TOTAL_DATA_NUM}, batch size:{BATCH_COUNT}") idx=0whileidx<TOTAL_DATA_NUM: batch_range=range(idx, idx+BATCH_COUNT) ifidx+BATCH_COUNT<=TOTAL_DATA_NUMelserange(idx, TOTAL_DATA_NUM) images= [ds[i]['image'] foriinbatch_range] # 中文 CLIP 模型生成图片 Embedding 向量image_embeddings=pipe.forward({'img': images})['img_embedding'] image_vectors=image_embeddings.detach().cpu().numpy() collection.insert( [ Doc( id=str(img_id), vector=img_vec, fields={'png_img': image2str(img)} ) forimg_id, img_vec, imginzip(batch_range, image_vectors, images) ] ) idx+=BATCH_COUNTprint("Finish indexing muge validation data")
(六)文本Query检索及展示结果
通过DashVector向量检索服务的检索接口,快速检索相似的图片,输入下方代码进行测验,同时也要注意API-KAY及CLUSTER_ENDPOINT
importtorchfrommodelscope.utils.constantimportTasksfrommodelscope.pipelinesimportpipelinefrommodelscope.msdatasetsimportMsDatasetfromdashvectorimportClient, Doc, DashVectorExceptionfromPILimportImageimportbase64importiodefstr2image(image_str): image_bytes=base64.b64decode(image_str) returnImage.open(io.BytesIO(image_bytes)) defmulti_modal_search(input_text): # 初始化 DashVector clientclient=Client( api_key='{your-dashvector-api-key}', endpoint='{your-dashvector-cluster-endpoint}' ) # 获取上述入库的集合collection=client.get('muge_embedding') # 获取文本 query 的 Embedding 向量pipe=pipeline(task=Tasks.multi_modal_embedding, model='damo/multi-modal_clip-vit-huge-patch14_zh', model_revision='v1.0.0') text_embedding=pipe.forward({'text': input_text})['text_embedding'] # 2D Tensor, [文本数, 特征维度]text_vector=text_embedding.detach().cpu().numpy()[0] # DashVector 向量检索rsp=collection.query(text_vector, topk=3) image_list=list() fordocinrsp: image_str=doc.fields['png_img'] image_list.append(str2image(image_str)) returnimage_listif__name__=='__main__': text_query="眼镜"images=multi_modal_search(text_query) forimginimages: # 注意:show() 函数在 Linux 服务器上可能需要安装必要的图像浏览器组件才生效# 建议在支持 jupyter notebook 的服务器上运行该代码img.show()
cpu运行时间较长,请耐心等待。。。
(七)实操视频
三、体验和展望
我是在 cpu 环境下运行,在 gpu 环境下会视 gpu 性能得到不同程度的性能提升,所以可能慢了一些,但是效果还是有目共睹的,通过整合前沿的多模态预训练模型CLIP与先进的向量检索引擎DashVector,我们成功构建了一套高效智能的“文本驱动图片搜索”系统。
在实践操作中,海量图片数据通过CLIP模型转化为语义稠密空间中的向量表示,进而被DashVector索引优化以实现亚秒级的检索速度。用户输入的任意文本也能转换为对应向量,并在庞大的图像数据库中寻找到语义最为匹配的结果。这一创新应用不仅体现了深度学习技术在跨模态信息检索领域的突破性进展,还揭示了理论研究与实际工程紧密结合所带来的巨大价值,为今后智能化信息服务的设计与实施树立了典范。