全部產品
Search
文件中心

ApsaraDB RDS:向量產生(rds_embedding)

更新時間:Jun 19, 2024

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

背景

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

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

前提條件

  • 請確保執行個體大版本滿足要求,本外掛程式具體支援的執行個體大版本,請參見支援外掛程式列表

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

  • 本文使用的模型為開源OpenAI提供的Embeddings模型,請確保您具備API Key,並且RDS PostgreSQL執行個體所處地區支援訪問OpenAI,本文樣本執行個體所處地區為新加坡。

  • 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執行個體的交換器。

        選擇公網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()

  1. 插入文本和其對應的向量資料。

    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()

  1. 計算文本不盡長江滾滾來與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暫未開放。