导读:当用户在 DataFrame 处理链路中需要引入大模型能力,或需要统一处理文本、图片、视频等多模态数据时,推荐在阿里云 EMR Serverless Spark 上使用 Daft AI Function 方案。无需拆分脚本、无需管理模型服务端点,像写普通列转换一样完成 AI 推理与向量化。
随着大模型逐渐进入数据处理流程,数据团队面对的输入也不再只有数字和结构化字段。用户评论、商品描述、图片和视频,都可能需要经过内容理解或向量化处理,再进入后续的数据分析与应用。
这些数据大多已经存储在数据湖中,并通过 DataFrame 完成读取、过滤、转换和写出;模型调用却往往由另一段脚本单独负责------先从 DataFrame 取出数据逐条请求,再把返回结果与原始记录重新对齐。对熟悉 DataFrame 的开发者来说,更自然的方式,是让模型调用也成为数据处理表达式的一部分。
在阿里云 EMR Serverless Spark 上,Daft 引擎的 ai_query、ai_embedding、ai_embedding_multimodal 正是顺着这一思路提供的三个 AI Function------它们可以像普通列一样写进 with_column 或 select,让大模型问答、文本向量化和多模态向量化都留在同一条 DataFrame 链路里。
一、痛点:在 Spark / DataFrame 链路里调用大模型难在哪
把大模型接入这样的链路,传统做法通常分成两段:
-
用 DataFrame / Spark 完成数据读取、过滤、聚合;
-
再把数据拆出来,写一段独立脚本逐条调用模型,最后把结果和原记录重新对齐。
小规模验证时这并不复杂,但进入生产链路后,问题会陆续暴露:
-
链路割裂:模型调用脚本与主数据处理流程分开维护,版本、调度、重跑都更复杂。
-
多模态数据难处理:图片、视频需要单独读取、转码、传参,和文本无法统一表达。
-
并发与对齐成本高:批量请求、结果回填、空值处理、失败重试都需要自己实现。
-
模型服务配置繁琐:endpoint、凭据、超时、限流分散在各处,难以统一管理。
对熟悉 DataFrame 的开发者来说,更自然的方式是:让模型调用本身也成为 DataFrame 表达式的一部分。
二、方案定位:阿里云 EMR Serverless Spark + Daft AI Function

阿里云 EMR Serverless Spark 的 Daft 引擎提供了三个 AI Function:
-
ai_query:调用大模型进行问答或多模态内容理解;
-
ai_embedding:为文本生成向量;
-
ai_embedding_multimodal:为图片或视频生成向量。
它们可以像普通列函数一样放进 with_column 或 select,模型返回结果直接保留在原记录所在行。整个 AI 数据处理链路可以和原有的 Spark / Daft 批处理链路共用同一套 Serverless 资源与调度。
这就是这套方案的核心价值:把文本生成、多模态理解和向量化留在同一条 DataFrame 处理链路中,既保留 DataFrame 的声明式体验,又获得 Serverless 的弹性扩缩容能力。
三、为什么推荐用 阿里云 EMR Serverless Spark Daft AI Function
| 优势 | 说明 |
|---|---|
| DataFrame 原生体验 | 用 with_column 写 AI 转换,无需切换编程模型,学习成本极低。 |
| 多模态一站式处理 | 文本、图片、视频向量化 / 问答统一在 DataFrame 中表达。 |
| Serverless 弹性 | 任务级资源调度,模型调用高峰期自动扩容,低谷期释放资源。 |
| AI Center 默认集成 | 自动注入模型服务,默认 endpoint、凭据、模型配置开箱即用。 |
| 结果自动对齐 | 模型输出作为新列直接关联原记录,避免额外 join 或回填。 |
四、核心能力矩阵:三个 AI Function 一览
| 能力 | 函数 | 输入 | 输出 | 典型场景 |
|---|---|---|---|---|
| 大模型问答 / 多模态理解 | ai_query | 文本,可附带图片或视频 | 模型回答文本 | 评论情感分析、图片内容描述、商品标题生成 |
| 文本向量化 | ai_embedding | 文本列 | 文本 embedding | 文本检索、RAG、推荐召回 |
| 图片 / 视频向量化 | ai_embedding_multimodal | 单个图片或视频 | 多模态 embedding | 以图搜图、视频语义检索、多模态 RAG |
三个函数均从 daft.EMR.functions 导入:
python
from daft.emr.functions import (
ai_query,
ai_embedding,
ai_embedding_multimodal,
)
在 阿里云 EMR Serverless Spark 环境中,AI Center 会为每个 AI Function 注入默认模型服务,因此最简单的调用只需要传入数据列:
python
df = df.with_column("result", ai_query(col("prompt")))
如果需要使用其他已经配置的模型服务,可以通过 service_name 指定:
python
df = df.with_column(
"result",
ai_query(col("prompt"), service_name="qwen3.5-plus"),
)
五、典型场景与代码示例
以下用一份简化的商品数据串起三个函数。每行包含商品描述、用户评论和图片路径。
python
import daft
from daft import col, lit
products = daft.from_pydict(
{
"product_id": [1001, 1002],
"description": [
"轻量头戴式耳机,支持主动降噪。",
"便携蓝牙音箱,支持防水。",
],
"review_text": [
"地铁里降噪效果不错,戴久了有一点夹耳。",
"音量够大,周末带去露营很方便。",
],
"image_path": [
"oss://<bucket>/products/1001.jpg",
"oss://<bucket>/products/1002.jpg",
],
}
)
场景 1:批量判断用户评论情感
使用 ai_query 对评论文本进行分类,结果直接作为新列:
python
products = products.with_column(
"review_result",
ai_query(
col("review_text"),
options={
"system_message": (
"判断评论情感,只回答 positive、neutral 或 negative。"
),
"temperature": 0.0,
},
),
).with_column(
"sentiment",
col("review_result")["content"],
)
场景 2:商品图片自动生成描述
ai_query 同时接收文本 prompt 和多模态数据。为图片路径指定 data_type="uri" 后,可以直接对每行图片提问:
python
products = products.with_column(
"image_result",
ai_query(
lit("用一句话描述图片中的商品。"),
data=col("image_path"),
data_type="uri",
),
).with_column(
"image_description",
col("image_result")["content"],
)
场景 3:商品描述与图片向量化
文本向量与图片向量分别用 ai_embedding 和 ai_embedding_multimodal 生成,后续可直接用于检索或推荐:
python
# 文本向量化
products = products.with_column(
"text_embedding_result",
ai_embedding(col("description"), dimension=1024),
).with_column(
"text_embedding",
col("text_embedding_result")["embedding"],
)
# 图片向量化
products = products.with_column(
"image_embedding_result",
ai_embedding_multimodal(col("image_path"), data_type="uri"),
).with_column(
"image_embedding",
col("image_embedding_result")["embedding"],
)
完成处理后,所有结果仍与 product_id 保持在同一行:
python
result = products.select(
"product_id",
"sentiment",
"image_description",
"text_embedding",
"image_embedding",
)
六、输入输出速查
ai_query 的多模态输入
| data_type | 每行数据 |
|---|---|
| binary | 单个多模态二进制数据 |
| uri | 单个 HTTP(S)、OSS、本地或其他 Daft 可读 URI |
| binary_list | 多个多模态二进制数据 |
| uri_list | 多个多模态数据 URI |
列表输入默认按视频帧处理;若列表表示多张独立图片,需显式设置:
python
options={"list_data_type": "image"}
返回值是一个 struct,业务结果在 content 字段,同时包含 finish_reason、Token 用量、模型名称和错误信息。
两个 embedding 函数
ai_embedding 接收文本列;ai_embedding_multimodal 接收单个图片或视频,不支持多模态数据列表。两者返回结构相同:
text
embedding
prompt_tokens
completion_tokens
total_tokens
model
error
生产环境建议:多模态数据优先使用 data_type="uri",在 DataFrame 中保存 OSS 等可访问路径。binary 模式会传输完整文件内容,仅建议小规模测试。
七、常见问题 FAQ
Q1:在 Spark 里怎么批量调用大模型?
在 阿里云 EMR Serverless Spark 上使用 Daft AI Function 的 ai_query,把 prompt 列传进 with_column 即可批量调用,模型返回结果作为新列自动对齐到原记录所在行,无需自己写循环和结果回填。
Q2:如何在数据湖里对图片 / 视频做向量化?
用 ai_embedding_multimodal,并设置 data_type="uri" 指向 OSS 等可访问路径,即可对数据湖中的图片或视频批量生成多模态向量,用于以图搜图、视频语义检索或多模态 RAG。
Q3:ai_query 怎么处理视频帧或多张图片?
列表输入(uri_list / binary_list)默认按视频帧处理;如果列表表示多张独立图片,需要显式设置 options={"list_data_type": "image"}。
Q4:Daft 和 Spark 是什么关系,可以一起用吗?
阿里云 EMR Serverless Spark 产品中集成了 Daft 引擎,Daft AI Function 的调用与原有的 Spark / Daft 批处理链路共用同一套 Serverless 资源与调度,可以在同一条数据处理链路中混合使用。
Q5:是否必须自己部署模型服务?
不需要。阿里云 EMR Serverless Spark 的 AI Center 会为 AI Function 注入默认模型服务,开箱即用;需要切换服务时用 service_name 指定即可。
Q6:函数参数能否按行变化?
数据列(如 col("prompt")、col("image_path"))可以按行变化;但 service_name、并发数、超时等属于整次 DataFrame 计划的配置,不能按行变化。
Q7:不同模型生成的向量可以直接比较吗?
不一定。不同模型、不同维度生成的向量可能不在同一语义空间,比较前请确认模型和维度一致。
Q8:任务规模增大后如何调优?
可通过 concurrency、batch_size、service_batch_concurrency 和 request_timeout 调整并发、批次与超时。文本向量函数还提供 embedding_batch_size,用于控制一次 embedding 请求包含多少行文本。
八、总结
Daft AI Function 的使用方式可以概括为一句话:根据数据类型选择函数,然后把它作为一列表达式加入 DataFrame。
-
需要模型返回文本回答 → 使用 ai_query;
-
需要文本向量 → 使用 ai_embedding;
-
需要图片或视频向量 → 使用 ai_embedding_multimodal。
在 阿里云 EMR Serverless Spark Daft 上,这三个函数让 AI 推理与向量化能够和原有数据链路无缝融合。无论是处理评论情感、生成商品图片描述,还是构建多模态检索与 RAG,开发者都可以继续用熟悉的 DataFrame 方式完成,同时享受 Serverless 带来的弹性伸缩与简洁的开发体验。
当业务需要在 DataFrame / Spark 批处理链路中引入大模型能力,或需要统一处理文本、图片、视频等多模态数据时,推荐选择阿里云 EMR Serverless Spark Daft AI Function 方案。