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

1. Wprowadzenie

Ostatnia aktualizacja: 8.04.2024

Wstawianie tekstu

Umieszczanie tekstu odnosi się do procesu przekształcania danych tekstowych w reprezentacje liczbowe. 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 jest jak złożony język, pełen niuansów i niejednoznaczności.

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

Zalety wektorów dystrybucyjnych tekstu

  • Umożliwia wydajne przetwarzanie: komputery znacznie szybciej przetwarzają dane liczbowe niż tekst zwykły. Jest to kluczowe 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. Odzwierciedlają one kontekst i zależności 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

Umożliwiają one przekształcanie tekstu w liczby, co pozwala na tworzenie różnych aplikacji do przetwarzania języka naturalnego (NLP). Oto kilka kluczowych zastosowań:

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 uczenie maszynowe do analizowania zachowań i preferencji użytkowników wyrażanych w opiniach, ocenach lub historii przeglądania.

System może następnie polecać podobne produkty, porównując zakodowane informacje o produktach, artykułach lub innych treściach, z którymi użytkownik wchodził w interakcje.

3. Wykrywanie plagiatu:

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 wytrenowanego wstępnie modelu embeddingu tekstu oferowanego przez Google Cloud Platform (GCP) za pomocą Vertex AI i zestawu 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).
  • utworzyć symulowaną bazę danych składającą się z tekstu i jego wektorów;
  • Przesyłać zapytanie do naszej symulowanej bazy danych wektorowych, porównując wektory i uzyskiwać najbardziej prawdopodobną odpowiedź.

Czego się nauczysz

  • Jak korzystać z tekstowego kodowania w GCP
  • Jak wywołać textembedding-gecko@003
  • Jak uruchomić to w Workbench
  • Wykonywanie skryptów za pomocą Vertex AI Workbench

Czego potrzebujesz

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

2. Konfiguracja

Utwórz instancję 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.

Możesz utworzyć instancję Vertex AI Workbench 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 Wystąpienia.
  3. Kliknij Utwórz nową. 381ff9b895e77641.png
  4. W oknie Tworzenie instancji 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ć podaj te informacje:

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, o ile ma 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ć wartość domyślną, czyli 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 go.

Utwórz notatnik Python 3

  1. W Jupyterlab w sekcji Launcher kliknij ikonę z logo Pythona z napisem Python3. e16bb118cd28256f.png
  2. Utworzono 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

Po utworzeniu instancji i otworzeniu JupyterLab musimy zainstalować wszystkie biblioteki wymagane do użycia w codelab.

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 bazy danych wektorów

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

Użytkownicy mogą przeszukać tekst, przekształcić go w wektory, wyszukać w naszej bazie danych i otrzymać najbardziej zbliżony wynik.

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

Skopiuj i wklej poniższy kod 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

Analiza kodu

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” odwołują się do symulowanego podręcznika samochodu wyprodukowanego przez Google.

W następnym wierszu tworzymy listę z tych 3 dokumentów (słowników).

documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]

Na koniec za pomocą biblioteki pandas utworzymy z tej listy ramkę danych 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

Teraz dla każdego rekordu w naszej symulowanej bazie danych dokumentów uzyskamy wbudowany tekst za pomocą modelu gecko@003.

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

Analiza kodu

Zdefiniowaliśmy funkcję o nazwie embed_fn, która będzie przyjmować jako dane wejściowe ramkę danych pandas zawierającą tekst do wykonania kodowania. 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łączać 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 zmienny, 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 sekwencji wektorów przechwytujemy wektor tekstu, który wysyłamy za pomocą funkcji model.get_embeddings.

Na końcu funkcji tworzymy nową kolumnę w ramce 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             

Wreszcie w zmiennej df_embedded_values_db rejestrujemy ramkę danych zawierającą nasze oryginalne dane z symulowanej bazy danych oraz nową kolumnę zawierającą listę wektorów dla każdego wiersza.

df_embedded_values_db = embed_fn(df_initial_db)
df_embedded_values_db      

6. Zadaj pytanie bazie 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ź.

Aby to zrobić, skopiuj i wklej ten kod 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 będzie wyglądał mniej więcej tak:

6b7cf9b08e3b4573.png

Analiza kodu

Podobnie jak w przypadku funkcji z poprzedniego kroku, najpierw inicjujemy zmienną question, podając, czego chcemy zapytać bazę danych.

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

Następnie w zmiennej model ustawiamy model, którego chcemy użyć, za pomocą funkcji TextEmbeddingModel.from_pretrained, która w tym przypadku jest modelem gecko@003.

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

W zmiennej embeddings wywołujemy funkcję model.get_embeddings i przekazujemy tekst, który ma zostać przekonwertowany na wektor. W tym przypadku przekazujemy pytanie, które ma zostać zadane.

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

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

Długość wektora jest drukowana tylko w celu odniesienia.

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.

Aby to zrobić, zmierzymy odległość między wektorem pytania a każdym wektorem w bazie danych. Istnieje wiele technik pomiaru odległości między wektorami. W tym przypadku użyjemy odległości euklidesowej lub normy L2.

73ea8635c4570bea.png

W Pythonie możemy do tego celu użyć funkcji 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

Na początek zamieniamy kolumnę z osadzonym tekstem lub wektorami w naszej bazie danych na listę i przechowujemy ją w kolumnie 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, w której znaleziono dany adres. 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

Znajomość pozycji na liście wektora, który ma najkrótszą odległość od pytania do bazy danych, pozwala nam 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 wykonaniu zobaczysz coś takiego:

7a0e429171a19afe.png

9. Gratulacje

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

Poznaliśmy podstawy wektorów dystrybucyjnych tekstu oraz sposób korzystania z modelu gecko003 w GCP Workbench.

Znasz już najważniejsze kroki, które pozwolą Ci stosować zdobytą wiedzę w większej liczbie przypadków.

Co dalej?

Zapoznaj się z tymi ćwiczeniami z programowania

Dokumenty referencyjne