图文搜索最佳实践
本文介绍如何在百度胜算中使用图文搜索能力,包括创建分析与 AI 搜索实例、连接 Notebook、创建向量表、生成多模态 embedding,以及执行图搜图和文搜图。
前提条件
- 已开通BOS、OOS、BLS权限。
- 已完成资源环境准备。
- 资源组已绑定处于运行中的分析与 AI 搜索实例。
- 准备好测试图片,本示例采用小猫、鞋子图片作为演示。
操作步骤
步骤一:创建 Notebook
前往工作台,选择目标项目,依次单击右上角创建>数据处理>Notebook。

步骤二:连接分析与 AI 搜索实例
进入创建的 Notebook,在右上角下拉框中选择处于运行中的分析与 AI 搜索实例。此时可以在 Notebook 中按本文顺序执行 SQL,体验图文搜索。

步骤三:创建测试数据
以下示例使用 rdtest 数据库和 test_table 数据表。
创建数据库
执行以下 SQL 创建数据库:
1CREATE DATABASE IF NOT EXISTS rdtest;

选择数据库
1USE rdtest;

创建数据表和 ANN 索引
执行以下 SQL 创建数据表。embedding 列用于保存图片或文本的向量,ANN 索引使用 HNSW 算法、L2 距离,向量维度为 1536。
1CREATE TABLE IF NOT EXISTS `test_table` (
2 `id` INT NOT NULL COMMENT "数据唯一编号",
3 `content` varchar(1000) NULL COMMENT "内容说明",
4 `path` varchar(1000) NULL COMMENT "图片路径",
5 `embedding` array<float> COMMENT "图片向量数据",
6 INDEX index_ann (`embedding`) USING ANN PROPERTIES(
7 "distance" = "l2",
8 "dimension" = "1536",
9 "algorithm" = "hnsw"
10 )
11) ENGINE=OLAP
12DUPLICATE KEY(`id`)
13DISTRIBUTED BY HASH(`id`) BUCKETS 2;

导入图片数据并生成 embedding
如果测试环境暂时无法搭建图片服务,可以跳过图片数据导入,改用使用文本embedding进行功能验证。
执行以下 SQL 导入测试数据,并通过 embedding() 函数生成图片向量:
1INSERT INTO test_table (id, content, path, embedding) VALUES
2 (1, 'xiezi1', 'http://xxx.bj.bcebos.com/dev/wgf/images/xiezi1.jpg',
3 embedding('http://xxx.bj.bcebos.com/dev/wgf/images/xiezi1.jpg', 'image', 'multimodal_embedding_server')),
4 (2, 'xiezi2', 'http://xxx.bj.bcebos.com/dev/wgf/images/xiezi2.png',
5 embedding('http://xxx.bj.bcebos.com/dev/wgf/images/xiezi2.png', 'image', 'multimodal_embedding_server')),
6 (3, 'xiezi3', 'http://xxx.bj.bcebos.com/dev/wgf/images/xiezi3.jpg',
7 embedding('http://xxx.bj.bcebos.com/dev/wgf/images/xiezi3.jpg', 'image', 'multimodal_embedding_server')),
8 (4, 'xiezi_test1', 'http://xxx.bj.bcebos.com/dev/wgf/images/xiezi_test1.jpg',
9 embedding('http://xxx.bj.bcebos.com/dev/wgf/images/xiezi_test1.jpg', 'image', 'multimodal_embedding_server')),
10 (5, 'mao1', 'http://xxx.bj.bcebos.com/dev/wgf/images/mao1.jpg',
11 embedding('http://xxx.bj.bcebos.com/dev/wgf/images/mao1.jpg', 'image', 'multimodal_embedding_server')),
12 (6, 'mao2', 'http://xxx.bj.bcebos.com/dev/wgf/images/mao2.jpg',
13 embedding('http://xxx.bj.bcebos.com/dev/wgf/images/mao2.jpg', 'image', 'multimodal_embedding_server')),
14 (7, 'mao_test1', 'http://xxx.bj.bcebos.com/dev/wgf/images/mao_test1.jpg',
15 embedding('http://xxx.bj.bcebos.com/dev/wgf/images/mao_test1.jpg', 'image', 'multimodal_embedding_server'));
embedding()函数的参数格式:embedding('图片 URL 或文本', '资源类型', '模型名称');- 图片url / 文本:如果是图片url,需要是Databuilder内可以访问到的地址;
- 资源类型:image表示图片,text表示文本;
- 模型名称:多模态embedding,当前固定写 multimodal_embedding_server。
查看导入的数据
执行以下 SQL 查看已导入的数据:
1SELECT id, content, path
2FROM test_table
3LIMIT 10;

执行图文搜索
以下示例均使用 test_table 中的 embedding 列进行检索,并返回 __DISTANCE 距离列。通常情况下,距离越小表示结果越相似。
TopK检索(图搜图:搜索相似鞋子)
将鞋子图片 URL 生成查询向量,返回与该图片最相似的图片。
1SELECT id, content, path, __DISTANCE
2FROM test_table
3ORDER BY ann_distance(
4 embedding,
5 embedding('http://xxx.bj.bcebos.com/dev/wgf/images/xiezi_test1.jpg', 'image', 'multimodal_embedding_server')
6)
7LIMIT 10;

TopK检索(图搜图:搜索相似猫)
1SELECT id, content, path, __DISTANCE
2FROM test_table
3ORDER BY ann_distance(
4 embedding,
5 embedding('http://xxx.bj.bcebos.com/dev/wgf/images/mao_test1.jpg', 'image', 'multimodal_embedding_server')
6)
7LIMIT 10;

范围检索(图搜图:按距离范围搜索鞋子)
只返回距离在 0 到 1.5 之间的图片,并按距离升序排列。
1SELECT id, content, path, __DISTANCE
2FROM test_table
3WHERE ann_distance(
4 embedding,
5 embedding('http://xxx.bj.bcebos.com/dev/wgf/images/xiezi_test1.jpg', 'image', 'multimodal_embedding_server')
6) BETWEEN 0 AND 1.5
7ORDER BY __DISTANCE;

范围检索:(图搜图:按距离范围搜索猫)
1SELECT id, content, path, __DISTANCE
2FROM test_table
3WHERE ann_distance(
4 embedding,
5 embedding('http://xxx.bj.bcebos.com/dev/wgf/images/mao_test1.jpg', 'image', 'multimodal_embedding_server')
6) BETWEEN 0 AND 1
7ORDER BY __DISTANCE;

TopK检索(文搜图:搜索猫)
将文本“猫咪相关的图片”生成查询向量,搜索相似图片。
1SELECT id, content, path, __DISTANCE
2FROM test_table
3ORDER BY ann_distance(
4 embedding,
5 embedding('猫咪相关的图片', 'text', 'multimodal_embedding_server')
6)
7LIMIT 10;

TopK检索(文搜图:使用更具体的描述搜索猫)
通过增加“站着的”等修饰词,使查询描述更具体。
1SELECT id, content, path, __DISTANCE
2FROM test_table
3ORDER BY ann_distance(
4 embedding,
5 embedding('站着的猫咪图片', 'text', 'multimodal_embedding_server')
6)
7LIMIT 10;

TopK检索(文搜图:搜索鞋子)
使用文本查询“皮鞋相关的图片”,并限制距离范围。
1SELECT id, content, __DISTANCE
2FROM test_table
3WHERE ann_distance(
4 embedding,
5 embedding('皮鞋相关的图片', 'text', 'multimodal_embedding_server')
6) BETWEEN 0 AND 1.5
7ORDER BY __DISTANCE
8LIMIT 10;

范围检索(文搜图:按距离范围搜索鞋子)
1SELECT id, content, __DISTANCE
2FROM test_table
3WHERE ann_distance(
4 embedding,
5 embedding('鞋子相关的图片', 'text', 'multimodal_embedding_server')
6) BETWEEN 0 AND 1.5
7ORDER BY __DISTANCE
8LIMIT 10;

单独调用 embedding() 函数
可以直接调用 embedding() 函数生成向量:
1SELECT embedding(
2 'http://xxx.bj.bcebos.com/dev/wgf/images/xiezi_test1.jpg',
3 'image',
4 'multimodal_embedding_server'
5) AS embedding;

使用文本生成 embedding
如果测试环境无法提供图片 URL,可以将文本转换为 embedding,使用同一张表验证文本检索图片的流程。
导入文本数据
1INSERT INTO test_table (id, content, path, embedding) VALUES
2 (1, 'xiezi1', 'xiezi1',
3 embedding('一双棕色的鞋子', 'text', 'multimodal_embedding_server')),
4 (2, 'xiezi2', 'xiezi2',
5 embedding('一双红色的鞋子', 'text', 'multimodal_embedding_server')),
6 (6, 'mao2', 'mao2',
7 embedding('一只黄色的猫', 'text', 'multimodal_embedding_server'));
查看文本数据
1SELECT id, content, path
2FROM test_table
3LIMIT 10;
执行文本 Top-K 查询
使用文本查询生成 embedding,并返回最相似的图片记录:
1SELECT id, content, path, __DISTANCE
2FROM test_table
3ORDER BY ann_distance(
4 embedding,
5 embedding('shoes', 'text', 'multimodal_embedding_server')
6)
7LIMIT 10;
8
9SELECT id, content, path, __DISTANCE
10FROM test_table
11ORDER BY ann_distance(
12 embedding,
13 embedding('cat', 'text', 'multimodal_embedding_server')
14)
15LIMIT 10;
执行结果参考下图:

评价此篇文章
