Delen via


Zelfstudie: Een semantische zoekopdracht maken met Azure Database for PostgreSQL en Azure OpenAI

In deze praktische zelfstudie leert u hoe u een semantische zoektoepassing bouwt met behulp van Azure Database for PostgreSQL en Azure OpenAI.

Met semantische zoekopdrachten worden zoekopdrachten uitgevoerd op basis van semantiek. Standaard lexicale zoekopdrachten worden uitgevoerd op basis van trefwoorden in een query. Uw receptgegevensset bevat bijvoorbeeld geen labels zoals glutenvrij, veganistisch, zuivelvrij, fruitvrij of dessert, maar deze kenmerken kunnen worden afgeleid van de ingrediënten. Het idee is om dergelijke semantische query's uit te voeren en relevante zoekresultaten te verkrijgen.

In deze handleiding leert u:

  • Identificeer de zoekscenario's en de gegevensvelden die worden betrokken bij een zoekopdracht.
  • Voor elk gegevensveld dat bij een zoekopdracht betrokken is, maakt u een corresponderend vectorveld om de insluitingen op te slaan van de waarde die is opgeslagen in het gegevensveld.
  • Genereer insluitingen voor de gegevens in de geselecteerde gegevensvelden en sla de insluitingen op in de bijbehorende vectorvelden.
  • Genereer de insluiting voor elke invoerzoekquery.
  • Zoek naar het vectorgegevensveld en vermeld de dichtstbijzijnde buren.
  • Voer de resultaten uit via de juiste relevantie-, classificatie- en personalisatiemodellen om de uiteindelijke classificatie te produceren. Als dergelijke modellen ontbreken, rangschikt u de resultaten in aflopende volgorde van puntproduct.
  • Bewaak het model, de kwaliteit van de resultaten en de zakelijke statistieken, zoals de klikfrequentie en de verblijfstijd. Neem feedbackmechanismen op om fouten op te sporen en de zoekstack te verbeteren, van gegevenskwaliteit, versheid van gegevens en persoonlijke instellingen tot gebruikerservaring.

Vereisten

  1. Maak een OpenAI-account en vraag toegang tot Azure OpenAI aan.
  2. Ververleent toegang tot Azure OpenAI in het gewenste abonnement.
  3. Verken machtigingen om Azure OpenAI-resources te maken en modellen te implementeren.
  4. Een Azure OpenAI-resource en een model maken en implementeren. Implementeer het insluitingsmodel text-embedding-ada-002. Kopieer de naam van de implementatie, omdat u deze nodig hebt om insluitingen te maken.

De extensies azure_ai en pgvector inschakelen

Voordat u azure_ai en pgvector kunt inschakelen op uw flexibele serverexemplaar van Azure Database for PostgreSQL, moet u deze toevoegen aan uw toegelaten lijst. Zorg ervoor dat ze correct zijn toegevoegd door uit te voeren SHOW azure.extensions;.

Vervolgens kunt u de extensie installeren door verbinding te maken met uw doeldatabase en de opdracht CREATE EXTENSION uit te voeren. U moet de opdracht afzonderlijk herhalen voor elke database waar u de extensie beschikbaar wilt maken.

CREATE EXTENSION azure_ai;
CREATE EXTENSION vector;

Een OpenAI-eindpunt en -sleutel configureren

In Azure AI-services vindt u onder Resourcebeheersleutels>en -eindpunten het eindpunt en de sleutels voor uw Azure AI-resource. Gebruik het eindpunt en een van de sleutels om de azure_ai extensie in te schakelen voor het aanroepen van de modelimplementatie:

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

De gegevens downloaden

Download de gegevens van Kaggle.

De tabel maken

Maak verbinding met uw server en maak een test database. Gebruik in die database de volgende opdracht om een tabel te maken waarin u gegevens importeert:

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

De gegevens importeren

Stel de volgende omgevingsvariabele in het clientvenster in om codering in te stellen op UTF-8. Deze stap is nodig omdat deze specifieke gegevensset gebruikmaakt van Windows-1252-codering.

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

Importeer de gegevens in de tabel die u hebt gemaakt. Let op dat deze gegevensset een koprij bevat.

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

Een kolom toevoegen om de insluitingen op te slaan

Voeg een insluitkolom toe aan de tabel:

ALTER TABLE recipes ADD COLUMN embedding vector(1536);

Insluitingen genereren

Genereer insluitingen voor uw gegevens met behulp van de azure_ai extensie. In het volgende voorbeeld worden enkele velden gevectoreerd en samengevoegd.

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;

Herhaal de opdracht totdat er geen rijen meer zijn om te verwerken.

Aanbeveling

Speel rond met de LIMIT waarde. Bij een hoge waarde kan de instructie halverwege mislukken vanwege beperking die door Azure OpenAI wordt opgelegd. Als de instructie mislukt, wacht u minstens één minuut en voert u de opdracht opnieuw uit.

Maak voor het gemak een zoekfunctie in uw database:

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;

Roep nu de functie aan om te zoeken:

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

En verken de resultaten:

 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)