本文介绍如何通过 PAI-FeatureStore 平台配置多模态 LLM Embedding 模型,将图片、视频等非结构化数据自动转换为特征向量写入 FeatureDB。以电商商品推荐场景为例,通过整合商品文本描述、主图和展示视频的多模态信息,构建完整的特征生产流程,无需自建 Embedding 服务即可实现端到端的多模态特征处理。
整体流程概览
本文档介绍的多模态Embedding方案流程如下:
注册大模型配置信息:将多模态Embedding模型(如tongyi-embedding-vision-plus、qwen3-vl-embedding)注册到特征平台,用于后续特征提取。
注册特征视图:定义特征结构、配置特征字段(包括输入字段和Embedding输出字段),并绑定已注册的大模型。
同步数据:通过实时同步或离线同步方式,将数据写入特征平台并自动触发Embedding提取,结果存入FeatureDB。
导出及训练:将特征数据导出为训练样本,配合TorchEasyRec进行模型训练。
上线服务:部署EAS模型服务并配置PAI-Rec引擎,完成推荐系统上线。
背景介绍
多模态Embedding 技术能够将文本、图片、视频等多种模态数据转换为统一的特征向量。在实际应用场景中,例如电商商品推荐,传统的文本匹配方式难以有效利用商品的图片和视频信息,而多模态Embedding 可以将商品的文字描述、主图视觉特征、视频内容统一映射到同一向量空间,从而实现更精准的内容理解和推荐匹配。
通过配置模型(如 tongyi-embedding-vision-plus、qwen3-vl-embedding)及参数(FPS、分辨率级别、最大帧数等),支持单模态或多模态融合输入,生成可用于检索、聚类、推荐等下游任务的向量表示。详细请参考:多模态向量
融合向量与独立向量
多模态Embedding模型在处理文本、图片、视频等多种模态输入时,可生成两种类型的向量输出:
类型 | 说明 | 适用场景 |
独立向量 | 每个模态单独生成一个向量,如 | 需单独分析特定模态的场景,如按文本相似度检索、按图片视觉特征匹配、分别评估各模态重要性。 |
融合向量 | 多个模态信息融合为一个统一向量,如 | 需综合多模态信息的场景,如商品标题+图片联合推荐、跨模态内容检索。 |
LLM调用高级功能
特征平台内置LLM Gateway服务,在调用LLM进行Embedding提取时,自动提供以下高级功能保障,无需用户手动配置:
智能缓存:对相同的输入内容自动缓存Embedding结果,避免重复调用LLM模型。当相同的文本、图片或视频URL再次请求时,系统直接返回缓存的向量,大幅降低API调用成本和响应延迟。
流量控制:内置RPS(每秒请求数)限制和并发控制,防止业务高峰导致LLM服务过载。在注册模型配置时设置的并发数参数即为最大并发限制,系统自动进行流量调度。
自动Token截断:当输入内容超过模型Token限制时,系统自动截断处理。注册模型时设置最大输入token限制(如8192),超长输入会被自动截断至限制范围内,确保请求正常处理。
自动重试机制:当LLM调用失败时,系统自动进行重试。每次重试会逐步减少输入Token数量,提高成功率。默认最大重试次数为5次,确保服务稳定性。
以上功能由特征平台自动管理,为您提供稳定、高效的LLM Embedding服务体验。
前提条件
- 说明
目前特征平台LLM多模态Embedding仅支持使用在线数据源FeatureDB。
准备数据表
本文以电商商品推荐场景为例进行说明。在实际业务中,商品往往包含多个维度的信息:文本描述(如商品标题、详情)、视觉素材(如商品主图)、视频内容(如商品展示视频)。下表展示了如何将这些多模态数据整合到一张MaxCompute表中,请将该表复制到DataWorks中执行。
其中,假设物品表的特征字段text_input文本字段、image_input单张图片字段、image_array多图数组字段、video_input视频字段,需要对以上字段进行实时处理提取Embedding,对应的MaxCompute表schema及示例数据为:
CREATE TABLE IF NOT EXISTS multimodal_source_data (
item_id STRING COMMENT '全局唯一ID,主键',
-- 1. 文本内容字段
text_input STRING COMMENT '文本输入内容,若无非文本数据则为NULL',
-- 2. 单张图片字段
image_input STRING COMMENT '单张图片URL,若无非单图数据则为NULL',
-- 3. 多图数组字段
image_array ARRAY<STRING> COMMENT '多张图片URL数组,用于批量图片Embedding处理',
-- 4. 视频字段
video_input STRING COMMENT '视频URL,若无非视频数据则为NULL'
)
PARTITIONED BY (
ds STRING COMMENT '业务日期分区',
dt STRING COMMENT '日期分区',
hh STRING COMMENT '小时分区'
)
LIFECYCLE 365;
INSERT OVERWRITE TABLE multimodal_source_data PARTITION(ds='20260511', dt='20260511', hh='00')
VALUES
(
'10001', -- item_id
'夏季新款纯棉短袖T恤', -- text_input: 文本内容
'https://img.alicdn.com/imgextra/i3/O1CN01rdstgY1uiZWt8gqSL_!!6000000006071-0-tps-1970-356.jpg', -- image_input: 单张主图URL
array(
'https://img.alicdn.com/imgextra/i2/O1CN019eO00F1HDdlU4Syj5_!!6000000000724-2-tps-2476-1158.png',
'https://img.alicdn.com/imgextra/i2/O1CN01dSYhpw1nSoamp31CD_!!6000000005089-2-tps-1765-1639.png'
), -- image_array: 多图数组URL
'https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250107/lbcemt/new+video.mp4', -- video_input: 视频URL
);
SELECT *
FROM multimodal_source_data WHERE ds = '${bdp.system.bizdate}';注册特征平台
注册大模型配置信息
为了后续特征提取时能够直接调用大模型进行 Embedding 计算,需要先将模型配置信息注册到特征平台。注册后,特征平台会自动管理模型的调用和向量生成过程。以注册tongyi-embedding-vision-plus和qwen3-vl-embedding模型为例进行说明。
模型支持说明:tongyi-embedding-vision-plus模型仅支持生成独立向量,即每个模态单独产出对应的Embedding向量。qwen3-vl-embedding模型同时支持融合向量和独立向量生成。使用qwen3-vl-embedding模型时,可以在注册模型配置时将EnableFusion设置为是,特征平台会自动为多模态输入生成融合向量。其他模型请参照:模型能力对照。
登录PAI控制台,在左侧导航栏单击数据准备
选择工作空间后,单击进入FeatureStore。
在特征生产页签,单击新建大模型调用信息,配置以下关键参数,其他未说明的参数保持默认即可。
参数
说明
名称
自定义名称。
模型参数
模型类型勾选 MULTI_MODAL_EMBEDDING,确认base url为https://dashscope.aliyuncs.com/api/v1,勾选/输入模型名称 tongyi-embedding-vision-plus后,默认向量维度1152,并发数30,最大输入token限制填入8192,BatchSize为1。
您也可以根据具体业务场景调整,其中tongyi-embedding-vision-plus模型默认产出1152维的向量。
API Key
填写已获取的百炼API Key。
EnableFusion
选择否(因为多模态模型区分独立向量和融合向量,根据您的实际情况选择是否要生成融合向量)
单击确定。
注册qwen3-vl-embedding模型(支持融合向量)的方式与上述步骤类似,主要区别如下:
参数
说明
模型参数
模型类型勾选 MULTI_MODAL_EMBEDDING,确认base url为https://dashscope.aliyuncs.com/api/v1,勾选/输入模型名称 qwen3-vl-embedding。该模型默认向量维度2560,支持生成融合向量和独立向量。
EnableFusion
选择是
qwen3-vl-embedding是同时支持融合向量和独立向量生成的。单击确定。
注册特征视图
特征视图是特征平台的核心概念,定义了特征的结构、来源和计算方式。在创建特征视图之前,需要先完成以下准备工作:创建FeatureStore项目,并创建特征实体(item)。特征实体 item 代表商品维度,后续的特征提取和向量生成都围绕该实体展开。
在特征视图页签,单击新建特征视图,配置以下关键参数,其他未说明的参数保持默认即可。
参数
说明
视图名称
自定义名称(例:item_fea_embedding_debug_v1)。
类型
选择实时。
特征实体
选择item。
特征字段
在表格添加页签,新增如下两个字段:
item_id,INT64,勾选主键。
text_input STRING
image_input STRING
video_input STRING
text_embedding_vec,ARRAY<FLOAT>,单击特征生产,配置如下参数:
变换类型:选择LLMEmbedding。
大模型调用信息:选择已注册的多模态模型名称。
特征生产输入:字段名输入text_input,多模态类型勾选TEXT。输入字段名需填写原始字段名,在离线场景中对应MaxCompute表的特征生产输入字段,在在线场景中对应Flink SQL或SDK等特征生产输入字段。
image_embedding_vec,ARRAY<FLOAT>,单击特征生产,配置类似(字段名输入image_input,多模态类型勾选IMAGE)。
video_embedding_vec,ARRAY<FLOAT>,单击特征生产,配置类似(字段名输入video_input,多模态类型勾选VIDEO)。
image_array,ARRAY<STRING>(多图数组输入字段)。
image_multi_vec,ARRAY<FLOAT>,单击特征生产,配置类似(字段名输入image_array,多模态类型勾选MULTI_IMAGES)。MULTI_IMAGES类型用于处理多张图片的数组输入,会将数组中的所有图片URL统一处理生成一个融合的Embedding向量。图片格式要求请参考:请求。
融合向量配置示例(以qwen3-vl-embedding模型为例):
mix_embedding_vec,ARRAY<FLOAT>,单击特征生产,配置如下参数:
变换类型:选择LLMEmbedding。
大模型调用信息:选择已注册的qwen3-vl-embedding模型(本示例使用该模型)。
特征生产输入:添加多个输入字段:
字段名输入text_input,多模态类型勾选TEXT。
字段名输入image_input,多模态类型勾选IMAGE。
字段名输入video_input,多模态类型勾选VIDEO。
配置完成后,特征平台会将文本、图片、视频三种模态的信息融合为一个mix_embedding_vec向量,该向量同时包含多模态的综合语义表示,适用于跨模态内容检索和多模态联合推荐场景。
单击提交。
同步数据
实时同步
实时同步适用于需要持续更新特征的场景。例如在电商场景中,新商品上架或商品信息更新时,需要及时将最新的多模态数据转换为特征向量写入在线数据源。
创建DataHub Topic。
登录DataHub控制台,新建项目。
单击已创建的项目名称,进入项目详情页面。
单击新建Topic,配置以下关键参数,其他未说明的参数保持默认即可。
参数
说明
名称
自定义名称。
Schema详情
新增如下字段:
item_id,BIGINT,取消勾选允许为null。
text_input,STRING,勾选允许为null。
image_input,STRING,勾选允许为null。
video_input,STRING,勾选允许为null。
image_array,STRING,勾选允许为null。
注意:因为datahub不支持ARRAY<STRING>类型,所以针对于图片数组字段需要额外处理下数据的格式。
测试的数据输入是以"|" join的,然后在对应的Flink SQL写入sink_featurestore表需要将image_array的字符串数据拆分为ARRAY<STRING>作为输入。
单击创建。
单击已创建的Topic,进入Topic详情页面。
在订阅列表页签,单击订阅,填写相关信息后,单击创建。
使用Flink SQL写入FeatureStore Connector。
Flink SQL主要包含三部分:创建临时表关联DataHub;创建临时表关联特征平台中对应的特征视图;该flink任务部署启动完成后,会例行从DataHub中读取实时数据写入到特征平台对应的特征视图。Flink SQL示例如下:
-- 1. 定义源表 (DataHub) -- 注意:如果 DataHub 中 image_array 是 JSON 字符串存储,这里用 STRING;如果是 Tuple 类型,可能需要自定义 Serializer CREATE TEMPORARY TABLE source_datahub ( item_id BIGINT, text_input STRING, image_input STRING, image_array STRING, -- 多图数组字段 video_input STRING ) WITH ( 'connector' = 'datahub' ,'subId' = 'xxxxxxxx' ,'endPoint' = 'http://dh-cn-xxxx.aliyuncs.com' ,'project' = 'xxxxx_test' ,'topic' = 'test_multi_emb' ,'accessId' = '${secret_values.ALIBABA_CLOUD_ACCESS_KEY_ID}' ,'accessKey' = '${secret_values.ALIBABA_CLOUD_ACCESS_KEY_SECRET}' ); -- 2. 定义目的表 (FeatureStore) -- 注意:FeatureStore Connector 通常要求字段与 FeatureView 定义严格一致 CREATE TEMPORARY TABLE sink_featurestore ( item_id BIGINT, text_input STRING, image_input STRING, image_array ARRAY<STRING>, -- 多图数组字段 video_input STRING ) WITH ( 'connector' = 'featurestore', 'region_id' = 'cn-xxx', 'project' = 'test_llm_embedding', 'feature_view' = 'test_embedding', 'username' = '${secret_values.FEATUREDB_USERNAME}', 'password' = '${secret_values.FEATUREDB_PASSWORD}', 'aliyun_access_id' = '${secret_values.ALIBABA_CLOUD_ACCESS_KEY_ID}', 'aliyun_access_key' = '${secret_values.ALIBABA_CLOUD_ACCESS_KEY_SECRET}' ); -- 3. 数据同步作业 INSERT INTO sink_featurestore SELECT item_id, text_input, image_input, SPLIT(image_array, '|') as image_array, --测试使用的Flink引擎版本为:vvr-11.6-jdk11-flink-1.20 video_input FROM source_datahub;为保障您的信息安全,部署启动该SQL作业前,需要在变量管理中创建以下名称变量并赋值:
ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET以及FEATUREDB_USERNAME、FEATUREDB_PASSWORD。
可以自定义python 脚本发送数据测试。
读取在线数据源特征,验证写入结果。
可通过FeatureStore控制台的数据查询功能或使用FeatureStore SDK读取特征数据。验证时需确认向量维度与注册模型时设置的维度一致(tongyi-embedding-vision-plus为1152维,qwen3-vl-embedding为2560维),且向量值无异常。
离线同步
离线同步适用于批量特征更新场景。例如首次上线时,需要将历史存量商品的多模态数据批量转换为特征向量;或者在每日例行更新时,将增量商品的 Embedding 同步到在线数据源。离线同步分为全部离线同步和增量离线同步两种方式。
全部离线同步:首次上线时,可以将整个离线表经过特征生产LLM Embedding提取后,同步到线上数据源FeatureDB中。复制如下代码到DataWorks中的PyODPS 3节点中执行。(实际执行时请参考:方式一:使用新版独享资源组+内置镜像(推荐)文档配置并运行)
from feature_store_py.fs_client import FeatureStoreClient
import datetime
from feature_store_py.fs_datasource import MaxComputeDataSource
import sys
from odps.accounts import StsAccount
cur_day = args['ds']
print('cur_day = ', cur_day)
access_key_id = o.account.access_id
access_key_secret = o.account.secret_access_key
sts_token = None
endpoint = 'paifeaturestore-vpc.cn-beijing.aliyuncs.com' #需替换实际的endpoint地址
if isinstance(o.account, StsAccount):
sts_token = o.account.sts_token
fs = FeatureStoreClient(access_key_id=access_key_id, access_key_secret=access_key_secret, security_token=sts_token, endpoint=endpoint)
cur_project_name = 'test_llm_embedding' #需替换实际的Featurestore项目名称
project = fs.get_project(cur_project_name)
feature_view_name = 'test_embedding' #需替换实际的Featurestore特征视图名称
batch_feature_view = project.get_feature_view(feature_view_name)
task = batch_feature_view.publish_table(partitions={'ds':cur_day}, mode='Overwrite', offline_to_online=True, publish_config={'offline_datasource_id':1, 'table_name': 'multimodal_source_data'})
print(task)
task.wait()增量离线同步:首次上线完成后,后续可以只同步增量数据,避免重复处理已上架商品的特征。增量同步的核心思路是先计算出新增的 item_id 集合,然后将这些增量商品的特征同步到线上数据源。
计算新的item_id集合。通过SQL查询识别出当日新增的商品数据(当日存在但前一日不存在):
-- 创建增量数据临时表 CREATE TABLE IF NOT EXISTS multimodal_source_data_new_tmp_v1 ( item_id BIGINT COMMENT '商品ID', text_input STRING COMMENT '文本输入内容', image_input STRING COMMENT '单张图片URL', image_array ARRAY<STRING> COMMENT '图片URL数组', video_input STRING COMMENT '视频URL' ) PARTITIONED BY ( ds STRING COMMENT '业务日期分区' ) LIFECYCLE 365; -- 从原始数据表筛选当日新增的商品 INSERT INTO TABLE multimodal_source_data_new_tmp_v1 PARTITION (ds='${bdp.system.bizdate}') SELECT t1.item_id, t1.text_input, t1.image_input, t1.image_array, t1.video_input FROM multimodal_source_data t1 WHERE t1.ds = '${bdp.system.bizdate}' AND NOT EXISTS ( SELECT 1 FROM multimodal_source_data t2 WHERE t2.ds = TO_CHAR(DATEADD(TO_DATE('${bdp.system.bizdate}','yyyymmdd'), -1, 'dd'),'yyyymmdd') AND t2.item_id = t1.item_id );将新的item_id集合经过特征生产同步到在线数据源中。
将如下代码复制到DataWorks中的PyODPS 3节点中执行。
from feature_store_py.fs_client import FeatureStoreClient import datetime from feature_store_py.fs_datasource import MaxComputeDataSource import sys from odps.accounts import StsAccount cur_day = args['dt'] #dt的值为表中实际的分区值 print('cur_day = ', cur_day) access_key_id = o.account.access_id access_key_secret = o.account.secret_access_key sts_token = None endpoint = 'paifeaturestore-vpc.cn-beijing.aliyuncs.com' if isinstance(o.account, StsAccount): sts_token = o.account.sts_token fs = FeatureStoreClient(access_key_id=access_key_id, access_key_secret=access_key_secret, security_token=sts_token, endpoint=endpoint) cur_project_name = 'test_llm_embedding' project = fs.get_project(cur_project_name) feature_view_name = 'test_embedding' batch_feature_view = project.get_feature_view(feature_view_name) task = batch_feature_view.publish_table(partitions={'ds':cur_day}, mode='Merge', offline_to_online=True, publish_config={'offline_datasource_id':1, 'table_name': 'multimodal_source_data_new_tmp_v1'}) task.wait()同步完成后,可通过FeatureStore控制台的数据查询功能或使用FeatureStore SDK读取特征数据,验证Embedding向量维度是否正确。
直接同步已提取好的Embedding
在某些场景中,您可能已经在其他系统中完成了 Embedding 的提取工作,不希望通过特征平台重复调用模型进行提取。此时可以直接将已有的 Embedding 结果同步至线上数据源。这种方式可以节省模型调用成本,同时加快特征上线速度。
使用已有提取好的 Embedding 直接同步时,表中需要包含text_embedding_vec、image_embedding_vec、video_embedding_vec字段,分别对应文本、图片、视频的向量结果。
假设已提取的 Embedding 表如下所示:
CREATE TABLE IF NOT EXISTS multimodal_source_data_embedding_debug_v1(
item_id BIGINT COMMENT 'item_id'
,text_embedding_vec ARRAY<FLOAT> COMMENT 'text_embedding_vec'
,image_embedding_vec ARRAY<FLOAT> COMMENT 'image_embedding_vec'
,image_multi_vec ARRAY<FLOAT> COMMENT 'image_multi_vec'
,video_embedding_vec ARRAY<FLOAT> COMMENT 'video_embedding_vec'
)
COMMENT 'multimodal_source_data_embedding_debug_v1'
PARTITIONED BY (
ds string COMMENT '业务日期分区'
)
LIFECYCLE 365
;
INSERT INTO TABLE multimodal_source_data_embedding_debug_v1 PARTITION (ds='20260512')
VALUES
(
10002,
cast(array(-0.0015845774, -0.018541088, -0.03797411, 0.026178276, 0.00044666405, 0.04816446, 0.010168053, 0.039713383, 0.037728827, -0.053159293) as array<float>),
cast(array(-0.00025816337, 0.02028804, 0.123045646, 0.006932845, -0.0026018752, 0.005099456, 0.046240922, -0.07517992, 0.09441404, 0.016829852) as array<float>),
cast(array( 0.03250122, -0.0063438416, -0.05065918, 0.0026760101, -0.0004506111, 0.011810303, 0.0042533875, 0.018676758, 0.030014038, 0.034454346) as array<float>),
cast(array(-0.0009875796, -0.05145009, 0.0041175424, -0.039124876, 0.00054519053, -0.009441288, 0.05197643, 0.030791102, 0.04903768, 0.015242034) as array<float>)
);
SELECT *
FROM multimodal_source_data_embedding_debug_v1 WHERE ds = '20260512';将如下代码复制到DataWorks中的PyODPS 3节点中执行。
from feature_store_py.fs_client import FeatureStoreClient
import datetime
from feature_store_py.fs_datasource import MaxComputeDataSource
import sys
from odps.accounts import StsAccount
cur_day = args['dt']
print('cur_day = ', cur_day)
access_key_id = o.account.access_id
access_key_secret = o.account.secret_access_key
sts_token = None
endpoint = 'paifeaturestore-vpc.cn-beijing.aliyuncs.com'
if isinstance(o.account, StsAccount):
sts_token = o.account.sts_token
fs = FeatureStoreClient(access_key_id=access_key_id, access_key_secret=access_key_secret, security_token=sts_token, endpoint=endpoint)
cur_project_name = 'test_llm_embedding'
project = fs.get_project(cur_project_name)
feature_view_name = 'test_embedding_debug_v1'
batch_feature_view = project.get_feature_view(feature_view_name)
task = batch_feature_view.publish_table(partitions={'ds':cur_day}, mode='Merge', offline_to_online=True, publish_config={'offline_datasource_id':1, 'table_name': 'multimodal_source_data_embedding_debug_v1'})
task.wait()导出及训练
完成多模态Embedding特征的生产和同步后,可将特征数据导出为训练样本,配合TorchEasyRec进行推荐模型训练。
新建模型特征
在特征平台中创建模型特征,将已生成的Embedding向量字段与模型训练所需的标签字段关联。具体操作,请参见配置FeatureStore项目。
导出样本
通过导出Training Set功能,将特征数据和标签数据整合为可用于模型训练的样本集。具体操作,请参见导出Training Set并训练模型。
配置Feature Generator及训练
利用TorchEasyRec的create_fg_json脚本,根据TorchEasyRec Config产出fg.json配置文件。Embedding型特征在TorchEasyRec Config中需配置为raw_feature,并指定正确的向量维度。具体操作,请参见TorchEasyRec文档和Embedding型特征配置。
上线服务
模型训练完成后,需将模型部署为在线服务,并配置PAI-Rec引擎实现特征的在线读取和推荐推理。
部署EAS模型服务
通过PAI-EAS将训练好的推荐模型部署为在线推理服务。具体操作,请参见创建与部署EAS模型服务。
配置PAI-Rec引擎
PAI-Rec引擎负责在线特征的实时读取和推荐结果的生成。配置时需确保FeatureDB连接正确,能够实时读取已同步的Embedding向量。具体操作,请参见配置PAI-Rec。