Home Машинное обучение Встраивание текста и поиск сходства предложений в любом масштабе с помощью Amazon SageMaker JumpStart | DeepTech

Встраивание текста и поиск сходства предложений в любом масштабе с помощью Amazon SageMaker JumpStart | DeepTech

0
Встраивание текста и поиск сходства предложений в любом масштабе с помощью Amazon SageMaker JumpStart
 | DeepTech

Текстовые векторы или внедрения — это числовые векторные представления текста, которые генерируются большими языковыми моделями (LLM). После того, как LLM полностью предварительно обучены на большом наборе данных или настроены на основе различных задач, включая завершение текста, ответы на вопросы и переводы, встраивание текста фиксирует семантическую информацию входного текста. Различные последующие приложения становятся возможными благодаря встраиванию текста, включая поиск по сходству, поиск информации, рекомендации и персонализацию, многоязычный перевод и многое другое.

Прежде чем интеллектуальные приложения можно было создавать на основе внедрений, предприятиям и организациям приходилось внедрять существующие документы, что могло быть дорогостоящим и технически сложным. Amazon SageMaker JumpStart — это центр машинного обучения (ML), который помогает ускорить этот процесс. С помощью SageMaker JumpStart вы можете получить доступ к предварительно обученным новейшим моделям внедрения текста от различных поставщиков моделей, включая Hugging Face, AI 21 Labs, Cohere и Meta AI. Вы можете легко внедрить эти модели в производство с помощью пользовательского интерфейса SageMaker JumpStart или SDK. Кроме того, никакие ваши данные не используются для обучения базовых моделей. Поскольку все данные зашифрованы и не покидают собственное VPC, вы можете быть уверены, что ваши данные останутся конфиденциальными.

В этом посте мы покажем, как использовать SageMaker Python SDK для встраивания текста и сходства предложений. Сходство предложений включает в себя оценку сходства между двумя фрагментами текста после их преобразования во встраивания с помощью LLM, что является основным шагом для таких приложений, как Поисковая дополненная генерация (RAG). Мы демонстрируем, как сделать следующее:

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

Весь код доступен на GitHub.

Развертывание модели внедрения текста с помощью SageMaker JumpStart

Чтобы разместить модель в Amazon SageMaker, первым делом необходимо настроить и аутентифицировать использование сервисов AWS. В Amazon SageMaker Studio мы используем роль выполнения, связанную с экземпляром блокнота. См. следующий код:

import sagemaker, boto3, json
from sagemaker.session import Session
sagemaker_session = Session()
aws_role = sagemaker_session.get_caller_identity_arn()
aws_region = boto3.Session().region_name
sess = sagemaker.Session()

В Hugging Face тест массивного встраивания текста (MTEB) предоставляется в качестве таблица лидеров для разнообразных задач по встраиванию текста. В настоящее время он предоставляет 129 наборов данных для сравнительного анализа для 8 различных задач на 113 языках. Лучшие модели встраивания текста из таблицы лидеров MTEB доступны в SageMaker JumpStart, включая bge, gte, e5, и более. В этом посте мы используем huggingface-sentencesimilarity-bge-large-en В качестве примера. Мы можем использовать SageMaker SDK для развертывания этой современной модели встраивания текста:

from sagemaker.jumpstart.model import JumpStartModel

model_id = "huggingface-sentencesimilarity-bge-large-en"
text_embedding_model = JumpStartModel(model_id=model_id)
predictor = text_embedding_model.deploy()

Запрос модели внедрения текста

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

Текст для встраивания

Если вы уже развернули конечную точку SageMaker, predictor можно восстановить следующим образом:

from sagemaker.predictor import Predictor
from sagemaker.deserializers import JSONDeserializer
from sagemaker.serializers import IdentitySerializer

predictor = Predictor(
    endpoint_name=<YOUR_ENDPOINT_NAME>,
    deserializer=JSONDeserializer(),
    serializer=IdentitySerializer(),
)
predictor.content_type = "application/x-text"

После успешного развертывания модели вы можете запросить конечную точку с пакетом входных текстов в полезной нагрузке JSON:

sentences = (
    # Pets
    "Your dog is so cute.",
    "How cute your dog is!",
    "You have such a cute dog!",
    # Cities
    "Sydney is the place where I work.",
    "I work in Sydney.",
    # Color
    "What colour do you like the most?",
    "What is your favourite colour?",
)

predictor.predict(json.dumps(sentences).encode('utf-8'))

Корреляция вложений этих предложений показана на следующем рисунке.

корреляция_heat_map

Как показано на предыдущем рисунке, одни и те же субъекты сильно коррелируют внутри себя, в том числе Pets, Citiesи Color; разные предметы сильно отличаются друг от друга. Это указывает на встраивание, генерируемое LLM (в данном случае, bge) может точно представлять семантическую информацию.

В этом посте мы использовали предыдущий пример и сравнили задержку в различных моделях встраивания предложений, доступных в настоящее время в SageMaker JumpStart. Задержка — это количество времени с момента отправки пользователем запроса до момента, когда приложение сообщит, что запрос выполнен. Числа в следующей таблице представляют собой среднюю задержку для 100 запросов, использующих один и тот же пакет входных текстов на ml.g5.2xlarge и ml.c6i.xlarge экземпляры.

Модель g5.2xlarge Средняя задержка (мс) c6i.xlarge Средняя задержка (мс) Языковая поддержка
все-MiniLM-L6-v2 19,5 27,9 Английский
База BGE, англ. 21.2 114 Английский
BGE Small En 28,3 45,6 Английский
BGE Large En 34,7 337 Английский
Многоязычная база E5 22.1 118 Многоязычный
Многоязычный E5, большой 39,8 360 Многоязычный
База Е5 25,6 117 Английский
База E5 V2 25,2 123 Английский
E5 Большой 32,2 339 Английский
E5 Большой V2 32,5 331 Английский
База ГТЭ 22.2 112 Английский
ГТД Малый 19,7 46 Английский
ГТД Большой 39,7 347 Английский

Получить ближайших соседей

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

  • корпус – Предоставляет список входных данных, из которых можно найти ближайшего соседа.
  • запросы – Предоставляет список входных данных, для которых можно найти ближайшего соседа из корпуса.
  • top_k – Количество ближайших соседей, которых можно найти из корпуса
  • режим – Установить как nn_corpus для того, чтобы ближайшие соседи могли вводить запросы внутри корпуса

См. следующий код:

corpus = (
    "Amazon SageMaker is a fully managed service to prepare data and build, train, and deploy machine learning (ML) models for any use case with fully managed infrastructure, tools, and workflows.",
    "Amazon SageMaker stores code in ML storage volumes, secured by security groups and optionally encrypted at rest.",
    "Amazon SageMaker provides a full end-to-end workflow, but you can continue to use your existing tools with SageMaker. You can easily transfer the results of each stage in and out of SageMaker as your business requirements dictate."
)
queries = (
    "What is Amazon SageMaker?",
    "How does Amazon SageMaker secure my code?",
    "What if I have my own notebook, training, or hosting environment in my own business environment?"
)

payload_nearest_neighbor = {"corpus": corpus, "queries": queries, "top_k": 3, "mode": "nn_corpus"}
query_response = predictor.predict(payload_nearest_neighbor)

Мы получаем следующий результат:

(
    (
        {'corpus_id': 0, 'score': 0.8992230892181396},
        {'corpus_id': 2, 'score': 0.8664969205856323},
        {'corpus_id': 1, 'score': 0.8456423282623291}
    ),
    (
        {'corpus_id': 1, 'score': 0.8919335603713989},
        {'corpus_id': 0, 'score': 0.840064525604248},
        {'corpus_id': 2, 'score': 0.8145401477813721}
    ),
    (
        {'corpus_id': 2, 'score': 0.7712811231613159},
        {'corpus_id': 1, 'score': 0.7564010620117188},
        {'corpus_id': 0, 'score': 0.7525666356086731}
    )
)

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

Мы также взяли предыдущий образец и сравнили задержку в различных моделях внедрения предложений, доступных в настоящее время в SageMaker JumpStart. Числа в следующей таблице представляют собой среднюю задержку для 100 запросов, использующих одну и ту же полезную нагрузку на сервере. ml.g5.2xlarge и ml.c6i.xlarge экземпляры.

Модель g5.2xlarge Средняя задержка (мс) c6i.xlarge Средняя задержка (мс) Языковая поддержка
все-MiniLM-L6-v2 21,7 69,1 Английский
База BGE, англ. 29.1 372 Английский
BGE Small En 29,2 124 Английский
BGE Large En 47,2 1240 Английский
Многоязычная база E5 30 389 Многоязычный
Многоязычный E5, большой 47,1 1380 Многоязычный
База Е5 30,4 373 Английский
База E5 V2 31 409 Английский
E5 Большой 45,9 12:30 Английский
E5 Большой V2 49,6 1220 Английский
База ГТЭ 30,3 375 Английский
ГТД Малый 28,5 129 Английский
ГТД Большой 46,6 1320 Английский

Получить ближайших соседей в большом наборе данных

При отправке запросов к конечной точке вызова SageMaker полезные данные ограничиваются примерно 5 МБ, а время ожидания запроса устанавливается равным 1 минуте. Если размер корпуса превышает эти ограничения, вы можете использовать задание обучения SageMaker, которое генерирует внедрения для вашего большого набора данных и сохраняет их вместе с моделью внутри конечной точки SageMaker. Поэтому их не обязательно передавать как часть полезных данных вызова. Процесс поиска ближайших соседей осуществляется с помощью ПредложениеТрансформатор и его функция полезности. Ближайший сосед основан на косинусном сходстве между встраиванием входного предложения и встраиванием предложений, заранее вычисленным во время задания обучения.

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

!aws s3 cp s3://jumpstart-cache-prod-us-west-2/training-datasets/Amazon_SageMaker_FAQs/Amazon_SageMaker_FAQs.csv Amazon_SageMaker_FAQs.csv

import pandas as pd

data = pd.read_csv("Amazon_SageMaker_FAQs.csv", names=("Questions", "Answers"))
data("id") = data.index
data_req = data(("id", "Answers"))
data_req.to_csv("data.csv", index=False, header=False)

output_bucket = sess.default_bucket()
output_prefix = "jumpstart-example-ss-training"

s3_output_location = f"s3://{output_bucket}/{output_prefix}/output"
training_dataset_s3_path = f"s3://{output_bucket}/{output_prefix}/data/data.csv"

!aws s3 cp data.csv {training_dataset_s3_path}

Для гиперпараметров обучения, специфичных для алгоритма, SageMaker SDK можно получить или перезаписать:

from sagemaker import hyperparameters

hyperparameters = hyperparameters.retrieve_default(model_id=model_id, model_version = "*")
hyperparameters("batch_size") = "64"
print(hyperparameters)
>>> {'max_seq_length': 'None', 'batch_size': '64', 'store_text_with_embedding': 'True'}

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

from sagemaker.jumpstart.estimator import JumpStartEstimator

estimator = JumpStartEstimator(
    model_id=model_id,
    hyperparameters=hyperparameters,
    output_path=s3_output_location
)

estimator.fit(
    {"training": f"s3://{output_bucket}/{output_prefix}/data"}
)
predictor = estimator.deploy()

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

payload_nearest_neighbour = {
    "queries": ("Is R supported with Amazon SageMaker?"),
    "top_k": 1,
    "mode": "nn_train_data",
}

response = predictor.predict(payload_nearest_neighbour)
>>> (({'id': '9', 'score': 0.9240573048591614}))

data("Answers").iloc(int(response(0)(0)("id")))
>>> "Yes, R is supported with Amazon SageMaker. You can use R within SageMaker notebook instances, which include a preinstalled R kernel and the reticulate library. Reticulate offers an R interface for the Amazon SageMaker Python SDK, enabling ML practitioners to build, train, tune, and deploy R models."

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

total_correct_answers = 0

for i in range(len(data)):
    question = data("Questions").iloc(i)
    payload_nearest_neighbor = {
        "queries": (question),
        "top_k": 3,
        "mode": "nn_train_data",
    }
    response = predictor.predict(payload_nearest_neighbor)
    response_ids = (int(res("id")) for res in response(0))

    if i in response_ids:
        total_correct_answers += 1
    else:
        pred_answer = (data("Answers").iloc(response_id) for response_id in response_ids)

print(total_correct_answers*100/len(data))
>>>
81.16883116883118

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

Для предприятий и организаций с большим объемом исторических документов, которые превышают объем памяти одного экземпляра конечной точки, вы можете использовать пакетное преобразование SageMaker для экономии затрат. Когда вы запускаете задание пакетного преобразования, SageMaker запускает необходимые вычислительные ресурсы для обработки данных. Во время выполнения задания SageMaker автоматически выделяет вычислительные ресурсы и управляет ими. По завершении задания пакетного преобразования эти ресурсы автоматически очищаются, что минимизирует затраты. Разделив большой набор данных на более мелкие фрагменты и используя больше экземпляров, вы можете масштабировать вычисления для более быстрого вывода с аналогичными затратами без управления инфраструктурой. Максимальная полезная нагрузка для пакетного преобразования — 100 МБ, а время ожидания — 1 час.

Входным форматом для нашего задания пакетного преобразования является файл JSONL с записями в виде строки JSON, состоящей из id и text_inputs. См. следующий код:

test_data_file_name = "test.jsonl"
test_data = ()

for i in range(len(data)):
    answer = data.loc(i, "Answers")
    payload = {"id": i, "text_inputs": answer}
    test_data.append(payload)

with open(test_data_file_name, "w") as outfile:
    for entry in test_data:
        outfile.write(f"{json.dumps(entry)}\n")

s3 = boto3.client("s3")
s3.upload_file(test_data_file_name, output_bucket, f"{output_prefix}/batch_input/test.jsonl")

Когда данные будут готовы в Amazon Simple Storage Service (Amazon S3), вы можете создать объект пакетного преобразования из модели SageMaker JumpStart, который запускает задание преобразования:

s3_input_data_path = f"s3://{output_bucket}/{output_prefix}/batch_input/"
s3_output_data_path = f"s3://{output_bucket}/{output_prefix}/batch_output/"

batch_transformer = text_embedding_model.transformer(
    instance_count=1,
    instance_type="ml.p3.2xlarge",
    output_path=s3_output_data_path,
    assemble_with="Line",
    accept="text/csv",
    max_payload=1,
)

batch_transformer.transform(
    s3_input_data_path,
    content_type="application/jsonlines",
    split_type="Line"
)

batch_transformer.wait()

После завершения задания пакетного преобразования вы можете загрузить результат с Amazon S3:

s3 = boto3.client("s3")
s3.download_file(
    output_bucket, output_prefix + "/batch_output/" + "test.jsonl.out", "predict.jsonl"
)

with open("predict.jsonl", "r") as json_file:
    json_list = list(json_file)

Заключение

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

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


Об авторах

Доктор Байчуань Сунь, в настоящее время работает старшим архитектором решений AI/ML в AWS, специализируется на генеративном искусственном интеллекте и применяет свои знания в области науки о данных и машинного обучения для предоставления практических облачных бизнес-решений. Имея опыт в управленческом консалтинге и архитектуре решений искусственного интеллекта, он решает ряд сложных задач, включая, среди прочего, робототехническое компьютерное зрение, прогнозирование временных рядов и профилактическое обслуживание. Его работа основана на солидном опыте управления проектами, исследованиях и разработках программного обеспечения и академической деятельности. Вне работы доктор Сан любит путешествовать и проводить время с семьей и друзьями, что отражает стремление как к его профессиональному росту, так и к личному благополучию.

Хемант Сингх — учёный-прикладник с опытом работы в Amazon SageMaker JumpStart. Он получил степень магистра в Институте математических наук Куранта и степень бакалавра технических наук в ИИТ Дели. У него есть опыт работы над широким спектром задач машинного обучения в области обработки естественного языка, компьютерного зрения и анализа временных рядов.

Доктор Ашиш Хетан — старший научный сотрудник, работающий со встроенными алгоритмами Amazon SageMaker и помогающий разрабатывать алгоритмы машинного обучения. Он получил докторскую степень в Университете Иллинойса Урбана-Шампейн. Он является активным исследователем в области машинного обучения и статистического вывода и опубликовал множество статей на конференциях NeurIPS, ICML, ICLR, JMLR, ACL и EMNLP.

LEAVE A REPLY

Please enter your comment!
Please enter your name here