使用阿里云向量检索服务DashVector实现关键词感知的向量检索

简介: 本文以房源检索服务为例,详解如何使用阿里云DashVector实现“关键词感知的向量检索”

一.概述

    本文以我个人搭建的房源检索服务为例,详细叙述了如何使用阿里云的 DashVector 产品实现“带有关键词感知的向量检索”。关于“关键词感知的向量检索”具体说明可以参见阿里云官方文档,这里仅对文档中没有详细叙述的实际操作过程进行补充。


二.操作过程

2.1 DashVector API-KEY 申请

登录   阿里云向量检索服务 DashVector 控制台 点击创建 api-key申请。注意:关闭后不可复制

image.png


2.2 创建 Cluster

创建集群(可以类比成关系型数据库里的一个数据库),阿里云会给一定的免费额度供练习使用。

image.png


2.3 创建collection

可以类比成关系型数据库的一个表

image.png


image.png


image.png

  • collection 名称:集合的名称。
  • 向量维度:1536 这个跟我们进行 稠密向量生成的Embedding模型有关,我使用的是qwen3.7-text-embedding 支持 1536 维度(因为有免费额度-。-)关于向量维度的更多说明,可以参考官方文档。
  • 距离度量方式:这里要注意一定要选 DotProduct  只有 DotProduct 模式才支持稀疏向量和稠密向量混合检索,也就是所谓的关键词感知检索。
  • 自定义 schema :向量数据库在存储向量数据的同时,给用户一定自由度扩展一些字段来存储额外的数据。例如这里我存储了一个 id.代表我的房源主键。自定义 shcema 的作用有两个,一个是信息检索结果中会附带这些信息使用比较方便。另外,DashVector 的检索接口支持通过这些 schema做条件查询。



所以我们创建完成的 collection 的一条数据的结构如下:

{
  id:向量数据的主键,
  vector:稠密向量数据用于语义召回,
  sparse_vector:稀疏向量用于关键词匹配,
  fields:{我们额外定义的其他字段key:value 格式}
}

我们在向 collection 中注入数据的时候,也需要按这种形式组织数据,先用 embeding 模型生成 vector ,再用对应的稀疏向量生成工具 DashText 生成稀疏向量,在拼接上我们自定义的 fields 存储到 collection.  


检索时,我们将 关键词  同样处理成,稠密和稀疏向量,进行匹配召回就可以了。召回的信息中,会附带我们自己的 fields.这样就召回了我们提前预定的关键信息。


2.4 生成及插入向量数据

  • 我的原始数据格式 house_vectors.json   这里我希望通过描述信息,召回对应房源 id 即可,所以 schema 中仅定义了一个 id.
[
  {
    "id": 8208,
    "description": "标题:合租Emerald Park主人房双人床有窗,业务类型:合租,房屋类型:主人房,房产类型:公寓,价格:2500$/月,户型/房间数:5,床型:双人床,付款方式:月付,有窗:有窗,置顶:否,是否已满:未满,归属建筑:Emerald Park,地址:2 Indus Rd #06-09, Emerald Park condominium, Singapore 169586,邮编:169586,状态:已发布,认证:否,归属品牌:homey,归属人:eight,发布时间:2026-05-23,房源描述:中心地段,新地铁线,外籍人士吸引力强,近河畔生活方式,租赁需求旺盛,英文原文描述:Central location, new MRT line, strong expat appeal, near river lifestyle, high rental demand,备注:来源: Homey 批量导入,周边:地铁站:Havelock、Tiong Bahru、Great World、Redhill、Orchard;学校:RCHE 新加坡莱佛士高等教育、AMITY 新加坡阿密提国际学院、新加坡管理大学、南洋艺术学院、LASALLE 拉萨尔艺术学院"
  }
]
  • 生成 稠密及稀疏向量 到 output_vectors.json
# pip install dashvector,dashtext,openai

import os
from openai import OpenAI
# 建立 DASHSCOPE_API_KEY 客户端,使用阿里云百炼平台的大模型服务,做 embeding 
client = OpenAI(
    api_key='阿里云百炼平台的 api-key,可以去百炼平台申请',
    base_url="阿里云百炼平台的 api 请求地址"
)

# 使用 dashtext 生成稀疏向量
from dashtext import SparseVectorEncoder
encoder = SparseVectorEncoder.default()# 暂时先使用 内置 encoder ,不用自己的语料库训练。后续再用自己的语料库。


import json
vectors = []
with open('./house_vectors.json','r') as f:
    house_list = json.load(f)
    for house in house_list:
        # 使用 qwen3.7-text-embedding 生成稠密向量
        completion = client.embeddings.create(
            model="qwen3.7-text-embedding",
            input=house['description'],
            dimensions=1536,  # 指定向量维度 需要与 collection 保持一致,
        )
        #id
        id = house['id']
        # 稀疏向量
        doc_sparse_vector = encoder.encode_documents(house['description'])
        # 稠密向量
        doc_dense_vector = completion.data[0].embedding;
        vectors.append({
            "id":id, # 直接使用房源主键作为向量数据主键。
            "vector":doc_dense_vector,
            "sparse_vector":doc_sparse_vector
        })

# vector 输出到文件
# 写入 JSON 文件
with open('output_vectors.json', 'w', encoding='utf-8') as f:
    json.dump(vectors, f, ensure_ascii=False, indent=2)  # indent 使输出可读
  • 将生成的 output_vectors.json 上传到 collection(这里其实也可以直接将上一步生成的数据直接调用接口存储到 collection,我这里只是多存储了一份中间文件)
import json
from dashvector import Doc

with open("./output_vectors.json", "r") as f:
    list = json.load(f)
    for data in list:
        response = collection.insert(Doc(
            id=str(data['id']),
            vector=data['vector'],
            sparse_vector={int(k): v for k,v in data['sparse_vector'].items()},# key 必须为 int
            fields={'id':data['id']} #注意这里传入的 字段 才是 collection schema 中定义的
        ))
    print('insert doc success!--')
    print(response)# 处理结果。上传可能会失败,我们可以通过这个 response 定位问题。


上传成功后,我们在平台的 collection 中可以看到导入的数据,至此我们的向量数据处理全部完成。可以看到存储的是向量信息。

image.png



2.5 向量检索

from dashvector_client import collection
import os
from openai import OpenAI
prompt = "我想要一套合租的房源"

from dashtext import SparseVectorEncoder
encoder = SparseVectorEncoder.default()

embedding_client = OpenAI(
    api_key="百炼平台 api",
    base_url="百炼平台请求地址"
)
completion = embedding_client.embeddings.create(
        model="qwen3.7-text-embedding",
        input=prompt,
        dimensions=1536,  # 指定向量维度 需要与 collection 保持一致,
)

# 稀疏向量 注意跟向量数据存储时需要用一个向量处理工具
doc_sparse_vector = encoder.encode_documents(prompt)
# 稠密向量 注意跟向量数据存储时需要用一个向量处理工具
doc_dense_vector = completion.data[0].embedding;

response = collection.query(
    vector=doc_dense_vector,
    sparse_vector=doc_sparse_vector
)

print(response) # 匹配结果

"""
{"code": 0, "message": "Success", "requests_id": "a0a7c3fa-efe1-4958-b81a-4386b1eebd72", "output": [{"id": "8207", "sparse_vector": {"128466567": 0.5385127663612366, "3488055477": 0.5385127663612366, "575208283": 0.5385127663612366, "3987355390": 0.5385127663612366, "455390201": 0.5385127663612366, "281464262": 0.5385127663612366, "1214339364": 0.5385127663612366, "38107217": 0.5385127663612366, "2879070766": 0.5385127663612366, "645608479": 0.7778134346008301, "1713372713": 0.5385127663612366, "3272354708": 0.5385127663612366, "2090698681": 0.5385127663612366, "225251141": 0.5385127663612366, "3799633237": 0.5385127663612366, "403644754": 0.5385127663612366, "731317203": 0.5385127663612366, "4121761508": 0.5385127663612366, "522061851": 0.5385127663612366, "865949017": 0.5385127663612366, "701918430": 0.5385127663612366, "1993390424": 0.5385127663612366, "3383387916": 0.5385127663612366, "1267261184": 0.7000433206558228, "473727155": 0.5385127663612366, "2647627939": 0.5385127663612366, "947081451": 0.5385127663612366, "3843901863": 0.7000433206558228, "3369620648": 0.5385127663612366, "1055110136": 0.5385127663612366, "2745751983": 0.5385127663612366, "1697543836": 0.5385127663612366, "3666358166": 0.5385127663612366, "1586628127": 0.5385127663612366, "1127428560": 0.5385127663612366, "346084629": 0.5385127663612366, "3945479823": 0.5385127663612366, "1183495594": 0.5385127663612366, "3099554429": 0.5385127663612366, "1458777822": 0.5385127663612366, "847813810": 0.5385127663612366, "284361920": 0.7000433206558228, "3747194111": 0.5385127663612366, "1514673797": 0.7000433206558228, "336721815": 0.5385127663612366, "685796717": 0.5385127663612366, "3785871704": 0.5385127663612366, "3855781321": 0.5385127663612366, "468086265": 0.5385127663612366, "1743941834": 0.5385127663612366, "3648775104": 0.5385127663612366, "1126527455": 0.5385127663612366, "1667662100": 0.5385127663612366, "712286644": 0.5385127663612366, "1075688730": 0.5385127663612366, "4130523965": 0.5385127663612366, "3337161277": 0.5385127663612366, "3580333748": 0.5385127663612366, "2581019827": 0.5385127663612366, "3327497065": 0.5385127663612366, "2240034651": 0.5385127663612366, "115805462": 0.5385127663612366, "3863254354": 0.5385127663612366, "220702789": 0.5385127663612366, "2520262144": 0.5385127663612366, "1564619016": 0.5385127663612366, "4281202855": 0.5385127663612366, "734978415": 0.5385127663612366, "1112844949": 0.5385127663612366, "2339710845": 0.5385127663612366, "1013716996": 0.5385127663612366, "1175131894": 0.5385127663612366, "2858950494": 0.5385127663612366, "4167657730": 0.7000433206558228, "1494060852": 0.5385127663612366, "2019564631": 0.5385127663612366, "1207638572": 0.5385127663612366, "65259376": 0.5385127663612366, "876119480": 0.5385127663612366, "697108202": 0.5385127663612366, "202257423": 0.5385127663612366, "2194918771": 0.5385127663612366, "1339242251": 0.5385127663612366, "1487858779": 0.5385127663612366, "3222452068": 0.5385127663612366, "1134386733": 0.5385127663612366, "3647405936": 0.5385127663612366, "1464895919": 0.5385127663612366, "3936322322": 0.7778134346008301, "4044102612": 0.7778134346008301, "3615541420": 0.5385127663612366, "3723151830": 0.5385127663612366, "2231074495": 0.5385127663612366, "2411973761": 0.7778134346008301, "3231553877": 0.5385127663612366, "2683328673": 0.5385127663612366, "497817439": 0.5385127663612366, "2494961552": 0.5385127663612366, "761498890": 0.5385127663612366, "2218935709": 0.5385127663612366, "1510475518": 0.7000433206558228, "3600691560": 0.5385127663612366, "283837043": 0.5385127663612366, "136736535": 0.5385127663612366, "2317842571": 0.5385127663612366, "2574140003": 0.5385127663612366, "2332514525": 0.5385127663612366, "3262929218": 0.7000433206558228, "789380708": 0.5385127663612366, "3311579508": 0.5385127663612366, "3016494671": 0.5385127663612366, "1583060724": 0.5385127663612366, "2319023830": 0.5385127663612366, "3317400086": 0.5385127663612366, "984329144": 0.5385127663612366, "1831503944": 0.7000433206558228, "2526992654": 0.5385127663612366, "3675741289": 0.5385127663612366, "65439743": 0.5385127663612366, "2935470936": 0.7000433206558228, "1619558971": 0.5385127663612366, "849976065": 0.7000433206558228, "509970187": 0.5385127663612366, "921598042": 0.5385127663612366, "1802189524": 0.5385127663612366, "3943043189": 0.7000433206558228, "1647979225": 0.5385127663612366, "3925402570": 0.5385127663612366, "1723027408": 0.8536843061447144}, "fields": {"vector": null, "id": 8207, "sparse_vector": null}, "score": 1.5299}]}
"""






三.注意事项及总结

  • 文中使用的阿里云百炼平台的 api-key  和 api 地址,需要去 百炼平台 提前申请。
  • 检索及存储向量时,要使用相同的向量处理模型和工具,注意向量维度也要保持一致。
  • 稠密向量维度要与 collection 中定义的保持一致。


参考资料:https://help.aliyun.com/document_detail/2586282.html?spm=a2c4g.11174283.0.0.71af582bNPgka4

相关文章
|
监控 网络协议 Java
分布式链路追踪- SkyWalking使用手册
分布式链路追踪- SkyWalking使用手册
2902 0
分布式链路追踪- SkyWalking使用手册
|
1月前
|
缓存 人工智能 自然语言处理
阿里云qwen-max、qwen-plus、qwen-flash、qwen-long热门模型解析与模型选择指南
本文全面解析阿里云百炼通义千问四大产品线:qwen-max旗舰、qwen-plus均衡、qwen-flash轻量、qwen-long长文本专用,覆盖全代际版本特性、适用场景、能力参数与价格体系。文章给出四步选型逻辑与生产环境分层调度策略,搭配当前限时折扣、夜间错峰优惠、新人免费额度等活动,帮助开发者精准匹配业务需求,在保障推理效果的同时最大化控制调用成本。
|
2月前
|
存储 监控 API
DashVector向量数据库全解:功能特性、API调用与百炼RAG集成
DashVector是阿里云原生向量检索服务,与百炼平台深度集成。本文详解DashVector核心功能、API调用方法和RAG应用集成实践,助你快速构建向量检索应用。
220 0
|
25天前
|
人工智能 缓存 API
保姆级通义千问Qwen大模型选型教程:Qwen3.8‑Max、Qwen3.7‑Max、Qwen3.7‑Plus、Qwen3.7‑Flash功能区别与选型指南,API代码实操
在AI应用开发、智能体搭建、代码工程落地、文档解析等场景中,模型选型直接决定项目效果、响应速度与调用成本。很多开发者初次接触Qwen系列模型时,很容易混淆Qwen3.8‑Max、Qwen3.7‑Max、Qwen3.7‑Plus、Qwen3.7‑Flash之间的定位差异,单纯依靠模型名称判断能力,出现选用高成本模型做简单任务造成预算浪费,或是选用轻量模型处理复杂推理任务,导致结果质量不达预期的情况。四款模型虽然都具备百万级上下文窗口,支持工具调用、结构化输出、思考模式,但在模态支持、推理深度、多模态能力、响应速度、单位Token定价上有着明确的区分。本文将逐一拆解四款模型的核心功能、能力边界、优
460 0
|
5月前
|
前端开发 JavaScript API
前端组件库 ——LayUI 知识点大全(一)
教程来源 http://oplhc.cn LayUI是由国内开发者“贤心”于2016年推出的经典模块化前端UI框架,MIT开源。不依赖Vue/React等现代框架,零配置、低门槛、开箱即用,尤受后端开发者与中小项目青睐。2026年仍持续更新,最新版2.11+强化组件与工程化支持。
|
5月前
|
存储 Oracle 关系型数据库
企业级数据库迁移实践:从Oracle到国产数据库的兼容性与实施策略
本文聚焦Oracle向国产数据库的“去O”迁移实战,系统解析兼容性痛点(如存储过程、分页、递归查询等65%~90%适配度)、三类迁移方案选型(全量/增量/并行)及五步实施路径,涵盖评估、结构转换、数据同步、代码适配与性能优化,并推荐KDTS、KStudio等工具链,助力企业安全可控完成异构数据库替换。
|
人工智能 JavaScript Java
【SpringAIAlibaba新手村系列】(1)初识 Spring AI Alibaba 框架
本文介绍了SpringAIAlibaba框架的基本概念和使用方法。作为Spring官方AI框架的阿里云实现版本,它简化了Java开发者调用AI模型的过程。文章详细讲解了核心概念如ChatModel、ChatClient,以及阿里云百炼平台的功能。通过HelloWorld项目示例,展示了如何配置APIKey、编写控制层代码,实现普通调用和流式输出两种AI交互方式。重点阐述了SpringAI与SpringAIAlibaba的关系,以及自动配置机制的工作原理,帮助开发者快速上手这一框架。
9822 9
|
人工智能 API Nacos
MCP Registry 官方发布:Nacos 原生支持,借助 HiMarket 构建企业级私有 MCP 市场
最近,MCP 社区发布了 MCP Registry(2025‑09‑08,预览版),为公开 MCP Server 提供“统一目录服务和开放 API”。Nacos 已原生支持 MCP Registry API,可直接作为“MCP Registry”对外提供标准 REST/OpenAPI 服务端,天然融入企业现有注册中心与配置治理体系,并与 Higress/HiMarket 对接打通,让企业能够高效的构建自己的私有 MCP 市场。
1154 100
|
JSON NoSQL Redis
Redis Stack是什么,你知道吗?
Redis Stack 是 Redis 官方推出的一款新产品,扩展了 Redis OSS 的核心功能,提供完整的开发人员体验。它支持概率数据结构、可查询的 JSON 文档、跨哈希和 JSON 文档查询、时间序列数据处理等高级功能。Redis Stack 包含 Redis Stack Server、RedisInsight 和客户端 SDK,适用于构建实时应用程序。安装方式包括直接安装和 Docker 安装,使用方法与 Redis 类似,支持 JSON、Bloom Filter 等数据类型及操作命令。
2842 1
|
缓存 Ubuntu Linux
【阿里云镜像】更改阿里巴巴开源镜像站镜像之——CentOS镜像
【阿里云镜像】更改阿里巴巴开源镜像站镜像之——CentOS镜像
5023 0
【阿里云镜像】更改阿里巴巴开源镜像站镜像之——CentOS镜像

热门文章

最新文章