1. Введение
Последнее обновление: 8 апреля 2024 г.
Встраивание текста
Встраивание текста — это процесс преобразования текстовых данных в числовые представления. Эти числовые представления, часто векторные, отражают семантическое значение и отношения между словами в тексте. Представьте себе это так:
Текст подобен сложному языку, полному нюансов и двусмысленностей.
Встраивание текста переводит этот язык в более простой математический формат, который компьютеры могут понимать и манипулировать им.
Преимущества внедрения текста
- Обеспечивает эффективную обработку. Числовые представления обрабатываются компьютерами гораздо быстрее, чем необработанный текст. Это крайне важно для таких задач, как поисковые системы, системы рекомендаций и машинный перевод.
- Улавливает семантическое значение: встраивания выходят за рамки буквального значения слов. Они фиксируют контекст и отношения между словами, позволяя проводить более детальный анализ.
- Повышает производительность машинного обучения. Встраивание текста можно использовать в качестве функций в моделях машинного обучения, что приводит к повышению производительности в таких задачах, как анализ настроений, классификация текста и тематическое моделирование.
Варианты использования встраивания текста
Встраивание текста путем преобразования текста в числовые представления открывает множество приложений в области обработки естественного языка (NLP). Вот несколько ключевых случаев использования:
1. Поисковые системы и поиск информации:
Встраивание текста позволяет поисковым системам понимать семантическое значение запросов и сопоставлять их с соответствующими документами, даже если точные ключевые слова отсутствуют.
Сравнивая вложения поискового запроса с вложениями документов, поисковые системы могут идентифицировать документы, охватывающие схожие темы или концепции.
2. Рекомендательные системы:
Рекомендательные системы используют встраивание текста для анализа поведения и предпочтений пользователей, выраженных через обзоры, рейтинги или историю просмотров.
Затем система может рекомендовать похожие элементы, сравнивая встраивания продуктов, статей или другого контента, с которым взаимодействовал пользователь.
3. Обнаружение плагиата:
Сравнение вложений двух фрагментов текста может помочь выявить потенциальный плагиат, обнаружив значительное сходство в их семантической структуре.
Это всего лишь несколько примеров, и возможности продолжают расти по мере развития методов встраивания текста. Поскольку компьютеры начинают лучше понимать язык благодаря встраиваниям, мы можем ожидать еще более инновационных приложений в будущем.
textembedding-gecko@003
Textembedding-gecko@003 — это особая версия предварительно обученной модели внедрения текста, предлагаемая Google Cloud Platform (GCP) через Vertex AI и ее набор инструментов и сервисов AI.
Что ты построишь
В этой лабораторной работе вы собираетесь создать скрипт Python. Этот скрипт будет:
- Используйте API Vertex для вызова textembedding-gecko@003 и преобразования текста во встроенные текстовые элементы (векторы).
- Создайте смоделированную базу данных из текста и их векторов.
- Выполните запрос к нашей базе данных смоделированных векторов, сравнив векторы и получив наиболее вероятный ответ.
Что вы узнаете
- Как использовать встраивание текста в GCP
- Как позвонить textembedding-gecko@003
- Как запустить это в Workbench
- Как использовать Vertex AI — Workbench для выполнения скриптов
Что вам понадобится
- Последняя версия Chrome
- Знание Python
- Облачный проект Google
- Доступ к Vertex AI — Workbench
2. Приступаем к настройке
Создайте экземпляр Vertex AI Workbench
- В консоли Google Cloud на странице выбора проекта выберите или создайте проект Google Cloud.
- Перейти к выбору проектов
- Убедитесь, что для вашего проекта Google Cloud включена оплата.
- Включите API ноутбуков.
Вы можете создать экземпляр Vertex AI Workbench с помощью консоли Google Cloud, интерфейса командной строки gcloud или Terraform. Для целей этого руководства мы создадим его с помощью Google Cloud Console. Более подробную информацию о других методах можно найти здесь .
- В консоли Google Cloud перейдите на страницу «Экземпляры», доступ к которой можно получить в меню Vertex AI, раздел «Блокноты», и нажмите «Workbench».
- Перейдите в раздел «Экземпляры».
- Нажмите Создать новый.
- В диалоговом окне «Создать экземпляр» в разделе «Сведения» укажите следующую информацию для вашего нового экземпляра:
Имя : укажите имя для вашего нового экземпляра. Имя должно начинаться с буквы, за которой могут следовать до 62 строчных букв, цифр или дефисов (-), и не может заканчиваться дефисом.
Регион и зона : выберите регион и зону для нового экземпляра. Для обеспечения наилучшей производительности сети выберите географически ближайший к вам регион.
Нет необходимости устанавливать графический процессор
В разделе «Сеть» укажите следующее:
Сеть : настройте параметры сети, чтобы использовать сеть в текущем проекте или общую сеть VPC из хост-проекта, если она настроена. Если вы используете общий VPC в главном проекте, вам также необходимо предоставить роль пользователя вычислительной сети (roles/compute.networkUser) агенту службы ноутбуков из проекта службы.
В поле «Сеть» выберите нужную сеть. Вы можете выбрать сеть VPC, если в сети включен частный доступ Google или есть доступ к Интернету.
В поле «Подсеть»: выберите нужную подсеть. Вы можете выбрать вариант по умолчанию.
В свойствах экземпляра можно оставить значение по умолчанию, то есть e2-standard-4.
- Нажмите «Создать».
Vertex AI Workbench создает экземпляр и автоматически запускает его. Когда экземпляр готов к использованию, Vertex AI Workbench активирует ссылку Open JupyterLab. Нажмите на него.
Создайте блокнот Python 3
- Внутри Jupyterlab на панели запуска в разделе «Блокнот» щелкните значок с логотипом Python с надписью «Python3».
- Блокнот Jupyter создается с именем «Без названия» и расширением ipynb.
- Вы можете переименовать его, используя раздел браузера файлов слева, или оставить как есть.
Теперь мы можем начать помещать наш код в блокнот.
3. Импорт необходимых библиотек.
После создания экземпляра и открытия Jupyterlab нам необходимо установить все необходимые библиотеки для нашей лаборатории кода.
Нам понадобится:
- бестолковый
- панды
- TextEmbeddingInput, TextEmbeddingModel из vertexai.language_models
Скопируйте и вставьте приведенный ниже код в ячейку:
from vertexai.language_models import TextEmbeddingInput, TextEmbeddingModel
import numpy as np
import pandas as pd
Это будет выглядеть примерно так:
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
Это будет выглядеть так:
Давайте проанализируем код
В переменных DOCUMENT1, DOCUMENT2 и DOCUMENT3 мы храним словарь, который будет эмулировать документы с их названиями и содержимым. Эти «документы» ссылаются на смоделированное руководство автомобиля, созданного Google.
В следующей строке мы создаем список из этих трех документов (словарей).
documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]
Наконец, используя pandas, мы создаем из этого списка фрейм данных, который будет называться 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
Это будет выглядеть так:
Давайте проанализируем код
Мы определили функцию 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, мы инициализируем переменную модель, в которой мы устанавливаем модель для использования, вызывая функцию TextEmbeddingModel.from_pretrained.
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(row['Text'])])
Затем во встраиваниях переменных мы фиксируем вектор текста, который отправляем с помощью функции model.get_embeddings.
В конце функции мы создаем новый столбец в кадре данных под названием «Встроенный текст», который будет содержать список векторов, созданных на основе модели 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)
Результат будет выглядеть примерно так:
Давайте проанализируем код
Подобно функции из предыдущего шага, мы сначала инициализируем переменную вопроса тем, что мы собираемся задать нашей базе данных.
question='How do you shift gears in the Google car?'
Затем в переменной модели мы устанавливаем модель, которую хотим использовать, с помощью функции 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.
В 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}')
Результат должен выглядеть так:
Давайте проанализируем код
Мы начинаем с преобразования столбца, содержащего встроенный текст или векторы нашей базы данных, в список и сохраняем его в 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'])
После его выполнения вы получите что-то вроде этого:
9. Поздравления
Поздравляем, вы успешно создали свое первое приложение, используя модель textembedding-gecko@003 в реальном сценарии использования!
Вы изучили основы встраивания текста и способы использования модели gecko003 в GCP Workbench.
Теперь вы знаете ключевые шаги, необходимые для дальнейшего применения ваших знаний в большем количестве случаев использования.
Что дальше?
Посмотрите некоторые из этих кодовых лабораторий...