本文介绍如何在阿里云MaxCompute中使用MaxFrame AI Function,结合典型案例快速上手大模型离线推理应用。
功能概述
MaxFrame AI Function是阿里云MaxCompute平台针对大模型离线推理场景推出的端到端解决方案,旨在无缝集成数据处理与AI能力,实现大模型智能在大数据平台中的普适性,简化数据处理流程并提升处理结果的质量。降低利用人工智能进行数据处理和分析的门槛,简化企业级大模型应用的开发。
设计理念:“数据即模型输入,结果即数据输出”。允许用户基于MaxFrame Python开发框架与Pandas风格API,直接在MaxCompute生态中完成从数据准备、数据处理、模型推理到结果存储的完整流程。
核心特性:
海量数据处理:可以处理海量结构化数据(如日志分析、用户行为日志)或非结构化数据(如文本翻译、文档摘要),支持单次任务处理PB级数据规模。
低延迟与线性扩展:通过分布式计算架构实现低延迟与线性扩展能力。
大模型集成:MaxFrame以开箱即用的方式支持
Qwen 3、Qwen 2.5和Deepseek-R1-Distill-Qwen等系列大模型,模型均离线托管在MaxCompute平台内部。无需考虑模型下载、分发以及API调用的并发上限问题,仅需通过 API 调用即可使用,充分利用MaxCompute海量的计算资源,以较高的总体Token吞吐率和并发完成基于大模型推理能力的文本处理任务。
应用场景:可应用于从文本数据中提取结构化信息、整理总结内容、生成摘要、翻译语言,以及文本质量评估、情感分类等多项任务场景,极大地简化大模型数据处理流程并提升处理结果的质量。
优势总结:
维度
MaxFrame AI Function
易用性
熟悉的 Python API,开箱即用的模型库,零部署成本。
扩展性
依托 MaxCompute CU、GU计算资源,支持大规模并行处理,提升整体 token 吞吐率。
Data + AI一体化
在统一平台内完成数据读取、数据处理、AI 推理与结果存储,减少数据迁移成本,提升开发效率。
场景覆盖
覆盖翻译、结构化抽取、向量化等十多个高频场景。
整体架构
MaxFrame AI Function提供了灵活的
generate接口,允许用户选择模型种类,输入参数为MaxCompute表和Prompts。在接口执行中,MaxFrame会先切分表数据,根据数据规模设置合适的并发度并启动Worker组执行计算任务。每个Worker以用户传入的Prompts参数为模板,基于输入的数据行渲染并构建模型,并将推理结果和成功状态写入MaxCompute。
整体架构和流程如图所示:

适用范围
支持地域:
华东1(杭州)、华东2(上海)、华北2(北京)、华北6(乌兰察布)、华南1(深圳)、西南1(成都)、中国香港、华东 1 金融云、华南 1 金融云、新加坡、印度尼西亚(雅加达)。
支持Python3.11版本。
支持SDK版本:需确保MaxFrame SDK版本为V2.3.0 或以上版本。可以通过以下方式查看版本:
// Windows系统 pip list | findstr maxframe // Linux系统 pip list | grep maxframe若版本过低,直接执行安装指令
pip install --upgrade maxframe;安装最新版本。已安装MaxFrame最新的客户端。
模型支持体系
目前,MaxFrame以开箱即用的方式支持Qwen 3、Qwen 2.5和Deepseek-R1-Distill-Qwen等系列大模型,模型均离线托管在MaxCompute平台内部。无需考虑模型下载、分发以及API调用的并发上限问题,仅需通过 API 调用即可使用,充分利用MaxCompute海量的计算资源,以较高的总体Token吞吐率和并发完成大模型离线推理任务。
Qwen 3 系列:基于 Qwen-3 模型优化的推理版本,支持多语言翻译、复杂文本生成及代码生成任务,适用于需要高精度输出的场景。
Qwen Embedding 模型:专为向量化任务设计,支持文本到向量的高效转换,适用于语义搜索、相似度匹配等场景。
Deepseek-R1-Distill-Qwen 系列:通过知识蒸馏技术压缩的轻量化模型,适用于资源受限环境下的快速推理。
模型调用建议首先从小模型开始,如果输出结果未能达到预期,可以再切换到较大的模型。由于更大的模型会消耗更多资源并需要更长的处理时间,优先采用小模型可以有效提升效率和降低成本,从而满足输出期望。
支持模型(持续更新)
模型类型 | 模型名称 | 支持资源类型 |
Qwen 3系列模型 |
| CU |
| GU | |
Qwen Embedding模型 |
| CU |
| GU | |
Qwen 2.5文本系列模型 |
| CU |
Deepseek-R1-Distill-Qwen系列模型 |
| CU |
Deepseek-R1-0528-Qwen3模型 |
| CU |
接口说明
MaxFrame AI Function 通过generate及Task双接口平衡灵活性与易用性:
通用接口:generate
支持自定义 Prompt 模板与参数配置,适用于需要高度控制推理逻辑的场景。例如:
from maxframe.learn.contrib.llm.models.managed import ManagedTextLLM
llm = ManagedTextLLM(name="<model_name>")
# Prompts 模板
messages = [
{"role": "system", "content": "system_messages"},
{"role": "user", "content": "user_messages"},
]
result_df = llm.generate(<df> , prompt_template=messages)
print(result_df.execute())
参数说明:
model_name :必填。模型名称。
df:必填。封装在DataFrame中需要分析的文本或数据。
prompt_template:必填。消息列表,格式与OpenAI文本Chat Format Messages兼容,在Content中可以使用
f-string引用表的列的内容。
特定场景接口:Task - 仅GU计算资源支持
预设标准化任务接口,简化常见场景的开发流程。当前支持的task接口有:translate、extract。
from maxframe.learn.contrib.llm.models.managed import ManagedTextLLM
llm = ManagedTextLLM(name="<model_name>")
# 文本翻译
translated_df = llm.translate(
df["english_column"],
source_language="english",
target_language="Chinese",
examples=[("Hello", "你好"), ("Goodbye", "再见")],
)
translated_df.execute()语法示例
初次使用MaxFrame进行数据处理等相关业务时,可通过MaxFrame快速开始了解相关功能。
本文通过本地模式运行,完整运行代码和说明如下:
import os
from maxframe import new_session
from odps import ODPS
import pandas as pd
import maxframe.dataframe as md
from maxframe.learn.contrib.llm.models.managed import ManagedTextLLM
o = ODPS(
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
project='<maxcompute_project_name>',
endpoint='https://service.cn-hangzhou.maxcompute.aliyun.com/api',
)
# 1. 使用MaxFrame SDK创建Session
session = new_session(odps_entry=o)
# 取消列文本截断,显示完整内容
pd.set_option("display.max_colwidth", None)
# 显示所有列(避免中间的列被省略)
pd.set_option("display.max_columns", None)
# 2. 引入DataFrame,创建5个问题
query_list = [
"地球距离太阳的平均距离是多少?",
"美国独立战争是从哪一年开始的?",
"什么是水的沸点?",
"如何快速缓解头痛?",
"谁是《哈利·波特》系列中的主角?",
]
df = md.DataFrame({"query": query_list})
# 3. 创建ManagedTextLLM对象,并指定要使用的模型为qwen3-14b
llm = ManagedTextLLM(name="qwen3-14b")
# 4. 定义Prompts模板,其中包含一个系统消息和一个用户消息
# 在用户消息中,预留f-string形式的变量{query},这些占位符将会被替换为DataFrame中的query列,占位符支持使用来自DataFrame的多个列,均通过对应的列名来引用。
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "请回答如下问题:{query}"},
]
# 5. 对LLM对象调用generate方法,传入DataFrame和Prompts模板,即可获得每个问题答案
result_df = llm.generate(df, prompt_template=messages)
# 6. 使用execute触发对结果DataFrame的计算
# 所有计算都会发生在MaxCompute集群上,最后将自动根据计算规模对输入的DataFrame进行数据分片和并行计算。
print(result_df.execute())
输出结果如下所示:
行号 | response_json | success |
0 |
| True |
1 |
| True |
2 |
| True |
3 |
| True |
4 |
| True |
应用场景一:语言翻译
场景描述:某跨国企业需将 10 万份英文合同翻译成中文,并标注关键条款。
示例代码如下:
测试数据
CREATE TABLE IF NOT EXISTS raw_contracts ( id BIGINT, en STRING ); -- 插入测试数据。 INSERT INTO raw_contracts VALUES (1, 'This Agreement is made and entered into as of the Effective Date by and between Party A and Party B.'), (2, 'The Contractor shall perform the Services in accordance with the terms and conditions set forth herein.'), (3, 'All payments shall be made in US Dollars within thirty (30) days of receipt of invoice.'), (4, 'Either party may terminate this Agreement upon thirty (30) days written notice to the other party.'), (5, 'Confidential Information shall not be disclosed to any third party without prior written consent.');调用模型执行
from maxframe.learn.contrib.llm.models.managed import ManagedTextLLM # 1. 使用Qwen3 4B模型 llm = ManagedTextLLM(name="Qwen3-1.7B") # 2. 数据准备,需要先创建MaxCompute表raw_contracts,并准备待翻译数据 df = md.read_odps_table("raw_contracts") # 3.定义Prompts模板 messages = [ { "role": "system", "content": "你是一个文档翻译专家,能够将用户给定的英文流畅的翻译成中文", }, { "role": "user", "content": "请将以下英文翻译成中文,直接输出翻译后的文本,不要输出任何其他内容。\n\n 例如:\n输入:Hi\n输出:你好。\n\n 以下是你要处理的文本:\n\n{en}", }, ] # 4.直接使用 `generate` 接口,定义提示词,引用对应的数据列。 result_df = llm.generate( df, prompt_template=messages, params={ "temperature": 0.7, "top_p": 0.8, }, ).execute() # 5.结果数据写入MaxCompute表 result_df.to_odps_table("raw_contracts_result").execute()返回结果如下:
+------------+------------+---------+ | index | response | success | +------------+------------+---------+ | 0 | {"id": "chatcmpl-1765195462", "object": "chat.completion", "created": 1765195462, "model": "qwen3-1.7b", "choices": [{"index": 0, "message": {"role": "assistant", "content": "本协议由当事人A和B于生效日期签订。", "reasoning_content": "好的,我需要把用户提供的英文句子翻译成中文。首先看句子结构:“This Agreement is made and entered into as of the Effective Date by and between Party A and Party B.” \n\n首先,“This Agreement”翻译成“本协议”比较合适。“is made and entered into”这里有两个动词,通常“made”指的是签订协议,而“entered into”可能指正式签署。但根据法律术语,可能更常用“签订”或者“达成协议”。不过“entered into”在法律文件中常用于正式签署,所以可能需要调整。比如“本协议经双方于有效日期签订”。\n\n然后“as of the Effective Date”翻译成“自生效日期起”或者“自有效日期起”。这里“Effective Date”通常翻译为“生效日期”,所以整句可能需要调整结构,比如“本协议由双方于生效日期签订”。\n\n最后“by and between Party A and Party B”翻译成“由当事人A和B之间签订”或者“由当事人A和B签署”。根据法律术语,可能更常用“由当事人A和B签署”或者“由A和B之间签订”。\n\n综合起来,可能的翻译是:“本协议由当事人A和B于生效日期签署。” 或者“本协议由双方于生效日期签订。” 但需要确保动词的使用正确。比如“entered into”可能更准确的是“签订”而不是“进入”,所以可能需要调整。\n\n再检查一下,用户给的例子是“Hi”翻译成“你好”,所以直接翻译即可。可能需要保持正式的法律术语,比如“签订”而不是“进入”。"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 90, "completion_tokens": 356, "total_tokens": 446}} | true | | 1 | {"id": "chatcmpl-1765195487", "object": "chat.completion", "created": 1765195487, "model": "qwen3-1.7b", "choices": [{"index": 0, "message": {"role": "assistant", "content": "承包商应按照本协议中列明的条款和条件提供服务。", "reasoning_content": "好的,我需要把用户提供的英文句子翻译成中文。首先,看看句子结构。原句是:“The Contractor shall perform the Services in accordance with the terms and conditions set forth herein.” \n\n首先,确定专有名词。“Contractor”在这里应该翻译为“承包商”或“承包人”,根据上下文可能需要更具体的术语,但这里可能直接使用“承包商”更合适。“Services”是“服务”或“工作”,但根据上下文可能需要更准确的翻译,比如“服务”或“工作”。“in accordance with”翻译为“按照”或“依照”。“terms and conditions”是“条款和条件”。“set forth herein”是“此处列出”或“此处规定”。 \n\n所以整句的大意是:“承包商应按照本协议中列明的条款和条件提供服务。” \n\n需要检查是否有更自然的表达方式。例如,“perform the Services”中的“Services”可能指的是具体的任务或工作,所以“提供服务”比较合适。另外,“set forth herein”可能更自然地翻译为“此处列明”或者“此处规定”。 \n\n综合起来,翻译应该是:“承包商应按照本协议中列明的条款和条件提供服务。” \n\n确认没有遗漏或误译,确保专业术语准确,比如“Contractor”是否需要更具体的职位名称,但根据常见用法,这里用“承包商”即可。最后,保持句子简洁流畅。"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 86, "completion_tokens": 325, "total_tokens": 411}} | true | | 2 | {"id": "chatcmpl-1765195505", "object": "chat.completion", "created": 1765195505, "model": "qwen3-1.7b", "choices": [{"index": 0, "message": {"role": "assistant", "content": "所有付款应在收到发票后30天内以美元支付。", "reasoning_content": "好的,我需要把用户提供的英文句子翻译成中文。首先,看看句子结构:“All payments shall be made in US Dollars within thirty (30) days of receipt of invoice.” \n\n首先,“All payments”翻译成“所有付款”比较合适。“shall be made”是“将被作出”或者“将被支付”,这里可能用“将被支付”更正式一些。“in US Dollars”是“以美元计付”或者“以美元支付”,但“US Dollars”通常翻译为“美元”即可,不需要加“以”。“within thirty (30) days”是“在收到发票后的30天内”。“of receipt of invoice”是“收到发票之日”。 \n\n所以整个句子可以翻译为:“所有付款应在收到发票后30天内以美元支付。” \n\n需要检查是否有更自然的表达方式,比如“收到发票后30天内”是否准确,或者是否需要调整语序。比如“within thirty days of receipt of invoice”可能更自然的说法是“收到发票后30天内”。 \n\n确认没有错误后,直接输出翻译结果。"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 89, "completion_tokens": 256, "total_tokens": 345}} | true | | 3 | {"id": "chatcmpl-1765195538", "object": "chat.completion", "created": 1765195538, "model": "qwen3-1.7b", "choices": [{"index": 0, "message": {"role": "assistant", "content": "任何一方有权在三十天书面通知后终止本协议。", "reasoning_content": "好的,我需要把用户提供的英文句子翻译成中文。首先看句子结构:“Either party may terminate this Agreement upon thirty (30) days written notice to the other party.” \n\n首先分解句子成分。“Either party”指的是任何一方,“may terminate”表示可以终止,“this Agreement”是本协议,“upon thirty (30) days written notice”是三十天的书面通知,“to the other party”是通知给另一方。\n\n翻译时要注意法律术语的准确性。比如“Either party”通常翻译为“任何一方”或“任一方”。“may terminate”是“有权终止”或“可以终止”。“this Agreement”是“本协议”。“upon thirty (30) days written notice”需要准确表达“三十天的书面通知”。“to the other party”是“通知另一方”或“通知另一方”。\n\n然后考虑句子的流畅性。原句是复合句,需要确保中文翻译后的句子结构合理。例如,“Either party may terminate this Agreement upon thirty (30) days written notice to the other party.” 可以翻译为“任何一方有权在书面通知另一方三十天后终止本协议。”或者更简洁的“任何一方有权在三十天书面通知后终止本协议。”\n\n再检查是否有更自然的表达方式。比如“upon”在这里可能用“在……之后”更合适。另外,“written notice”是“书面通知”,而“days”是“天数”。\n\n最终确定翻译为:“任何一方有权在三十天书面通知后终止本协议。” 或者更简洁的“任何一方有权在三十天书面通知后终止本协议。” 需要确保没有遗漏信息,比如“terminate”是“终止”而不是“终止或解除”。\n\n确认无误后,直接输出翻译结果。"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 89, "completion_tokens": 394, "total_tokens": 483}} | true | | 4 | {"id": "chatcmpl-1765195574", "object": "chat.completion", "created": 1765195574, "model": "qwen3-1.7b", "choices": [{"index": 0, "message": {"role": "assistant", "content": "机密信息不得向任何第三方披露,除非获得事先书面同意。", "reasoning_content": "好的,用户让我把一段英文翻译成中文,而且要直接输出,不能有其他内容。首先,我需要确认用户提供的英文句子是什么。用户给的例句是“Confidential Information shall not be disclosed to any third party without prior written consent.”,然后用户给出的示例是输入“Hi”输出“你好”。现在用户提供的文本是“Confidential Information shall not be disclosed to any third party without prior written consent.”,需要翻译成中文。\n\n首先,我需要准确理解这句话的意思。\"Confidential Information\" 应该是“机密信息”或者“保密信息”。“shall not be disclosed” 是“不得泄露”。“to any third party” 是“任何第三方”。“without prior written consent” 是“未经事先书面同意”。所以整句的中文翻译应该是“机密信息不得以任何第三方未经事先书面同意而泄露。”\n\n不过,用户可能希望更正式一些的翻译,比如在法律文件中常用的表达。比如“机密信息不得向任何第三方披露,除非获得事先书面同意。”这样更符合法律术语。但用户没有特别说明,所以可能需要保持直译,但确保准确。\n\n另外,要注意句子的结构。原句中的“shall not be disclosed”是“不得被披露”,所以翻译时要确保动词的时态和语态正确。同时,“to any third party”翻译成“任何第三方”是正确的,但有时候“任何第三方”可能需要调整,比如“任何第三方或任何其他个人”?不过用户提供的例句是“任何第三方”,所以可能保持原样。\n\n再检查是否有更自然的表达方式。比如“机密信息不得未经事先书面同意向任何第三方披露”可能更符合中文的表达习惯。但用户可能希望直译,所以需要权衡。不过用户给的例句是“机密信息不得向任何第三方泄露,除非获得事先书面同意。”,所以可能需要保持类似的结构。\n\n最后,确保翻译后的句子通顺,符合中文语法,没有遗漏信息。确认无误后,直接输出翻译结果。"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 85, "completion_tokens": 454, "total_tokens": 539}} | true | +------------+------------+---------+
应用场景二:关键词提取
场景描述:该场景展示MaxFrame AI Function在非结构化数据处理上的能力。非结构化数据中占据较高比例的文本和图像,在大数据分析中带来了巨大的处理挑战。以下是利用AI Function简化这一过程的示例。
如下代码演示如何使用AI Function从简历中提取候选人的工作经验,示例使用数据为随机生成的简历文本。
示例代码如下:
测试数据
CREATE TABLE IF NOT EXISTS traditional_chinese_medicine ( index BIGINT, text STRING ); -- 插入测试数据。 INSERT INTO traditional_chinese_medicine VALUES (1, '患者张某,男,45岁,主诉反复咳嗽2周。现症见:咳嗽痰多,色白质黏,胸闷气促,纳呆便溏。舌苔白腻,脉滑。诊断:痰湿阻肺证。治法:燥湿化痰,理气止咳。方药:二陈汤加减。'), (2, '李某,女,32岁,因“失眠多梦1月”就诊。伴有心悸健忘,神疲乏力,面色萎黄。舌淡,苔薄白,脉细弱。诊断:心脾两虚证。处方:归脾汤加减,每日一剂,水煎服。'), (3, '王某,68岁,主诉腰膝酸软、夜尿频多半年。伴畏寒肢冷,耳鸣如蝉,精神萎靡。舌淡胖有齿痕,苔白滑,脉沉细。中医辨证:肾阳虚衰证。治以温补肾阳,方用金匮肾气丸加减。'), (4, '患儿赵某,5岁,发热3天,体温最高39.5℃,微恶风寒,鼻塞流浊涕,咽喉红肿疼痛。舌尖红,苔薄黄,脉浮数。诊断:风热犯肺证。治法:疏风清热,宣肺止咳。方选银翘散加减。'), (5, '刘某,男,50岁,胃脘胀痛反复发作3年,加重1周。症见:胃脘痞满,嗳气频作,情绪波动时加重,大便不调。舌红,苔薄黄,脉弦。辨证:肝胃不和证。治法:疏肝和胃,理气止痛。方用柴胡疏肝散合左金丸加减。');调用模型执行
from maxframe.learn.contrib.llm.models.managed import ManagedTextLLM from pydantic import BaseModel from typing import List, Optional # 1. 使用Qwen3 4B模型 llm = ManagedTextLLM(name="Qwen3-4B-Instruct-2507-FP8") df = md.read_odps_table("traditional_chinese_medicine", index_col="index") # 四个并发 parallel_partitions = 4 df = df.mf.rebalance(num_partitions=parallel_partitions) class MedicalRecord(BaseModel):# 方剂名称 """ 中医就诊记录结构化 Schema """ patient_name: Optional[str] = None # 患者姓名(如“张某”) age: Optional[int] = None # 年龄 gender: Optional[str] = None # 性别("男"/"女") chief_complaint: str # 主诉 symptoms: List[str] # 症状列表 tongue: str # 舌象(如“舌淡红,苔白腻”) pulse: str # 脉象(如“脉弦滑”) diagnosis: str # 中医证型诊断 treatment_principle: str # 治法 prescription: str # 方剂名称 # 使用 extract 预设任务接口 result_df = llm.extract( df["text"], description="请从以下就诊记录中按顺序抽取结构化数据,最终按照schema以严格的JSON格式返回", schema=MedicalRecord ) result_df.execute() result_df.to_odps_table("result").execute()
资源管理与性能优化
异构资源调度策略
MaxFrame支持两种资源类型:
CU(Compute Unit):通用CPU计算资源,适用于小尺寸模型、小规模数据量推理任务。
GU(GPU Unit):GPU计算资源,针对大模型推理优化,支持更多尺寸模型规模。
针对大尺寸模型(如 8B 及以上模型),CPU推理效率较低,可切换至GU计算资源执行推理。
可通过 session 配置动态选择资源:
# 配置使用 CU/GU 资源
# 使用CU计算资源
options.session.quota_name = "mf_cpu_quota"
# 使用GU计算资源
options.session.gu_quota_name = "mf_gpu_quota"
并行推理
MaxFrame采用并行计算机制实现大规模数据离线推理:
数据切分:通过
rebalance接口将输入数据表按指定分区数(num_partitions)均匀分配至多个Worker节点。模型并行加载:每个Worker独立加载模型并进行预热,避免因模型加载导致的冷启动延迟。
结果聚合:输出结果按分区写入MaxCompute表,支持后续的数据分析。
针对大规模数据推理作业,可根据数据情况通过rebalance 接口提前切分并发,从而实现对数据的并行处理。