向量生成(rds_embedding)

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

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

背景

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

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

前提条件

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

    说明

    暂不支持RDS PostgreSQL 17。

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

  • 本文使用的模型为阿里云模型服务灵积(dashscope)提供的通用文本向量模型,请先前往模型服务灵积管理控制台开通服务,并获取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;

使用示例

  1. 创建测试表(test)。

    CREATE TABLE test(info text, vec vector(1536) NOT NULL);
  2. 插入文本和其对应的向量数据。

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

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

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

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

    返回结果示例:

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

相关参考

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

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

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

POST传入的参数如下:

参数

示例值

说明

location

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

模型的URL地址。此处为模型服务灵积官方文档中embedding模型的HTTP请求URL地址。

header

  • Authorization: Bearer sk-9****6

  • Content-Type: application/json

  • POST请求关于Authorization的内容。

    格式:Authorization: Bearer <dashscoped的API-KEY>

    说明

    获取API-KEY的具体操作,请参见API-KEY的获取与配置

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

data

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

POST请求Body部分的内容。

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

    dashscope_1

    模型名称。

    murl

    text

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

    模型的URL地址。

    此处为模型服务灵积官方文档中embedding模型的HTTP请求URL地址。

    mauth_header_template

    text

    Authorization: Bearer sk-9****6

    POST请求Authorization的内容。

    格式:Authorization: Bearer <dashscoped的API-KEY>

    说明

    获取API-KEY的具体操作,请参见API-KEY的获取与配置

    mbody_template

    text

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

    POST请求Body部分的内容。

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

    • model:调用模型名称。

      可前往模型服务灵积官方文档查看embedding模型的英文名称。

    • parameters:请求的其他参数,不同模型参数不同,可前往模型服务灵积官方文档查看embedding模型的请求参数。

    membedding_path

    text

    ->"output"->"embeddings"->0->>"embedding"

    从Response获取embedding的路径。

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

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

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

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

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

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

    • 具体返回的JSON结果可前往模型服务灵积官方文档查看embedding模型的响应示例。

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

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

    参数

    参数类型

    示例值

    说明

    mname

    text

    dashscope_1

    模型名称。

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

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

    参数

    参数类型

    示例值

    说明

    mname

    text

    dashscope_1

    模型名称。

    api-key

    text

    sk-9****6

    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暂未开放。