Freigeben über


Semantische Suche mit Azure Database for PostgreSQL - Flexible Server und Azure OpenAI

GILT FÜR: Azure Database for PostgreSQL – Flexibler Server

Dieses praktische Tutorial zeigt Ihnen, wie Sie mit Azure Database for PostgreSQL – „Flexibler Server“ und Azure OpenAI Service eine semantische Suchanwendung erstellen. Die semantische Suche sucht auf Grundlage der Semantik; die lexikalische Standardsuche sucht auf Grundlage der in einer Anfrage angegebenen Schlüsselwörter. So enthält Ihr Datensatz für Rezepte vielleicht keine Angaben wie „glutenfrei“, „vegan“, „milchfrei“, „fruchtfrei“ oder „Dessert“, aber diese Merkmale lassen sich aus den Zutaten ableiten. Die Idee ist, solche semantischen Abfragen zu stellen und relevante Suchergebnisse zu erhalten.

Das Erstellen der semantischen Suchfunktion für Ihre Daten mithilfe von GenAI und Flexible Server umfasst die folgenden Schritte:

  • Identifizieren der Suchszenarien. Identifizieren der Datenfelder, die in die Suche einbezogen werden sollen.
  • Erstellen Sie für jedes Datenfeld, das an der Suche beteiligt ist, ein entsprechendes Vektorfeld, um die Einbettungen des im Datenfeld gespeicherten Werts zu speichern.
  • Erstellung von Einbettungen für die Daten in den ausgewählten Datenfeldern und Speicherung der Einbettungen in den entsprechenden Vektorfeldern.
  • Erstellung der Einbettung für eine beliebige Eingabesuchabfrage.
  • Das Vektordatenfeld suchen und die Pixelwiederholung auflisten.
  • Ausführen der Ergebnisse durch geeignete Relevanz-, Ranking- und Personalisierungsmodelle, um das endgültige Ranking zu erstellen. Falls es keine solchen Modelle gibt, werden die Ergebnisse in absteigender Reihenfolge des Punktprodukts geordnet.
  • Überwachung des Modells, der Ergebnisqualität und der Geschäftskennzahlen wie CTR (Click-Through-Rate) und Verweildauer. Integration von Feedback-Mechanismen zur Fehlerbehebung und Verbesserung des Suchstapels - von der Datenqualität, der Datenfrische und der Personalisierung bis hin zum Benutzererlebnis.

Voraussetzungen

  1. Erstellen Sie ein Open AI-Konto, und fordern Sie den Zugriff auf den Azure OpenAI Servicean.
  2. Gewähren des Zugriffs auf Azure OpenAI im gewünschten Abonnement.
  3. Zuweisung der Zugriffsberechtigungen zum Erstellen von Azure OpenAI-Ressourcen und zum Bereitstellen von Modellen.

Erstellen und Bereitstellen einer Azure OpenAI Service-Ressource und ein Modell, unter Verwendung des Einbettungsmodells text-embedding-ada-002. Den Bereitstellungsnamen kopieren, da er zum Erstellen von Einbettungen benötigt wird.

Aktivieren von azure_ai und pgvector Erweiterungen

Bevor Sie azure_ai und pgvector in Ihrer Instanz von Azure Database for PostgreSQL – Flexibler Server aktivieren können, müssen Sie sie, wie unter Verwenden von PostgreSQL-Erweiterungen beschrieben, Ihrer Positivliste hinzufügen und überprüfen, ob sie korrekt hinzugefügt wurden, indem Sie SHOW azure.extensions; ausführen.

Anschließend können Sie die Erweiterung installieren, indem Sie eine Verbindung mit Ihrer Zieldatenbank herstellen und den Befehl CREATE EXTENSION ausführen. Sie müssen den Befehl separat für jede Datenbank wiederholen, in der die Erweiterung verfügbar sein soll.

CREATE EXTENSION azure_ai;
CREATE EXTENSION pgvector;

Konfigurieren des OpenAI-Endpunkts und des Schlüssels

In Azure KI Services unter Ressourcenverwaltung>Schlüssel und Endpunkte finden Sie den Endpunkt und die Schlüssel für Ihre Azure KI-Ressource. Verwenden Sie den Endpunkt und einen der Schlüssel, um der Erweiterung azure_ai das Aufrufen der Modellimplementierung zu ermöglichen.

select azure_ai.set_setting('azure_openai.endpoint','https://<endpoint>.openai.azure.com');
select azure_ai.set_setting('azure_openai.subscription_key', '<API Key>');

Herunterladen und Importieren der Daten

  1. Herunterladen der Daten aus Kaggle.
  2. Stellen Sie eine Verbindung mit Ihrem Server her, und erstellen Sie eine test-Datenbank. Erstellen Sie darin eine Tabelle, in die Sie die Daten importieren.
  3. Importieren der Daten
  4. Fügen Sie der Tabelle eine Spalte für Einbettungen hinzu.
  5. Generieren der Einbettungen
  6. Suchen.

Erstellen der Tabelle

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

Importieren der Daten

Definieren Sie die folgende Umgebungsvariable im Client-Fenster, um die Kodierung auf utf-8 festzulegen. Dieser Schritt ist erforderlich, da dieses bestimmte Dataset die WIN1252-Codierung verwendet.

Rem on Windows
Set PGCLIENTENCODING=utf-8;
# on Unix based operating systems
export PGCLIENTENCODING=utf-8

Importieren Sie die Daten in die erstellte Tabelle; Beachten Sie, dass dieses Dataset eine Kopfzeile enthält:

psql -d <database> -h <host> -U <user> -c "\copy recipes FROM <local recipe data file> DELIMITER ',' CSV HEADER"

Hinzufügen einer Spalte zum Speichern der Einbettungen

ALTER TABLE recipes ADD COLUMN embedding vector(1536); 

Generieren von Einbettungen

Generieren Sie Einbettungen für Ihre Daten mit der Erweiterung azure_ai. Im Folgenden werden einige verschiedene Felder vektorisiert, verkettet:

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;

Wiederholen Sie den Befehl, bis keine weiteren zu verarbeitenden Zeilen vorhanden sind.

Tipp

Experimentieren Sie mit LIMIT. Bei einem hohen Wert könnte die Anweisung aufgrund der Drosselung durch Azure OpenAI auf halbem Weg scheitern. Wenn ein Fehler auftritt, warten Sie mindestens eine Minute und führen Sie den Befehl erneut aus.

Erstellen Sie eine Suchfunktion in Ihrer Datenbank zur Vereinfachung:

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; 

Rufen Sie nun einfach die Funktion auf, um die Suche auszuführen:

select recipeid, recipe_name, score from recipe_search('vegan recipes', 10);

Untersuchen Sie die Ergebnisse:

 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)

Nächste Schritte

Sie haben gelernt, wie Sie die semantische Suche mit Azure Database for PostgreSQL – Flexibler Server und Azure OpenAI durchführen.