使用入门

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

前提条件

支持的PolarDB PostgreSQL的版本如下:

  • PostgreSQL 16(内核小版本2.0.16.6.2.0及以上)

  • PostgreSQL 15(内核小版本2.0.15.12.4.0及以上)

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

说明

您可在控制台查看内核小版本号,也可以通过SHOW polardb_version;语句查看。如未满足内核小版本要求,请升级内核小版本

基本概念

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

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

优势说明

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

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

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

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

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

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

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

快速入门

创建扩展

请使用高权限账号执行如下语句:

CREATE EXTENSION IF NOT EXISTS polar_ai;

了解内置模型

重要

当前仅支持华北2(北京)区域的PolarDB PostgreSQL标准版集群调用内置模型。对于其他区域及版本,您可以创建自定义模型进行调用。

内置模型是指在创建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文本理解模型,适用于中文、英文零样本条件下进行文本理解任务,如信息抽取、文本分类等。

如何快速执行文本转向量

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

说明

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

  1. 绑定Token

    首次调用内置模型前,需先前往阿里云大模型服务平台百炼开通服务,并获取API Key。随后,执行如下SQL命令将您的API-KEY绑定到指定模型中。返回t代表执行成功,f代表执行失败。

    SELECT polar_ai.AI_SetModelToken('_dashscope/text_embedding/text_embedding_v2', '<YOUR_API_KEY>');
  2. 修改模型调用地址

    执行以下SQL命令修改内置模型_dashscope/text_embedding/text_embedding_v2的模型调用地址,将原有地址替换为阿里云大模型服务平台百炼的私网连接(PrivateLink),即将https://dashscope.aliyuncs.com更改为https://vpc-cn-beijing.dashscope.aliyuncs.com

    SELECT polar_ai.AI_AlterModel('_dashscope/text_embedding/text_embedding_v2', model_url=>'https://vpc-cn-beijing.dashscope.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding');
  3. 通过SQL语句执行Embedding

    调用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}

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

  1. 绑定Token

    首次调用内置模型前,需先前往阿里云大模型服务平台百炼开通服务,并获取API Key。随后,执行如下SQL命令将您的API-KEY绑定到指定模型中。返回t代表执行成功,f代表执行失败。

    SELECT polar_ai.AI_SetModelToken('_dashscope/text-classfication/opennlu-v1', '<YOUR_API_KEY>');
  2. 修改模型调用地址

    执行以下SQL命令修改内置模型_dashscope/text-classfication/opennlu-v1的模型调用地址,将原有地址替换为阿里云大模型服务平台百炼的私网连接(PrivateLink),即将https://dashscope.aliyuncs.com更改为https://vpc-cn-beijing.dashscope.aliyuncs.com

    SELECT polar_ai.AI_AlterModel('_dashscope/text-classfication/opennlu-v1', model_url=>'https://vpc-cn-beijing.dashscope.aliyuncs.com/api/v1/services/nlp/nlu/understanding');
  3. 通过SQL语句执行文本情感分类

    调用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. 定义模型输入与输出函数

    • 模型输入函数:

      在使用HTTP调用opennlu-v1模型时,请求体的内容示例如下所示:

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

      请求体中,参数modelinput.sentenceinput.labels为必填项。此外,input.task项作为模型入参,固定为classification。则模型输入函数可定义为:

      -- model, input.sentence, input.labels项为输入内容,input.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$;
    • 模型输出函数:

      在使用HTTP调用opennlu-v1模型时,请求输出内容示例如下所示:

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

      由于仅需获取output.text项的内容,且输出为一个极为简单的词语,无需进行任何处理,因此模型输出函数无需定义。

  3. 创建文本分类模型

    调用AI_CreateModel创建模型。在创建模型的过程中,需对以下参数进行调整:

    • 模型调用地址model_url域名修改,将OpenNLUHTTP调用域名的替换为阿里云大模型服务平台百炼的私网连接(PrivateLink),即将https://dashscope.aliyuncs.com更改为http://vpc-cn-beijing.dashscope.aliyuncs.com

    • 模型配置信息model_config中的token替换为您阿里云大模型服务平台百炼的API Key

    • 模型输入转换函数model_in_transform_fn为上述步骤创建的my_text_classification_in函数。

    SELECT polar_ai.ai_createmodel('my_text_classification_model', 'http://vpc-cn-beijing.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);
    说明

    您可以通过查询语句SELECT * FROM polar_ai._ai_models;来查看创建的模型信息。

  4. 创建模型的调用函数

    根据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;
  5. 通过SQL语句执行文档分类

    调用上述创建的函数进行模型调用。

    SELECT my_text_classification_func('my_text_classification_model', '国足近5年首次攻破日本队球门!');

    返回结果如下:

    体育新闻;
  6. (可选)批量文本分类

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

    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. 准备工作

    • 了解如何使用API调用通用文本向量,包括请求的入参及出参。

    • 获取阿里云大模型服务平台百炼的API Key

  2. 定义模型输入与输出函数

    • 在使用HTTP调用text-embedding-v2模型时,请求体的内容示例如下所示:

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

      请求体中,参数modelinput.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$;
    • 定义模型输出函数。

      在使用HTTP调用text-embedding-v2模型时,请求输出内容示例如下所示:

      {
        "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;
  3. 创建文本向量模型

    调用AI_CreateModel创建模型。在创建模型的过程中,需对以下参数进行调整:

    • 模型调用地址model_url域名修改,将通用文本向量的HTTP调用域名的替换为阿里云大模型服务平台百炼的私网连接(PrivateLink),即将https://dashscope.aliyuncs.com更改为http://vpc-cn-beijing.dashscope.aliyuncs.com

    • 模型配置信息model_config中的token替换为您阿里云大模型服务平台百炼的API Key

    • 模型输入转换函数model_in_transform_fn为上述步骤创建的my_text_embedding_in函数。

    • 模型输出转换函数model_out_transform_fn为上述步骤创建的my_text_embedding_out函数。

    SELECT polar_ai.ai_createmodel('my_text_embedding_model', 'http://vpc-cn-beijing.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);
    说明

    您可以通过查询语句SELECT * FROM polar_ai._ai_models;来查看创建的模型信息。

  4. 创建模型的调用函数

    根据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;
  5. 批量文本转向量

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

    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);
  6. 向量检索

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

    1. (可选)创建向量插件。

      说明

      若您在上述步骤已创建向量插件,请忽略当前步骤。

      CREATE EXTENSION vector;
    2. 创建向量索引。

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

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

      返回结果如下:

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

常见问题

调用内置模型报错:ERROR: Failed to connect to dashscope.aliyuncs.com port 443: Connection timed out?

您需要将内置模型的调用地址域名替换为阿里云大模型服务平台百炼的私网连接(PrivateLink),即将https://dashscope.aliyuncs.com更改为http://vpc-cn-beijing.dashscope.aliyuncs.com

说明

如果您是AI_CreateModel创建的自定义模型,并且使用的是阿里云大模型服务平台百炼中的模型,则也需要将域名替换为上述私网连接。

例如:

  • _dashscope/text_embedding/text_embedding_v2

    SELECT polar_ai.AI_AlterModel('_dashscope/text_embedding/text_embedding_v2', model_url=>'http://vpc-cn-beijing.dashscope.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding');
  • _dashscope/text-classfication/opennlu-v1

    SELECT polar_ai.AI_AlterModel('_dashscope/text-classfication/opennlu-v1', model_url=>'http://vpc-cn-beijing.dashscope.aliyuncs.com/api/v1/services/nlp/nlu/understanding');