使用入门

Polar_AI云原生数据库PolarDB的一个AI扩展,集成先进的AI模型和算法,构建数据库与现代人工智能技术之间的桥梁,使得数据库能够执行机器学习和自然语言处理等任务。本文档为您介绍Polar_AI引擎的基本功能,包括如何在数据库中调用AI大模型执行文本转向量、情感分类等功能,以及如何通过SQL扩展自定义AI模型,以实现与更多AI模型服务的交互。

前提条件

支持的PolarDB PostgreSQL的版本如下:

PostgreSQL 14(内核小版本14.13.28.0及以上)。

说明

您可通过如下语句查看PolarDB PostgreSQL的内核小版本号:

SELECT version();

如需升级内核小版本,请参考升级版本

基本概念

  • NLP:自然语言处理(Natural Language Processing)是AI的一个领域,专注于使计算机能够理解和生成人类语言。该领域包括文本分类、情感分析、机器翻译、对话系统等技术。

  • Embedding:中文可译为嵌入或嵌入式表示,是机器学习和自然语言处理领域中的一个重要概念。该概念指的是将高维、稀疏的特征向量(例如词典中的词语、图像像素点等)转换为低维、密集的连续向量空间中的向量表示的过程。

优势说明

通过标准SQL语言即可轻松实现数据库内部AI模型的调用及管理,这种方式具备以下几个显著优势:

  • 简单易用性:无需深厚的AI专业知识或复杂的编程技能,仅需掌握基础的SQL语法就能完成从模型训练到预测推理结果输出的全流程操作。极大降低使用门槛,使得更多非专业人员也能参与到AI应用实践中来。

  • 灵活可定制化:除了提供一系列预设的常用AI算法外,还支持根据业务需求快速添加新的模型。只需编写几行简单的SQL语句即可实现功能扩展。因此,无论是文本分类、图像识别还是时序预测等不同类型的任务,都能够在统一框架下高效处理。

  • 无缝数据融合:传统上,AI模型生成的输出通常需要经过额外步骤才能被有效整合进现有的信息系统。然而,在本方案中,所有AI计算的结果均可直接保存至数据库,并能够方便地与其他结构化或非结构化数据进行联合查询与分析,从而为决策制定提供更加全面和准确的信息支持。

  • 数据安全保障:在整个计算过程中,原始数据始终存放于安全可靠的数据库环境中,从而避免因频繁传输而引发的信息泄露风险。同时,借助成熟的企业级特性,例如细粒度权限控制、访问审计跟踪及加密技术等手段,进一步提升系统的防护水平。

  • 卓越性能表现:由于所有计算任务均在数据库内部执行,减少因数据迁移而产生的额外开销,因此在响应速度和吞吐量方面均能达到非常出色的水平。对于实时性要求较高的应用场景尤为重要。

  • 企业级服务支撑:全面继承云原生数据库PolarDB所拥有的各种高级特性,比如自动故障切换、在线扩容缩容、冷热分层存储等等。这些都为企业构建稳定可靠的大规模数据处理平台奠定坚实的基础。

快速入门

创建扩展

CREATE EXTENSION IF NOT EXISTS polar_ai;

内置模型介绍

内置模型是指在创建Polar_AI扩展后,预先安装于数据库中的几种常用AI模型。您无需关注模型的部署及参数细节,可直接进行使用。可通过以下SQL命令查看内置模型:

SELECT model_seq,model_id,model_name,model_url FROM polar_ai._ai_models;           

返回结果如下:

-----------+---------------------------------------------
1 | _dashscope/text_embedding/text_embedding_v2 | text-embedding-v2 | https://dashscope.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding 
2 | _dashscope/text_embedding/text_embedding_v3 | text-embedding-v3 | https://dashscope.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding 
3 | _dashscope/text-classfication/opennlu-v1    | opennlu-v1        | https://dashscope.aliyuncs.com/api/v1/services/nlp/nlu/understanding                    
(3 rows)

当前内置模型主要集成了阿里云大模型服务平台百炼服务中提供的自然语言处理模型,其功能解释如下:

  • _dashscope/text_embedding/text_embedding_v2:通用文本向量,支持将中文、英语、西班牙语、法语、葡萄牙语、印尼语、日语、韩语、德语、俄罗斯语转为向量,输出的向量维度为1536。

  • _dashscope/text_embedding/text_embedding_v3:通用文本向量,在text_embedding_v2的基础上增加了50多种语言,输出的向量维度默认为1024。

  • _dashscope/text-classfication/opennlu-v1:OpenNLU开放域文本理解模型,适用于中文、英文零样本条件下进行文本理解任务,如信息抽取、文本分类等。

如何快速执行文本转向量

以调用内置模型_dashscope/text_embedding/text_embedding_v2为例,仅通过执行两次SQL命令就可完成文本转向量操作。

_dashscope/text_embedding/text_embedding_v2内置模型输出的向量固定为real[],如需输出更多类型,请参考如何实现批量Embedding及向量检索

绑定Token

首次调用内置模型前,需要先获阿里云账号的API-KEY并绑定到模型,获取方法请参考获取API Key。然后,执行如下SQL命令将API-KEY绑定到指定模型中。

SELECT polar_ai.AI_SetModelToken('_dashscope/text_embedding/text_embedding_v2', 'YOUR_API_KEY');

执行Embedding

绑定API-KEY后,调用AI_Text_Embedding函数,即可完成文本转向量操作。

SELECT polar_ai.ai_text_embedding('风急天高猿啸哀');

返回结果如下:

---
{0.0049301917,-0.012394876,0.041976027,-0.01943111,0.039707053,-0.030824259,0.036376007,-0.035169102,-0.00021252778,0.0053405385,0.039079465,-0.03019667,-0.0067224405,0.01711386,0.021989742,
...,
0.019008696,-0.03215185,-0.021820776,0.029520806,0.022677675,-0.0038922566,0.014941438,0.012986258,0.030003566,-0.008285377,0.0014573333,-0.017584551,-0.038089804,-0.0371967,-0.008629344}

如何快速实现文本情感分类

绑定Token

首次调用内置模型前,需要先获取阿里云账号的API-KEY并绑定到模型,获取方法请参考获取API Key。然后,执行如下SQL命令将API-KEY绑定到指定模型中。

SELECT polar_ai.AI_SetModelToken('_dashscope/text-classfication/opennlu-v1', 'YOUR_API_KEY');

执行文本情感分类

绑定API-KEY后,调用AI_Text_Classification函数,即可对输入的文本进行情感分类。

  • SELECT polar_ai.ai_text_classification('老师今天表扬我了');

    返回结果如下:

    ---
    积极;
  • SELECT polar_ai.ai_text_classification('这家饭店的菜真难吃', '_dashscope/text-classfication/opennlu-v1');

    返回结果如下:

    ---
    消极;

高级进阶

当内置模型无法满足您的业务需求时,可以通过SQL语句在数据库中扩展AI模型,从而实现与更多AI模型服务的交互。

如何实现自定义模型调用

此处以调用百炼中的主题分类模型为例,自定义实现文本主题分类功能。

定义模型输入与输出函数

  1. 准备工作。

  2. 定义模型输入函数。

    模型opennlu-v1 CURL调用命令中'--data'部分为:

    {
      "model": "opennlu-v1",
      "input":{
        "sentence":"国足近5年首次攻破日本队球门!",
        "task": "classification",
        "labels":"体育新闻,娱乐新闻"
      },
      "parameters": {
      }
    }

    JSONmodel项、input/sentenceinput/labels项为必填项,作为函数入参传入,input/task项为固定项,模型输入函数可定义为:

    -- model,sentence,labels项为输入内容,task项固定
    CREATE OR REPLACE FUNCTION my_text_classification_in(model text, content text)
        RETURNS jsonb
        LANGUAGE plpgsql
        AS $function$
        BEGIN
        RETURN ('{"model": "'|| model ||'","input":{"sentence":"'|| content ||'","task": "classification","labels":"体育新闻,时事新闻"},"parameters":{}}')::jsonb;
        END;
        $function$;
  3. 定义模型输出函数。

    Curl调用输出内容示例:

    {
        "output":{
            "text":"体育新闻",
        },
        "usage":{
            "output_tokens":2,
            "input_tokens":11,
            "total_tokens":13
        },
        "request_id":"d89c06fb-46a1-47b6-acb9-bfb17f814969"
    }

    只需要获取output/text项的部分内容即可。因为输出是一个极简单的词语,且不需要做任何处理,因此模型输出函数无需定义。

创建文本主题分类模型

准备好输入函数后,调用AI_CreateModel创建模型。

-- 将"your-api-key"替换成上文准备工作中获取到的API Key即可
-- 输入函数为my_text_classification_in
SELECT polar_ai.ai_createmodel('my_text_classification_model', 'https://dashscope.aliyuncs.com/api/v1/services/nlp/nlu/understanding','Alibaba','OpenNLU开放域文本理解模型','opennlu-v1','{"author_type": "token", "token": "your-api-key"}', NULL,'my_text_classification_in'::regproc,NULL);

SQL方式执行主题分类

根据AI_CallModel自定义模型调用函数:

-- 创建自定义模型调用函数
CREATE OR REPLACE FUNCTION my_text_classification_func(model_id text, content text)
    RETURNS text
    AS $$ select (((polar_ai.AI_CALLMODEL($1,$2)::json)->>'output')::jsonb->>'text')::text as result $$
    LANGUAGE 'sql' IMMUTABLE;

-- 执行主图分类  
SELECT my_text_classification_func('my_text_classification_model', '国足近5年首次攻破日本队球门!');

批量主题分类

对于已经在数据库内的数据,可以批量执行主题分类,详细步骤如下。

  1. 准备测试数据。

    -- 创建表
    CREATE TABLE my_text_classification_tbl(id integer, content text, class text);
    
    -- 插入数据
    INSERT INTO my_text_classification_tbl VALUES(1,'国足近5年首次攻破日本队球门!'),(2,'中国智慧点亮全球治理的拉美时刻'),(3,'王楚钦复仇莫雷加德晋级四强');
  2. 批量主题分类。

    UPDATE my_text_classification_tbl SET class=my_text_classification_func('my_text_classification_model', content);

    执行如下SQL语句查看分类结果。

    SELECT * FROM my_text_classification_tbl;

    返回结果如下:

     id |            content             |  class   
    ----+--------------------------------+----------
      1 | 国足近5年首次攻破日本队球门!     | 体育新闻 
      2 | 中国智慧点亮全球治理的拉美时刻    | 时事新闻 
      3 | 王楚钦复仇莫雷加德晋级四强        | 体育新闻 
    (3 rows)

如何实现批量Embedding及向量检索

此处以调用百炼中的通用文本向量为例,实现批量文本转向量功能,并针对返回结果自定义输出内容。

定义模型输入、输出函数

  1. 准备工作。

  2. 定义模型输入函数。

    通用文本向量模型text-embedding-v2 CURL调用命令中'--data'部分为:

    {
        "model": "text-embedding-v2",
        "input": {
            "texts": [
            "风急天高猿啸哀"
            ]
        },
        "parameters": {
            "text_type": "query"
        }
    }

    以上内容中的model项和input/texts项为必填项,作为函数入参,则模型输入函数可定义为:

    CREATE OR REPLACE FUNCTION my_text_embedding_in(model text, texts text)
        RETURNS jsonb
        LANGUAGE plpgsql
        AS $function$
        BEGIN
        RETURN ('{"model": "'|| model ||'","input":{"texts":["'|| texts ||'"]},"parameters":{"text_type": "query"}}')::jsonb;
        END;
        $function$;
  3. 定义模型输出函数。

    通用文本向量模型text-embedding-v2 CURL调用输出内容为:

    {
      "usage": {
        "total_tokens": 7
      },
      "output": {
        "embeddings": {
          "embedding": [0.004930191827757042, -0.008629344325205105, 0.041976027360927766],
          "text_index": 0
        }
      },
      "request_id": "317ba0d4-6c08-9c24-8725-eebd445def51"
    }

    只需要获取output/embeddings/embedding项的向量部分内容,并保留jsonb格式,则模型输出函数可定义为:

    CREATE OR REPLACE FUNCTION my_text_embedding_out(model_id text, response_json jsonb)
        RETURNS jsonb
        AS $$ select ((((response_json->>'output')::jsonb->>'embeddings')::jsonb)->0->>'embedding')::jsonb as result $$
        LANGUAGE 'sql' IMMUTABLE;

创建自定义文本向量模型

定义模型输入输出函数后,即可通过AI_CreateModel函数在数据库中创建模型。

-- 将"your-api-key"替换成上文准备工作中获取到的API Key即可
SELECT polar_ai.ai_createmodel('my_text_embedding_model', 'https://dashscope.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding','Alibaba','通用文本向量模型','text-embedding-v2','{"author_type": "token", "token": "your-api-key"}', NULL,'my_text_embedding_in'::regproc,'my_text_embedding_out'::regproc);

定义Embedding函数

根据AI_CallModel自定义模型调用函数:

CREATE OR REPLACE FUNCTION my_text_embedding_func(model_id text, texts text)
    RETURNS float8[]
    AS $$ select array(select json_array_elements_text(polar_ai.AI_CALLMODEL($1,$2)::json))::float8[] as result $$
    LANGUAGE 'sql' IMMUTABLE;

批量文本转向量

对于已经在数据库内的数据,可以批量执行文本转向量并写入向量字段。详细步骤如下。

  1. 创建向量插件。

    CREATE EXTENSION vector;
  2. 创建向量表并插入数据。

    CREATE TABLE my_text_embedding_tbl(id int, content text, vec vector(1536));
    INSERT INTO my_text_embedding_tbl VALUES(1,'PolarDB是阿里巴巴自研的新一代云原生数据库,在存储计算分离架构下,利用了软硬件结合的优势,为用户提供具备极致弹性、高性能、海量存储、安全可靠的数据库服务。'),(2,'postgresql是一种开源的关系型数据库管理系统,由PostgreSQL Global Development Group开发,由Perl编写。');
  3. 批量执行文本转向量并写入表。

    UPDATE my_text_embedding_tbl set vec=my_text_embedding_func('my_text_embedding_model', content);

向量检索

将文本转成向量后,可利用PGVector(向量检索)进行快速、准确地检索相似文本。

  1. 创建向量索引。

    CREATE INDEX ON my_text_embedding_tbl USING hnsw (vec vector_l2_ops);
  2. 根据内容进行检索。

    SELECT content FROM my_text_embedding_tbl WHERE vec <=> my_text_embedding_func('my_text_embedding_model', 'PolarDB数据库架构是怎么样的?')::vector(1536) < 0.5;

    返回结果如下:

    ----
    PolarDB是阿里巴巴自研的新一代云原生数据库,在存储计算分离架构下,利用了软硬件结合的优势,为用户提供具备极致弹性、高性能、海量存储、安全可靠的数据库服务。
    (1 row)

综上,已完成Polar_AI功能初步体验。如需进一步帮助,请联系我们