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

1. Wprowadzenie

Last Updated: 2024-04-08

Wektor dystrybucyjny tekstu

Wektor dystrybucyjny tekstu to proces przekształcania danych tekstowych w reprezentacje liczbowe. Te reprezentacje numeryczne, często wektory, odzwierciedlają znaczenie semantyczne i relacje między słowami w tekście. Wyobraź sobie taką sytuację:

Tekst jest jak złożony język, pełen niuansów i niejednoznaczności.

Wektor dystrybucyjny tekstu przekształca język w prostszy format matematyczny, który komputery mogą zrozumieć i przetwarzać.

Korzyści z wektorów dystrybucyjnych tekstu

  • Umożliwia wydajne przetwarzanie: reprezentacje numeryczne są przetwarzane przez komputery znacznie szybciej niż zwykły tekst. Jest to kluczowe w przypadku takich zadań jak wyszukiwarki, systemy rekomendacji i tłumaczenie maszynowe.
  • Uchwycenie znaczenia semantycznego: wektory dystrybucyjne wykraczają poza dosłowne znaczenie słów. Uchwycają one kontekst i relacje między słowami, co pozwala na bardziej szczegółową analizę.
  • Poprawa skuteczności systemów uczących się: osadzanie tekstu może być używane jako cechy w modelach uczenia maszynowego, co prowadzi do lepszych wyników w przypadku zadań takich jak analiza nastawienia, klasyfikacja tekstu i modelowanie tematyczne.

Przykłady zastosowań wektorów dystrybucyjnych tekstu

Osadzanie tekstu, czyli przekształcanie tekstu w reprezentacje numeryczne, otwiera wiele możliwości zastosowania w przetwarzaniu języka naturalnego (NLP). Oto kilka kluczowych zastosowań:

1. Wyszukiwarki i wyszukiwanie informacji:

Wektory dystrybucyjne tekstu umożliwiają wyszukiwarkom zrozumienie semantycznego znaczenia zapytań i dopasowywanie ich do odpowiednich dokumentów, nawet jeśli nie zawierają one dokładnych słów kluczowych.

Porównując osadzenia zapytania z osadzeniami dokumentów, wyszukiwarki mogą identyfikować dokumenty, które dotyczą podobnych tematów lub koncepcji.

2. Systemy rekomendacji:

Systemy rekomendacji wykorzystują wektor dystrybucyjny tekstu 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 osadzenia produktów, artykułów lub innych treści, z którymi użytkownik wchodził w interakcje.

3. Wykrywanie plagiatów:

Porównanie wektorów osadzania dwóch fragmentów tekstu może pomóc w wykryciu potencjalnego plagiatu poprzez znalezienie znaczących podobieństw w ich strukturze semantycznej.

To tylko kilka przykładów, a możliwości stale rosną wraz z rozwojem technik osadzania tekstu. W miarę jak komputery będą lepiej rozumieć język dzięki osadzaniu, w przyszłości możemy spodziewać się jeszcze bardziej innowacyjnych zastosowań.

textembedding-gecko@003

Textembedding-gecko@003 to konkretna wersja wstępnie wytrenowanego modelu wektora dystrybucyjnego tekstu oferowanego przez Google Cloud Platform (GCP) w ramach Vertex AI oraz pakietu narzędzi i usług AI.

Co utworzysz

W tym ćwiczeniu utworzysz skrypt w Pythonie. Ten skrypt:

  • Użyj interfejsu Vertex API, aby wywołać model textembedding-gecko@003 i przekształcić tekst w wektory dystrybucyjne tekstu.
  • Utwórz symulowaną bazę danych składającą się z tekstu i jego wektorów.
  • Wysyłaj zapytania do naszej symulowanej wektorowej bazy danych, porównując wektory, i uzyskuj najbardziej prawdopodobną odpowiedź.

Czego się nauczysz

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

Czego potrzebujesz

  • najnowsza wersja Chrome,
  • Znajomość Pythona
  • Projekt Google Cloud
  • Dostęp do Vertex AI Workbench

2. Przygotowania

Tworzenie instancji Vertex AI Workbench

  1. W konsoli Google Cloud na stronie selektora projektów wybierz lub utwórz projekt w chmurze 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.

Instancję Vertex AI Workbench możesz utworzyć za pomocą konsoli Google Cloud, gcloud CLI 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ę Instancje, do której możesz przejść w menu Vertex AI, w sekcji Notatniki, i kliknij Workbench. 56c087d619c464dd.png
  2. Otwórz Instancje.
  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 można umieścić do 62 małych liter, cyfr lub łączników (-), i nie może kończyć się łącznikiem.

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

Nie musisz instalować GPU

W sekcji Sieć podaj te informacje:

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

W polu Sieć: wybierz odpowiednią sieć. Możesz wybrać sieć VPC, o ile ma ona włączony prywatny dostęp do Google lub może uzyskać dostęp do internetu.

W polu Podsieć: wybierz odpowiednią podsieć. Możesz wybrać domyślny.

W przypadku właściwości instancji możesz pozostawić domyślną, czyli e2-standard-4.

d47bdc2d7f516c46.png

  1. Kliknij Utwórz.

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

Tworzenie notatnika w Pythonie 3

  1. W JupyterLab w sekcji Notatnik w Launcherze kliknij ikonę z logo Pythona z napisem Python3. e16bb118cd28256f.png
  2. Zostanie utworzony notatnik Jupyter o nazwie Bez tytułu 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 otwarciu JupyterLab musimy zainstalować wszystkie biblioteki wymagane w tym samouczku.

Potrzebne będą:

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

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

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 składającą się z tekstów i odpowiadających im wektorów przetłumaczonych za pomocą modelu wektora dystrybucyjnego tekstu gecko@003.

Celem jest umożliwienie użytkownikom wyszukiwania tekstu, tłumaczenia go na wektor, wyszukiwania go w naszej bazie danych i zwracania najbardziej zbliżonego wyniku.

Nasza baza danych wektorów będzie zawierać 3 rekordy. Utworzymy ją w ten sposób:

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

Będzie to wyglądać tak:

26baa3b876c0605d.png

Analiza kodu

W zmiennych DOCUMENT1, DOCUMENT2 i DOCUMENT3 przechowujemy słownik, który będzie emulować dokumenty z ich tytułami i zawartością. Te „dokumenty” odnoszą się do symulowanej instrukcji obsługi 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 tworzymy 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 uzyskamy wektor dystrybucyjny tekstu za pomocą modelu gecko@003 dla każdego rekordu w naszej symulowanej bazie danych dokumentów.

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      

Będzie to wyglądać 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 osadzania. Następnie funkcja zwraca 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.

Korzystając z metody iterrows z biblioteki pandas, możemy iterować każdy wiersz w ramce danych, pobierają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 zmienną model, w której 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 wektorach dystrybucyjnych zmiennych rejestrujemy wektor tekstu, który wysyłamy za pomocą funkcji model.get_embeddings.

Na końcu funkcji tworzymy w ramce danych nową kolumnę o nazwie Embedded text (Tekst osadzony), 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 zapisujemy ramkę danych zawierającą oryginalne 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 pytań bazie danych wektorowych

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 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 będzie wyglądał mniej więcej tak:

6b7cf9b08e3b4573.png

Analiza kodu

Podobnie jak w przypadku funkcji z poprzedniego kroku najpierw inicjujemy zmienną pytania, podając to, o co chcemy zapytać 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_pretrained. W tym przypadku jest to model gecko@003.

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

W zmiennej embeddings wywołujemy funkcję model.get_embeddings i przekazujemy tekst do przekonwertowania na wektor. W tym przypadku przekazujemy pytanie.

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

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

Długość wektora wyświetlamy tylko w celach informacyjnych.

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

7. Porównywanie wektorów

W naszej symulowanej bazie danych mamy teraz listę wektorów i pytanie przekształcone w wektor. Dzięki temu możemy porównać wektor pytania ze wszystkimi wektorami w naszej bazie danych, aby znaleźć ten, który jest najbliższy 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 konkretnym ćwiczeniu użyjemy odległości euklidesowej lub normy L2.

73ea8635c4570bea.png

W Pythonie możemy to zrobić za pomocą 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

Zaczynamy od przekształcenia kolumny zawierającej osadzony tekst lub wektory z naszej bazy danych w listę i zapisania jej w list_embedded_text_from_db.

Zainicjowaliśmy też zmienną shortest_distance wartością 1, aby ją aktualizować, dopóki nie znajdziemy 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 obliczamy odległość między wektorem z pytania a każdym wektorem w bazie danych.

Za pomocą funkcji numpy linalg.norm obliczamy ich odległość.

Jeśli obliczona odległość jest mniejsza niż wartość zmiennej shortest_distance, zostanie ona ustawiona jako wartość tej zmiennej.

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 pozycję na liście wektora o najmniejszej odległości między pytaniem a bazą danych, możemy wydrukować wyniki.

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

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 wykonaniu tego działania zobaczysz coś takiego:

7a0e429171a19afe.png

9. Gratulacje

Gratulacje! Udało Ci się utworzyć pierwszą aplikację z użyciem modelu textembedding-gecko@003 w rzeczywistym przypadku użycia.

Poznałeś podstawy wektorów dystrybucyjnych tekstu i wiesz, jak używać modelu gecko003 w GCP Workbench.

Znasz już najważniejsze kroki, które pozwolą Ci wykorzystywać zdobytą wiedzę w kolejnych zastosowaniach.

Co dalej?

Sprawdź te ćwiczenia z programowania:

Dokumentacja