Delen via


Semantic Search met Azure Database for PostgreSQL - Flexible Server en Azure OpenAI

VAN TOEPASSING OP: Azure Database for PostgreSQL - Flexibele server

In deze praktische zelfstudie leert u hoe u een semantische zoektoepassing bouwt met behulp van een flexibele Azure Database for PostgreSQL-server en Azure OpenAI-service. Semantische zoekopdrachten voert zoekopdrachten uit op basis van semantiek; standaard lexicale zoekopdrachten voert zoekopdrachten uit 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.

Het bouwen van een semantische zoekfunctie voor uw gegevens met behulp van GenAI en Flexibele server omvat de volgende stappen:

  • Identificeer de zoekscenario's. Identificeer de gegevensvelden die betrokken zijn bij het zoeken.
  • Maak voor elk gegevensveld dat betrokken is bij het zoeken 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 een bepaalde 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 metrische gegevens zoals CTR (klikfrequentie) en de tijd van de woning. Neem feedbackmechanismen op om fouten op te sporen en de zoekstack te verbeteren van gegevenskwaliteit, versheid van gegevens en persoonlijke instellingen voor gebruikerservaring.

Vereisten

  1. Maak een OpenAI-account en vraag toegang tot de Azure OpenAI-service aan.
  2. Ververleent toegang tot Azure OpenAI in het gewenste abonnement.
  3. Verken machtigingen om Azure OpenAI-resources te maken en modellen te implementeren.

Maak en implementeer een Azure OpenAI-serviceresource en een model, implementeer het insluitmodel text-embedding-ada-002. Kopieer de naam van de implementatie omdat deze nodig is om insluitingen te maken.

azure_ai De en pgvector extensies inschakelen

Voordat u uw flexibele serverexemplaren van Azure Database for PostgreSQL kunt inschakelen azure_ai en pgvector gebruiken, moet u deze toevoegen aan uw acceptatielijst, zoals beschreven in het gebruik van PostgreSQL-extensies en controleren of deze 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 waarin u wilt dat de extensie beschikbaar is.

CREATE EXTENSION azure_ai;
CREATE EXTENSION pgvector;

OpenAI-eindpunt en -sleutel configureren

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

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 en importeren

  1. Download de gegevens van Kaggle.
  2. Maak verbinding met uw server en maak een test database en maak hierin een tabel waarin u de gegevens gaat importeren.
  3. Importeer de gegevens.
  4. Voeg een insluitkolom toe aan de tabel.
  5. Genereer de insluitingen.
  6. Zoeken.

De tabel maken

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 de WIN1252 codering.

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

Importeer de gegevens in de gemaakte tabel; Houd er rekening mee dat deze gegevensset een veldnamenrij 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

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 vectoriseren we enkele verschillende velden, 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 moeten worden verwerkt.

Tip

Speel rond met de LIMIT. Met een hoge waarde kan de instructie halverwege mislukken vanwege beperking die door Azure OpenAI wordt opgelegd. Als dit 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)

Volgende stappen

U hebt geleerd hoe u semantische zoekopdrachten kunt uitvoeren met azure Database for PostgreSQL Flexibele server en Azure OpenAI.