Udostępnij za pośrednictwem


Wyszukiwanie semantyczne za pomocą usługi Azure Database for PostgreSQL — serwer elastyczny i usługa Azure OpenAI

DOTYCZY: Azure Database for PostgreSQL — serwer elastyczny

W tym samouczku praktycznym pokazano, jak utworzyć aplikację wyszukiwania semantycznego przy użyciu elastycznego serwera usługi Azure Database for PostgreSQL i usługi Azure OpenAI Service. Wyszukiwanie semantyczne wykonuje wyszukiwanie na podstawie semantyki; Standardowe wyszukiwanie leksykalne wykonuje wyszukiwanie na podstawie słów kluczowych podanych w zapytaniu. Na przykład zestaw danych przepisów może nie zawierać etykiet, takich jak bezglutenowe, wegańskie, bezmleczne, bez owoców lub deser, ale te cechy mogą być wyprowadzone ze składników. Chodzi o to, aby wydać takie zapytania semantyczne i uzyskać odpowiednie wyniki wyszukiwania.

Tworzenie funkcji wyszukiwania semantycznego na danych przy użyciu usługi GenAI i serwera elastycznego obejmuje następujące kroki:

  • Identyfikowanie scenariuszy wyszukiwania. Zidentyfikuj pola danych, które będą zaangażowane w wyszukiwanie.
  • Dla każdego pola danych zaangażowanego w wyszukiwanie utwórz odpowiednie pole wektorowe do przechowywania osadzania wartości przechowywanej w polu danych.
  • Generowanie osadzania dla danych w wybranych polach danych i przechowywanie osadzonych w odpowiednich polach wektorów.
  • Wygeneruj osadzanie dla dowolnego wejściowego zapytania wyszukiwania.
  • Wyszukaj pole danych wektorowych i wyświetl listę najbliższych sąsiadów.
  • Uruchom wyniki za pomocą odpowiednich modeli istotności, klasyfikacji i personalizacji, aby utworzyć końcowy ranking. W przypadku braku takich modeli należy sklasyfikować wyniki w zakresie malejącego zamówienia dot-product.
  • Monitoruj model, jakość wyników i metryki biznesowe, takie jak CTR (współczynnik wyboru) i czas zamieszkania. Uwzględnij mechanizmy przesyłania opinii w celu debugowania i ulepszania stosu wyszukiwania na podstawie jakości danych, aktualności danych i personalizacji po środowisko użytkownika.

Wymagania wstępne

  1. Utwórz konto openAI i zażądaj dostępu do usługi Azure OpenAI Service.
  2. Udziel dostępu do usługi Azure OpenAI w żądanej subskrypcji.
  3. Udzielanie uprawnień do tworzenia zasobów usługi Azure OpenAI i wdrażania modeli.

Utwórz i wdróż zasób usługi Azure OpenAI Service i model, wdróż model osadzania tekstu modelu ada-002. Skopiuj nazwę wdrożenia, ponieważ jest ona potrzebna do utworzenia osadzonych.

azure_ai Włączanie rozszerzeń i pgvector

Przed włączeniem i włączeniem azure_ai wystąpienia serwera elastycznego usługi Azure Database for PostgreSQL należy dodać je do listy dozwolonych zgodnie z opisem w temacie how to use PostgreSQL extensions (Jak używać rozszerzeń PostgreSQL) i sprawdzić, czy dodano je poprawnie, uruchamiając polecenie SHOW azure.extensions;.pgvector

Następnie możesz zainstalować rozszerzenie, łącząc się z docelową bazą danych i uruchamiając polecenie CREATE EXTENSION . Należy powtórzyć polecenie oddzielnie dla każdej bazy danych, w której ma być dostępne rozszerzenie.

CREATE EXTENSION azure_ai;
CREATE EXTENSION vector;

Konfigurowanie punktu końcowego i klucza interfejsu OpenAI

W usługach azure AI w obszarze Klucze zarządzania>zasobami i punkty końcowe można znaleźć punkt końcowy i klucze dla zasobu usługi Azure AI. Użyj punktu końcowego i jednego z kluczy, aby włączyć azure_ai rozszerzenie w celu wywołania wdrożenia modelu.

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

Pobieranie i importowanie danych

  1. Pobierz dane z narzędzia Kaggle.
  2. Połącz się z serwerem i utwórz bazę danych, a następnie utwórz w niej tabelę test , w której zaimportujesz dane.
  3. Zaimportuj dane.
  4. Dodaj kolumnę osadzania do tabeli.
  5. Wygeneruj osadzanie.
  6. Wyszukaj.

Tworzenie tabeli

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

Importowanie danych

Ustaw następującą zmienną środowiskową w oknie klienta, aby ustawić kodowanie na wartość utf-8. Ten krok jest niezbędny, ponieważ ten konkretny zestaw danych używa kodowania WIN1252.

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

Zaimportuj dane do utworzonej tabeli; Zwróć uwagę, że ten zestaw danych zawiera wiersz nagłówka:

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

Dodawanie kolumny do przechowywania osadzania

ALTER TABLE recipes ADD COLUMN embedding vector(1536);

Generowanie osadzania

Generuj osadzanie dla danych przy użyciu rozszerzenia azure_ai. W następujący sposób wektoryzujemy kilka różnych pól, połączonych:

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;

Powtórz to polecenie, dopóki nie będzie więcej wierszy do przetworzenia.

Napiwek

Odtwórz element za pomocą polecenia LIMIT. Z wysoką wartością instrukcja może zakończyć się niepowodzeniem w połowie drogi z powodu ograniczenia przepustowości nałożonego przez usługę Azure OpenAI. Jeśli zakończy się to niepowodzeniem, zaczekaj co najmniej minutę i ponownie wykonaj polecenie.

Utwórz funkcję wyszukiwania w bazie danych dla wygody:

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;

Teraz po prostu wywołaj funkcję, aby wyszukać:

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

Zapoznaj się z wynikami:

 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)