您需要在數據庫中直接將文本轉化為向量時,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網關。
登錄NAT網關管理控制臺。
在公網NAT網關頁面,單擊創建公網NAT網關。
(可選)首次使用NAT網關時,在公網NAT網關頁面關聯角色創建區域,單擊創建關聯角色,創建服務關聯角色。角色創建成功后即可創建NAT網關。
在創建公網NAT網關頁面,配置以下購買信息,然后單擊立即購買。
說明下表僅列出關鍵參數,所有參數的具體信息,請參見使用公網NAT網關SNAT功能訪問互聯網。
配置
說明
所屬地域
選擇需要創建公網NAT網關的地域,需要與RDS PostgreSQL實例同一地域。
所屬專有網絡
選擇公網NAT網關實例所屬的VPC,需要與RDS PostgreSQL實例的VPC相同。您可以前往RDS管理控制臺的數據庫連接頁面,查看目標實例的VPC。
關聯交換機
選擇公網NAT網關實例所屬的交換機,需要與RDS PostgreSQL實例的交換機相同。您可以前往RDS管理控制臺的數據庫連接頁面,查看目標實例的交換機。
訪問模式
本文選擇稍后配置。
在確認訂單頁面確認公網NAT網關的配置信息,選中服務協議并單擊確認訂單。
創建成功后,您可以在公網NAT網關頁面查看已創建的公網NAT網關實例。
為公網NAT網關綁定公網IP(EIP)。
在NAT網關管理控制臺頁面,找到新建的公網NAT網關實例,單擊實例ID,進入基本信息頁。
切換至綁定的彈性公網IP頁簽,單擊綁定彈性公網IP。
在綁定彈性公網IP彈窗中,選擇新購彈性公網IP并綁定。
單擊確定。
綁定成功后,在綁定的彈性公網IP處查看已綁定的彈性公網IP。
創建SNAT條目。
在NAT網關管理控制臺頁面,找到新建的公網NAT網關實例,單擊實例ID,進入基本信息頁。
切換至SNAT管理頁簽,單擊創建SNAT條目。
在創建SNAT條目頁面,配置以下參數,然后單擊確定創建。
配置
說明
SNAT條目粒度
選擇SNAT條目的粒度。本文以選擇交換機粒度為例:指定交換機下的RDS PostgreSQL實例通過配置的公網IP訪問公網。
選擇交換機
在下拉列表中選擇RDS PostgreSQL實例的交換機。
選擇彈性公網IP地址
選擇用來提供公網訪問的公網IP。本文以選擇使用單個IP為例,在下拉列表中選擇已綁定的EIP。
創建成功后,在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版本為例。更多通用文本向量模型請參見模型介紹。
創建測試表test。
CREATE TABLE test(info text, vec vector(1024) NOT NULL);
添加模型。
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()。
插入文本和其對應的向量數據。
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()。
計算文本
不盡長江滾滾來
與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 |
|
|
data |
| POST請求Body部分的內容。您可以前往通用文本向量查看不同模型的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
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暫未開放。