使用適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器和 Azure OpenAI 的語意搜尋
適用範圍:適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器
本實際操作教學課程示範如何使用 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器和 Azure OpenAI 服務來建置語意搜尋應用程式。 語意搜尋會根據語意進行搜尋;標準語彙搜尋會根據查詢中提供的關鍵字進行搜尋。 例如,您的食譜數據集可能不包含無麩質、素食、無乳製品、無水果或甜點等標籤,但這些特性可以從成分推斷。 這個想法是發出這類語意查詢並獲得相關的搜尋結果。
使用 GenAI 和彈性伺服器在資料上建立語意搜尋功能包含以下步驟:
- 識別搜尋案例。 識別搜尋中將涉及的資料欄位。
- 針對搜尋所涉及的每個資料欄位,建立對應的向量欄位,以儲存儲存在資料欄位中的值內嵌。
- 為所選資料欄位中的資料產生內嵌,並將內嵌儲存在對應的向量欄位中。
- 產生任何指定輸入搜尋查詢的內嵌。
- 搜尋向量資料欄位,並列出最接近的相鄰項目。
- 透過適當的相關性、排名和個人化模型執行結果,以產生最終排名。 如果沒有這類模型,請以遞減點乘積順序來排名結果。
- 監視模型、結果品質和商務計量,例如 CTR(選取率)和停留時間。 納入意見反應機制,以偵錯和改善從資料品質、資料新鮮度和個人化到使用者體驗的搜尋堆疊。
必要條件
- 建立 OpenAI 帳戶,並 要求 Azure OpenAI Service 的存取。
- 在所需的訂用帳戶中授與 Azure OpenAI 的存取權。
- 授與 建立 Azure OpenAI 資源及部署模型 的權限。
建立及部署 Azure OpenAI 服務資源和模型,部署內嵌模型 文字內嵌-ada-002。 複製部署名稱,因為需要用以建立內嵌。
啟用 azure_ai
和 pgvector
延伸模組
在適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體上啟用 azure_ai
和 pgvector
之前,您必須先將它們新增至您的允許清單 (如如何使用 PostgreSQL 延伸模組所述),並執行 SHOW azure.extensions;
來檢查是否已正確新增。
然後,您可以連線到目標資料庫並執行 CREATE EXTENSION 命令來安裝延伸模組。 您需要為每個您希望延伸模組可用的資料庫分別重複該命令。
CREATE EXTENSION azure_ai;
CREATE EXTENSION vector;
設定 OpenAI 端點和金鑰
在 Azure AI 服務中,在 [資源管理]>[金鑰和端點] 下,您可以找到 Azure AI 資源的端點和金鑰。 使用端點和其中一個金鑰來啟用 azure_ai
延伸模組以叫用模型部署。
select azure_ai.set_setting('azure_openai.endpoint','https://<endpoint>.openai.azure.com');
select azure_ai.set_setting('azure_openai.subscription_key', '<API Key>');
下載和匯入資料
- 從 Kaggle 下載資料。
- 線上到您的伺服器並建立
test
資料庫,並在其中建立資料表以匯入數據。 - 匯入資料。
- 將內嵌資料行新增至資料表。
- 產生內嵌。
- 搜尋。
建立資料表
CREATE TABLE public.recipes(
rid integer NOT NULL,
recipe_name text,
prep_time text,
cook_time text,
total_time text,
servings integer,
yield text,
ingredients text,
directions text,
rating real,
url text,
cuisine_path text,
nutrition text,
timing text,
img_src text,
PRIMARY KEY (rid)
);
匯入資料
在用戶端視窗上設定下列環境變數,以將編碼設定為 utf-8。 此步驟是必要的,因為這個特定資料集會使用 WIN1252 編碼。
Rem on Windows
Set PGCLIENTENCODING=utf-8;
# on Unix based operating systems
export PGCLIENTENCODING=utf-8
將資料匯入已建立的資料表中;請注意,此資料集包含標頭資料列:
psql -d <database> -h <host> -U <user> -c "\copy recipes FROM <local recipe data file> DELIMITER ',' CSV HEADER"
新增資料行以儲存內嵌
ALTER TABLE recipes ADD COLUMN embedding vector(1536);
產生內嵌
使用 azure_ai 延伸模組為您的資料產生內嵌。 在下列項目中,我們會將幾個不同的欄位向量化,並串連:
WITH ro AS (
SELECT ro.rid
FROM
recipes ro
WHERE
ro.embedding is null
LIMIT 500
)
UPDATE
recipes r
SET
embedding = azure_openai.create_embeddings('text-embedding-ada-002', r.recipe_name||' '||r.cuisine_path||' '||r.ingredients||' '||r.nutrition||' '||r.directions)
FROM
ro
WHERE
r.rid = ro.rid;
重複命令,直到沒有其他要處理的資料列為止。
提示
探索 LIMIT
的運作。 使用高值時,陳述式可能會因為 Azure OpenAI 所施加的節流而中途失敗。 如果失敗,請至少等候一分鐘,然後再次執行命令。
搜尋
為了方便起見,請在資料庫中建立搜尋函式:
create function
recipe_search(searchQuery text, numResults int)
returns table(
recipeId int,
recipe_name text,
nutrition text,
score real)
as $$
declare
query_embedding vector(1536);
begin
query_embedding := (azure_openai.create_embeddings('text-embedding-ada-002', searchQuery));
return query
select
r.rid,
r.recipe_name,
r.nutrition,
(r.embedding <=> query_embedding)::real as score
from
recipes r
order by score asc limit numResults; -- cosine distance
end $$
language plpgsql;
現在只要叫用函式便可進行搜尋:
select recipeid, recipe_name, score from recipe_search('vegan recipes', 10);
並探索結果:
recipeid | recipe_name | score
----------+--------------------------------------------------------------+------------
829 | Avocado Toast (Vegan) | 0.15672222
836 | Vegetarian Tortilla Soup | 0.17583494
922 | Vegan Overnight Oats with Chia Seeds and Fruit | 0.17668104
600 | Spinach and Banana Power Smoothie | 0.1773768
519 | Smokey Butternut Squash Soup | 0.18031077
604 | Vegan Banana Muffins | 0.18287598
832 | Kale, Quinoa, and Avocado Salad with Lemon Dijon Vinaigrette | 0.18368931
617 | Hearty Breakfast Muffins | 0.18737361
946 | Chia Coconut Pudding with Coconut Milk | 0.1884186
468 | Spicy Oven-Roasted Plums | 0.18994217
(10 rows)