MaxFrame AI Function

更新时间:2025-04-27 06:48:56

MaxFrame推出的AI Function功能集成了Qwen2.5Deepseek-R1-Distill-Qwen等系列大模型,支持通过简单易用的编程接口直接调用,从而使用大模型对MaxCompute表中的海量数据进行离线处理。本文为您介绍如何使用AI Function功能,并展示一些典型的应用场景案例。

背景信息

为实现大模型智能在大数据平台中的普适性,并降低用户利用人工智能进行数据处理和分析的门槛,MaxFrame正式推出了AI Function功能。AI Function集成开箱即用的Qwen 2.5Deepseek-R1-Distill-Qwen等系列大模型,无需关心和解决复杂繁琐的模型部署问题,直接调用AI Function中提供的简单易用的编程接口,就可以对MaxCompute表中的海量数据使用大模型进行离线处理。

AI Function也可应用于从文本数据中提取结构化信息、整理总结内容、生成摘要、翻译语言,以及文本质量评估,情感分类等多项任务场景,极大地简化数据处理流程并提升处理结果的质量。

原理说明

AI Function提供了简单的generate接口,允许用户选择模型种类,并以表和Prompts作为参数输入执行。在接口执行中,MaxFrame会先对表数据进行切分,根据数据规模设置合适的并发度并启动Worker组执行计算任务,每个Worker对输入的数据行,使用用户传入的Prompts参数为模板进行渲染并构建模型输入数据,来调用Worker中本地启动的大模型进行推理,并将推理结果和成功状态写入MaxCompute。

整体架构和流程如图所示:

image

目前,MaxFrame以开箱即用的方式支持Qwen2.5Deepseek-R1-Distill-Qwen系列模型,并且模型均离线托管在MaxCompute平台内部。您无需考虑模型下载、分发以及API调用的并发上限问题。因此,调用AI FunctionMaxFrame作业能够充分利用MaxCompute海量的计算资源,以较高的总体Token吞吐率和并发完成基于大模型推理能力的文本处理任务。

前提条件

您已安装MaxFrame最新的客户端,详情请参见安装MaxFrame

使用限制

  • 支持的地域目前有华东1(杭州)、华东2(上海)、华北2(北京)、华北3(张家口)、华北6(乌兰察布)、华南1(深圳)、西南1(成都)、中国香港、日本(东京)、新加坡、马来西亚(吉隆坡)、印度尼西亚(雅加达)、德国(法兰克福)、英国(伦敦)、美国(硅谷)、美国(弗吉尼亚)、阿联酋(迪拜)和沙特(利雅得)。

  • 支持的Python版本为3.73.11。

  • 支持的SDK版本:需确保MaxFrame SDK版本为V1.3.1或以上版本。您可以通过以下方式查看版本:

    // Windows系统
    pip list | findstr maxframe
    
    // Linux系统
    pip list | grep maxframe

    若版本过低,直接执行安装指令pip install --upgrade maxframe;安装最新版本。

  • 支持模型(持续更新):

    模型类型

    模型名称

    模型类型

    模型名称

    Qwen 2.5 文本系列模型

    • Qwen2.5-0.5B-instruct

    • Qwen2.5-1.5B-instruct

    • Qwen2.5-3B-instruct

    • Qwen2.5-7B-instruct

    Deepseek-R1-Distill-Qwen系列模型

    • DeepSeek-R1-Distill-Qwen-1.5B

    • DeepSeek-R1-Distill-Qwen-7B

    • DeepSeek-R1-Distill-Qwen-14B

    说明
    • 上述模型均离线托管在MaxCompute平台内部,您可以直接调用。

    • 建议您首先从小模型开始调用,如果输出结果未能达到您的预期,可以再切换到较大的模型。由于更大的模型会消耗更多资源并需要更长的处理时间,优先采用小模型可以有效提升效率和降低成本,从而满足您的输出期望。

语法说明

命令格式

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引用表的列的内容。

语法示例

若您初次使用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对象,并指定要使用的模型为qwen2.5-1.5b-instruct
llm = ManagedTextLLM(name="qwen2.5-1.5b-instruct")

# 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())

输出结果如下所示:

index

response

success

0

{"id": "chatcmpl-1744090855", "object": "chat.completion", "created": 1744090855, "model": "qwen2.5-1.5b-instruct", "choices": [{"index": 0, "message": {"role": "assistant", "content": "地球距离太阳的平均距离约为1天文单位(AU)。"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0}}

True

1

{"id": "chatcmpl-1744090858", "object": "chat.completion", "created": 1744090858, "model": "qwen2.5-1.5b-instruct", "choices": [{"index": 0, "message": {"role": "assistant", "content": "美国独立战争始于1775年,结束于1783年。"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0}}

True

2

{"id": "chatcmpl-1744090862", "object": "chat.completion", "created": 1744090862, "model": "qwen2.5-1.5b-instruct", "choices": [{"index": 0, "message": {"role": "assistant", "content": "水的沸点是指水在标准大气压(1个大气压,即760毫米汞柱)下达到的温度。在标准大气压下,水的沸点是100摄氏度(212华氏度)。当水达到这个温度时,水分子的动能达到最大,它们开始以气态的形式从液态中逸出,形成水蒸气。这个过程称为沸腾。沸点是水的一个重要特性,它在许多化学和物理过程中起着关键作用。"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0}}

True

3

{"id": "chatcmpl-1744090878", "object": "chat.completion", "created": 1744090878, "model": "qwen2.5-1.5b-instruct", "choices": [{"index": 0, "message": {"role": "assistant", "content": "头痛是一种常见的症状,可能由多种原因引起,包括压力、疲劳、缺水、睡眠不足、饮食不当、眼睛疲劳等。以下是一些快速缓解头痛的方法:\n\n1. 休息:如果头痛是由于疲劳或压力引起的,那么休息一下可能会有所帮助。\n\n2. 深呼吸:深呼吸可以帮助放松身体,减轻压力和紧张。\n\n3. 水分补充:缺水是头痛的一个常见原因,所以确保每天喝足够的水。\n\n4. 热敷或冷敷:有些人发现热敷或冷敷头痛区域有助于缓解疼痛。\n\n5. 轻松运动:轻度的运动,如散步或瑜伽,可以帮助放松身体,减轻压力。\n\n6. 避免刺激性食物:避免摄入咖啡因、酒精、巧克力等可能引起头痛的食物。\n\n7. 调整睡眠习惯:确保有足够的睡眠,避免过度疲劳。\n\n如果头痛持续或严重,建议咨询医生以确定头痛的原因并获得适当的治疗。"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0}}

True

4

{"id": "chatcmpl-1744090926", "object": "chat.completion", "created": 1744090926, "model": "qwen2.5-1.5b-instruct", "choices": [{"index": 0, "message": {"role": "assistant", "content": "《哈利·波特》系列中的主角是哈利·波特。"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0}}

True

index

response

success

0

{"id": "chatcmpl-1744090855", "object": "chat.completion", "created": 1744090855, "model": "qwen2.5-1.5b-instruct", "choices": [{"index": 0, "message": {"role": "assistant", "content": "地球距离太阳的平均距离约为1天文单位(AU)。"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0}}

True

1

{"id": "chatcmpl-1744090858", "object": "chat.completion", "created": 1744090858, "model": "qwen2.5-1.5b-instruct", "choices": [{"index": 0, "message": {"role": "assistant", "content": "美国独立战争始于1775年,结束于1783年。"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0}}

True

2

{"id": "chatcmpl-1744090862", "object": "chat.completion", "created": 1744090862, "model": "qwen2.5-1.5b-instruct", "choices": [{"index": 0, "message": {"role": "assistant", "content": "水的沸点是指水在标准大气压(1个大气压,即760毫米汞柱)下达到的温度。在标准大气压下,水的沸点是100摄氏度(212华氏度)。当水达到这个温度时,水分子的动能达到最大,它们开始以气态的形式从液态中逸出,形成水蒸气。这个过程称为沸腾。沸点是水的一个重要特性,它在许多化学和物理过程中起着关键作用。"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0}}

True

3

{"id": "chatcmpl-1744090878", "object": "chat.completion", "created": 1744090878, "model": "qwen2.5-1.5b-instruct", "choices": [{"index": 0, "message": {"role": "assistant", "content": "头痛是一种常见的症状,可能由多种原因引起,包括压力、疲劳、缺水、睡眠不足、饮食不当、眼睛疲劳等。以下是一些快速缓解头痛的方法:\n\n1. 休息:如果头痛是由于疲劳或压力引起的,那么休息一下可能会有所帮助。\n\n2. 深呼吸:深呼吸可以帮助放松身体,减轻压力和紧张。\n\n3. 水分补充:缺水是头痛的一个常见原因,所以确保每天喝足够的水。\n\n4. 热敷或冷敷:有些人发现热敷或冷敷头痛区域有助于缓解疼痛。\n\n5. 轻松运动:轻度的运动,如散步或瑜伽,可以帮助放松身体,减轻压力。\n\n6. 避免刺激性食物:避免摄入咖啡因、酒精、巧克力等可能引起头痛的食物。\n\n7. 调整睡眠习惯:确保有足够的睡眠,避免过度疲劳。\n\n如果头痛持续或严重,建议咨询医生以确定头痛的原因并获得适当的治疗。"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0}}

True

4

{"id": "chatcmpl-1744090926", "object": "chat.completion", "created": 1744090926, "model": "qwen2.5-1.5b-instruct", "choices": [{"index": 0, "message": {"role": "assistant", "content": "《哈利·波特》系列中的主角是哈利·波特。"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0}}

True

应用案例

为了更直观地展示MaxFrame AI Function的强大功能和应用场景,以下将通过两个应用案例来深入了解这些技术是如何为用户解决实际问题的。

风控分类

Deepseek-R1-Distill-Qwen系列模型具备深度推理能力,能够在推理过程中执行文本分类、情感分析、文本质量评估等多项任务,并且能够详细输出思维链和逻辑推理过程。这种能力使其在深度理解文本分类任务时具备更大的优势,特别是在风控这种涉及复杂语义和上下文关联的场景。

AI Function中,可以使用DeepSeek-R1-Distill-Qwen-14B模型对文本进行风控分类。

示例数据

客户信用评级调查报告 - 编号:RJ22222222-ZZ
客户姓名:王先生
身份证号:110000111111111111
联系方式:111000000000  
常住地址:北京市朝阳区朝阳街道朝阳小区10000号楼10000室  
**资产概况**  
- 招商银行账户:6200 0000 0000 0000(余额:¥2,000,000.00)  
- 平安证券账户:A100000000(持仓市值:¥1000,000.00)  
**近期大额交易**  
1. 2088-15-35 向李女士(账号:6200 0000 0000 0000)转账¥1,500,000.00,备注:购房首付款-上海市浦东新区浦东新路1000010000号。
2. 2088-15-35 收到"深圳市某某电子科技有限公司"(开户行:中国银行深圳分行)货款¥4000,000.00。
**审批意见**  
客户信用评级AAA,建议给予最高授信额度。经办人:张女士(工号:ZX000000000),联系方式:zhangkaixin@example.com / 内线88888

示例代码

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',
)

session = new_session(odps_entry=o)

# 取消列文本截断,显示完整内容
pd.set_option("display.max_colwidth", None)
# 显示所有列(避免中间的列被省略)
pd.set_option("display.max_columns", None)

query_list = [
"客户信用评级调查报告 - 编号:RJ22222222-ZZ 客户姓名:王先生 身份证号:110000111111111111 联系方式:111000000000  常住地址:北京市朝阳区朝阳街道朝阳小区10000号楼10000室  **资产概况**  招商银行账户:6200 0000 0000 0000(余额:¥2,000,000.00)  平安证券账户:A100000000(持仓市值:¥1000,000.00)  **近期大额交易**  1. 2088-15-35 向李女士(账号:6200 0000 0000 0000)转账¥1,500,000.00,备注:购房首付款-上海市浦东新区浦东新路10000弄10000号。2. 2088-15-35 收到'深圳市某某电子科技有限公司'(开户行:中国银行深圳分行)货款¥4000,000.00。**审批意见**  客户信用评级AAA,建议给予最高授信额度。经办人:张女士(工号:ZX000000000),联系方式:zhangkaixin@example.com / 内线88888。"
]

df = md.DataFrame({"query": query_list})

llm = ManagedTextLLM(name="DeepSeek-R1-Distill-Qwen-14B")

# Deepseek 模型不应当提供 system Prompts
messages = [
    {
        "role": "user",
        "content": """请作为文本风控评估员,对以下互联网文本进行健康程度评估,并给出理由,且需满足以下要求:

1. **需识别的违规类型**(优先级从高到低):
   - 身份证信息
   - 账号信息
   - 手机号码信息
   - 交易金额信息
   - 姓名信息
   - 地址信息
   - 编号信息

2. **输出格式**:
    以如下纯JSON表示形式,并确保输出中不包含```或任何其他Markdown格式符号
    "reason": "简要说明评分依据(100字内)",
    "category": "主要违规类型(无则填'安全')"

以下是你要判断的文本:
{query}
""",
    },
]

result_df = llm.generate(
    df,
    prompt_template=messages,
)

print(result_df.execute())

相比于普通模型,Deepseek-R1-Distill-Qwen在推理过程中增加了额外的计算步骤,因此执行分析任务时间会更长,但能够获得质量更高的推理结果。输出结果如下:

index

response

success

0

{"id": "chatcmpl-1744091383", "object": "chat.completion", "created": 1744091383, "model": "deepseek-r1-distill-qwen-14b", "choices": [{"index": 0, "message": {"role": "assistant", "content": "```json\n{\n \"reason\": \"文本包含身份证号、招商银行账户、平安证券账户、手机号码、地址、交易金额等敏感信息,存在多处违规。\",\n \"category\": \"身份证信息\"\n}\n```", "reasoning_content": "好,我现在需要评估这段互联网文本的健康程度。首先,我得仔细阅读文本,找出可能的违规信息。\n\n文本开头提到了客户信用评级调查报告,编号是RJ22222222-ZZ。这里有一个编号,属于违规类型中的“编号信息”,需要记录下来。\n\n接下来,客户姓名是王先生,这属于“姓名信息”。然后是身份证号:110000111111111111,这明显是身份证信息,属于高优先级的违规类型。\n\n联系方式是111000000000,这是一个手机号码,属于“手机号码信息”。常住地址是北京市朝阳区的具体地址,属于“地址信息”。\n\n在资产概况部分,招商银行账户是6200 0000 0000 0000,余额是200万。平安证券账户是A100000000,持仓市值100万。这里涉及到了“交易金额信息”。\n\n近期大额交易部分,有两笔交易:一笔转账150万,另一笔收到400万货款。这些金额都很大,属于“交易金额信息”。\n\n审批意见部分提到了客户信用评级AAA,建议授信额度。经办人信息有工号ZX000000000,联系方式zhangkaixin@example.com和内线88888。工号和联系方式属于“账号信息”。\n\n综合来看,文本中涉及了身份证信息、账号信息、手机号码信息、交易金额信息、姓名信息和地址信息。其中,身份证信息的优先级最高,所以主要违规类型是身份证信息。"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0}}

True

index

response

success

0

{"id": "chatcmpl-1744091383", "object": "chat.completion", "created": 1744091383, "model": "deepseek-r1-distill-qwen-14b", "choices": [{"index": 0, "message": {"role": "assistant", "content": "```json\n{\n \"reason\": \"文本包含身份证号、招商银行账户、平安证券账户、手机号码、地址、交易金额等敏感信息,存在多处违规。\",\n \"category\": \"身份证信息\"\n}\n```", "reasoning_content": "好,我现在需要评估这段互联网文本的健康程度。首先,我得仔细阅读文本,找出可能的违规信息。\n\n文本开头提到了客户信用评级调查报告,编号是RJ22222222-ZZ。这里有一个编号,属于违规类型中的“编号信息”,需要记录下来。\n\n接下来,客户姓名是王先生,这属于“姓名信息”。然后是身份证号:110000111111111111,这明显是身份证信息,属于高优先级的违规类型。\n\n联系方式是111000000000,这是一个手机号码,属于“手机号码信息”。常住地址是北京市朝阳区的具体地址,属于“地址信息”。\n\n在资产概况部分,招商银行账户是6200 0000 0000 0000,余额是200万。平安证券账户是A100000000,持仓市值100万。这里涉及到了“交易金额信息”。\n\n近期大额交易部分,有两笔交易:一笔转账150万,另一笔收到400万货款。这些金额都很大,属于“交易金额信息”。\n\n审批意见部分提到了客户信用评级AAA,建议授信额度。经办人信息有工号ZX000000000,联系方式zhangkaixin@example.com和内线88888。工号和联系方式属于“账号信息”。\n\n综合来看,文本中涉及了身份证信息、账号信息、手机号码信息、交易金额信息、姓名信息和地址信息。其中,身份证信息的优先级最高,所以主要违规类型是身份证信息。"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0}}

True

Reasoning模型中,推理过程可能是人工复查结果的重要依据,因此MaxFrame也支持提取推理思维链的内容,单独存放在reasoning_content中,可以使用flatjson访问。

以下完整代码是直接将原始文本的DataFrame和推理结果的DataFrame进行合并,并提出reasoning_content输出。

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
import numpy as np

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',
)

session = new_session(odps_entry=o)

# 取消列文本截断,显示完整内容
pd.set_option("display.max_colwidth", None)
# 显示所有列(避免中间的列被省略)
pd.set_option("display.max_columns", None)

query_list = [
"客户信用评级调查报告 - 编号:RJ22222222-ZZ 客户姓名:王先生 身份证号:110000111111111111 联系方式:111000000000  常住地址:北京市朝阳区朝阳街道朝阳小区10000号楼10000室  **资产概况**  招商银行账户:6200 0000 0000 0000(余额:¥2,000,000.00)  平安证券账户:A100000000(持仓市值:¥1000,000.00)  **近期大额交易**  1. 2088-15-35 向李女士(账号:6200 0000 0000 0000)转账¥1,500,000.00,备注:购房首付款-上海市浦东新区浦东新路10000弄10000号。2. 2088-15-35 收到'深圳市某某电子科技有限公司'(开户行:中国银行深圳分行)货款¥4000,000.00。**审批意见**  客户信用评级AAA,建议给予最高授信额度。经办人:张女士(工号:ZX000000000),联系方式:zhangkaixin@example.com / 内线88888。"
]

df = md.DataFrame({"query": query_list})

llm = ManagedTextLLM(name="DeepSeek-R1-Distill-Qwen-14B")

# Deepseek 模型不应当提供 system prompts
messages = [
    {
        "role": "user",
        "content": """请作为文本风控评估员,对以下互联网文本进行健康程度评估,并给出理由,且需满足以下要求:

1. **需识别的违规类型**(优先级从高到低):
   - 身份证信息
   - 账号信息
   - 手机号码信息
   - 交易金额信息
   - 姓名信息
   - 地址信息
   - 编号信息

2. **输出格式**:
    以如下纯JSON表示形式,并确保输出中不包含```或任何其他Markdown格式符号
    "reason": "简要说明评分依据(100字内)",
    "category": "主要违规类型(无则填'安全')"

以下是你要判断的文本:
{query}
""",
    },
]

result_df = llm.generate(
    df,
    prompt_template=messages,
)

merged_df = md.merge(df, result_df, left_index=True, right_index=True)
# 提取推理结果
merged_df["content"] = merged_df.response.mf.flatjson(
    ["$.choices[0].message.content"], dtype=np.dtype(np.str_)
)
# 提取推理思维链
merged_df["reasoning_content"] = merged_df.response.mf.flatjson(
    ["$.choices[0].message.reasoning_content"], dtype=np.dtype(np.str_)
)

# 输出结果
print(merged_df[["query", "content", "reasoning_content"]].execute())

输出结果如下:

index

query

content

reasoning_content

0

客户信用评级调查报告 - 编号:RJ22222222-ZZ 客户姓名:王先生 身份证号:110000111111111111 联系方式:111000000000 常住地址:北京市朝阳区朝阳街道朝阳小区10000号楼10000室 **资产概况** 招商银行账户:6200 0000 0000 0000(余额:¥2,000,000.00) 平安证券账户:A100000000(持仓市值:¥1000,000.00) **近期大额交易** 1. 2088-15-35 向李女士(账号:6200 0000 0000 0000)转账¥1,500,000.00,备注:购房首付款-上海市浦东新区浦东新路1000010000号。2. 2088-15-35 收到'深圳市某某电子科技有限公司'(开户行:中国银行深圳分行)货款¥4000,000.00。**审批意见** 客户信用评级AAA,建议给予最高授信额度。经办人:张女士(工号:ZX000000000),联系方式:zhangkaixin@example.com / 内线88888。

```json\n{\n "reason": "文本包含身份证号、招商银行账户、平安证券账户、手机号码、地址、交易金额等敏感信息,存在多处违规。",\n "category": "身份证信息"\n}\n```

好,我现在需要评估这段互联网文本的健康程度。首先,我得仔细阅读文本,找出可能的违规信息。\n\n文本开头提到了客户信用评级调查报告,编号是RJ22222222-ZZ。这里有一个编号,属于违规类型中的“编号信息”,需要记录下来。\n\n接下来,客户姓名是王先生,这属于“姓名信息”。然后是身份证号:110000111111111111,这明显是身份证信息,属于高优先级的违规类型。\n\n联系方式是111000000000,这是一个手机号码,属于“手机号码信息”。常住地址是北京市朝阳区的具体地址,属于“地址信息”。\n\n在资产概况部分,招商银行账户是6200 0000 0000 0000,余额是200万。平安证券账户是A100000000,持仓市值100万。这里涉及到了“交易金额信息”。\n\n近期大额交易部分,有两笔交易:一笔转账150万,另一笔收到400万货款。这些金额都很大,属于“交易金额信息”。\n\n审批意见部分提到了客户信用评级AAA,建议授信额度。经办人信息有工号ZX000000000,联系方式zhangkaixin@example.com和内线88888。工号和联系方式属于“账号信息”。\n\n综合来看,文本中涉及了身份证信息、账号信息、手机号码信息、交易金额信息、姓名信息和地址信息。其中,身份证信息的优先级最高,所以主要违规类型是身份证信息。

index

query

content

reasoning_content

0

客户信用评级调查报告 - 编号:RJ22222222-ZZ 客户姓名:王先生 身份证号:110000111111111111 联系方式:111000000000 常住地址:北京市朝阳区朝阳街道朝阳小区10000号楼10000室 **资产概况** 招商银行账户:6200 0000 0000 0000(余额:¥2,000,000.00) 平安证券账户:A100000000(持仓市值:¥1000,000.00) **近期大额交易** 1. 2088-15-35 向李女士(账号:6200 0000 0000 0000)转账¥1,500,000.00,备注:购房首付款-上海市浦东新区浦东新路1000010000号。2. 2088-15-35 收到'深圳市某某电子科技有限公司'(开户行:中国银行深圳分行)货款¥4000,000.00。**审批意见** 客户信用评级AAA,建议给予最高授信额度。经办人:张女士(工号:ZX000000000),联系方式:zhangkaixin@example.com / 内线88888。

```json\n{\n "reason": "文本包含身份证号、招商银行账户、平安证券账户、手机号码、地址、交易金额等敏感信息,存在多处违规。",\n "category": "身份证信息"\n}\n```

好,我现在需要评估这段互联网文本的健康程度。首先,我得仔细阅读文本,找出可能的违规信息。\n\n文本开头提到了客户信用评级调查报告,编号是RJ22222222-ZZ。这里有一个编号,属于违规类型中的“编号信息”,需要记录下来。\n\n接下来,客户姓名是王先生,这属于“姓名信息”。然后是身份证号:110000111111111111,这明显是身份证信息,属于高优先级的违规类型。\n\n联系方式是111000000000,这是一个手机号码,属于“手机号码信息”。常住地址是北京市朝阳区的具体地址,属于“地址信息”。\n\n在资产概况部分,招商银行账户是6200 0000 0000 0000,余额是200万。平安证券账户是A100000000,持仓市值100万。这里涉及到了“交易金额信息”。\n\n近期大额交易部分,有两笔交易:一笔转账150万,另一笔收到400万货款。这些金额都很大,属于“交易金额信息”。\n\n审批意见部分提到了客户信用评级AAA,建议授信额度。经办人信息有工号ZX000000000,联系方式zhangkaixin@example.com和内线88888。工号和联系方式属于“账号信息”。\n\n综合来看,文本中涉及了身份证信息、账号信息、手机号码信息、交易金额信息、姓名信息和地址信息。其中,身份证信息的优先级最高,所以主要违规类型是身份证信息。

在此示例风控场景中,我们可以看到Deepseek-R1-Distill-Qwen模型在文本分类和逻辑推理中的强大表现。它不仅提供高度准确的分类结果,还揭示了推理的思考过程,使用户对模型的决策和分析有更全面的了解。这种透明度对于满足合规要求和提高信任度是至关重要的。借助MaxFrame AI Function,用户可以对海量的文本进行风控,更好地应对复杂的风险控制问题,并快速识别潜在威胁。

结构化信息提取

该场景展示MaxFrame AI Function在非结构化数据处理上的能力。非结构化数据例如文本和图像往往占据主导地位,在大数据分析中带来了巨大的处理挑战。以下是如何利用AI Function简化这一过程。

示例演示如何使用AI Function从简历中提取候选人的工作经验,使用随机生成的简历文本进行演示。

完整示例代码如下:

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',
)
session = new_session(odps_entry=o)

# 添加简历相关数据 
resumes = [
    "138-xxxx-xxxx zhangwei@example.com 希望在一家创新型科技公司担任软件开发工程师 运用我的编程技能和团队协作能力推动产品落地 某大学计算机科学与技术 本科 2018.09 - 2022.06 某大学软件工程 硕士 2022.09 - 至今 A 公司 后端开发实习生 2021.07 - 2021.12 参与推荐系统后端服务的开发与优化,提升系统响应速度约20%。使用Go语言重构了部分代码模块,提高了代码可维护性。B公司 全栈开发工程师 2022.06 - 至今 负责电商平台核心功能模块的开发,完成用户登录、支付等功能的实现。主导了前端性能优化项目,页面加载时间减少了30%。编程语言: Python Go JavaScript 框架: Django React Vue.js 数据库: MySQL MongoDB 工具: Docker Git Jenkins",
    "159-xxxx-xxxx lina@example.com 致力于成为数据领域的专家通过数据分析与挖掘帮助企业制定更精准的商业决策 某大学 统计学 本科 2016.09 - 2020.06 某大学 数据科学 硕士 2020.09 - 2022.06 C 公司 数据分析师 2022.07 - 至今 负责电商平台用户行为数据的分析 提出多项优化建议并被采纳 构建机器学习模型预测用户购买意向 准确率达到85%以上 D 公司 咨询顾问 2020.07 - 2022.06 协助客户进行财务数据清洗与可视化分析 输出高质量报告 支持多个大型项目的实施 涉及零售、金融等行业 数据分析工具: Excel Tableau Power BI 编程语言: Python R SQL 机器学习框架: Scikit-learn TensorFlow",
    "135-xxxx-xxxx wangqiang@example.com 期望在市场营销领域发挥创意与执行力 为企业品牌建设贡献力量 某大学 市场营销 本科 2017.09 - 2021.06 E 公司 市场专员 2021.07 - 2023.03 策划并执行了多场线上线下推广活动 累计吸引超过10万用户参与 分析竞品动态 为新产品上市提供市场调研支持 F 公司 广告策划 2023.04 - 至今 负责大客户广告投放策略制定 单季度广告收入增长15% 创作多支短视频广告脚本 点击率高于行业平均水平20% 营销工具: Google Analytics SEMrush Hootsuite 设计软件: Photoshop Illustrator 社交媒体运营经验: 微信公众号、抖音等平台"
]
df = md.DataFrame({"text": resumes})

# 取消列文本截断,显示完整内容
pd.set_option("display.max_colwidth", None)
# 显示所有列(避免中间的列被省略)
pd.set_option("display.max_columns", None)

# 使用qwen2.5-7b-instruct大模型 
llm = ManagedTextLLM(name="qwen2.5-7b-instruct")
messages = [
    {
        "role": "system",
        "content": "你是一个简历信息提取专家,从简历中提取结构化信息,以 json 格式返回,包括姓名,教育经历,工作经历,请不要遗漏任何一段经历",
    },
    {
        "role": "user",
        "content": "从如下简历中抽取信息\n```{text}```",
    },
]

# generate函数接收params传入的模型参数:
#  模型参数包括 response_format, max_tokens, repeat_penalty 等参数,避免在处理复杂JSON和长文本时出现重复输出的问题
# 使用Prompts要求LLM从其中提取简历信息,并以JSON结构返回
# 约束模型,以预期的JSON Format输出
result = llm.generate(
    df,
    prompt_template=messages,
    params={
        "response_format": {
            "type": "json_object",
            "schema": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string",
                        "description": "The individual's name",
                    },
                    "education": {
                        "type": ["string", "array"],
                        "description": "The individual's educational background, can be a string or an array. If not provided, it might be empty or contain explanatory text.",
                    },
                    "workExperience": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "position": {
                                    "type": "string",
                                    "description": "The job title of the position held",
                                },
                                "company": {
                                    "type": "string",
                                    "description": "The name of the company where the individual was employed",
                                },
                                "duration": {
                                    "type": "string",
                                    "description": "The period during which the individual worked at the company",
                                },
                            },
                            "required": [
                                "position",
                                "company",
                                "duration",
                            ],
                        },
                    },
                },
                "required": ["education", "education", "workExperience"],
            },
        },
        "repeat_penalty": 1.2,
    },
)

# 输出计算结果:根据Prompts传入的指令和response_format的设置,模型的输出变成结构化的JSON格式文本。
print(result.execute())

# 将结果输出MaxCompute项目表中
result.to_odps_table('maxcompute_table_name').execute()

输出结果如下:

index

response

success

0

{"id": "chatcmpl-1744092192", "object": "chat.completion", "created": 1744092192, "model": "qwen2.5-7b-instruct", "choices": [{"index": 0, "message": {"role": "assistant", "content": "{\"education\": [{\"school_name\": \"某大学计算机科学与技术\", \"degree\": \"本科\", \"start_date\": \"2018.09\", \"end_date\": \"2022.06\"}, {\"school_name\": \"某大学软件工程\", \"degree\": \"硕士\", \"start_date\": \"2022.09\", \"end_date\": null}], \"workExperience\": [{\"position\": \"后端开发实习生\", \"company\": \"A 公司\", \"duration\": \"2021.07 - 2021.12\"}, {\"position\": \"全栈开发工程师\", \"company\": \"B公司\", \"duration\": \"2022.06 - 至今\"}]}"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0}}

True

1

{"id": "chatcmpl-1744092287", "object": "chat.completion", "created": 1744092287, "model": "qwen2.5-7b-instruct", "choices": [{"index": 0, "message": {"role": "assistant", "content": "{\"education\": [{\"school_name\": \"某大学\", \"degree\": \"\", \"field_of_study\": \"统计学\", \"start_date\": \"2016.09\", \"end_date\": \"2020.06\"}, {\"school_name\": \"某大学\", \"degree\": \"\", \"field_of_study\": \"数据科学\", \"start_date\": \"2020.09\", \"end_date\": \"2022.06\"}], \"workExperience\": [{\"position\": \"数据分析师\", \"company\": \"C 公司\", \"duration\": \"2022.07 - 至今\"}, {\"position\": \"咨询顾问\", \"company\": \"D 公司\", \"duration\": \"2020.07 - 2022.06\"}]}"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0}}

True

2

{"id": "chatcmpl-1744092368", "object": "chat.completion", "created": 1744092368, "model": "qwen2.5-7b-instruct", "choices": [{"index": 0, "message": {"role": "assistant", "content": "{\"education\": [{\"school_name\": \"某大学\", \"major\": \"市场营销\", \"degree\": \"本科\"}], \"workExperience\": [{\"position\": \"市场专员\", \"company\": \"E 公司\", \"duration\": \"2021.07 - 2023.03\"}, {\"position\": \"广告策划\", \"company\": \"F 公司\", \"duration\": \"2023.04 - 至今\"}]}"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0}}

True

index

response

success

0

{"id": "chatcmpl-1744092192", "object": "chat.completion", "created": 1744092192, "model": "qwen2.5-7b-instruct", "choices": [{"index": 0, "message": {"role": "assistant", "content": "{\"education\": [{\"school_name\": \"某大学计算机科学与技术\", \"degree\": \"本科\", \"start_date\": \"2018.09\", \"end_date\": \"2022.06\"}, {\"school_name\": \"某大学软件工程\", \"degree\": \"硕士\", \"start_date\": \"2022.09\", \"end_date\": null}], \"workExperience\": [{\"position\": \"后端开发实习生\", \"company\": \"A 公司\", \"duration\": \"2021.07 - 2021.12\"}, {\"position\": \"全栈开发工程师\", \"company\": \"B公司\", \"duration\": \"2022.06 - 至今\"}]}"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0}}

True

1

{"id": "chatcmpl-1744092287", "object": "chat.completion", "created": 1744092287, "model": "qwen2.5-7b-instruct", "choices": [{"index": 0, "message": {"role": "assistant", "content": "{\"education\": [{\"school_name\": \"某大学\", \"degree\": \"\", \"field_of_study\": \"统计学\", \"start_date\": \"2016.09\", \"end_date\": \"2020.06\"}, {\"school_name\": \"某大学\", \"degree\": \"\", \"field_of_study\": \"数据科学\", \"start_date\": \"2020.09\", \"end_date\": \"2022.06\"}], \"workExperience\": [{\"position\": \"数据分析师\", \"company\": \"C 公司\", \"duration\": \"2022.07 - 至今\"}, {\"position\": \"咨询顾问\", \"company\": \"D 公司\", \"duration\": \"2020.07 - 2022.06\"}]}"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0}}

True

2

{"id": "chatcmpl-1744092368", "object": "chat.completion", "created": 1744092368, "model": "qwen2.5-7b-instruct", "choices": [{"index": 0, "message": {"role": "assistant", "content": "{\"education\": [{\"school_name\": \"某大学\", \"major\": \"市场营销\", \"degree\": \"本科\"}], \"workExperience\": [{\"position\": \"市场专员\", \"company\": \"E 公司\", \"duration\": \"2021.07 - 2023.03\"}, {\"position\": \"广告策划\", \"company\": \"F 公司\", \"duration\": \"2023.04 - 至今\"}]}"}, "finish_reason": "stop"}], "usage": {"prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0}}

True

您可以从结果中看到,MaxFrameAI Function之外,还有大量的数据分析算子,在提前限定JSON结构的情况下,可以轻松地解析出结果。

  • 本页导读 (1)
  • 背景信息
  • 原理说明
  • 前提条件
  • 使用限制
  • 语法说明
  • 命令格式
  • 参数说明
  • 语法示例
  • 应用案例
  • 风控分类
  • 结构化信息提取