此azure_ai延伸模組藉由整合 Azure AI 服務的強大功能,在適用於 PostgreSQL 的 Azure 資料庫中新增使用大型語言模型 (LLM) 和建置產生式 AI 應用程式的能力。
生成式 AI 是一種形式的人工智慧,其中會訓練 LLM,以根據自然語言輸入產生原始內容。 藉由使用 azure_ai 擴充功能,您可以使用產生 AI 的功能,直接從資料庫處理自然語言查詢。
本文展示如何使用 azure_ai 延伸模組,將豐富的 AI 功能新增至適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體。 它示範如何使用擴充功能,將 Azure OpenAI 和 Azure AI 語言服務 整合至您的資料庫。
先決條件
Azure 訂用帳戶。 免費建立一個。
在所需的 Azure 訂用帳戶中授與 Azure OpenAI 的存取權。 應用程式目前會授與此服務的存取權。 您可以完成 Azure OpenAI 服務有限存取中的表單,以申請 Azure OpenAI 存取權。
已部署
text-embedding-ada-002(版本 2) 模型的 Azure OpenAI 資源。 此模型目前僅適用於 特定區域。 如果您沒有資源,建立資源的程序記載於 Azure OpenAI 資源部署指南中。Azure AI 語言資源。 如果您沒有語言資源,您可以遵循快速入門中提供的摘要指示,在 Azure 入口網站中建立一個資源。 您可以使用免費定價層 (
Free F0) 來試用服務,之後可升級至付費層以用於實際執行環境。Azure 訂用帳戶中適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體。 如果您沒有此資源,請參閱 建立適用於 PostgreSQL 的 Azure 資料庫。
在 Azure Cloud Shell 中使用 psql 連線到資料庫
在網頁瀏覽器中開啟 Azure Cloud Shell。 選取 [Bash] 作為環境。 如果系統提示您,請選取您用於適用於 PostgreSQL 的 Azure 資料庫的訂用帳戶,然後選取 [ 建立記憶體]。
若要擷取資料庫連線詳細資料:
在 Azure 入口網站中,移至您的適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體。
在左側功能表上的 [ 設定] 底下,選取 [ 連線]。 複製 [ 連線詳細數據 ] 區塊。
將環境變數複製的宣告行貼到 Azure Cloud Shell 終端機中。 將
{your-password}令牌取代為您在建立資料庫時所設定的密碼。export PGHOST={your-server-name}.postgresql.database.azure.com export PGUSER={your-user-name} export PGPORT=5432 export PGDATABASE={your-database-name} export PGPASSWORD="{your-password}"使用 psql 命令行工具連線到您的資料庫。 在命令提示字元中輸入以下命令:
psql
安裝azure_ai擴充功能
您可以使用擴充 azure_ai 功能,將 Azure OpenAI 和 Azure 認知服務整合到您的資料庫中。 如需詳細資訊,請參閱 在適用於PostgreSQL的 Azure 資料庫中使用 Azure OpenAI 產生向量內嵌。
若要在您的資料庫中開啟擴充功能:
檢查azure_ai擴充功能中的物件
檢閱延伸模組所包含的物件 azure_ai ,可以進一步瞭解其提供的功能。 您可以從命令提示字元使用\dx中繼命令psql來列出延伸模組中的物件:
\dx+ azure_ai
meta-command 輸出顯示 azure_ai 延伸模組會在資料庫中建立三個結構描述、多個使用者定義的函式 (UDF),以及數個複合類型。 下表描述擴充功能新增的架構:
| 結構描述 | 說明 |
|---|---|
azure_ai |
提供設定資料表和 UDF 用來與其互動所在的主體結構描述。 |
azure_openai |
包含啟用呼叫 Azure OpenAI 端點的 UDF。 |
azure_cognitive |
提供與將資料庫與 Azure 認知服務整合相關的 UDF 和複合類型。 |
函式和類型全都與其中一個結構描述相關聯。 若要檢閱架構中 azure_ai 定義的函式,請使用 \df meta-command。 指定應該顯示函式的結構描述。
\x auto命令會在\df命令之前自動啟動和關閉展開顯示,以便讓命令的輸出更容易在 Azure Cloud Shell 中檢視。
\x auto
\df+ azure_ai.*
使用函式 azure_ai.set_setting() 來設定 Azure AI 服務的端點和重要值。 它會接受索引鍵和要指派的值。 函式 azure_ai.get_setting() 提供一種方式來取得您使用函式 set_setting() 設定的值。 它接受您想要查看的設定鍵值。 針對這兩個方法,索引鍵必須是下列其中一項:
| Key | 說明 |
|---|---|
azure_openai.endpoint |
支援的 Azure OpenAI 端點 (例如 , https://example.openai.azure.com)。 |
azure_openai.subscription_key |
Azure OpenAI 資源的訂用帳戶密鑰。 |
azure_cognitive.endpoint |
支援的認知服務端點 (例如,https://example.cognitiveservices.azure.com)。 |
azure_cognitive.subscription_key |
認知服務資源的訂用帳戶金鑰。 |
重要事項
因為 Azure AI 服務的連線資訊,包括 API 金鑰,會儲存在資料庫中的組態數據表中, azure_ai 擴充功能會定義稱為 azure_ai_settings_manager 的角色,以協助確保此資訊受到保護,且只能供具有該角色的使用者存取。 此角色可讓您讀取和寫入與延伸模組相關的設定。
只有超級使用者和 azure_ai_settings_manager 角色的成員可以叫用 azure_ai.get_setting() 和 azure_ai.set_setting() 函式。 在適用於PostgreSQL的 Azure 資料庫中,所有系統管理員使用者都有 azure_ai_settings_manager 角色。
使用 Azure OpenAI 產生向量內嵌
azure_ai 延伸模組的 azure_openai 結構描述可讓您使用 Azure OpenAI 來建立文字值的向量內嵌。 藉由使用此架構,您可以直接從資料庫 產生 Azure OpenAI 的內嵌 ,以建立輸入文字的向量表示法。 然後,這些表示可用於向量相似度搜尋,並由機器學習模型取用。
內嵌是使用機器學習模型來評估相關資訊接近程度的一種技術。 這項技術可讓您有效率地識別數據之間的關聯性和相似性,讓演算法能夠識別模式並做出精確的預測。
設定 Azure OpenAI 端點和金鑰
使用函式 azure_openai 之前,請使用您的 Azure OpenAI 服務端點和密鑰來設定擴充功能:
在 Azure 入口網站,前往您的 Azure OpenAI 資源。 在左側功能表的 [ 資源管理] 底下,選取 [ 金鑰和端點]。
複製您的端點和存取金鑰。 您可以使用
KEY1或KEY2。 隨時持有兩個金鑰可讓您安全地輪替和重新產生金鑰,而不會造成服務中斷。在下列命令中,將
{endpoint}和{api-key}標記替換成您從 Azure 入口網站擷取的值。 然後,從psql命令提示字元執行命令,將值新增至組態數據表。SELECT azure_ai.set_setting('azure_openai.endpoint','{endpoint}'); SELECT azure_ai.set_setting('azure_openai.subscription_key', '{api-key}');驗證在設定資料表中寫入的設定:
SELECT azure_ai.get_setting('azure_openai.endpoint'); SELECT azure_ai.get_setting('azure_openai.subscription_key');
azure_ai 延伸模組現在已連線到您的 Azure OpenAI 帳戶,並準備好產生向量內嵌。
使用範例資料填入資料庫
本文使用 BillSum 數據集 的一小部分來提供產生向量的範例文字數據。 此數據集提供美國國會和加州州法案的清單。 您可以從 Azure 範例的 GitHub 儲存庫下載包含此資料的bill_sum_data.csv檔案。
若要在資料庫中裝載範例數據,請建立名為 的 bill_summaries數據表:
CREATE TABLE bill_summaries
(
id bigint PRIMARY KEY,
bill_id text,
bill_text text,
summary text,
title text,
text_len bigint,
sum_len bigint
);
從命令提示字元使用 PostgreSQL COPY 命令psql,將 CSV 檔案bill_summaries中的範例數據載入資料表。 指定 CSV 檔案的第一個資料列是標頭數據列。
\COPY bill_summaries (id, bill_id, bill_text, summary, title, text_len, sum_len) FROM PROGRAM 'curl "https://raw.githubusercontent.com/Azure-Samples/Azure-OpenAI-Docs-Samples/main/Samples/Tutorials/Embeddings/data/bill_sum_data.csv"' WITH CSV HEADER ENCODING 'UTF8'
啟用向量支援
您可以使用 azure_ai 擴充套件來產生輸入文字的嵌入向量。 若要讓產生的向量與資料庫中其餘的數據一起儲存,您必須安裝 pgvector 延伸模組。 請遵循 文件中關於在您的資料庫中啟用向量支援的指引。
在資料庫中加入了向量支援後,使用bill_summaries資料類型在vector資料表中新增一個欄位,以儲存嵌入。 模型 text-embedding-ada-002 會產生具有 1,536 個維度的向量,因此您必須指定 1536 為向量大小。
ALTER TABLE bill_summaries
ADD COLUMN bill_vector vector(1536);
產生和儲存向量
bill_summaries 資料表現在已準備好儲存內嵌。 藉由使用azure_openai.create_embeddings() 函數,您可以為bill_text 字段建立向量,並將其插入 bill_vector 表格中新建立的 bill_summaries 欄。
使用 函 create_embeddings() 式之前,請執行下列命令來檢查它並檢閱必要的自變數:
\df+ azure_openai.*
在命令Argument data types的輸出中,\df+ azure_openai.*屬性會顯示函式預期的參數清單:
| 論點 | 類型 | 預設 | 說明 |
|---|---|---|---|
deployment_name |
text |
Azure AI Foundry 入口網站中包含 text-embeddings-ada-002 模型的部署名稱。 |
|
input |
text |
用來建立內嵌的輸入文字。 | |
timeout_ms |
integer |
3600000 |
逾時以毫秒為單位,之後即停止作業。 |
throw_on_error |
boolean |
true |
旗標,指出函式是否應該在發生錯誤時擲回會導致包裝交易復原的例外狀況。 |
第一個自變數是 deployment_name 值,這是在 Azure OpenAI 帳戶中部署內嵌模型時指派的值。 若要擷取此值:
在 Azure 入口網站中前往 Azure OpenAI 資源。
在左側功能表的 [ 資源管理] 底下,選取 [模型部署 ] 以開啟 Azure AI Foundry 入口網站。
在 Azure AI Foundry 入口網站中,選取 [ 部署]。 在 [部署] 窗格中,複製與模型部署相關聯的
text-embedding-ada-002值。
使用這項資訊,執行查詢來更新數據表中的每個 bill_summaries 記錄。 使用 bill_text 函式,將生成的向量內嵌插入 bill_vector 欄位中的 azure_openai.create_embeddings() 欄。 將 {your-deployment-name} 取代為您從 Azure AI Foundry 入口網站的 [部署] 窗格複製的 [部署名稱] 值。 然後執行下列命令:
UPDATE bill_summaries b
SET bill_vector = azure_openai.create_embeddings('{your-deployment-name}', b.bill_text);
執行下列查詢,以檢視針對數據表中第一筆記錄所產生的內嵌。 如果輸出難以讀取,您可以先執行 \x。
SELECT bill_vector FROM bill_summaries LIMIT 1;
每個嵌入都是浮點數組成的向量。 向量空間中兩個內嵌之間的距離與原始格式兩個輸入之間的語意相似性相互關聯。
執行向量相似性搜尋
向量相似性是測量兩個專案相似程度的方法,方法是將其表示為向量。 向量是一系列數位。 它們通常用來透過 LLM 執行搜尋。
向量相似度通常是透過距離計量來計算,例如:
- Euclidean 距離:測量 n 維空間中兩個向量之間的直線距離。
- 餘弦相似度:測量兩個向量之間角度的餘弦值。
透過餘弦距離和vector 在 bill_summaries 上建立索引,以更有效率地搜尋 欄位。 HNSW 允許 pgvector 使用最新的圖表型演算法來靠近最接近的鄰近查詢。
CREATE INDEX ON bill_summaries USING hnsw (bill_vector vector_cosine_ops);
現在,您已準備好對資料庫執行 餘弦相似度 搜尋查詢。
在下列查詢中,會針對輸入問題產生內嵌,然後轉換成向量陣列 (::vector)。 向量數位可讓問題與儲存在數據表中的 bill_summaries 向量進行比較。
SELECT bill_id, title FROM bill_summaries
ORDER BY bill_vector <=> azure_openai.create_embeddings('embeddings', 'Show me bills relating to veterans entrepreneurship.')::vector
LIMIT 3;
查詢會使用 <=>向量運算符。 這個運算元代表餘弦距離運算符,用來計算多維度空間中兩個向量之間的距離。
整合 Azure 認知服務
延伸模組架構azure_cognitive中包含的 azure_ai Azure AI 服務整合提供一組豐富的 AI 語言功能,可讓您直接從數據庫存取。 功能包括情感分析、語言偵測、關鍵片語擷取、實體辨識和文字摘要。 對這些功能的存取權會透過 Azure AI 語言服務啟用。
若要檢閱您可以透過延伸模組存取的完整 Azure AI 功能,請參閱 整合適用於 PostgreSQL 的 Azure 資料庫與 Azure 認知服務。
設定 Azure AI 語言服務端點和金鑰
如同函式 azure_openai ,若要使用 azure_ai 擴充功能成功對 Azure AI 服務進行呼叫,您必須提供 Azure AI 語言服務資源的端點和密鑰:
在 Azure 入口網站中,移至您的語言服務資源。
在左側功能表的 [ 資源管理] 底下,選取 [ 金鑰和端點]。
複製您的端點和存取金鑰。 您可以使用
KEY1或KEY2。在
psql命令提示字元中,執行下列命令,將值新增至組態數據表。 將{endpoint}和{api-key}權杖取代為您從 Azure 入口網站擷取的值。SELECT azure_ai.set_setting('azure_cognitive.endpoint','{endpoint}'); SELECT azure_ai.set_setting('azure_cognitive.subscription_key', '{api-key}');
摘要帳單
若要示範延伸模組 azure_cognitive 的某些 azure_ai 功能,您可以產生每個帳單的摘要。 架構 azure_cognitive 提供兩個函式來摘要文字:
-
summarize_abstractive:抽象摘要會產生摘要,從輸入文字擷取主要概念,但可能不會使用相同的單字。 -
summarize_extractive:擷取摘要會藉由從輸入文字擷取重要句子來組合摘要。
若要使用 Azure AI 語言服務的功能來產生新的原始內容,您可以使用 summarize_abstractive 函式來建立文字輸入的摘要。 再次使用來自 \df 的 psql meta-command,這次特別查看 azure_cognitive.summarize_abstractive 函式:
\df azure_cognitive.summarize_abstractive
在命令Argument data types的輸出中,\df azure_cognitive.summarize_abstractive屬性會顯示函式預期的參數清單:
| 論點 | 類型 | 預設 | 說明 |
|---|---|---|---|
text |
text |
要摘要的輸入文字。 | |
language |
text |
書寫輸入文字所用語言的雙字母 ISO 639-1 表示法。 如需可用值,請檢查 語言功能的支援語言。 | |
timeout_ms |
integer |
3600000 |
逾時以毫秒為單位,之後即停止作業。 |
throw_on_error |
boolean |
true |
旗標,指出函式是否應該在發生錯誤時擲回會導致包裝交易復原的例外狀況。 |
sentence_count |
integer |
3 |
要包含在所產生摘要中的句子數目上限。 |
disable_service_logs |
boolean |
false |
停用語言服務記錄的設定。 語言服務會將您的輸入文字記錄 48 小時,僅用於疑難排解問題。 將此屬性設定為 true 後,輸入記錄會停用,並可能會限制我們調查所發生問題的能力。 如需詳細資訊,請參閱認知服務合規性和隱私權注意事項和Microsoft負責任 AI 原則。 |
函 summarize_abstractive 式需要下列自變數: azure_cognitive.summarize_abstractive(text TEXT, language TEXT)。
下列針對 bill_summaries 數據表的查詢會使用 summarize_abstractive 函式來生成法案文本的新一句話摘要。 它可讓您將生成式 AI 直接地整合到查詢中。
SELECT
bill_id,
azure_cognitive.summarize_abstractive(bill_text, 'en', sentence_count => 1) one_sentence_summary
FROM bill_summaries
WHERE bill_id = '112_hr2873';
您也可以使用 函式將數據寫入資料庫數據表。
bill_summaries修改資料表以加入新的資料行,以將單句摘要儲存在資料庫中:
ALTER TABLE bill_summaries
ADD COLUMN one_sentence_summary TEXT;
接下來,使用摘要更新資料表。
summarize_abstractive 函式會傳回文字的陣列 (text[])。
array_to_string 函式會將傳回值轉換為其字串表示。 在下列查詢中,throw_on_error 引數會設定為 false。 此設定可讓摘要程序在發生錯誤時繼續。
UPDATE bill_summaries b
SET one_sentence_summary = array_to_string(azure_cognitive.summarize_abstractive(b.bill_text, 'en', throw_on_error => false, sentence_count => 1), ' ', '')
where one_sentence_summary is NULL;
在輸出中,您可能會注意到有關無法產生適當摘要的無效文件的警告。 警告是由於在上述查詢中將 throw_on_error 設定為 false 而產生的。 如果您將該旗標保留為的預設值 true,則查詢會失敗,而且不會將摘要寫入資料庫。 若要檢視擲回警告的記錄,請執行此命令:
SELECT bill_id, one_sentence_summary FROM bill_summaries WHERE one_sentence_summary is NULL;
然後,您可以查詢 bill_summaries 資料表來查看由該 azure_ai 擴充套件為資料表中其他記錄生成的新單句摘要:
SELECT bill_id, one_sentence_summary FROM bill_summaries LIMIT 5;
結論
祝賀! 您剛瞭解如何使用 azure_ai 擴充功能,將大型語言模型和產生的AI功能整合到您的資料庫中。