全部產品
Search
文件中心

ApsaraDB RDS:向量產生(rds_embedding)

更新時間:Dec 19, 2024

您需要在資料庫中直接將文本轉化為向量時,RDS PostgreSQL的rds_embedding外掛程式為您提供了自訂模型配置和模型調用能力,使文本到向量的轉換變得簡單快捷,從而滿足特定的資料處理需求。

背景

嵌入(embedding)是指將高維資料對應為低維表示的過程。在機器學習和自然語言處理中,嵌入通常用於將離散的符號或對象表示為連續的向量空間中的點。

在產生嵌入時,向量資料的值取決於所參照的模型資料,RDS PostgreSQL支援使用rds_embedding外掛程式,將資料庫中的常值內容,基於引入的外部模型,產生對應的向量資料,還支援使用向量相似性運算子,計算資料庫內文本與模型中指定文本的相似性,實現更多業務情境。

前提條件

  • 執行個體大版本為RDS PostgreSQL 14或以上。

  • 如執行個體大版本已滿足要求,但仍提示不支援,請升級核心小版本,具體操作,請參見升級核心小版本

  • 本文使用的模型為阿里雲大模型服務平台百鍊提供的通用文本向量模型,請先前往百鍊開通服務,並擷取API-KEY。具體操作,請參見擷取API Key

    說明

    除了本文使用的通用文本向量模型外,您還可以使用rds_embedding外掛程式提供的函數添加其他模型,具體請參見rds_embedding外掛程式提供的函數

  • RDS PostgreSQL資料庫預設不具備訪問外部網路的能力,因此,需要為RDS PostgreSQL執行個體所屬的VPC配置NAT Gateway,使其允許訪問外部模型。NAT Gateway相關資訊,請參見使用公網NAT GatewaySNAT功能訪問互連網

    NAT Gateway配置步驟

    1. 建立NAT Gateway。

      1. 登入NAT Gateway管理主控台

      2. 公網NAT Gateway頁面,單擊建立公網NAT Gateway

      3. (可選)首次使用NAT Gateway時,在公網NAT Gateway頁面關聯角色建立地區,單擊建立關聯角色,建立服務關聯角色。角色建立成功後即可建立NAT Gateway。

      4. 在建立公網NAT Gateway頁面,配置以下購買資訊,然後單擊立即購買

        說明

        下表僅列出關鍵參數,所有參數的具體資訊,請參見使用公網NAT GatewaySNAT功能訪問互連網

        配置

        說明

        所屬地區

        選擇需要建立公網NAT Gateway的地區,需要與RDS PostgreSQL執行個體同一地區。

        所屬專用網路

        選擇公網NAT Gateway執行個體所屬的VPC,需要與RDS PostgreSQL執行個體的VPC相同。您可以前往RDS管理主控台的資料庫連接頁面,查看目標執行個體的VPC。

        關聯交換器

        選擇公網NAT Gateway執行個體所屬的交換器,需要與RDS PostgreSQL執行個體的交換器相同。您可以前往RDS管理主控台的資料庫連接頁面,查看目標執行個體的交換器。

        訪問模式

        本文選擇稍後配置

      5. 確認訂單頁面確認公網NAT Gateway的配置資訊,選中服務合約並單擊確認訂單

        建立成功後,您可以在公網NAT Gateway頁面查看已建立的公網NAT Gateway執行個體。建立NAT Gateway

    2. 為公網NAT Gateway綁定公網IP(EIP)。

      1. NAT Gateway管理主控台頁面,找到建立的公網NAT Gateway執行個體,單擊執行個體ID,進入基本資料頁。

      2. 切換至綁定的Elastic IP Address頁簽,單擊綁定Elastic IP Address

      3. 綁定Elastic IP Address彈窗中,選擇新購Elastic IP Address並綁定綁定Elastic IP Address

      4. 單擊確定

        綁定成功後,在綁定的Elastic IP Address處查看已綁定的Elastic IP Address。已綁定的Elastic IP Address

    3. 建立SNAT條目。

      1. NAT Gateway管理主控台頁面,找到建立的公網NAT Gateway執行個體,單擊執行個體ID,進入基本資料頁。

      2. 切換至SNAT管理頁簽,單擊建立SNAT條目

      3. 建立SNAT條目頁面,配置以下參數,然後單擊確定建立

        配置

        說明

        SNAT條目粒度

        選擇SNAT條目的粒度。本文以選擇交換器粒度為例:指定交換器下的RDS PostgreSQL執行個體通過配置的公網IP訪問公網。

        選擇交換器

        在下拉式清單中選擇RDS PostgreSQL執行個體的交換器。

        選擇Elastic IP Address地址

        選擇用來提供公網訪問的公網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-intl.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-intl.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-intl.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-intl.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暫未開放。