Home Машинное обучение Уменьшите галлюцинации с помощью расширенной генерации с использованием базы данных векторов сосновых шишек и Llama-2 от Amazon SageMaker JumpStart | DeepTech

Уменьшите галлюцинации с помощью расширенной генерации с использованием базы данных векторов сосновых шишек и Llama-2 от Amazon SageMaker JumpStart | DeepTech

0
Уменьшите галлюцинации с помощью расширенной генерации с использованием базы данных векторов сосновых шишек и Llama-2 от Amazon SageMaker JumpStart
 | DeepTech

Несмотря на, казалось бы, неудержимое внедрение программ LLM во всех отраслях, они являются одним из компонентов более широкой технологической экосистемы, которая питает новую волну искусственного интеллекта. Многие сценарии использования диалогового ИИ требуют, чтобы LLM, такие как Llama 2, Flan T5 и Bloom, отвечали на запросы пользователей. Эти модели полагаются на параметрические знания для ответа на вопросы. Модель изучает эти знания во время обучения и кодирует их в параметры модели. Чтобы обновить эти знания, нам необходимо переобучить LLM, что требует много времени и денег.

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

В этом сообщении блога мы рассмотрим, как развертывать LLM, такие как Llama-2, с помощью Amazon Sagemaker JumpStart и поддерживать актуальность наших LLM с помощью соответствующей информации с помощью поисковой дополненной генерации (RAG) с использованием базы данных векторов Pinecone, чтобы предотвратить галлюцинации искусственного интеллекта. .

Поисковая дополненная генерация (RAG) в Amazon SageMaker

Pinecone будет обрабатывать компонент поиска RAG, но вам нужны еще два важных компонента: где-то для запуска вывода LLM и где-то для запуска модели внедрения.

Amazon SageMaker Studio — интегрированная среда разработки (IDE), предоставляющая единый веб-визуальный интерфейс, с помощью которого вы можете получить доступ к специально созданным инструментам для выполнения всех задач машинного обучения (ML). Он предоставляет SageMaker JumpStart, который представляет собой центр моделей, где пользователи могут находить, просматривать и запускать конкретную модель в своей учетной записи SageMaker. Он предоставляет предварительно обученные, общедоступные и собственные модели для широкого спектра типов задач, включая базовые модели.

Amazon SageMaker Studio предоставляет идеальную среду для разработки конвейеров LLM с поддержкой RAG. Сначала с помощью консоли AWS перейдите в Amazon SageMaker, создайте домен SageMaker Studio и откройте блокнот Jupyter Studio.

Предварительные условия

Выполните следующие необходимые шаги:

  1. Настройте Amazon SageMaker Studio.
  2. Подключение к домену Amazon SageMaker.
  3. Подпишитесь на бесплатную базу данных векторов сосновых шишек.
  4. Необходимые библиотеки: SageMaker Python SDK, клиент Pinecone.

Пошаговое руководство по решению

Используя блокнот SageMaker Studio, нам сначала необходимо установить необходимые библиотеки:

!pip install -qU sagemaker pinecone-client==2.2.1 ipywidgets==7.0.0 

Развертывание LLM

В этом посте мы обсуждаем два подхода к развертыванию LLM. Первый – через HuggingFaceModel объект. Вы можете использовать это при развертывании LLM (и внедрении моделей) непосредственно из концентратора моделей Hugging Face.

Например, вы можете создать развертываемую конфигурацию для гугл/флан-t5-xl модель, как показано на следующем снимке экрана:

import sagemaker
from sagemaker.huggingface import (
HuggingFaceModel, 
get_huggingface_llm_image_uri
)
role = sagemaker.get_execution_role()
hub_config = {'HF_MODEL_ID':'google/flan-t5-xl', # model_id from hf.co/models
'HF_TASK':'text-generation' # NLP task you want to use for predictions

# retrieve the llm image uri
llm_image = get_huggingface_llm_image_uri("huggingface", version="0.8.2"&)
huggingface_model = HuggingFaceModel(env=hub_config, role=role, # iam role with permissions to create an Endpoint 
image_uri=llm_image
)

При развертывании моделей непосредственно из Hugging Face инициализируйте my_model_configuration со следующим:

  • Ан env config сообщает нам, какую модель мы хотим использовать и для какой задачи.
  • Наше исполнение SageMaker role дает нам разрешения на развертывание нашей модели.
  • Ан image_uri — это конфигурация образа, специально предназначенная для развертывания LLM из Hugging Face.

Альтернативно, в SageMaker есть набор моделей, напрямую совместимых с более простыми моделями. JumpStartModel объект. Эта модель поддерживает многие популярные LLM, такие как Llama 2, и ее можно инициализировать, как показано на следующем снимке экрана:

import sagemaker 
from sagemaker.jumpstart.model import JumpStartModel 

role = sagemaker.get_execution_role() 

my_model = JumpStartModel(model_id = "meta-textgeneration-llama-2-7b-f")

Для обеих версий my_modelразверните их, как показано на следующем снимке экрана:

predictor = my_model.deploy(
    initial_instance_count=1, instance_type="ml.g5.4xlarge", endpoint_name="llama-2-generator")

Запрос предварительно обученного LLM

Имея инициализированную конечную точку LLM, вы можете начать выполнение запросов. Формат наших запросов может различаться (особенно между разговорными и недиалоговыми LLM), но процесс в целом один и тот же. Для модели «Обнимающее лицо» выполните следующие действия:

# https://aws.amazon.com/blogs/machine-learning/llama-2-foundation-models-from-meta-are-now-available-in-amazon-sagemaker-jumpstart/

prompt = """Answer the following QUESTION based on the CONTEXT
given. If you do not know the answer and the CONTEXT doesn't
contain the answer truthfully say "I don't know

ANSWER:

"""

payload = {
    "inputs":  
      (
        (
         {"role": "system", "content": prompt},
         {"role": "user", "content": question},
        )   
      ),
   "parameters":{"max_new_tokens": 64, "top_p": 0.9, "temperature": 0.6, "return_full_text": False}
}

out = predictor.predict(payload, custom_attributes="accept_eula=true")
out(0)('generation')('content')

Решение вы можете найти в Репозиторий GitHub.

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

Обеспечение дополнительного контекста для LLM

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

Чтобы правильно ответить на этот вопрос, мы должны использовать исходные знания. То есть дополнительную информацию мы даем LLM через подсказку. Давайте добавим эту информацию непосредственно в качестве дополнительного контекста для модели.

context = """Managed Spot Training can be used with all instances
supported in Amazon SageMaker. Managed Spot Training is supported
in all AWS Regions where Amazon SageMaker is currently available."""

prompt_template = """Answer the following QUESTION based on the CONTEXT
given. If you do not know the answer and the CONTEXT doesn't
contain the answer truthfully say "I don't know".

CONTEXT:
{context}

ANSWER:
"""

text_input = prompt_template.replace("{context}", context).replace("{question}", question)

payload = {
    "inputs":  
      (
        (
         {"role": "system", "content": text_input},
         {"role": "user", "content": question},
        )   
      ),
   "parameters":{"max_new_tokens": 64, "top_p": 0.9, "temperature": 0.6, "return_full_text": False}
}

out = predictor.predict(payload, custom_attributes="accept_eula=true")
generated_text = out(0)('generation')('content')
print(f"(Input): {question}\n(Output): {generated_text}")

(Input): Which instances can I use with Managed Spot Training in SageMaker?

(Output):  Based on the given context, you can use Managed Spot Training with all instances supported in Amazon SageMaker. Therefore, the answer is:

All instances supported in Amazon SageMaker.

Теперь мы видим правильный ответ на вопрос; это было легко! Однако пользователь вряд ли будет вставлять контексты в свои подсказки, он уже будет знать ответ на свой вопрос.

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

Поисковая расширенная генерация

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

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

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

Оба шага требуют модели внедрения для перевода нашего удобочитаемого простого текста в семантическое векторное пространство. Используйте высокоэффективный преобразователь предложений MiniLM от Hugging Face, как показано на следующем снимке экрана. Эта модель не является LLM и поэтому не инициализируется так же, как наша модель Llama 2.

hub_config = {
    "HF_MODEL_ID": "sentence-transformers/all-MiniLM-L6-v2",  # model_id from hf.co/models
    "HF_TASK": "feature-extraction",
}

huggingface_model = HuggingFaceModel(
    env=hub_config,
    role=role,
    transformers_version="4.6",  # transformers version used
    pytorch_version="1.7",  # pytorch version used
    py_version="py36",  # python version of the DLC
)

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

encoder = huggingface_model.deploy(
    initial_instance_count=1, instance_type="ml.t2.large", endpoint_name="minilm-embedding"
)

Вы можете снова развернуть модель с помощью deployиспользуя меньший (только для процессора) экземпляр ml.t2.large. Модель MiniLM крошечная, поэтому ей не требуется много памяти и графический процессор, поскольку она может быстро создавать встраивания даже на центральном процессоре. При желании вы можете запустить модель быстрее на графическом процессоре.

Для создания вложений используйте predict и передать список контекстов для кодирования через метод inputs ключ, как показано:

out = encoder.predict({"inputs": ("some text here", "some more text goes here too")})

Передаются два входных контекста, возвращающие два вектора контекста, как показано:

len(out)

2

Размерность вложения модели MiniLM равна 384 что означает, что каждый вектор, встраивающий выходные данные MiniLM, должен иметь размерность 384. Однако, посмотрев на длину наших вложений, вы увидите следующее:

len(out(0)), len(out(1))

(8, 8)

Два списка содержат по восемь пунктов каждый. MiniLM сначала обрабатывает текст на этапе токенизации. Эта токенизация преобразует наш удобочитаемый простой текст в список идентификаторов токенов, читаемых моделью. В выходных функциях модели вы можете увидеть внедрения на уровне токена. одно из этих вложений показывает ожидаемую размерность 384 как показано:

len(out(0)(0))

384

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

Операция среднего объединения для получения одного 384-мерного вектора.

import numpy as np embeddings = np.mean(np.array(out), axis=1)embeddings.shape(2, 384)

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

from typing import List

def embed_docs(docs: List(str)) -> List(List(float)):
    out = encoder.predict({"inputs": docs})
    embeddings = np.mean(np.array(out), axis=1)
    return embeddings.tolist()

Загрузка набора данных

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

Загрузите часто задаваемые вопросы по Amazon SageMaker

При выполнении поиска ищите только ответы, чтобы можно было удалить столбец «Вопрос». Подробности смотрите в блокноте.

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

Индексирование

База данных векторов Pinecone хранит векторные вложения и эффективно выполняет их поиск в любом масштабе. Для создания базы данных вам понадобится бесплатный ключ API от Pinecone.

import pinecone
import os

# add Pinecone API key from app.pinecone.io
api_key = os.environ.get("PINECONE_API_KEY") or "YOUR_API_KEY"
# set Pinecone environment - find next to API key in console
env = os.environ.get("PINECONE_ENVIRONMENT") or "YOUR_ENV"

pinecone.init(api_key=api_key, environment=env)

После подключения к векторной базе данных «Сосновая шишка» создайте единый векторный индекс (аналог таблицы в традиционных БД). Назовите индекс retrieval-augmentation-aws и выровнять индекс dimension и metric параметры с теми, которые требуются для модели внедрения (в данном случае MiniLM).

import time

index_name = "retrieval-augmentation-aws"

if index_name in pinecone.list_indexes():
    pinecone.delete_index(index_name)

pinecone.create_index(name=index_name, dimension=embeddings.shape(1), metric="cosine")
# wait for index to finish initialization
while not pinecone.describe_index(index_name).status("ready"):
    time.sleep(1)

Чтобы начать вставку данных, выполните следующую команду:

from tqdm.auto import tqdm

batch_size = 2  # can increase but needs larger instance size otherwise instance runs out of memory
vector_limit = 1000

answers = df_knowledge(:vector_limit)
index = pinecone.Index(index_name)

for i in tqdm(range(0, len(answers), batch_size)):
    # find end of batch
    i_end = min(i + batch_size, len(answers))
    # create IDs batch
    ids = (str(x) for x in range(i, i_end))
    # create metadata batch
    metadatas = ({"text": text} for text in answers("Answer")(i:i_end))
    # create embeddings
    texts = answers("Answer")(i:i_end).tolist()
    embeddings = embed_docs(texts)
    # create records list for upsert
    records = zip(ids, embeddings, metadatas)
    # upsert to Pinecone
    index.upsert(vectors=records)

Вы можете начать запрос индекса с вопроса, заданного ранее в этой статье.

# extract embeddings for the questions
query_vec = embed_docs(question)(0)

# query pinecone
res = index.query(query_vec, top_k=1, include_metadata=True)

# show the results
res
{'matches': ({'id': '90',
'metadata': {'text': 'Managed Spot Training can be used with all '
'instances supported in Amazon '
'SageMaker.\r\n'},
'score': 0.881181657,
'values': ()}),
'namespace': ''}

Вывод выше показывает, что мы возвращаем соответствующие контексты, которые помогут нам ответить на наш вопрос. С тех пор, как мы top_k = 1, index.query вернул верхний результат вместе с метаданными, которые читают Managed Spot Training can be used with all instances supported in Amazon.

Дополнение подсказки

Используйте полученные контексты, чтобы дополнить подсказку и определить максимальный объем контекста для подачи в LLM. Использовать 1000 количество символов ограничено, чтобы итеративно добавлять каждый возвращаемый контекст в приглашение, пока вы не превысите длину содержимого.

Дополнение подсказки

Дополнение подсказки

Накормить context_str в приглашение LLM, как показано на следующем снимке экрана:

payload = create_payload(question, context_str)
out = predictor.predict(payload, custom_attributes="accept_eula=true")
generated_text = out(0)('generation')('content')
print(f"(Input): {question}\n(Output): {generated_text}")

(Input): Which instances can I use with Managed Spot Training in SageMaker?

(Output):  Based on the context provided, you can use Managed Spot Training with all instances supported in Amazon SageMaker. Therefore, the answer is:


All instances supported in Amazon SageMaker.

Логика работает, поэтому оберните ее в одну функцию, чтобы все было чисто.

def rag_query(question: str) -> str:
    # create query vec
    query_vec = embed_docs(question)(0)
    # query pinecone
    res = index.query(query_vec, top_k=5, include_metadata=True)
    # get contexts
    contexts = (match.metadata("text") for match in res.matches)
    # build the multiple contexts string
    context_str = construct_context(contexts=contexts)
    # create our retrieval augmented prompt
    payload = create_payload(question, context_str)
    # make prediction
    out = predictor.predict(payload, custom_attributes="accept_eula=true")
    return out(0)("generation")("content")

Теперь вы можете задавать вопросы, подобные показанным ниже:

rag_query("Does SageMaker support spot instances?")

' Yes, Amazon SageMaker supports spot instances for managed spot training. According to the provided context, Managed Spot Training can be used with all instances supported in Amazon SageMaker, and Managed Spot Training is supported in all AWS Regions where Amazon SageMaker is currently available.\n\nTherefore, the answer to your question is:\n\nYes, SageMaker supports spot instances in all regions where Amazon SageMaker is available.'

Очистить

Чтобы избежать нежелательных расходов, удалите модель и конечную точку.

encoder.delete_model()

encoder.delete_endpoint()

Заключение

В этом посте мы познакомили вас с RAG и LLM с открытым доступом на SageMaker. Мы также показали, как развертывать модели Amazon SageMaker Jumpstart с помощью Llama 2, LLM Hugging Face с помощью Flan T5 и встраивать модели с помощью MiniLM.

Мы реализовали полный комплексный конвейер RAG, используя наши модели открытого доступа и векторный индекс сосновой шишки. Используя это, мы показали, как свести к минимуму галлюцинации, поддерживать знания LLM в актуальном состоянии и, в конечном итоге, повысить удобство работы пользователей и повысить доверие к нашим системам.

Чтобы запустить этот пример самостоятельно, клонируйте этот репозиторий GitHub и выполните предыдущие шаги, используя Блокнот для ответов на вопросы на GitHub.


Об авторах

Изображение профиля веданта-джайнаВедант-джайн — старший специалист по искусственному интеллекту и машинному обучению, работающий над стратегическими инициативами в области генеративного искусственного интеллекта. До прихода в AWS Ведант занимал должности специалиста по ML/Data Science в различных компаниях, таких как Databricks, Hortonworks (теперь Cloudera) и JP Morgan Chase. Помимо своей работы, Ведант увлекается созданием музыки, скалолазанием, использованием науки для полноценной жизни и изучением кухонь всего мира.

Джеймс Бриггс — штатный юрист-разработчик в компании Pinecone, специализирующийся на векторном поиске и искусственном интеллекте и машинном обучении. Он помогает разработчикам и предприятиям разрабатывать собственные решения GenAI посредством онлайн-обучения. До прихода в Pinecone Джеймс работал над искусственным интеллектом для небольших технологических стартапов и крупных финансовых корпораций. Помимо работы, Джеймс любит путешествовать и искать новые приключения, от серфинга и подводного плавания до тайского бокса и BJJ.

Синь ХуанСинь Хуан — старший научный сотрудник Amazon SageMaker JumpStart и встроенных алгоритмов Amazon SageMaker. Он занимается разработкой масштабируемых алгоритмов машинного обучения. Его исследовательские интересы лежат в области обработки естественного языка, объяснимого глубокого обучения табличных данных и надежного анализа непараметрической пространственно-временной кластеризации. Он опубликовал множество статей на конференциях ACL, ICDM, KDD и Королевском статистическом обществе: серия A.

LEAVE A REPLY

Please enter your comment!
Please enter your name here