Создание агента LLaMa 2, обладающего знаниями из Википедии.

Создание агента LLaMa 2 с знаниями из Википедии.

Усиление LLaMa 2 с помощью повышенной генерации для поиска и использования информации из Википедии.

Фото от Лисандера Юена на Unsplash

Введение

Большие языковые модели (LLM) – это одна из самых популярных тенденций в области искусственного интеллекта. Они проявляют впечатляющие способности по генерации текста, начиная от возможности вести беседы с людьми до написания кода. Появление открытых исходных LLM, таких как LLama, Falcon, Stable Beluga и др., сделало их потенциал доступным для широкого круга исследовательского сообщества по искусственному интеллекту, благодаря также фокусировке на разработке более компактных и эффективных моделей, которые могут работать на обычном оборудовании.

Один из ключевых компонентов, способствующих успеху LLM, – это знаменитая трансформационная архитектура, представленная в революционной статье Attention Is All You Need. Впечатляющую производительность современных LLM достигается за счет масштабирования этой архитектуры до миллиардов параметров и обучения на наборах данных, содержащих триллионы токенов. Предварительное обучение позволяет создать мощные модели, способные понимать естественный язык, которые затем могут быть дополнительно настроены для конкретных случаев использования.

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

Значительный шаг в направлении согласования текста, генерируемого LLM, с предпочтениями людей был сделан с помощью обучения с подкреплением на основе обратной связи от людей (RLHF). Эта техника является основой современных моделей чатов, таких как ChatGPT. После начальной фазы самообучения, большой языковой моделью дополнительно настраивается алгоритм обучения с подкреплением для максимизации вознаграждения, калиброванного с учетом предпочтений людей. Для получения функции вознаграждения обычно тренируется вспомогательная модель для изучения скалярного вознаграждения, отражающего предпочтения людей. Таким образом, количество реальных данных с метками, созданных людьми, необходимых для фазы обучения с подкреплением, можно минимизировать. Обучающие данные для моделей вознаграждений состоят из сгенерированных текстов, которые были ранжированы людьми по их предпочтениям. Модель стремится предсказывать более высокое вознаграждение для текстов, которые занимают более высокое положение в ранжировании. Обучение LLM с целью максимизации вознаграждения, отражающего предпочтения людей, должно привести к генерации текстов, которые более согласованы с намерениями человека. Чат-модели, LLM, настроенные с помощью обучения с подкреплением на основе обратной связи от людей, показали более точное следование инструкциям пользователей, при этом они являются менее токсичными и более правдивыми.

Получение данных для улучшения генерации

Одним из типичных недостатков больших языковых моделей является то, что они обучаются офлайн и, следовательно, не имеют информации о событиях, произошедших после сбора обучающих данных. Точно так же они не могут использовать конкретные знания, которые отсутствовали в обучающих данных. Это может быть проблематично для конкретных областей, так как данные для обучения LLM обычно берутся из общедоступных корпусов. Один из способов обойти эти проблемы без необходимости дорогостоящей настройки – использование получения данных для улучшения генерации (RAG). RAG работает путем дополнения запросов, передаваемых LLM, внешней текстовой информацией. Обычно эта информация получается из внешнего источника данных на основе релевантности текущего запроса. На практике, первым шагом является преобразование запроса и внешнего текста в векторные вложения. Последние могут быть получены путем объединения вывода модели кодировщика трансформатора (например, BERT), обученной для отображения текстов с похожим значением на вложения, близкие друг к другу в соответствии с подходящей метрикой. В случае длинных текстов они могут быть разбиты на части, которые встраиваются индивидуально, что приводит к получению наиболее релевантных фрагментов. Затем извлекаются тексты, чьи вложения наиболее близки к вложению запроса. Конкатенация запроса и полученного текста, после соответствующего форматирования, подается на вход языковой модели.

С помощью Retrieval Augmented Generation модель может получать доступ к информации, которая не была доступна во время обучения, и будет основывать свои ответы на выбранном корпусе текста. RAG также позволяет проверить источники, которые использовала модель для ответа, что облегчает оценку результатов модели человеком.

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

Агент Llama 2 с дополнительным содержанием из Википедии

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

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

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

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

Шаблон, который использовался во время процедуры обучения моделей чата Llama 2, имеет следующую структуру:

<s>[INST] <<SYS>>{{ system_prompt }}<</SYS>>{{ user_message }} [/INST]

В {{ системный запрос }} указывается поведение модели чата в отношении последующих запросов и может быть полезно для настройки ответа модели на различные задачи. {{ user_message }} – это запрос пользователя, на который модель должна ответить.

Вернемся к проблеме получения поисковых запросов для Википедии. Наш агент будет использовать модель Llama 2 с следующим запросом:

<s>[INST] <<SYS>>Вы являетесь помощником, возвращающим текстовые запросы для поиска статей Википедии, содержащих актуальную информацию о запросе. Напишите запросы и ничего больше.Пример: [prompt] Расскажите о волной жары в Европе летом 2023 года [query] жара, погода, температура, Европа, лето 2023.<</SYS>>[prompt] {prompt} [/INST] [query]

{prompt} будет заменен пользовательским вводом перед генерацией. Пример, представленный в виде системного запроса, направлен на использование возможностей внутреннего обучения модели. Внутреннее обучение относится к способности модели решать новые задачи на основе нескольких примеров, предоставленных в запросе. Таким образом, модель может узнать, что ожидается, чтобы она предоставила ключевые слова, относящиеся к предоставленному запросу, разделенные запятыми после текста [query]. Последнее используется в качестве разделителя для разграничения запроса и ответа в примере, а также полезно для извлечения запросов из вывода модели. Оно уже предоставляется в качестве ввода, чтобы модель должна была генерировать только то, что следует за ним.

Полученные запросы из вывода модели используются для поиска Википедии и извлечения метаданных и текста полученных страниц. В коде, прилагаемом к посту, я использовал пакет wikipedia package – простой пакет на Python, который обеспечивает доступ к API MediaWiki, для поиска информации на Википедии и ее получения.

После извлечения текста из результатов поиска выбирается наиболее релевантная страница в соответствии с исходным запросом пользователя. Это переориентирует полученную информацию на исходный запрос пользователя, что потенциально устраняет расхождения, возникшие из-за запросов на поиск, сгенерированных моделью. Для этого исходный запрос пользователя и сводка страниц из результатов поиска встраиваются и сохраняются в векторной базе данных. Затем извлекается статья с ближайшим встраиванием к исходному запросу пользователя. Я использовал модель all-MiniLM-L6-v2 sentence transformers в качестве модели встраивания и векторную базу данных FAISS с интеграцией, предоставленной пакетом langchain.

Найдя соответствующую страницу из Википедии, поскольку добавление всего ее текста к запросу может потребовать много памяти (или превысить ограничение модели на количество токенов для длины контекста), наш агент найдет наиболее релевантные выдержки для увеличения запроса. Для этого сначала текст страницы разбивается на части, затем, как и раньше, они встраиваются в векторное пространство и извлекаются ближайшие к запросу встраивания. Я снова использовал модель all-MiniLM-L6-v2 для встраивания частей и векторную базу данных FAISS для их хранения и извлечения.

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

<s>[INST] <<SYS>>You are a helpful and honest assistant. Your answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal content.You have retrieved the following extracts from the Wikipedia page {title}:{extracts}.You are expected to give truthful answers based on the previous extracts. If it doesn't include relevant information for the request just say so and don't make up false information.<</SYS>>{prompt} [/INST]

Перед генерацией {prompt} заменяется пользовательским запросом, {title} – заголовком страницы Википедии, а {extracts} – извлеченными выдержками. Можно также предоставить несколько примеров, чтобы снова использовать возможности внутреннего обучения модели, но это значительно увеличит требования к памяти.

Давайте теперь проверим, способна ли модель отвечать, используя актуальную информацию, которая не была доступна во время ее обучения, извлекая ее из Википедии. Следующий пример был получен с использованием самой маленькой версии чата LLaMa 2 с 7 миллиардами параметров, работающей на бесплатных GPU Google Colab.

Я дал модели следующий запрос:

prompt: "Расскажи мне о землетрясении в Марракеше"

Модель создала следующий запрос для поиска в Википедии:

"землетрясение, Марракеш, Марокко, недавние землетрясения, сейсмическая активность."

После извлечения выдержек из наиболее релевантной страницы модель вернула следующий ответ:

Землетрясение, которое произошло в Марракеше 8 сентября 2023 года, было разрушительным событием, которое привело к широкому разрушению и потерям жизни в регионе. Согласно информации, предоставленной на Википедии, землетрясение имело моментную магнитуду 6,8-6,9 и максимальную интенсивность Меркалли VIII (сильное), что делает его самым мощным инструментально зарегистрированным землетрясением в Марокко и самым смертельным с 1960 года, с момента землетрясения в Агадире. Эпицентр землетрясения находился примерно в 45 милях (73,4 км) к юго-западу от Марракеша, рядом с городом Игиль и горнолыжным курортом Оукаймен в Атласе. Землетрясение произошло в результате неглубокого наклонно-надвигового движения под горным массивом. По данным Всемирной организации здравоохранения, около 300 000 человек из Марракеша и окружающих районов пострадали от землетрясения, включая 100 000 детей. Землетрясение привело к по меньшей мере 2 946 погибшим, большинство из которых погибли за пределами Марракеша. Важно отметить, что информация, предоставленная на Википедии, основана на имеющихся данных и может быть недостаточной или неактуальной. Если у вас есть какие-либо конкретные вопросы 

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

ИЗВЛЕЧЕННАЯ СТРАНИЦА ВИКИПЕДИИ: заголовок: Землетрясение в Марракеше 2023 года url: https://ru.wikipedia.org/wiki/Землетрясение_в_Марракеше_2023_года. Извлеченные выдержки: Выдержка_0: Последствия землетрясения в Марракеше и Мулай Брахим Выдержка_1: Разрушения были широко распространены, а исторические памятники Марракеша были разрушены. Землетрясение также почувствовали в Испании, Португалии и Алжире. Это самое мощное землетрясение, зарегистрированное инструментально в Марокко, самое смертельное в стране с 1960 года после землетрясения в Агадире и второе по смертельности землетрясение 2023 года после турецко-сирийского землетрясения. Всемирная организация здравоохранения оценивает, что около 300 000 человек из Марракеша и близлежащих районов пострадало, включая 100 000 детей. Выдержка_2: 8 сентября 2023 года в 23:11 DST (22:11 UTC) в Марракеше произошло землетрясение моментной магнитудой 6,8-6,9 и максимальной интенсивностью Меркалли VIII (сильное). Эпицентр землетрясения находился в 73,4 км (45,6 милях) к юго-западу от Марракеша, рядом с городом Игиль и горнолыжным курортом Оукаймен в горах Атласа. Он произошел в результате неглубокого наклонно-надвигового движения под этим горным массивом. Было сообщено о по меньшей мере 2 946 погибших, большинство из которых умерло за пределами Марракеша

Заключение

В этой статье я объяснил, как создать простого агента, который может отвечать на запросы пользователя, выполняя поиск в Википедии и базируя ответ на полученной странице. Несмотря на свою простоту, агент способен предоставлять актуальные и точные ответы даже с использованием самой маленькой модели Llama 2 7B. Агент также возвращает отрывки со страницы, которую он использовал для генерации ответа, что позволяет пользователю проверить правильность информации, предоставленной моделью, и более подробно ознакомиться с полной исходной страницей.

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

Пр