全部产品
Search
文档中心

云数据库 RDS:向量生成(rds_embedding)

更新时间:Nov 13, 2024

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

背景

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

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

前提条件

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

    说明

    暂不支持RDS PostgreSQL 17。

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

  • 本文使用的模型为开源OpenAI提供的Embeddings模型,请确保您具备API Key,并且RDS PostgreSQL实例所处地域支持访问OpenAI,本文示例实例所处地域为新加坡。

  • 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. 添加模型。

    SELECT rds_embedding.add_model('text-embedding-ada-002','https://api.openai.com/v1/embeddings','Authorization: Bearer sk-****P','{"input":{"texts":["%s"]},"model":"text-embedding-v1"}','->"data"->0->>"embedding"');
    说明
    • 本文使用的模型为开源OpenAI提供的Embeddings模型,请确保您具备API Key,并且RDS PostgreSQL实例所处地域支持访问OpenAI,本文示例实例所处地域为新加坡。

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

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

    INSERT INTO test SELECT '风急天高猿啸哀', rds_embedding.get_embedding_by_model('text-embedding-ada-002', 'sk-****P', '风急天高猿啸哀')::real[];
    INSERT INTO test SELECT '渚清沙白鸟飞回', rds_embedding.get_embedding_by_model('text-embedding-ada-002', 'sk-****P', '渚清沙白鸟飞回')::real[];
    INSERT INTO test SELECT '无边落木萧萧下', rds_embedding.get_embedding_by_model('text-embedding-ada-002', 'sk-****P', '无边落木萧萧下')::real[];
    INSERT INTO test SELECT '不尽长江滚滚来', rds_embedding.get_embedding_by_model('text-embedding-ada-002', 'sk-****P', '不尽长江滚滚来')::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-ada-002', 'sk-****P', '不尽长江滚滚来')::real[]::vector AS distance FROM test ORDER BY vec <=> rds_embedding.get_embedding_by_model('text-embedding-ada-002', 'sk-****P', '不尽长江滚滚来')::real[]::vector;

    返回结果示例:

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

相关参考

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

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

curl https://api.openai.com/v1/embeddings \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "input": "Your text string goes here",
    "model": "text-embedding-ada-002"
  }'

POST传入的参数如下:

参数

示例值

说明

location

https://api.openai.com/v1/embeddings

模型的URL地址。此处为OpenAI官方文档中embedding模型的HTTP请求URL地址。

-H

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

  • Content-Type: application/json

  • POST请求关于Authorization的内容。

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

    说明

    获取API-KEY的具体操作,请参见OpenAI官方网站

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

-d

  • "input": "Your text string goes here"
  • "model": "text-embedding-ada-002"

POST请求Body部分的内容。

  • input:文本内容。

  • model:调用模型名称。

    可前往OpenAI官方文档查看embedding模型的英文名称。

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-ada-002

    模型名称。

    murl

    text

    https://api.openai.com/v1/embeddings

    模型的URL地址。

    此处为OpenAI官方文档中embedding模型的HTTP请求URL地址。

    mauth_header_template

    text

    Authorization: Bearer sk-9****6

    POST请求Authorization的内容。

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

    说明

    获取API-KEY的具体操作,请参见OpenAI官方网站

    mbody_template

    text

    {
      "input":{
        "texts":["%s"]
      },
        "model":"text-embedding-ada-002"
    }

    POST请求Body部分的内容。

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

    • model:调用模型名称。

      可前往OpenAI官方文档查看embedding模型的英文名称。

    membedding_path

    text

    ->"data"->0->>"embedding"

    从Response获取embedding的路径。

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

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

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

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

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

    参数

    参数类型

    示例值

    说明

    mname

    text

    text-embedding-ada-002

    模型名称。

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

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

    参数

    参数类型

    示例值

    说明

    mname

    text

    text-embedding-ada-002

    模型名称。

    api-key

    text

    sk-9****6

    API-KEY。

    获取API-KEY的具体操作,请参见OpenAI官方网站

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