使用AI内置模型实现推理

更新时间:

本文介绍如何在AnalyticDB PostgreSQL 7.0版中使用预训练的深度学习模型进行推理。

功能简介

AnalyticDB PostgreSQL 7.0版支持基于pgml插件使用预训练模型进行数据的推理,减少数据流转,提高资源利用率,确保数据分析的实时性和决策的可靠性。当前支持的推理任务包括:文本嵌入(Text Embedding)、文本分类(Text Classification)和命名实体识别(Named Entity Recognition)。下文列出当前推理任务中支持的预训练模型及相关参数说明。

说明

如果您要使用的模型不存在于当前的支持列表中,请提交工单联系研发人员

文本嵌入

文本嵌入(Text Embedding)可以将自然语言转换为定量向量表示,常用于文本分析、相似度计算、机器学习任务及RAG等场景。通过pgml插件提供的embed接口函数,您可以使用此函数获取给定文本在指定模型编码空间的文本嵌入向量。

模型名称

支持语言

最大token数

维度

模型大小

thenlper/gte-large-zh

中文

512

1024

1.25 GB

thenlper/gte-small-zh

中文

512

512

0.12 GB

thenlper/gte-large

英文

512

1024

1.25 GB

thenlper/gte-small

英文

512

512

0.21 GB

Alibaba-NLP/gte-Qwen2-7B-instruct

多语言

32000

3584

26.45 GB

Alibaba-NLP/gte-Qwen2-1.5B-instruct

多语言

32000

1536

6.62 GB

语法

  • 单条推理。

    CREATE FUNCTION pgml."embed"(
            "transformer" TEXT,
            "inputs" TEXT,
            "kwargs" jsonb DEFAULT '{}'
    ) RETURNS real[]
    IMMUTABLE STRICT PARALLEL SAFE
    LANGUAGE c /* Rust */;
  • 批量推理。

    CREATE  FUNCTION pgml."embed"(
            "transformer" TEXT,
            "inputs" TEXT[],
            "kwargs" jsonb DEFAULT '{}'
    ) RETURNS real[][]
    IMMUTABLE STRICT PARALLEL SAFE
    LANGUAGE c /* Rust */;

参数说明

参数名称

描述

示例值

transformer

需要使用的模型名称,可从模型名称中查看当前支持的模型。

'thenlper/gte-large'

inputs

需要推理的文本。

'自注意力机制被广泛地在神经网络中使用。'

kwargs

额外参数,详情请参照huggingface开源模型。通用参数(如指定推理设备)也可通过此参数传递。

说明

当前版本暂不支持GPU推理。

'{"device": "cpu"}'

使用示例

对单条文本进行嵌入

SELECT pgml.embed('thenlper/gte-small-zh', '自注意力机制被广泛地在神经网络中使用。');

结果如下。

                           embed
------------------------------------------------------------
 {0.011534364,-0.029397607, ... -0.00056651415,-0.05465962}

对多条文本进行嵌入

SELECT pgml.embed('thenlper/gte-small-zh', ARRAY['自注意力机制被广泛地在神经网络中使用。', '其核心思想是让模型在处理单个元素时能够考虑到序列中的其他元素']);

结果如下。

                           embed
------------------------------------------------------------
 {0.011534364,-0.029397607, ... -0.00056651415,-0.05465962}
 {0.024123996,0.0360483154, ... -0.029659372,-0.0198373856}

对已导入表中的数据进行嵌入

假设需要推理的文本数据已被导入到dump_table中。

CREATE TABLE dump_table(id int, content text);
--content内容如下
/*
 id |                      content
----+--------------------------------------------------------
  2 | 通过计算 Query 和 Key 的点积,并经过 softmax 函数,得到注意力权重,这些权重表明当前元素在整合其他元素时的“注意力”。
  1 | 自注意力机制通过计算序列中每个元素之间的相似度来生成注意力分数。这些分数表示了每个元素对其他元素的重要性。
*/

将dump_table中的content列进行embed处理并将结果保存在result_table中。

CREATE TABLE result_table AS SELECT id, content, pgml.embed('thenlper/gte-small-zh', content) AS embed FROM dump_table;

SELECT id, content, embed[1:2] FROM result_table;

结果如下。

 id |               content        |      embed
----+------------------------------+-------------------
  2 | 通过计算 ... 他元素时的“注意力”。| {-0.036033697,..., -0.030451842}
  1 | 自注意力机制通过 ... 的重要性。  | {-0.020080239,..., -0.017561916}
(2 rows)

文本分类

文本分类(Text Classification)是将文本自动分配到预定义类别的任务。通过使用不同的预训练模型,可以实现情感分析、数据自动标记、审查等数据处理。通过pgml插件提供的transform接口函数,您可以使用以下模型完成文本数据的分类处理。

模型名称

描述

语言

最大token数

模型大小

Alibaba-NLP/gte-multilingual-reranker-base

文本识别。

多语言

8192

306 MB

lxyuan/distilbert-base-multilingual-cased-sentiments-student

情感分析(正负面二分类)。

多语言

512

541 MB

语法

CREATE FUNCTION pgml."transform"(
        "task" jsonb,
        "args" jsonb DEFAULT '{}',
        "inputs" TEXT[] DEFAULT ARRAY[]::TEXT[],
        "cache" bool DEFAULT false
) RETURNS jsonb 
IMMUTABLE STRICT PARALLEL SAFE
LANGUAGE c;

参数说明

参数名称

描述

示例值

task

指定所使用的预训练模型以及任务类型(对于文本分类任务则为text-classification)。

{

"task": "text-classification",

"model": "lxyuan/distilbert-base-multilingual-cased-sentiments-student"

}

args

额外参数,详情请参照huggingface开源模型。

{"max_new_tokens": 32}

inputs

需要分类的文本。

ARRAY['产品的质量很好']

cache

是否缓存transformer模型。

true

使用示例

对单条文本进行分类

SELECT pgml.transform(
    task => '{"task": "text-classification",
              "model": "lxyuan/distilbert-base-multilingual-cased-sentiments-student"
             }'::JSONB,
    inputs => ARRAY[
        '产品的质量很好'
    ]
) AS positivity;

结果如下。分类返回结果为positive,即代表该模型认为‘产品的质量很好’,属于正面评价,置信度为0.9924。

                     positivity
-----------------------------------------------------
 [{"label": "positive", "score": 0.992497742176056}]
(1 row)

对已导入表中的数据进行分类

读取dump_table中的数据,并根据content列的内容进行分类。如果分类结果为positive,则对应的pos的结果为true,结果保存在result_table中。

CREATE TABLE result_table AS 
  SELECT 
    id, 
    content, 
    pgml.transform(
      task => '{
                "task": "text-classification",
                "model": "lxyuan/distilbert-base-multilingual-cased-sentiments-student"
               }'::JSONB,
      inputs => ARRAY[content]::text[])->0->>'label' = 'positive' AS pos 
  FROM dump_table;

命名实体识别

命名实体识别(Named Entity Recognition, NER)用于从文本中识别并分类命名实体,通常包括人名、地点、时间和组织等,便于后续对数据深度加工与分析。通过pgml插件提供的transform接口函数,您可以使用以下模型完成命名实体的抽取。

模型名称

语言

模型说明

模型大小

Babelscape/wikineural-multilingual-ner

多语言

可标注文本中的组织,人物及地点等信息。

709 MB

语法

CREATE FUNCTION pgml."transform"(
        "task" jsonb,
        "args" jsonb DEFAULT '{}',
        "inputs" TEXT[] DEFAULT ARRAY[]::TEXT[],
        "cache" bool DEFAULT false
) RETURNS jsonb 
IMMUTABLE STRICT PARALLEL SAFE
LANGUAGE c;

参数说明

参数名称

描述

示例值

task

指定所使用的预训练模型以及任务类型(对于命名实体识别任务则为token-classification)。

{

"task": "token-classification",

"model": "Babelscape/wikineural-multilingual-ner"

}

args

额外参数,详情请参照huggingface开源模型。

{"max_new_tokens": 32}

inputs

需要抽取的文本。

ARRAY['李明昨天抵达了杭州']

cache

是否缓存transformer模型。

true

使用示例

对单条文本进行抽取

SELECT pgml.transform(
    task => '{"task": "token-classification",
              "model": "Babelscape/wikineural-multilingual-ner"
             }'::JSONB,
    inputs => ARRAY[
        '李明昨天抵达了某市'
    ]
);

抽取得到的结果如下。

  • 人名:李明(B-PER和I-PER标识),其置信度非常高。

  • 地名:某市(B-LOC和I-LOC标识),其置信度同样很高。

                      transform
------------------------------------------------------------
 [[{"end": 1, "word": "李", "index": 1, "score": 0.9668680429458618, "start": 0, "entity": "B-PER"}, {"end": 2, "word": "明", "index": 2, "score": 0.9899099469184875, "start": 1
, "entity": "I-PER"}, {"end": 8, "word": "某", "index": 8, "score": 0.9998119473457336, "start": 7, "entity": "B-LOC"}, {"end": 9, "word": "市", "index": 9, "score": 0.998930156
2309264, "start": 8, "entity": "I-LOC"}]]
(1 row)

对已导入表中的数据进行抽取

CREATE TABLE result_table AS SELECT id, content, pgml.transform(
    task => '{"task": "token-classification",
              "model": "Babelscape/wikineural-multilingual-ner"
             }'::JSONB,
    inputs => ARRAY[
        content
    ]
) AS RESULT FROM dump_table;

SELECT * FROM result_table ;

结果如下。

------------------------------------------------------
  1 | My name IS Wolfgang AND I live IN Berlin. | [[{"end": 19, "word": "Wolfgang", "index": 4, "score": 0.9645113348960876, "start": 11, "entity": "B-PER"}, {"end": 40, "word":
 "Berlin", "index": 9, "score": 0.9998326301574708, "start": 34, "entity": "B-LOC"}]]
  2 | 李明今天会前往某市                        | [[{"end": 1, "word": "李", "index": 1, "score": 0.9602842330932616, "start": 0, "entity": "B-PER"}, {"end": 2, "word": "明", "i
ndex": 2, "score": 0.9939024448394777, "start": 1, "entity": "I-PER"}, {"end": 8, "word": "某", "index": 8, "score": 0.9995771050453186, "start": 7, "entity": "B-LOC"}, {"end":
9, "word": "市", "index": 9, "score": 0.997289776802063, "start": 8, "entity": "I-LOC"}]]
(2 rows)