导读:
在当今搜索场景中,多模态搜索的应用日益广泛,例如通过文字寻找图片、利用图片检索图片,甚至借助图片描述匹配其他描述。本文将以阿里云 Elasticsearch(ES)与千问 VL 大模型为核心,完整演示从图片特征提取到向量检索的实战流程。提供的代码示例覆盖以文搜图、以文搜文、以图搜图、以图搜文四种常见场景,开箱即用。
效果展示>>
背景信息
当图片和文本这类非结构化数据并存时,传统的关键词匹配往往力不从心。更高效的做法是先将它们转换为向量,再通过向量检索快速命中相似内容。本实践使用以下三个工具:
Elasticsearch:作为向量存储与检索的核心数据库,此处选用 8.17 及以上版本。
千问 VL 模型:负责从图片中提取描述与关键词,相当于为每张图片生成一段自然语言说明。
DashScope Embedding API:将图片和文本分别转化为向量,从而在统一向量空间内实现跨模态匹配。
具体能实现哪些功能?
以文搜图:输入一句话,找出最匹配的图片。
以文搜文:输入一句话,找出最相似的图片描述。
以图搜图:输入一张图片,找出视觉上最相近的图片。
以图搜文:输入一张图片,找出内容描述最接近的文本。
系统架构
下图展示了整个多模态搜索系统的架构概览,从数据录入、向量生成到检索响应,流程一目了然。
前提条件
动手前请确认环境是否准备就绪:
一个 8.17 及以上版本的阿里云 Elasticsearch 实例(创建步骤参见官方文档)。
已开通百炼服务,并获取可用的 API-Key。
本地 Python 版本 ≥ 3.8。
环境准备
安装依赖
执行以下命令,一次性安装所需的库:
pip install elasticsearch dashscope requests streamlit下载示例数据集
数据集来自公开的图片检索示例包,运行以下命令下载并解压:
wget https://github.com/milvus-io/pymilvus-assets/releases/download/imagedata/reverse_image_search.zip
unzip -q -o reverse_image_search.zip解压后会得到一个 CSV 文件和多张图片样本。
目录结构
建议将工作目录组织如下:
multi_modal_search/
├── reverse_image_search.csv # 数据集文件
├── train/ # 图片目录(解压后生成)
│ └── *.jpg
├── scripts/ # 脚本目录
│ ├── write.py # 数据写入脚本
│ ├── read.py # 查询脚本
│ └── demo.py # 前端演示脚本核心代码介绍
写入流程
写入过程分为两步:首先使用千问 VL 模型为每张图片生成一段描述文本,并存入 text_input 字段;然后调用多模态 Embedding 模型,分别将原始图片和描述文本转换为向量,对应 image_embedding 和 text_embedding。这样一来,后续无论使用图片还是文字进行查询,都能在同一向量空间内完成比较。
为便于演示,本示例仅处理前 200 张图片。
完整代码可参考官方文档中的 write.py 脚本。请根据实际情况替换以下参数:
- ES 连接地址、端口、用户名、密码
- 百炼 API Key
执行 python3 write.py 后,控制台会逐条显示每张图片生成的描述及处理进度。
查询流程
查询脚本定义了四种检索类型。无论查询输入是文本还是图片,都会先调用百炼多模态模型生成对应的向量,然后根据检索类型匹配 image_embedding 或 text_embedding 字段,最终返回最相似的结果。
详细代码见 read.py 脚本,其中 ES 配置参数与写入流程保持一致。
前端 Demo
基于 Streamlit 搭建的简易演示界面,可在浏览器中直接交互体验四种搜索模式。代码位于 demo.py 中。
操作流程
步骤一:配置参数
运行脚本前,请打开 write.py 和 read.py,修改以下配置项:
# ES配置
ES_HOST = "" # 替换为您的ES实例地址
ES_PORT = 9200
ES_USER = "" # 替换为您的ES用户名
ES_PASSWORD = "" # 替换为您的ES密码
# 百炼API配置(仅write.py需要)
DASHSCOPE_API_KEY = "" # 替换为百炼平台中可用的API Key 步骤二:加载数据集
进入 scripts 目录,执行数据写入脚本:
cd scripts
python3 write.py成功执行后,您会看到类似下面的输出:
INFO - [1/7] 创建 ES 客户端...
INFO - ES连接状态: xxx...
INFO - 处理第 1/200 张图片: xxx
INFO - 描述: xxx
...
INFO - 处理完成!成功: 200, 失败: 0步骤三:验证数据写入(可选)
运行查询脚本确认数据已正确写入:
python3 read.py以“以文搜图”为例,搜索关键词“狮子”,结果类似:
以文搜图 - 搜索关键词"狮子"
✓ 得分: 0.8077 - 一只狮子坐在倒下的树干上,周围是茂密的灌木和树枝
✓ 得分: 0.7732 - 雄壮的狮子站在草地上,鬃毛在阳光下威武宁静
✓ 得分: 0.7566 - 雄狮特写,鬃毛浓密,眼神锐利步骤四:启动前端演示
streamlit run demo.py浏览器会自动打开 https://localhost:8501,界面直观易用。
步骤五:多模态向量检索
在搜索设置中选择检索类型(以文搜图、以文搜文、以图搜图、以图搜文),输入文字或上传图片,点击搜索即可查看匹配结果。
