将AI模型推理结果写回数据库

本文描述了如何通过PolarDB for AI在数据库中生成含有AI模型推理列的数据表PolarDB for AI Augmented Table(下文简称AAT)。经过人工智能增强的数据表可广泛应用于Data+AI的多个场景,以协助用户进行数据洞察,并根据实际情况调整其决策。

什么是AAT

一张含有AI模型或推理数据列的表被称为AAT。示例如下:

  • 1中的表为原表。其中,TripID为主键,Airline、Flight、AirportFrom、AirportTo、DayOfWeek、TimeLength为一次航班飞行的相关信息。

  • 2中的表为图1中表的AAT,表中的result列是根据一个AI模型生成出来的结果。该表既包含了数据,又包含了AI推理生成结果。

PolarDB对图2中的数据库表进行充分利用,可以帮助用户来分析自己的航班有没有可能延误,也可以帮助航空公司来改进相关航班信息,提升它的准点率。

1. 原表

image.png

2. AAT

image.png

在关系型数据库中引入并使用AAT会带来很多便捷之处。比如:对用户群体的划分、销售量的预测以及基于大模型生成内容等,都可以通过AAT在数据库中进行存储、计算和使用。AAT作为数据库外表,在使用上和数据库里面其他的表没有太大的差别。

准备工作

  • 开启冷数据归档:为了避免AI模型对数据库的频繁写入,PolarDBAAT作为外部表存储在对象存储OSS上。因此需前往PolarDB控制台配置与管理 > 数据与生命周期 > 冷数据归档(冷数据)页面开启冷数据归档功能。

  • 创建数据库:创建一个新的数据库polar4ai,系统自动生成的AAT将存储于数据库polar4ai中。在创建数据库时,请选择字符集utf8mb4,并选择AI节点的连接数据库账号进行授权,授予该账号读写权限。

通过AAT连接AI和数据库

通过以下示例,来描述如何通过AAT来连接AI和数据库。在实际使用过程中,请根据实际情况进行操作。

  1. 创建一个AI模型。

    /*polar4ai*/CREATE MODEL airlines_gbm WITH (
    model_class='lightgbm', 
    x_cols ='Airline,Flight,AirportFrom,AirportTo,DayOfWeek,Time,Length', 
    y_cols='Delay',
    model_parameter=(boosting_type='gbdt', n_estimators=100, max_depth=8, num_leaves=256)
    ) AS (SELECT * FROM airlines_train)
  2. 查看当前集群下的模型列表。

    /*polar4ai*/SHOW MODELS;

    执行结果如下:

    +--------------------+-------------+--------------+
    | model_name         | model_class | model_status |
    +--------------------+-------------+--------------+
    | airlines_gbm       | lightgbm    | saved_oss    |
    +--------------------+-------------+--------------+
  3. 使用创建好的模型进行离线推理,自动生成AAT。

    /*polar4ai*/SELECT TripID,Delay FROM PREDICT (MODEL airlines_gbm, SELECT * FROM airlines_train) WITH (
    s_cols='TripID,Delay',
    x_cols = 'Airline,Flight,AirportFrom,AirportTo,DayOfWeek,Time,Length',
    y_cols='Delay',
    primary_key='TripID', 
    mode='async',
    into_type='db'
    ) INTO airlines_gbm_predict;

    其中,airlines_gbm_predict为系统即将自动构建的AAT的表名,primary_key为表中的主键。离线推理SQL执行完成后,会返回一个任务ID。如:8c9e205a-42bc-11f0-b8ab-6300f792f4b8

  4. 查看离线任务状态。

    通过离线任务ID来检查任务状态。当任务状态为finish时,代表AI模型已经完成相应的推理。

    /*polar4ai*/SHOW TASK `8c9e205a-42bc-11f0-b8ab-6300f792f4b8`	

    执行结果如下:

    +------------+---------------------------------------------------------------------------------------------------------------------------------------------+---------+----------------+----------------+--------+--------------+----------+
    | taskStatus | filePath                                                                                                                                    | results | startTime      | endTime        | errMsg | successBatch | allBatch |
    +------------+---------------------------------------------------------------------------------------------------------------------------------------------+---------+----------------+----------------+--------+--------------+----------+
    | finish     | http://db4ai-xxx.aliyuncs.com/xxx/polar4ai/airlines_gbm_predict-0.csv?security-token=xxx&OSSAccessKeyId=xxx&Expires=xxx&Signature=xxx       |         | 2025-04-21 xxx | 2025-04-21 xxx |        |              |          |
    +------------+---------------------------------------------------------------------------------------------------------------------------------------------+---------+----------------+----------------+--------+--------------+----------+
  5. 查看在数据库polar4ai下自动生成的AAT表结构。

    SHOW CREATE TABLE polar4ai.airlines_gbm_predict;

    执行结果如下:

    +---------------------------+------------------------------------------------------------------------------------------------------------+
    | Table                     | Create Table                                                                                               |
    +---------------------------+------------------------------------------------------------------------------------------------------------+
    | airlines_gbm_predict      | CREATE TABLE `airlines_gbm_predict` (
      `TripID` int(11) DEFAULT NULL,
      `Delay` tinyint(1) DEFAULT NULL,
      `result` text
    ) ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800010128 NULL_MARKER='NULL' */ CONNECTION='default_oss_server' |
    +---------------------------+------------------------------------------------------------------------------------------------------------+

    新生成的AAT与原表相对比,TripIDDelay的类型和长度均与原表一致。resultAI模型推理出来的结果,并作为原表的增强列写入了AAT中。

    +----------------+--------------------------------------------------------------------------------------------------------------+
    | Table          | Create Table                                                                                                 |
    +----------------+--------------------------------------------------------------------------------------------------------------+
    | airlines_train | CREATE TABLE `airlines_train` (
      `TripID` int(11) NOT NULL AUTO_INCREMENT,
      `Airline` varchar(255) COLLATE utf8mb4_general_ci NOT NULL,
      `Flight` varchar(50) COLLATE utf8mb4_general_ci NOT NULL,
      `AirportFrom` char(3) COLLATE utf8mb4_general_ci NOT NULL,
      `AirportTo` char(3) COLLATE utf8mb4_general_ci NOT NULL,
      `DayOfWeek` enum('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday') COLLATE utf8mb4_general_ci NOT NULL,
      `Time` time NOT NULL,
      `Length` int(11) NOT NULL,
      `Delay` tinyint(1) DEFAULT NULL,
      PRIMARY KEY (`TripID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci |
    +----------------+--------------------------------------------------------------------------------------------------------------+
  6. 查看AAT中的数据。

    SELECT * FROM polar4ai.airlines_gbm_predict;

    执行结果如下,由查询结果可以看出,新生成的result列包含预测值和不同类别的概率值。

    +--------+-------+--------------------+
    | TripID | Delay | result             |
    +--------+-------+--------------------+
    |      1 |     0 | 0;{0: 0.6, 1: 0.4} |
    |      2 |     1 | 0;{0: 0.6, 1: 0.4} |
    |      3 |     0 | 0;{0: 0.6, 1: 0.4} |
    |      4 |     1 | 0;{0: 0.6, 1: 0.4} |
    |      5 |     0 | 0;{0: 0.6, 1: 0.4} |
    |      6 |     0 | 0;{0: 0.6, 1: 0.4} |
    |      7 |     1 | 0;{0: 0.6, 1: 0.4} |
    |      8 |     0 | 0;{0: 0.6, 1: 0.4} |
    |      9 |     1 | 0;{0: 0.6, 1: 0.4} |
    |     10 |     0 | 0;{0: 0.6, 1: 0.4} |
    +--------+-------+--------------------+
  7. 通过AAT和数据库表进行连接操作。

    自动生成的表airlines_gbm_predict与数据库中其他表在使用上并无差异,可以与数据库中的其他表进行连接操作。示例如下:

    SELECT * 
    FROM airlines_train, polar4ai.airlines_gbm_predict
    WHERE airlines_train.TripID=polar4ai.airlines_gbm_predict.TripID AND airlines_train.Delay=1

    执行结果如下:

    +--------+--------------------+--------+-------------+-----------+-----------+----------+--------+-------+--------+-------+--------------------+
    | TripID | Airline            | Flight | AirportFrom | AirportTo | DayOfWeek | Time     | Length | Delay | TripID | Delay | result             |
    +--------+--------------------+--------+-------------+-----------+-----------+----------+--------+-------+--------+-------+--------------------+
    |      2 | Delta Airlines     | DL456  | LAX         | ORD       | Tuesday   | 11:15:00 |    320 |     1 |      2 |     1 | 0;{0: 0.6, 1: 0.4} |
    |      4 | Southwest Airlines | SW012  | DFW         | DEN       | Thursday  | 09:00:00 |    210 |     1 |      4 |     1 | 0;{0: 0.6, 1: 0.4} |
    |      7 | Qatar Airways      | QR901  | DOH         | JFK       | Sunday    | 13:45:00 |    860 |     1 |      7 |     1 | 0;{0: 0.6, 1: 0.4} |
    |      9 | Air France         | AF567  | CDG         | ORY       | Tuesday   | 18:30:00 |     60 |     1 |      9 |     1 | 0;{0: 0.6, 1: 0.4} |
    +--------+--------------------+--------+-------------+-----------+-----------+----------+--------+-------+--------+-------+--------------------+