本文介绍了一套基于阿里云 Flink OSS CDC、Flink AI 和 DLF Paimon 的以图搜图方案,面向大数据从业者,提供从图片实时发现、向量化入湖到 SQL 向量检索的完整链路。方案以 TensorFlow Flower Photos 数据集(约 3,670 张图片)为例,使用 qwen3-vl-embedding 模型将图片转换为 2560 维向量,存入 Paimon 表后通过 DLF Global Index 构建向量索引,最终以 Flink SQL 的 VECTOR_SEARCH 函数完成 Top-K 相似检索。整套方案无需编写代码,无需额外部署向量数据库,模型推理直接嵌入 Flink 数据处理链路。
核心结论
-
实时性:图片上传至 OSS 后,Flink OSS CDC 自动感知变更,秒级完成向量化和入湖,消除天级别的人工导入延迟
-
零代码集成:Flink AI 的 AI_IMAGE_EMBED 函数在 Flink SQL/CDC YAML 中直接调用多模态模型,无需管理 API Key 或独立部署推理服务
-
统一存储:图片元数据与向量统一存储在 Paimon 表中,避免多套系统之间的数据一致性问题
-
SQL 原生检索:通过 VECTOR_SEARCH 函数在 Flink SQL 中完成向量相似度查询,无需将数据导出到独立向量数据库
基于 Flink OSS CDC、Flink AI 和 DLF Paimon,构建图片实时发现、向量化入湖与 SQL 以图搜图链路,为大数据从业者提供一套可复用的大模型工程实践。
对于大数据从业者来说,大模型真正落地的难点,往往不只是"调用一次模型 API",而是如何把模型能力稳定地嵌入现有数据链路。图片检索就是一个典型的场景。
在电商、内容平台和企业知识库中,大量图片已经存放在 OSS。随着图片规模持续增长,只依赖文件名、目录或人工标签来管理检索,问题会集中暴露:
- 新商品上线后,图片搜索系统要等到下一轮人工触发或批量导入才能感知到新增图片------而这个周期往往是天级别的;
- 文件名通常是
IMG_20240301_001.jpg这样的无意义编号,人工标注成本高、覆盖率有限,且标注质量难以一致; - 图片元数据、向量和索引分散在多套系统中,数据一致性靠定时任务勉强维持,链路复杂、维护成本高;
- 图片规模每翻一倍,上述问题就加剧一倍------这不是某个团队的管理问题,而是"图片管理"在规模化之后的结构性困境。
一、整体架构
从大数据平台视角看,这套方案的核心价值在于:对象存储负责承载原始图片,Flink 负责实时编排与模型调用,Paimon 负责统一存储数据和向量,Global Index 负责检索加速。 各组件职责清晰,无需再单独搭建一条"图片同步到向量数据库"的旁路链路。
整条链路可以概括为两条数据流和一次向量查询:

图1: Flink OSS CDC + DLF Paimon 以图搜图实践架构
整套方案分为图库摄入、查询图片摄入和向量检索三个部分。将图库和查询图片拆分到两张表,可以避免查询结果召回图片自身,也便于分别管理索引、生命周期和访问权限。
预期结果
Flower Photos 全部约 3,670 张图片写入 image_search.image_assets,另外准备 5 张数据集之外的花卉照片作为查询图片,写入 image_search.image_queries。使用 image_queries 中的 5 张图片作为查询向量,分别从 image_assets 中召回 Top-3 相似图片,共 15 条结果。由于两张表分开存储,不会召回查询图片自身。
二、实践准备
环境与资源
开始实践前,需要准备以下资源:
- 阿里云实时计算 Flink版。AI-Native的一站式实时数据云平台,提供企业级、高性能、全托管Serverless Flink云服务,具备全模态数据流式处理能力,在处理性能、结构化算子、实时增量处理、连接器生态及容错能力等维度,均优于 Ray、Daft 等开源技术栈。以下实践使用的实时计算版本为11.8;
- Flink AI服务。阿里云实时计算Flink版的托管式AI模型调用能力。您无需配置 API-Key ,即可在 Flink SQL 作业、Flink Agent 作业、Flink Python DataFrame API 作业中调用内置模型,实现流式 AI 推理与向量化。提供了qwen3.7-max、text-embedding-v4、qwen3-vl-embedding等多种模型进行选择,每个主账号每个地域每个自然月前100万tokens免费;
- DLF Catalog 和 Paimon Warehouse。阿里云数据湖构建(Data Lake Formation,简称DLF)是一款全托管的统一元数据和数据存储及管理平台,为客户提供元数据管理、权限管理和存储优化等功能。DLF与多个阿里云大数据计算引擎无缝对接,打破数据孤岛,帮助用户快速实现云原生数据湖及OpenLake解决方案的构建与管理。该平台能够实现元数据的统一、湖表格式的统一以及数据存储的统一,显著简化客户在数据湖构建和管理过程中的运维工作,助力企业聚焦于业务创新和数据洞察;
- OSS Bucket 和 MNS Queue。阿里云轻量消息队列(原 MNS)(Simple Message Queue (formerly MNS))是一种高效、可靠、安全、便捷、可弹性扩展的分布式消息服务。SMQ能够帮助应用开发者在他们应用的分布式组件上自由的传递数据、通知消息,构建松耦合系统。
OSS 与 MNS
配置 OSS 事件通知:
- 目标设置为 MNS Queue;
- 分别为
cdc-image-search/images/flowers/和cdc-image-search/queries/flowers/配置匹配前缀; - 建议只选择 ObjectCreated、ObjectCopied 等创建类事件。
为保证检索结果稳定,建议为每张图片使用唯一且不重复的 Object Key;图片更新时上传为新对象。对于删除或下架的图片,可以通过独立的状态管理机制控制其是否继续参与检索。
权限配置
运行身份至少需要:
- MNS Queue 消费和删除消息权限;
- OSS ListObjects、GetObject 权限;
- DLF Catalog 和 Paimon Warehouse 读写权限;
- 模型服务调用权限。
FETCH_CONTENT(oss://...) 使用 Flink FileSystem 读取图片。除了 Flink OSS CDC Source 的凭据,还需要在 Flink 运行参数配置 OSS 文件系统访问:
yaml
fs.oss.bucket.<bucketName>.accessKeyId: <access-key-id>
fs.oss.bucket.<bucketName>.accessKeySecret: <access-key-secret>
测试数据
为了降低复现门槛,本文选择 TensorFlow 教程提供的 Flower Photos 图片集(约 218 MB,3,670 张 JPG 图片)。下载解压后就是普通图片目录,不需要注册账号,也不需要处理 Base64、TSV 或 LMDB。
Flower Photos 包含 5 类花卉(daisy、dandelion、roses、sunflowers、tulips),共约 3,670 张图片。本文将全部图片上传到图库目录。查询图片使用数据集之外的花卉照片(自行拍摄或从网上获取),每类花卉各准备 1 张,共 5 张,单独上传到查询目录:
| 用途 | OSS 路径 | 数量 |
|---|---|---|
| 图库图片 | oss:///cdc-image-search/images/flowers/ | 约 3,670 张(全部) |
| 查询图片 | oss:///cdc-image-search/queries/flowers/ | 5 张(数据集之外,每类 1 张) |

图2: OSS 数据预览
查询图片来自数据集之外,确保与图库图片不重叠。两张表分开存储,检索时不会召回查询图片自身。
数据下载地址:
https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz
三、从配置到检索
CDC YAML 作业配置
图库表和查询图片表可以复用同一个 Flink CDC YAML 文本模板,只需替换 OSS 路径、目标表、作业名称和建表参数。
这里最值得关注的不是 YAML 本身,而是 transform 中的两步处理:
FETCH_CONTENT从 OSS url 读取图片内容;AI_IMAGE_EMBED调用多模态模型,把图片转换为可检索的向量。
也就是说,模型推理已经被纳入 Flink 数据处理链路,推理结果可以随元数据一起写入 Paimon。
yaml
source:
type: oss-cdc
endpoint: https://<account-id>.mns.cn-hangzhou-internal.aliyuncs.com
region: cn-hangzhou
queue-name: <mns-queue-name>
access-key-id: ${secret_values.oss_ak}
access-key-secret: ${secret_values.oss_sk}
scan.startup.mode: INITIAL
oss-endpoint: oss-cn-hangzhou-internal.aliyuncs.com
oss-bucket: <bucket-name>
path: <source-path>
transform:
- source-table: <bucket-name>
projection: >
`key`,
`url` AS oss_url,
region,
bucket,
fileName AS file_name,
`size` AS file_size,
modificationTime AS modification_time,
eTag AS etag,
FETCH_CONTENT(`url`) AS image,
AI_IMAGE_EMBED(
'image_embedding_model',
FETCH_CONTENT(`url`)
) AS embedding
primary-keys: ''
table-options: >
row-tracking.enabled=true,
data-evolution.enabled=true,
morax.lumina-index.enabled=true,
morax.lumina-vector-ann-index.enabled=true,
global-index.lumina-vector-ann.index-column=embedding,
global-index.lumina.index-column=embedding,
lumina.index.dimension=2560,
blob-field=image,
blob-descriptor-field=image,
blob-as-descriptor=true
route:
- source-table: <bucket-name>
sink-table: <sink-table>
sink:
type: paimon
using.built-in-catalog: <catalog-name>
pipeline:
name: <pipeline-name>
model:
name: image_embedding_model
type: openai-compatible
model: qwen3-vl-embedding
分别使用以下参数运行两个作业:
| 参数 | 图库图片作业 | 查询图片作业 |
|---|---|---|
<source-path> |
cdc-image-search/images/flowers |
cdc-image-search/queries/flowers |
<sink-table> |
image_search.image_assets |
image_search.image_queries |
<pipeline-name> |
oss-cdc-image-embedding-to-paimon |
oss-cdc-query-image-embedding-to-paimon |
使用以图搜图
在数据写入完成后,在 DLF 中可以通过数据预览页面查看到数据的 Blob 和特征向量的内容:

图3: DLF 数据预览
两个摄入作业完成后,约 3,670 张图库图片的向量写入 image_search.image_assets,5 张查询图片的向量写入 image_search.image_queries。接下来使用 Flink SQL 完成检索,无需把向量导出到独立系统。
首先创建 Print Sink:
sql
CREATE TEMPORARY TABLE print_sink (
query_key VARCHAR,
matched_key VARCHAR,
score DOUBLE
) WITH (
'connector' = 'print'
);
执行向量查询:
sql
INSERT INTO print_sink
SELECT
q.`key` AS query_key,
vs.`key` AS matched_key,
vs.score
FROM
`ffa_lake`.image_search.image_queries AS q,
LATERAL TABLE (
VECTOR_SEARCH(
SEARCH_TABLE =>
TABLE `ffa_lake`.image_search.image_assets,
COLUMN_TO_SEARCH => DESCRIPTOR(embedding),
COLUMN_TO_QUERY => q.embedding,
TOP_K => 3,
CONFIG => MAP['async', 'false']
)
) AS vs;
这段 SQL 的关键参数如下:
image_queries提供 5 个查询图片向量;q.embedding是当前查询图片的向量;SEARCH_TABLE指向包含约 3,670 张图库图片的image_assets;embedding是image_assets中创建 DLF Global Index 的向量列;TOP_K=3表示每张查询图片返回 3 张相似图片;vs.score表示查询图片与候选图片的相似度得分;async=false使用同步查询模式。
5 张数据集之外的查询图片与 约 3,670 张图库图片分别存储在两张表中,因此不会召回查询图片自身。完整查询预计输出 15 条结果(每张图片 Top-3)。查询结果通过 Print Connector 输出到作业日志,每行格式为 [query_key, matched_key, score]。以雏菊(daisy)类别的一张查询图片为例,其 Top-3 召回结果如下(召回结果均为 daisy 目录下的相似图片):

图4: Vector Search 相似性查询结果

图5: 相似性查询结果展示
3 条结果的相似度得分在 0.88~0.92 之间,说明查询图片与召回图片在视觉语义上高度相似。注意查询路径为 queries/,匹配路径为 images/,两者来自不同的表,不会召回查询图片自身。
除了图片 Key,还可以在 Print Sink 中增加 oss_url、file_name 等字段,便于直接查看或展示查询图片与匹配图片。
四、典型场景
1. 电商拍照找相似商品
用户拍摄或上传一张商品图片,系统从持续更新的商品图库中召回外观、颜色、形状和风格相近的商品。整个过程不依赖文件名或目录标签,而是基于查询图片与图库图片在同一向量空间中的相似度完成。
真实生产系统还可以结合类目、品牌、价格、库存和用户行为,对向量召回结果进行二次过滤与排序,服务于拍照找相似商品、视觉导购和相似商品推荐等场景。对于精确同款识别,可以进一步结合商品主体检测、局部特征优化检索结果。

图6: 电商拍照找相似商品场景
2. 企业素材库与专业图库检索
设计师上传一张参考图,从 OSS 素材库中查找风格、主体、颜色或构图相近的历史素材,减少人工翻目录的时间。同样适用于植物、动物、文物、工业零部件等专业图库------用户上传一张参考图片,即可快速查找外观或类别相近的历史记录,为知识查询、样本分析和业务判断提供辅助。
3. 商品重复上架治理
使用已上架商品图片搜索相似图片,发现可能重复发布或高度相似的商品。
需要注意,图片 Embedding 更偏向语义和视觉相似检索。如果目标是识别完全相同、仅发生缩放或压缩的重复文件,建议同时使用 MD5、感知哈希等技术作为补充。
五、总结
随着商品图、设计素材、工业图片和业务影像持续增长,企业需要解决的已经不只是"图片存在哪里",更重要的是如何持续发现、理解和使用这些非结构化数据。
Flink OSS CDC、Flink AI 与 DLF Paimon 的组合,为图片数据提供了一条从发现到检索的完整链路:
- 图片进入 OSS 后,可以自动完成发现、向量化和入湖;
- 图片元数据与向量统一保存在 Paimon 表中,减少多套存储之间的数据同步;
- DLF Global Index 持续维护向量索引,让新增图片逐步进入检索体系;
VECTOR_SEARCH可以直接基于 Paimon 表构建相似商品推荐、素材检索和专业图库查询等能力。
对于已经使用 OSS、实时计算 Flink 版和 DLF 的企业,这套方案能够在现有数据平台上进一步释放图片资产价值,减少单独建设图片同步、向量存储和索引链路的复杂度。
更重要的是,这套思路并不局限于图片。将模型推理嵌入实时数据链路后,还可以进一步处理文本、音频、视频等非结构化数据,让模型输出像普通字段一样进入湖仓治理、SQL 分析和下游应用。
如果你正在评估如何把大模型服务接入现有大数据平台,可以先选择一个边界清晰、结果可验证的场景,从少量数据跑通"采集---推理---入湖---索引---查询"闭环,再逐步扩展到增量生产链路。
让模型能力进入数据工程主链路,让每一份非结构化数据都能够被发现、被理解、被检索。
参考资料
- 开通实时计算 Flink 版 :https://help.aliyun.com/zh/flink/
- Flink OSS CDC :查看使用文档
- Flink 数据摄入文档 :CDC YAML 作业开发指南
- DLF 2.0 Global Index :构建 Global Index 实现查询加速和向量搜索