向量生成(rds_embedding)

您需要在数据库中直接将文本转化为向量时,RDS PostgreSQL的rds_embedding插件为您提供了自定义模型配置和模型调用能力,使文本到向量的转换变得简单快捷,从而满足特定的数据处理需求。

您可以加入RDS PostgreSQL插件交流钉钉群(103525002795),进行咨询、交流和反馈,获取更多关于插件的信息。

背景

嵌入(embedding)是指将高维数据映射为低维表示的过程。在机器学习和自然语言处理中,嵌入通常用于将离散的符号或对象表示为连续的向量空间中的点。

在生成嵌入时,向量数据的值取决于所参照的模型数据,RDS PostgreSQL支持使用rds_embedding插件,将数据库中的文本内容,基于引入的外部模型,生成对应的向量数据,还支持使用向量相似度运算符,计算数据库内文本与模型中指定文本的相似度,实现更多业务场景。

前提条件

  • 实例大版本为RDS PostgreSQL 14或以上。

  • 如实例大版本已满足要求,但仍提示不支持,请升级内核小版本,具体操作,请参见升级内核小版本

  • 本文使用的模型为阿里云大模型服务平台百炼提供的通用文本向量模型,请先前往百炼开通服务,并获取API-KEY。具体操作,请参见获取API Key

    说明

    除了本文使用的通用文本向量模型外,您还可以使用rds_embedding插件提供的函数添加其他模型,具体请参见rds_embedding插件提供的函数

  • RDS PostgreSQL数据库默认不具备访问外部网络的能力,因此,需要为RDS PostgreSQL实例所属的VPC配置NAT网关,使其允许访问外部模型。NAT网关相关信息,请参见使用公网NAT网关SNAT功能访问互联网

    NAT网关配置步骤

    1. 创建NAT网关。

      1. 登录NAT网关管理控制台

      2. 公网NAT网关页面,单击创建公网NAT网关

      3. (可选)首次使用NAT网关时,在公网NAT网关页面关联角色创建区域,单击创建关联角色,创建服务关联角色。角色创建成功后即可创建NAT网关。

      4. 在创建公网NAT网关页面,配置以下购买信息,然后单击立即购买

        说明

        下表仅列出关键参数,所有参数的具体信息,请参见使用公网NAT网关SNAT功能访问互联网

        配置

        说明

        所属地域

        选择需要创建公网NAT网关的地域,需要与RDS PostgreSQL实例同一地域。

        所属专有网络

        选择公网NAT网关实例所属的VPC,需要与RDS PostgreSQL实例的VPC相同。您可以前往RDS管理控制台的数据库连接页面,查看目标实例的VPC。

        关联交换机

        选择公网NAT网关实例所属的交换机,需要与RDS PostgreSQL实例的交换机相同。您可以前往RDS管理控制台的数据库连接页面,查看目标实例的交换机。

        访问模式

        本文选择稍后配置

      5. 确认订单页面确认公网NAT网关的配置信息,选中服务协议并单击确认订单

        创建成功后,您可以在公网NAT网关页面查看已创建的公网NAT网关实例。创建NAT网关

    2. 为公网NAT网关绑定公网IP(EIP)。

      1. NAT网关管理控制台页面,找到新建的公网NAT网关实例,单击实例ID,进入基本信息页。

      2. 切换至绑定的弹性公网IP页签,单击绑定弹性公网IP

      3. 绑定弹性公网IP弹窗中,选择新购弹性公网IP并绑定绑定弹性公网IP

      4. 单击确定

        绑定成功后,在绑定的弹性公网IP处查看已绑定的弹性公网IP。已绑定的弹性公网IP

    3. 创建SNAT条目。

      1. NAT网关管理控制台页面,找到新建的公网NAT网关实例,单击实例ID,进入基本信息页。

      2. 切换至SNAT管理页签,单击创建SNAT条目

      3. 创建SNAT条目页面,配置以下参数,然后单击确定创建

        配置

        说明

        SNAT条目粒度

        选择SNAT条目的粒度。本文以选择交换机粒度为例:指定交换机下的RDS PostgreSQL实例通过配置的公网IP访问公网。

        选择交换机

        在下拉列表中选择RDS PostgreSQL实例的交换机。

        选择弹性公网IP地址

        选择用来提供公网访问的公网IP。本文以选择使用单个IP为例,在下拉列表中选择已绑定的EIP。

        创建成功后,在SNAT条目列表处查看已配置的SNAT条目。已配置的SNAT

插件开启与关闭

说明

请使用高权限账号执行如下命令。

  • 开启插件。

    开启rds_embedding插件前,需要先开启vector 插件,vector插件提供了必要的向量数据类型支持和基础向量操作能力(计算向量之间的距离、相似度等),rds_embedding插件专注于将高维文本数据转化为向量。

    CREATE EXTENSION vector;
    CREATE EXTENSION rds_embedding;
  • 关闭插件。

    DROP EXTENSION rds_embedding;
    DROP EXTENSION vector;

使用示例

本文以阿里云大模型服务平台百炼提供的通用文本向量模型text-embedding-v3版本为例。更多通用文本向量模型请参见模型介绍

  1. 创建测试表test。

    CREATE TABLE test(info text, vec vector(1024) NOT NULL);
  2. 添加模型。

    SELECT rds_embedding.add_model(
        'text-embedding-v3',
        'https://dashscope.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding',
        'Authorization: Bearer sk-****',
        '{"input":{"texts":["%s"]},"model":"text-embedding-v3","parameters":{"text_type":"query"}}',
        '->''output''->''embeddings''->0->>''embedding'''
    );
    说明

    函数rds_embedding.add_model()的具体使用方法,请参见rds_embedding.add_model()

  3. 插入文本和其对应的向量数据。

    INSERT INTO test SELECT '风急天高猿啸哀', rds_embedding.get_embedding_by_model('text-embedding-v3', 'sk-****', '风急天高猿啸哀')::real[];
    INSERT INTO test SELECT '渚清沙白鸟飞回', rds_embedding.get_embedding_by_model('text-embedding-v3', 'sk-****', '渚清沙白鸟飞回')::real[];
    INSERT INTO test SELECT '无边落木萧萧下', rds_embedding.get_embedding_by_model('text-embedding-v3', 'sk-****', '无边落木萧萧下')::real[];
    INSERT INTO test SELECT '不尽长江滚滚来', rds_embedding.get_embedding_by_model('text-embedding-v3', 'sk-****', '不尽长江滚滚来')::real[];
    说明

    函数rds_embedding.get_embedding_by_model()的具体使用方法,请参见rds_embedding.get_embedding_by_model()

  4. 计算文本不尽长江滚滚来与test表中各文本的向量相似度。

    SELECT 
        info, 
        vec <=> rds_embedding.get_embedding_by_model(
            'text-embedding-v3', 
            'sk-****', 
            '不尽长江滚滚来'
        )::real[]::vector AS distance 
    FROM 
        test 
    ORDER BY 
        vec <=> rds_embedding.get_embedding_by_model(
            'text-embedding-v3', 
            'sk-****', 
            '不尽长江滚滚来'
        )::real[]::vector;

    返回结果示例:

          info      |      distance
    ----------------+--------------------
     不尽长江滚滚来 |                  0
     无边落木萧萧下 | 0.42740682200152647
     风急天高猿啸哀 | 0.5247695147991147
     渚清沙白鸟飞回 | 0.5161883811726116
    (4 rows)

相关参考

通过HTTP请求获取文本的嵌入向量

使用curl命令,向text-embedding-v3模型的URL地址发送POST请求,获取到对应文本的嵌入向量。

curl --location 'https://dashscope.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding' \
--header 'Authorization: Bearer <API-KEY>' \
--header 'Content-Type: application/json' \
--data '{
    "model": "text-embedding-v3",
    "input": {
        "texts": [
        "风急天高猿啸哀",
        "渚清沙白鸟飞回", 
        "无边落木萧萧下", 
        "不尽长江滚滚来"
        ]
    },
    "parameters": {
    		"text_type": "query"
    }
}'

POST传入的参数如下:

参数

示例值

说明

location

https://dashscope.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding

模型的URL地址。此处为通用文本向量模型的HTTP请求URL地址。

header

  • Authorization: Bearer sk-****

  • Content-Type: application/json

  • POST请求关于Authorization的内容。

    格式:Authorization: Bearer <API-KEY>

    说明

    获取API-KEY的具体操作,请参见获取API Key

  • Content-Type:请求类型,固定为application/json

data

  • "model": "text-embedding-v3"
  • "input": {
        "texts": [
        "风急天高猿啸哀",
        "渚清沙白鸟飞回", 
        "无边落木萧萧下", 
        "不尽长江滚滚来"
       ]
    }
  • "parameters": {
        "text_type": "query"
    }

POST请求Body部分的内容。您可以前往通用文本向量查看不同模型的Body部分。

  • model:调用模型名称。

  • input.texts:文本内容。

  • parameters:请求的其他参数,不同模型参数不同。

rds_embedding插件提供的函数

您可以通过psql命令\dx+ rds_embedding查询该插件支持的所有函数。

             Objects in extension "rds_embedding"
                      Object description
---------------------------------------------------------------
 function rds_embedding.add_model(text,text,text,text,text)
 function rds_embedding.del_model(text)
 function rds_embedding.get_embedding_by_model(text,text,text)
 function rds_embedding.get_response_by_model(text,text,text)
 function rds_embedding.show_models()
 function rds_embedding.update_model(text,text,text,text,text)
 schema rds_embedding
 table rds_embedding.models
(8 rows)

各函数作用:

  • rds_embedding.add_model():向rds_embedding.models表中添加模型。

    调用函数时,传入的参数如下:

    参数

    参数类型

    示例值

    说明

    mname

    text

    text-embedding-v3

    模型名称。

    murl

    text

    https://dashscope.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding

    模型的URL地址。

    此处为通用文本向量的HTTP请求URL地址。

    mauth_header_template

    text

    Authorization: Bearer sk-****

    POST请求Authorization的内容。

    格式:Authorization: Bearer <API-KEY>

    说明

    获取API-KEY的具体操作,请参见获取API Key

    mbody_template

    text

    {
      "input":{
        "texts":["%s"]
      },
        "model":"text-embedding-v3",
        "parameters":{
           "text_type":"query"
        }
    }

    POST请求Body部分的内容。您可以前往通用文本向量查看不同模型的Body部分。

    • input.texts:文本内容,使用%s占位符,用于在实际使用时替换为具体的文本。

    • model:调用模型名称。

    • parameters:请求的其他参数,不同模型参数不同。

    membedding_path

    text

    ->''output''->''embeddings''->0->>''embedding''

    从Response获取embedding的路径。

    示例表达式用于从返回的JSON结果中提取嵌入向量的值。

    • output:表示JSON对象中的一个键,该键对应的值是一个对象。

    • embeddings:表示output对象中的一个键,该键对应的值是一个数组。

    • 0:表示embeddings数组中的第一个元素。

    • embedding:表示数组元素中的一个键,该键对应的值是一个字符串。

    重要
    • 这个表达式在使用之前需要确保返回的JSON结果中有对应的路径结构,否则可能会导致提取失败或出现错误。

    • 具体返回的JSON结果可前往通用文本向量文档查看模型的响应示例。

  • rds_embedding.del_model():删除rds_embedding.models表中的模型。

    调用函数时,传入的参数如下:

    参数

    参数类型

    示例值

    说明

    mname

    text

    text-embedding-v3

    模型名称。

  • rds_embedding.get_embedding_by_model():获取指定文本的向量值。

    调用函数时,传入的参数如下:

    参数

    参数类型

    示例值

    说明

    mname

    text

    text-embedding-v3

    模型名称。

    api-key

    text

    sk-****

    API-KEY。

    获取API-KEY的具体操作,请参见获取API Key

    texts

    text

    风急天高猿啸哀

    待获取向量值的指定文本。

  • rds_embedding.show_models:展示rds_embedding.models表中的模型。

  • rds_embedding.update_model:更新rds_embedding.models表中的模型。

    调用函数时,传入的参数同rds_embedding.add_model。

说明

rds_embedding.get_response_by_model暂未开放。