Использование textembedding-gecko@003 для векторных вложений

1. Введение

Последнее обновление: 08.04.2024

Встраивание текста

Встраивание текста — это процесс преобразования текстовых данных в числовые представления. Эти числовые представления, часто векторные, отражают семантическое значение и взаимосвязи между словами в тексте. Представьте это так:

Текст подобен сложному языку, полному нюансов и двусмысленностей.

Встраивание текста переводит этот язык в более простой, математический формат, который компьютеры могут понимать и обрабатывать.

Преимущества встраивания текста

  • Обеспечивает эффективную обработку: числовые представления обрабатываются компьютерами гораздо быстрее, чем необработанный текст. Это имеет решающее значение для таких задач, как поисковые системы, рекомендательные системы и машинный перевод.
  • Отражает семантическое значение: векторные представления выходят за рамки простого буквального значения слов. Они учитывают контекст и взаимосвязи между словами, что позволяет проводить более тонкий анализ.
  • Повышает эффективность машинного обучения: текстовые векторные представления могут использоваться в качестве признаков в моделях машинного обучения, что приводит к улучшению результатов в таких задачах, как анализ настроений, классификация текста и тематическое моделирование.

Примеры использования встраивания текста

Встраивание текста, преобразуя текст в числовые представления, открывает множество возможностей для применения в обработке естественного языка (NLP). Вот несколько ключевых примеров использования:

1. Поисковые системы и поиск информации:

Встраивание текста позволяет поисковым системам понимать семантическое значение запросов и сопоставлять их с соответствующими документами, даже если точные ключевые слова отсутствуют.

Сравнивая векторные представления поискового запроса с векторными представлениями документов, поисковые системы могут выявлять документы, охватывающие схожие темы или концепции.

2. Системы рекомендаций:

Рекомендательные системы используют текстовые встраивания для анализа поведения пользователей и их предпочтений, выраженных в отзывах, оценках или истории просмотров.

Затем система может рекомендовать похожие товары, сравнивая встроенные элементы продуктов, статей или другого контента, с которым взаимодействовал пользователь.

3. Выявление плагиата:

Сравнение векторных представлений двух текстовых фрагментов может помочь выявить потенциальный плагиат, обнаружив существенные сходства в их семантической структуре.

Это лишь несколько примеров, и возможности продолжают расти по мере развития методов встраивания текста. По мере того, как компьютеры будут лучше понимать язык с помощью векторных представлений, мы можем ожидать еще больше инновационных приложений в будущем.

textembedding-gecko@003

Textembedding-gecko@003 — это конкретная версия предварительно обученной модели встраивания текста, предлагаемой облачной платформой Google (GCP) через Vertex AI и их набор инструментов и сервисов искусственного интеллекта.

Что вы построите

В этом практическом задании вы создадите скрипт на Python. Этот скрипт будет:

  • Используйте API Vertex для вызова функции textembedding-gecko@003 и преобразования текста в текстовые эмбеддинги (векторы).
  • Создайте смоделированную базу данных, состоящую из текста и его векторов.
  • Выполните запрос к нашей смоделированной базе данных векторов, сравнив векторы, и получите наиболее вероятный ответ.

Что вы узнаете

  • Как использовать встраивание текста в GCP
  • Как позвонить textembedding-gecko@003
  • Как запустить это в Workbench
  • Как использовать Vertex AI - Workbench для выполнения скриптов

Что вам понадобится

  • Последняя версия Chrome
  • Знание Python
  • Проект Google Cloud
  • Доступ к Vertex AI - Workbench

2. Настройка

Создайте экземпляр Vertex AI Workbench.

  1. В консоли Google Cloud на странице выбора проекта выберите или создайте проект Google Cloud.
  1. Перейдите к выбору проекта
  2. Убедитесь, что для вашего проекта в Google Cloud включена функция выставления счетов.
  3. Включите API для блокнотов.

Создать экземпляр Vertex AI Workbench можно с помощью консоли Google Cloud, интерфейса командной строки gcloud или Terraform. В рамках этого руководства мы будем создавать его с помощью консоли Google Cloud. Более подробную информацию о других методах можно найти здесь .

  1. В консоли Google Cloud перейдите на страницу «Экземпляры», доступ к которой можно получить через меню Vertex AI, раздел «Блокноты», и нажмите «Рабочая среда». 56c087d619c464dd.png
  2. Перейдите в раздел «Экземпляры».
  3. Нажмите «Создать новый». 381ff9b895e77641.png
  4. В диалоговом окне «Создать экземпляр» в разделе «Подробности» укажите следующую информацию для вашего нового экземпляра:

Имя : Укажите имя для нового экземпляра. Имя должно начинаться с буквы, за которой следует не более 62 строчных букв, цифр или дефисов (-), и не может заканчиваться дефисом.

Регион и зона : Выберите регион и зону для нового экземпляра. Для оптимальной производительности сети выберите регион, географически наиболее близкий к вам.

Нет необходимости устанавливать графический процессор.

В разделе «Сетевые настройки» укажите следующее:

Настройка сети : Настройте параметры сети, чтобы использовать сеть из текущего проекта или общую сеть VPC из основного проекта, если таковая настроена. Если вы используете общую сеть VPC в основном проекте, необходимо также предоставить роль пользователя вычислительной сети (roles/compute.networkUser) агенту службы Notebooks из проекта службы.

В поле «Сеть» : выберите нужную сеть. Вы можете выбрать сеть VPC, при условии, что в этой сети включен Private Google Access или она имеет доступ к интернету.

В поле «Подсеть»: выберите нужную подсеть. Можно выбрать подсеть по умолчанию.

В свойствах экземпляра можно оставить значение по умолчанию, а именно e2-standard-4.

d47bdc2d7f516c46.png

  1. Нажмите «Создать».

Vertex AI Workbench создает экземпляр и автоматически запускает его. Когда экземпляр будет готов к использованию, Vertex AI Workbench активирует ссылку «Открыть JupyterLab». Щелкните по ней.

Создайте блокнот Python 3.

  1. Внутри Jupyterlab, в меню запуска, в разделе «Блокноты» нажмите на значок с логотипом Python, на котором написано Python3. e16bb118cd28256f.png
  2. Создается блокнот Jupyter с именем Untitled и расширением ipynb. da9bd34cf307156c.png
  3. Вы можете переименовать его, используя раздел файлового браузера слева, или оставить как есть.

Теперь мы можем начать вставлять наш код в блокнот.

3. Импорт необходимых библиотек

После создания экземпляра и открытия Jupyterlab нам необходимо установить все необходимые библиотеки для нашей практической работы.

Нам понадобится:

  1. numpy
  2. панды
  3. TextEmbeddingInput, TextEmbeddingModel из vertexai.language_models

Скопируйте и вставьте приведенный ниже код в ячейку:

from vertexai.language_models import TextEmbeddingInput, TextEmbeddingModel

import numpy as np
import pandas as pd

Это будет выглядеть примерно так:

6852d323eedcac93.png

4. Создайте имитированную базу данных векторов.

Для тестирования нашего кода мы создадим базу данных, содержащую текст и соответствующие ему векторные представления, преобразованные с помощью модели векторного представления текста gecko@003.

Цель состоит в том, чтобы пользователи могли найти текст, преобразовать его в вектор, найти его в нашей базе данных и получить наиболее точный результат.

Наша база данных векторов будет содержать 3 записи, вот как мы её создадим:

Скопируйте и вставьте приведенный ниже код в новую ячейку.

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

Это будет выглядеть примерно так:

26baa3b876c0605d.png

Давайте проанализируем код.

В переменных DOCUMENT1, DOCUMENT2 и DOCUMENT3 хранится словарь, который будет имитировать документы по их заголовкам и содержимому. Эти «документы» ссылаются на смоделированное руководство по эксплуатации автомобиля, созданного Google.

В следующей строке мы создаём список из этих трёх документов (словарей).

documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]

Наконец, используя библиотеку pandas, мы создадим из этого списка DataFrame, который будет называться df_initial_db.

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

5. Создайте векторные представления текста.

Теперь мы получим текстовое представление, используя модель gecko@003, для каждой записи в нашей смоделированной базе данных документов.

Скопируйте и вставьте приведенный ниже код в новую ячейку:

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      

Это будет выглядеть примерно так:

4c4af091c7a82861.png

Давайте проанализируем код.

Мы определили функцию embed_fn, которая принимает на вход датафрейм pandas, содержащий текст для выполнения встраивания. Затем функция возвращает текст, закодированный в виде вектора.

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             

В списке с именем list_embedded_values ​​мы будем хранить и добавлять закодированный текст каждой строки.

Используя метод iterrows из библиотеки pandas, мы можем перебрать каждую строку в датафрейме, получая значения из столбца Text (который содержит информацию, введенную вручную из нашей имитированной базы данных).

Для отправки обычного текста и возврата его вектора с использованием модели gecko@003 мы инициализируем переменную model, в которой задаем используемую модель, вызывая функцию TextEmbeddingModel.from_pretrained.

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

Затем в переменных embeddings мы получаем вектор текста, который отправляем с помощью функции model.get_embeddings.

В конце функции мы создаём в датафрейме новый столбец под названием Embedded text, который будет содержать список векторов, созданных на основе модели gecko@003.

df_input['Embedded text'] = list_embedded_values
return df_input             

Наконец, в переменной df_embedded_values_db мы получаем датафрейм, содержащий наши исходные данные из смоделированной базы данных, а также новый столбец, содержащий список векторов для каждой строки.

df_embedded_values_db = embed_fn(df_initial_db)
df_embedded_values_db      

6. Задать вопрос базе данных векторов.

Теперь, когда наша база данных содержит текст и его векторные представления, мы можем задать вопрос и выполнить запрос к базе данных, чтобы найти ответ.

Для этого скопируйте и вставьте приведенный ниже код в новую ячейку:

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)

В результате получится примерно следующее:

6b7cf9b08e3b4573.png

Давайте проанализируем код.

Аналогично функции из предыдущего шага, сначала мы инициализируем переменную question тем, что мы собираемся спросить у нашей базы данных.

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

Затем в переменной model мы задаем модель, которую хотим использовать, с помощью функции TextEmbeddingModel.from_pretrained, которая в данном случае является моделью gecko@003.

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

В переменной embeddings мы вызываем функцию model.get_embeddings и передаем текст, который нужно преобразовать в вектор, в данном случае мы передаем вопрос, который нужно задать.

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

Наконец, переменная text_to_search содержит список векторов, переведенных из вопроса.

Мы выводим длину вектора просто для справки.

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

7. Сравнение векторов

Теперь у нас есть список векторов в нашей смоделированной базе данных и вопрос, преобразованный в вектор. То есть, теперь мы можем сравнить вектор вопроса со всеми векторами в нашей базе данных, чтобы определить, какой из них наиболее точно отвечает на наш вопрос.

Для этого мы измерим расстояние между вектором вопроса и каждым вектором базы данных. Существует несколько методов измерения расстояний между векторами, но для данной конкретной практической работы мы будем использовать евклидово расстояние или L2-норму.

73ea8635c4570bea.png

В Python для этого можно использовать функцию `numpy`.

Скопируйте и вставьте приведенный ниже код в новую ячейку:

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}')

В результате должно получиться примерно так:

b70563b50ea86668.png

Давайте проанализируем код.

Для начала преобразуем столбец, содержащий встроенный текст или векторы из нашей базы данных, в список и сохраняем его в переменной list_embedded_text_from_db.

Мы также инициализировали переменную shortest_distance значением 1, чтобы продолжать обновлять ее до тех пор, пока не найдем фактическое кратчайшее расстояние.

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

Затем, используя цикл for, мы перебираем вектор из вопроса и получаем расстояние между каждым вектором в базе данных.

Используя функцию numpy linalg.norm, мы вычисляем расстояние между ними.

Если вычисленное расстояние меньше значения в переменной shortest_distance, то вычисленное расстояние будет присвоено этой переменной.

Затем мы фиксируем кратчайшее расстояние, а также позицию в списке, где оно было найдено. Эти данные сохраняются в переменных shortest_distance и 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. Результаты

Зная позицию вектора в списке, содержащего кратчайшее расстояние между вопросом и базой данных, мы можем вывести результаты.

Скопируйте и вставьте приведенный ниже код в новую ячейку:

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'])

После выполнения вы получите примерно такой результат:

7a0e429171a19afe.png

9. Поздравляем!

Поздравляем, вы успешно создали свое первое приложение, используя модель textembedding-gecko@003 в реальном практическом примере!

Вы изучили основы векторного представления текста и научились использовать модель gecko003 в GCP Workbench.

Теперь вы знаете ключевые шаги, необходимые для дальнейшего применения ваших знаний в большем количестве сценариев.

Что дальше?

Посмотрите некоторые из этих практических занятий по программированию...

Справочная документация