Zastosowanie textembedding-gecko@003 na potrzeby wektorów dystrybucyjnych

Zastosowanie textembedding-gecko@003 na potrzeby wektorów dystrybucyjnych

Informacje o tym ćwiczeniu (w Codelabs)

subjectOstatnia aktualizacja: paź 7, 2024
account_circleAutorzy: Eduardo Godinez

1. Wprowadzenie

Ostatnia aktualizacja: 8.04.2024

Osadzanie tekstu odnosi się do procesu przekształcania danych tekstowych w postać liczbową. Te reprezentacje liczbowe, często wektory, odzwierciedlają znaczenie semantyczne i zależności między słowami w tekście. Wyobraź sobie to tak:

Tekst przypomina język złożony – pełen niuansów i niejasności.

Wstawianie tekstu przekształca ten język w prostszy format matematyczny, który komputery mogą zrozumieć i zmienić.

Zalety umieszczania tekstu

  • Umożliwia wydajne przetwarzanie: reprezentacje liczbowe są znacznie szybsze do przetwarzania przez komputery w porównaniu do czystego tekstu. Ma to kluczowe znaczenie w przypadku takich zadań jak wyszukiwarki, systemy rekomendacji i tłumaczenie maszynowe.
  • Odzwierciedla znaczenie semantyczne: reprezentacje właściwościowe wykraczają poza dosłowne znaczenie słów. Uwzględniają kontekst i relacje między słowami, co pozwala na bardziej szczegółową analizę.
  • Poprawia wydajność systemów uczących się: wektory dystrybucyjne mogą być wykorzystywane jako funkcje w modelach systemów uczących się, co prowadzi do większej skuteczności w zadaniach takich jak analiza nastawienia, klasyfikacja tekstu i modelowanie tematów.

Przypadki użycia umieszczania tekstu

Dzięki przekształceniu tekstu w postaci liczbowej można stosować go w różnych aplikacjach do przetwarzania języka naturalnego (NLP). Oto kilka najważniejszych przypadków użycia:

1. Wyszukiwarki i pobieranie informacji:

Umieszczanie tekstu w układzie współrzędnych umożliwia wyszukiwarkom zrozumienie semantycznego znaczenia zapytań i dopasowanie ich do odpowiednich dokumentów, nawet jeśli nie zawierają one dokładnych słów kluczowych.

Porównując wektory zapytania z wektorami dokumentu, wyszukiwarki mogą identyfikować dokumenty, które dotyczą podobnych tematów lub pojęć.

2. Systemy rekomendacji:

Systemy rekomendacji wykorzystują tekstowe wektory osadzone do analizowania zachowań i preferencji użytkowników wyrażanych w opiniach, ocenach lub historii przeglądania.

System może potem rekomendować podobne elementy, porównując reprezentacje produktów, artykułów lub innych treści, z którymi użytkownik wchodził w interakcję.

3. Wykrywanie plagiatów:

Porównywanie wektorów dwóch tekstów może pomóc w identyfikacji potencjalnego plagiatu dzięki wykrywaniu znaczących podobieństw w ich strukturze semantycznej.

To tylko kilka przykładów. Możliwości stale się zwiększają, ponieważ ewoluują techniki umieszczania tekstu. Dzięki temu, że komputery lepiej rozumieją język dzięki emulacji, możemy spodziewać się w przyszłości jeszcze bardziej innowacyjnych zastosowań.

textembedding-gecko@003

Textembedding-gecko@003 to konkretna wersja już wytrenowanego modelu wektora dystrybucyjnego oferowanego przez Google Cloud Platform (GCP) za pośrednictwem Vertex AI oraz pakietu narzędzi i usług AI.

Co utworzysz

W tym ćwiczeniu spróbujesz utworzyć skrypt Pythona. Ten skrypt:

  • Użyj interfejsu Vertex API, aby wywołać textembedding-gecko@003 i przekształcić tekst w wektory tekstowe (wektory).
  • Utworzenie symulowanej bazy danych złożonej z tekstu i ich wektorów
  • Wykonanie zapytania do naszej symulowanej bazy danych wektorowych przez porównanie wektorów i uzyskanie najbardziej prawdopodobnej odpowiedzi.

Czego się nauczysz

  • Jak korzystać z funkcji umieszczania tekstu w GCP
  • Jak wywołać textembedding-gecko@003
  • Jak uruchomić to w Workbench
  • Jak używać Vertex AI – Workbench do wykonywania skryptów

Czego potrzebujesz

  • najnowszą wersję Chrome;
  • Znajomość Pythona
  • Projekt Google Cloud
  • Dostęp do Vertex AI – Workbench

2. Konfiguracja

Tworzenie instancji Vertex AI Workbench

  1. W konsoli Google Cloud na stronie selektora projektu wybierz lub utwórz projekt Google Cloud.
  1. Otwórz selektor projektów
  2. Sprawdź, czy w projekcie Google Cloud włączone są płatności.
  3. Włącz interfejs Notebooks API.

Instancja Vertex AI Workbench możesz utworzyć za pomocą konsoli Google Cloud, interfejsu wiersza poleceń gcloud lub Terraform. Na potrzeby tego samouczka utworzymy go za pomocą konsoli Google Cloud. Więcej informacji o innych metodach znajdziesz tutaj.

  1. W konsoli Google Cloud otwórz stronę Instance (Instancje), do której można dotrzeć w menu Vertex AI w sekcji Notebooks (Notatniki) i kliknij Workbench (Workbench). 56c087d619c464dd.png
  2. Otwórz Instancje.
  3. Kliknij Utwórz nową. 381ff9b895e77641.png
  4. W oknie Utwórz instancję w sekcji Szczegóły podaj te informacje o nowej instancji:

Nazwa: podaj nazwę nowej instancji. Nazwa musi zaczynać się od litery, po której następują maksymalnie 62 małe litery, cyfry lub łączniki (-), i nie może kończyć się łącznikiem.

Region i strefa: wybierz region i strefę dla nowej instancji. Aby uzyskać najlepszą wydajność sieci, wybierz region, który znajduje się najbliżej Ciebie pod względem geograficznym.

Nie musisz instalować karty graficznej.

W sekcji Sieć wpisz:

Sieć: dostosuj opcje sieci, aby używać sieci w bieżącym projekcie lub sieci współdzielonego środowiska VPC z projektu głównego, jeśli jest skonfigurowana. Jeśli w projekcie głównym używasz współdzielonego środowiska VPC, musisz też przyznać użytkownikowi usługi Notebooks z projektu usługi rolę użytkownika sieci Compute (roles/compute.networkUser).

W polu Sieć: wybierz sieć, której chcesz użyć. Możesz wybrać sieć VPC, jeśli ma ona włączony prywatny dostęp do Google lub ma dostęp do internetu

W polu „Subnetwork” (Podesieć): wybierz odpowiednią podsieć. Możesz wybrać domyślny.

W sekcji Właściwości instancji możesz pozostawić domyślną wartość e2-standard-4.

d47bdc2d7f516c46.png

  1. Kliknij Utwórz.

Vertex AI Workbench tworzy instancję i automatycznie ją uruchamia. Gdy instancja będzie gotowa do użycia, Vertex AI Workbench aktywuje link „Otwórz JupyterLab”. Kliknij ją.

Utwórz notatnik Python 3

  1. W Jupyterlab w sekcji Launcher kliknij ikonę z logo Pythona z napisem Python3. e16bb118cd28256f.png
  2. Zostanie utworzony notatnik Jupyter o nazwie Bez nazwy i rozszerzeniu ipynb. da9bd34cf307156c.png
  3. Możesz zmienić jego nazwę w sekcji przeglądarki plików po lewej stronie lub pozostawić ją bez zmian.

Teraz możemy zacząć umieszczać kod w notatniku.

3. Importowanie wymaganych bibliotek

Gdy instancja zostanie utworzona i otwarta JupyterLab, trzeba zainstalować wszystkie biblioteki wymagane do ćwiczeń z programowania.

Potrzebujemy:

  1. numpy
  2. pandy
  3. TextEmbeddingInput, TextEmbeddingModel z vertexai.language_models

Skopiuj i wklej ten kod w komórce:

from vertexai.language_models import TextEmbeddingInput, TextEmbeddingModel

import numpy as np
import pandas as pd

Mogłoby to wyglądać następująco:

6852d323eedcac93.png

4. Tworzenie symulowanej wektorowej bazy danych

Aby przetestować nasz kod, utworzymy bazę danych z tekstem i odpowiednimi wektorami przetłumaczonymi za pomocą modelu tekstowego gecko@003.

Dzięki temu użytkownicy mogą wyszukać tekst, przetłumaczyć go na format wektorowy, wyszukać go w naszej bazie danych i zwrócić jak najbardziej przybliżony wynik.

Nasza baza danych wektorów będzie zawierać 3 rekordy. Oto jak ją utworzymy:

Skopiuj poniższy kod i wklej go w nowej komórce.

DOCUMENT1 = {
    "title": "Operating the Climate Control System",
    "content": "Your Googlecar has a climate control system that allows you to adjust the temperature and airflow in the car. To operate the climate control system, use the buttons and knobs located on the center console.  Temperature: The temperature knob controls the temperature inside the car. Turn the knob clockwise to increase the temperature or counterclockwise to decrease the temperature. Airflow: The airflow knob controls the amount of airflow inside the car. Turn the knob clockwise to increase the airflow or counterclockwise to decrease the airflow. Fan speed: The fan speed knob controls the speed of the fan. Turn the knob clockwise to increase the fan speed or counterclockwise to decrease the fan speed. Mode: The mode button allows you to select the desired mode. The available modes are: Auto: The car will automatically adjust the temperature and airflow to maintain a comfortable level. Cool: The car will blow cool air into the car. Heat: The car will blow warm air into the car. Defrost: The car will blow warm air onto the windshield to defrost it."}

DOCUMENT2 = {
    "title": "Touchscreen",
    "content": "Your Googlecar has a large touchscreen display that provides access to a variety of features, including navigation, entertainment, and climate control. To use the touchscreen display, simply touch the desired icon.  For example, you can touch the \"Navigation\" icon to get directions to your destination or touch the \"Music\" icon to play your favorite songs."}

DOCUMENT3 = {
    "title": "Shifting Gears",
    "content": "Your Googlecar has an automatic transmission. To shift gears, simply move the shift lever to the desired position.  Park: This position is used when you are parked. The wheels are locked and the car cannot move. Reverse: This position is used to back up. Neutral: This position is used when you are stopped at a light or in traffic. The car is not in gear and will not move unless you press the gas pedal. Drive: This position is used to drive forward. Low: This position is used for driving in snow or other slippery conditions."}

documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]

df_initial_db = pd.DataFrame(documents)
df_initial_db.columns = ['Title', 'Text']
df_initial_db

Wygląda to tak:

26baa3b876c0605d.png

Przeanalizujmy kod

W zmiennych DOCUMENT1, DOCUMENT2 i DOCUMENT3 przechowujemy słownik, który będzie emulował dokumenty wraz z ich tytułami i zawartością. Te „dokumenty” odnoszą się do symulowanej instrukcji obsługi samochodu wyprodukowanego przez Google.

W następnym wierszu utworzymy listę na podstawie tych 3 dokumentów (słowników).

documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]

Na koniec, wykorzystując pandy, na podstawie tej listy tworzymy strukturę DataFrame o nazwie df_initial_db.

df_initial_db = pd.DataFrame(documents)
df_initial_db
.columns = ['Title', 'Text']
df_initial_db

5. Tworzenie wektorów dystrybucyjnych tekstu

W naszej symulowanej bazie danych dokumentów uzyskamy teraz osadzony tekst z wykorzystaniem modelu gecko@003 dla każdego rekordu.

Skopiuj i wklej poniższy kod do nowej komórki:

def embed_fn(df_input):
    list_embedded_values = []
    for index, row in df_input.iterrows():        
        model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
        embeddings = model.get_embeddings([(row['Text'])])        
        list_embedded_values.append(embeddings[0].values)
    df_input['Embedded text'] = list_embedded_values
    return df_input        
                                           
df_embedded_values_db = embed_fn(df_initial_db)
df_embedded_values_db      

Wygląda to tak:

4c4af091c7a82861.png

Przeanalizujmy kod

Zdefiniowaliśmy funkcję o nazwieembed_fn, która jako dane wejściowe otrzyma obiekt danych Pandas zawierający tekst służący do wektora dystrybucyjnego. Funkcja zwraca następnie tekst zakodowany jako wektor.

def embed_fn(df_input):
    list_embedded_values = []
    for index, row in df_input.iterrows():        
        model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
        embeddings = model.get_embeddings([(row['Text'])])        
        list_embedded_values.append(embeddings[0].values)
    df_input['Embedded text'] = list_embedded_values
    return df_input            

Na liście o nazwie list_embedded_values będziemy przechowywać i dołączyć zakodowany tekst każdego wiersza.

Za pomocą metody iterrows z pakietu pandas możemy przejrzeć każdy wiersz w dataframeie, uzyskując wartości z kolumny Text (która zawiera informacje ręczne z naszej symulowanej bazy danych).

Aby wysłać zwykły tekst i zwrócić jego wektor za pomocą modelu gecko@003, inicjujemy model zmiennego, w którym ustawiamy model do użycia, wywołując funkcję TextEmbeddingModel.from_pretrained.

model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(row['Text'])])                    

Następnie w eksportowanych wektorach dystrybucyjnych zapisujemy wektor tekstu, który wysyłamy za pomocą funkcji model.get_embeddings.

Na końcu funkcji tworzymy nową kolumnę w ramach ramki danych o nazwie Embedded text, która będzie zawierać listę wektorów utworzonych na podstawie modelu gecko@003.

df_input['Embedded text'] = list_embedded_values
return df_input            

Na koniec w zmiennej df_embedded_values_db przechwytujemy ramka danych zawierającą pierwotne dane z symulowanej bazy danych oraz nową kolumnę z listą wektorów dla każdego wiersza.

df_embedded_values_db = embed_fn(df_initial_db)
df_embedded_values_db      

6. Zadawanie pytania do bazy danych wektorów

Teraz, gdy nasza baza danych zawiera tekst i jego wektory, możemy zadać pytanie i wysłać zapytanie do bazy danych, aby znaleźć odpowiedź.

W tym celu skopiuj poniższy kod i wklej go do nowej komórki:

question='How do you shift gears in the Google car?'
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(question)])        
text_to_search=embeddings[0].values
len(text_to_search)

Wynik powinien być podobny do tego:

6b7cf9b08e3b4573.png

Przeanalizujmy kod

Podobnie jak w przypadku funkcji z poprzedniego kroku, najpierw zainicjujemy zmienną pytania tym, o co chcemy zapytać naszą bazę danych.

question='How do you shift gears in the Google car?'

Następnie w zmiennej modelu ustawiamy model, którego chcemy użyć za pomocą funkcji TextEmbeddingModel.from_pretraining, czyli w tym przypadku modelu gecko@003.

model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")

W zmiennej wektorów dystrybucyjnych wywołujemy funkcję model.get_embeddings i przekazujemy tekst do skonwertowania na format wektorowy. W tym przypadku przekazujemy zadane pytanie.

embeddings = model.get_embeddings([(question)])        

Zmienna text_to_search zawiera listę wektorów przetłumaczonych z pytania.

Długość wektora drukujemy jako odniesienie.

text_to_search=embeddings[0].values
len
(text_to_search)

7. Porównywanie wektorów

Mamy teraz listę wektorów w naszej symulowanej bazie danych i pytanie przekształcone w wektora. Możemy teraz porównać wektor pytania ze wszystkimi wektorami w naszej bazie danych, aby dowiedzieć się, który z nich jest najbliższy dokładnej odpowiedzi na nasze pytanie.

W tym celu zmierzymy odległość między wektorem pytania a każdym wektorem bazy danych. Istnieje wiele metod pomiaru odległości między wektorami. W tym konkretnym ćwiczeniu w programowaniu użyjemy odległości euklidesowej lub normy L2.

73ea8635c4570bea.png

W Pythonie do tego celu możemy wykorzystać funkcję numpy.

Skopiuj i wklej poniższy kod do nowej komórki:

list_embedded_text_from_db = df_embedded_values_db['Embedded text']
shortest_distance=1
for position, embedded_value in enumerate(list_embedded_text_from_db):
    distance=np.linalg.norm((np.array(embedded_value) - np.array(text_to_search)), ord = 2)
    print(distance)
    if distance<shortest_distance:
        shortest_distance=distance
        shortest_position=position
       
print(f'The shortest distance is {shortest_distance} and the position of that value is {shortest_position}')

Wynik powinien wyglądać tak:

b70563b50ea86668.png

Analiza kodu

Zaczynamy od przekształcenia kolumny zawierającej osadzony tekst lub wektorów bazy danych w listę i zapisanie jej w pliku list_embedded_text_from_db.

Zmienne shortest_distance inicjujemy też wartością 1, aby aktualizować je do momentu znalezienia rzeczywistej najkrótszej odległości.

list_embedded_text_from_db = df_embedded_values_db['Embedded text']
shortest_distance
=1

Następnie za pomocą pętli for iterujemy i uzyskiwać odległość między wektorem z pytania a każdym wektorem w bazie danych.

Korzystając z funkcji numpy linalg.norm, obliczamy odległość.

Jeśli obliczona odległość jest mniejsza niż ta w zmiennej shortest_distance, obliczona odległość zostanie ustawiona na tę zmienną.

Następnie rejestrujemy najkrótszą odległość oraz pozycję na liście, na której została znaleziona. W zmiennych „shortest_distance” i „shortest_position”.

for position, embedded_value in enumerate(list_embedded_text_from_db):
    distance=np.linalg.norm((np.array(embedded_value) - np.array(text_to_search)), ord = 2)
    print(distance)
    if distance<shortest_distance:
        shortest_distance=distance
        shortest_position=position

8. Wyniki

Znając miejsce na liście wektora, który ma najmniejszą odległość między pytaniem a bazą danych, możemy wydrukować wyniki.

Skopiuj i wklej poniższy kod w nowej komórce:

print("Your question was:\n "+question+ " \nAnd our answer is:\n "+
      df_embedded_values_db
.at[shortest_position, 'Title']+": "+
      df_embedded_values_db
.at[shortest_position, 'Text'])

Po jego uruchomieniu wyświetli się komunikat podobny do tego:

7a0e429171a19afe.png

9. Gratulacje

Gratulacje! Udało Ci się utworzyć pierwszą aplikację korzystającą z modelu textembedding-gecko@003 w rzeczywistym środowisku.

Znasz już podstawy wektorów dystrybucyjnych tekstu i wiesz, jak używać modelu gecko003 w GCP Workbench.

Wiesz już, co zrobić, aby móc dalej wykorzystywać swoją wiedzę w większej liczbie przypadków użycia.

Co dalej?

Zapoznaj się z tymi ćwiczeniami z programowania...

Dokumenty referencyjne