Ricerca semantica con Database di Azure per PostgreSQL - Server flessibile e OpenAI di Azure
SI APPLICA A: Database di Azure per PostgreSQL - Server flessibile
Questa esercitazione pratica illustra come creare un'applicazione di ricerca semantica usando Database di Azure per PostgreSQL server flessibile e il servizio Azure OpenAI. La ricerca semantica esegue ricerche basate sulla semantica; la ricerca lessicale standard esegue ricerche basate su parole chiave fornite in una query. Ad esempio, il set di dati delle ricette potrebbe non contenere etichette come senza glutine, vegano, senza latte, senza frutta o dessert, ma queste caratteristiche possono essere dedotti dagli ingredienti. L'idea è quella di emettere query semantiche e ottenere risultati di ricerca pertinenti.
La creazione di funzionalità di ricerca semantica sui dati tramite GenAI e server flessibile prevede i passaggi seguenti:
- Identificare gli scenari di ricerca. Identificare i campi dati che verranno coinvolti nella ricerca.
- Per ogni campo dati coinvolto nella ricerca, creare un campo vettore corrispondente per archiviare gli incorporamenti del valore archiviato nel campo dati.
- Generare incorporamenti per i dati nei campi dati selezionati e archiviare gli incorporamenti nei relativi campi vettoriali corrispondenti.
- Generare l'incorporamento per qualsiasi query di ricerca di input specificata.
- Cercare il campo dei dati vettoriali ed elencare i vicini più vicini.
- Eseguire i risultati tramite i modelli appropriati di pertinenza, classificazione e personalizzazione per produrre la classificazione finale. In assenza di tali modelli, classificare i risultati in diminuzione dell'ordine di punti-prodotto.
- Monitorare il modello, la qualità dei risultati e le metriche aziendali, ad esempio CTR (velocità selezionata) e tempo di attesa. Incorporare meccanismi di feedback per eseguire il debug e migliorare lo stack di ricerca dalla qualità dei dati, dall'aggiornamento dei dati e dalla personalizzazione all'esperienza utente.
Prerequisiti
- Creare un account OpenAI e richiedere l'accesso al servizio Azure OpenAI.
- Concedere l'accesso ad Azure OpenAI nella sottoscrizione desiderata.
- Concedere le autorizzazioni di accesso per creare risorse Azure OpenAI e distribuire modelli.
Creare e distribuire una risorsa del servizio OpenAI di Azure e un modello, distribuire il modello di incorporamento di testo-embedding-ada-002. Copiare il nome della distribuzione in base alle esigenze per creare incorporamenti.
Abilitare le estensioni azure_ai e pgvector
Prima di poter abilitare azure_ai
e pgvector
nell'istanza del server flessibile di Database di Azure per PostgreSQL, è necessario aggiungerla all'elenco di elementi consentiti come descritto in Come usare le estensioni PostgreSQL e verificare se sono state aggiunte correttamente eseguendo SHOW azure.extensions;
.
È quindi possibile installare l'estensione connettendosi al database di destinazione ed eseguendo il comando CREA ESTENSIONE. È necessario ripetere il comando separatamente per ogni database in cui si desidera che l'estensione sia disponibile.
CREATE EXTENSION azure_ai;
CREATE EXTENSION vector;
Configurare l'endpoint e la chiave OpenAI
Nei Servizi di Azure AI, in Gestione risorse>Chiavi ed endpoint è possibile trovare l'endpoint e le chiavi per la risorsa Azure per intelligenza artificiale. Usare l'endpoint e una delle chiavi per abilitare l'estensione azure_ai
per richiamare la distribuzione del modello.
select azure_ai.set_setting('azure_openai.endpoint','https://<endpoint>.openai.azure.com');
select azure_ai.set_setting('azure_openai.subscription_key', '<API Key>');
Scaricare e importare i dati
- Scaricare i dati da Kaggle.
- Connettersi al server e creare un
test
database e creare una tabella in cui verranno importati i dati. - Importare i dati.
- Aggiungere una colonna di incorporamento alla tabella.
- Generare gli incorporamenti.
- Ricerca.
Creare la tabella
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)
);
Importare i dati
Impostare la variabile di ambiente seguente nella finestra client per impostare la codifica su utf-8. Questo passaggio è necessario perché questo particolare set di dati usa la codifica WIN1252.
Rem on Windows
Set PGCLIENTENCODING=utf-8;
# on Unix based operating systems
export PGCLIENTENCODING=utf-8
Importare i dati nella tabella creata; Si noti che questo set di dati contiene una riga di intestazione:
psql -d <database> -h <host> -U <user> -c "\copy recipes FROM <local recipe data file> DELIMITER ',' CSV HEADER"
Aggiungere una colonna per archiviare gli incorporamenti
ALTER TABLE recipes ADD COLUMN embedding vector(1536);
Generare incorporamenti
Generare incorporamenti per i dati usando l'estensione azure_ai. Nell'esempio seguente vengono vettorizzati alcuni campi diversi, concatenati:
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;
Ripetere il comando fino a quando non sono presenti altre righe da elaborare.
Suggerimento
Effettuare qualche prova con LIMIT
. Con un valore elevato, l'istruzione potrebbe non riuscire a metà strada a causa della limitazione imposta da Azure OpenAI. Se ha esito negativo, attendere almeno un minuto ed eseguire di nuovo il comando.
Ricerca
Creare una funzione di ricerca nel database per praticità:
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;
Ora è sufficiente richiamare la funzione per eseguire la ricerca:
select recipeid, recipe_name, score from recipe_search('vegan recipes', 10);
Esplorare quindi i risultati:
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)
Contenuto correlato
- Integrare Database di Azure per PostgreSQL - Server flessibile con Servizi cognitivi di Azure.
- Generare incorporamenti vettoriali in Database di Azure per PostgreSQL - Server flessibile con LLM (anteprima) distribuito localmente.
- Integrare Database di Azure per PostgreSQL con Azure Machine Learning Services.
- Generare incorporamenti vettoriali con Azure OpenAI in Database di Azure per PostgreSQL - Server flessibile.
- Estensione azure per intelligenza artificiale in Database di Azure per PostgreSQL - Server flessibile.
- Intelligenza artificiale generativa con Database di Azure per PostgreSQL - Server flessibile.
- Sistema di raccomandazione con Database di Azure per PostgreSQL - Server flessibile e OpenAI di Azure.
- Abilitare e usare pgvector in Database di Azure per PostgreSQL - Server flessibile.