AI Function 为部分函数提供了对应的 raw 版本,以 STRING 类型返回模型服务的原始 JSON 响应。当您需要读取 Token 用量、请求标识、模型服务的扩展字段,或获取稀疏(sparse)向量时,可以使用 raw 函数。本文介绍 raw 函数的使用方式以及原始响应的解析方法。
前提条件
-
已开通AI中心。
-
使用esr-4.10.0及之后的引擎版本。
-
作业提交、或创建会话时添加
spark.emr.serverless.ai.function.enable trueSpark 配置。
raw 函数清单
raw 函数的入参与对应的标准函数完全相同,区别仅在于返回值:标准函数返回解析后的结果,raw 函数返回模型服务的原始 JSON 响应。各函数的参数说明请参见AI Function 介绍。
|
raw 函数 |
对应的标准函数 |
典型用途 |
|
|
|
读取 Token 用量(usage)、请求标识及模型服务的扩展字段。 |
|
|
|
获取稀疏(sparse)向量。 |
|
|
|
读取多模态向量化的原始响应及模型服务的扩展字段。 |
ai_query_raw()
函数语法
ai_query_raw(prompt [, service_name] [, options] [, data] [, data_type])
返回类型为 STRING。生成文本、usage、请求标识等字段的位置由模型服务响应格式决定。
SQL 示例
SELECT ai_query_raw(
'请将下面文本总结为一句话:AI Function 将模型能力集成到 Spark。',
'my_qwen_service',
'{"temperature":0.2}'
) AS raw_response;
PySpark 示例
from emr_serverless_spark_ai import ai_query_raw
result_df = source_df.select(
ai_query_raw(
"prompt",
service_name="my_qwen_service",
options='{"temperature":0.2}',
).alias("raw_response")
)
ai_embedding_raw()
函数语法
ai_embedding_raw(
input,
dimension=None,
service_name=None,
options=None,
)
参数 input 可以是 STRING 或 ARRAY<STRING>,返回类型固定为 STRING。文本向量 raw 结果使用统一 envelope,根节点包含 local_results 和 calls 两个字段:
{
"local_results": [ ],
"calls": [ ]
}
-
local_results:未调用模型服务、在本地完成的输入元素,例如 NULL 和空字符串。其中input_index为元素在当前 Spark 行输入中的位置(标量输入为 0),embedding为本地生成的结果(当前为空数组),reason为原因(例如 null_input、empty_input)。 -
calls:当前 Spark 行涉及的物理模型调用。其中input_indices为该调用结果对应当前行原始输入的位置,call_id为 AI Function 引擎生成的物理调用标识,response为模型服务原始 JSON 响应(保留 usage、dense、sparse 及未知扩展字段)。
call_id 与模型服务返回的 id 或 request_id 是相互独立的标识,不应假设两者相等。
处理 ARRAY<STRING> 输入
SELECT ai_embedding_raw(
array('第一段文本', NULL, '', '第四段文本'),
service_name => 'qwen3.7-text-embedding'
);
数组元素中的 NULL 和空字符串不会发送到模型服务。请使用 input_indices 将模型服务结果映射回原始数组位置,不要直接把模型服务返回的 index 或 text_index 当作当前行的数组下标。
通过 DashScope API 获取 sparse 向量
ai_embedding() 只能返回 dense 向量。获取 sparse 或 dense&sparse 结果时,必须使用 ai_embedding_raw() 并通过函数 options.api_mode 或 Spark 配置 spark.emr.serverless.ai.embedding.apiMode 指定 DashScope API:
SELECT ai_embedding_raw(
text,
dimension => 1024,
service_name => 'qwen3.7-text-embedding',
options => '{
"api_mode":"dashscope",
"text_type":"document",
"output_type":"dense&sparse"
}'
)
FROM source_table;
DashScope 响应中的 sparse 向量通常位于 calls[*].response.output.embeddings[*].sparse_embedding,每个稀疏向量元素包含 index 和 value。具体字段以模型服务实际响应为准。
api_mode 支持以下取值:auto(默认,由系统根据参数自动选择接口)、dashscope(使用 DashScope API)、openai_compatible(使用 OpenAI 兼容接口)。api_mode 的优先级为:函数 options.api_mode > Spark 配置 spark.emr.serverless.ai.embedding.apiMode > AI Function 默认配置 > auto。api_mode=auto 时,只要传入 output_type、text_type 或 instruct,就会使用 DashScope API。
ai_embedding_multimodal_raw()
函数语法
ai_embedding_multimodal_raw(
data [, service_name] [, options] [, data_type]
)
返回类型为 STRING。图片输入方式与 ai_embedding_multimodal() 相同;响应保留模型服务返回的请求标识、usage、向量及扩展字段。
示例
SELECT ai_embedding_multimodal_raw(
image_col,
service_name => 'multimodal-embedding-model',
data_type => 'binary'
) AS raw_response
FROM image_table;
解析原始响应
raw 函数的返回值为 STRING 类型的 JSON 文本,您可以使用 Spark SQL 的 JSON 函数按需取值。常用方式如下:
-
取单个字段:使用
get_json_object(),通过 JSON Path 定位目标字段。 -
按结构展开:使用
from_json(),为响应定义 STRUCT 结构后再访问各字段。
原始响应的字段以模型服务实际返回的内容为准。不同模型服务,以及同一模型服务在 OpenAI 兼容接口与 DashScope API 下返回的字段可能不同,建议先取一行结果查看实际结构,再编写解析逻辑。
示例:Spark SQL
如果只需要少量稳定字段,可以使用 get_json_object() 通过 JSON Path 直接取值:
WITH result AS (
SELECT ai_embedding_raw(
text,
service_name => 'qwen3.7-text-embedding',
options => '{"api_mode":"dashscope"}'
) AS raw_response
FROM source_table
)
SELECT
get_json_object(raw_response, '$.calls[0].call_id') AS call_id,
get_json_object(raw_response, '$.calls[0].response.request_id') AS request_id
FROM result;
示例:PySpark
import json
from emr_serverless_spark_ai import ai_embedding_raw
raw_df = source_df.select(
ai_embedding_raw(
"text",
service_name="qwen3.7-text-embedding",
options=json.dumps({"api_mode": "dashscope"}),
).alias("raw_response")
)
需要批量展开或长期保存字段时,建议为 JSON 定义显式 schema 后使用 from_json(),避免依赖字段顺序。
使用建议
-
业务计算优先使用标准函数;确实需要模型服务原始字段时再使用 raw 函数。
-
使用 raw 响应时保留完整 JSON,解析逻辑只读取所需字段,并允许出现未知扩展字段。
-
需要稳定 JSON 结构时显式设置
api_mode,避免 auto 模式因参数变化切换接口。 -
Embedding 函数的 options 兼容
dimension和dimensions两种指定维度的参数,请使用其中之一进行配置,避免同时使用。