本文介紹如何在阿里雲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 介面提前切分並發,從而實現對資料的平行處理。