Исследовательский агент Решение проблемы ответов на вопросы на основе большого текстового корпуса

Исследовательский агент для обработки вопросов на основе текстового корпуса

Я создал Автономного исследовательского агента ИИ, который может отвечать на сложные вопросы с глубокими многошаговыми способностями рассуждения

Изображение от автора (созданное с помощью Photoshop Generative fill)

Введение в проблему

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

И, к моему разочарованию, я начал свои эксперименты с одной из самых сложных и запутанных историй, когда-либо написанных – Махабхарата. Для тех, кто не знаком с этим произведением, Махабхарата – это сборник из 18 книг с общим объемом около 1,8 миллиона слов. Это самое большое поэтическое произведение, когда-либо написанное, с примерно 90 000 стихов. Оно примерно в десять раз длиннее “Илиады” и “Одиссеи” вместе взятых. Но впечатляет не только длина, но и ширина Махабхараты. Высоконелинейная и сложная в своих причинах и последствиях, она имеет тысячи персонажей, охватывающих семь поколений, и из них ни один не является полностью хорошим или злым. В ней содержатся глубокие философские комментарии о Долге (Карма), Выборах и Человеческом существовании, особенно о конфликтах долгов и выборе между несколькими неправильными путями. Бхагавад-гита (ключевая философия индуизма) также является частью 6-й книги Махабхараты.

Я собрал текстовые данные Махабхараты из нескольких источников в Интернете и создал чистый набор данных. Однако я не смог найти способ реализовать осмысленный вопросно-ответный поиск в тексте.

Меньше чем за два года все изменилось.

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

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

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

Исследовательский агент

Здесь я расскажу о дизайне и реализации Автономного Исследовательского Агента ИИ, который может решать проблему многопрыжкового KBQA с глубокой способностью рассуждения. Я поделюсь репозиторием git с первоначальной реализацией исследовательского агента в блокноте Python. Если вас интересует только этот аспект, не стесняйтесь пропустить к разделу “Реализация” позже в этой статье.

Если вас интересует больше информации об искусственном интеллекте, “Вопросно-ответная система на основе базы знаний” (KBQA) и эволюция дизайна исследовательского агента ИИ, то, пожалуйста, продолжайте чтение.

Почему?

Первый вопрос, который может возникнуть, – почему бы не использовать просто интерфейс ChatGPT и задавать вопросы. Он был обучен на огромном объеме данных Интернета, сгенерированных до 2021 года, поэтому текстовый корпус, подобный Махабхарате, ему известен.

Это был мой первый подход. Я задавал ChatGPT несколько вопросов о Махабхарате. Я получал хорошие ответы на некоторые вопросы. Однако они не были достаточно строгими для большинства. И это ожидаемо. GPT обучен на общих наборах данных. Он может хорошо понимать и интерпретировать естественные языки. Он также может вполне логично рассуждать. Однако он не является экспертом в какой-либо конкретной области. Так что, хотя у него может быть некоторое знание о Махабхарате, он может не давать глубоко исследованных ответов. Иногда у GPT просто нет ответа вообще. В этих случаях он либо скромно отказывается отвечать на вопрос, либо уверенно придумывает ответы (галлюцинации).

Вторым наиболее очевидным способом достижения KBQA является использование запросов Retrieval QA. И здесь LangChain начинает быть чрезвычайно полезным.

Извлечение QA

Для тех, кто не знаком с библиотекой LangChain, это один из лучших способов использовать LLMs, такие как GPT, в вашем коде. Вот реализация KBQA с использованием LangChain.

QA с использованием Retriever | 🦜️🔗 Langchain

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

python.langchain.com

Вкратце, вот шаги для достижения KBQA в любом наборе документов:

  • Разделите базу знаний на текстовые фрагменты.
  • Создайте числовое представление (векторные представления) для каждого фрагмента и сохраните их в базе данных векторов. Если ваши данные статичны, шаги 1 и 2 требуют однократных усилий.
  • Выполните семантический поиск с использованием запроса пользователя в этой базе данных и извлеките соответствующие текстовые фрагменты.
  • Отправьте эти текстовые фрагменты в LLM вместе с вопросами пользователя и попросите их ответить.

Вот графическое представление этого процесса.

Изображение, созданное автором с использованием draw.io

Так зачем идти дальше? Кажется, проблема решена!

Не совсем 🙁

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

Кроме того, LLM ограничены длиной текста, который они могут обработать за один запрос. Конечно, вы можете отправлять документы по одному и затем “уточнять” или “сокращать” ответ с каждым вызовом. Однако этот подход не позволяет использовать сложное “многошаговое” рассуждение. В некоторых случаях результаты, используя подход “уточнение” или “сокращение”, лучше, чем просто заполнение всех документов в одном запросе, но не на много.

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

Например:

Кто такой Арджуна?

Это простой вопрос и на него можно ответить с ограниченным контекстом. Однако следующий вопрос:

Почему произошла махабхарата?

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

Так что дальше?

AI Агенты

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

AI-агент, также известный просто как «агент», относится к программному обеспечению или системе, способной автономно воспринимать свою среду, принимать решения и предпринимать действия для достижения определенных целей. AI-агенты разработаны для имитации человекоподобного поведения в задачах решения проблем и принятия решений. Они работают в определенной среде и взаимодействуют с этой средой для достижения желаемых результатов.

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

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

React Этот агент использует стиль рассуждения “ReAct” (Reason and Action), чтобы решить, какой инструмент использовать для данной проблемы.

Это реализация langChain агента ReAct:

ReAct | 🦜️🔗 Langchain

Это руководство демонстрирует использование агента для реализации логики ReAct.

python.langchain.com

Я предоставил агенту следующие инструменты для выбора:

  • Цепочка вопрос-ответ с хранилищем документов.
  • Поиск в глоссарии персонажей (я создал глоссарий с распознаванием именованных сущностей с использованием предварительно обученной модели)
  • Поиск в Википедии.

Агент ReAct не дал мне хороших результатов и часто не смог сойтись на каком-либо ответе. Он плохо работает с GPT 3.5. Возможно, он будет работать лучше с GPT 4, который стоит в 20-30 раз дороже, чем GPT 3.5, поэтому пока это может быть не вариант.

Даже когда он сходился, я не мог получить хорошие результаты. Кто-то более компетентный в создании ‘react’ подсказок, вероятно, справился бы лучше.

Агент ‘Задайте себе вопрос’Этот агент задает уточняющие вопросы, основанные на исходном вопросе, а затем пытается найти промежуточные ответы. Используя эти промежуточные ответы, он наконец приходит к окончательному ответу. Вот статья, объясняющая агента ‘Задайте себе вопрос’

Самоподсказка

Самоподсказка – это развитие от подсказок “Цепочка мыслей”. Ниже приведены некоторые практические примеры и…

cobusgreyling.medium.com

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

Например, вопросы:

Кто убил Карну и почему?

Относительно легко ответить с помощью этого подхода

Вопрос

Почему Арджуна убил Карну, своего сводного брата?

Гораздо сложнее ответить на него. Для этого требуется, чтобы LLM знал факт, что Арджуна не знал, что Карна – его сводный брат. LLM не может знать, что ему нужно знать этот факт, либо понимая вопрос, либо задавая дополнительные вопросы на основе исходного вопроса.

Процесс исследования человека

Цитируя GPT снова

Искусственные интеллектуальные агенты разработаны для имитации человекоподобного поведения при решении проблем и принятии решений

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

Вот что я придумал.

Методология исследования:

Запишите исходный запрос на странице.

  1. Я пытаюсь ответить на текущий вопрос, прочитав несколько книг. В процессе я делаю несколько заметок и добавляю в закладки несколько отрывков, которые нахожу наиболее относящимися к текущему вопросу.
  2. Неизбежно, я нахожу много неизвестного в этих отрывках. Я записываю эти неизвестные и формулирую еще несколько вопросов, которые могут помочь мне узнать об этих неизвестных.
  3. Из этих вопросов я выбираю один вопрос, который наиболее важен для исходного вопроса.
  4. Я возвращаюсь к шагу 1

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

Если да, то хорошо сделано! Если нет, то продолжайте трудиться.

Вуаля!

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

Спойлер: это сработало! 🙂

Прежде чем приступить к написанию кода, я искал в интернете похожие идеи. И я обнаружил BabyAGI. Какой замечательный мир!

Вот репозиторий, описывающий BabyAGI

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

Реализация исследовательского агента

Вот тот же процесс, преобразованный в блок-схему с использованием удивительного draw.io

Изображение автора (создано с помощью draw.io)

Каждый синий блок в этой схеме представляет собой вызов LLM.

Компоненты

  1. Агент QA — Поиск ответов и дополнительного контекста
  2. Это простая цепочка вопрос-ответ с использованием хранилища векторов. В будущем это может быть ИИ-агент, который использует такие инструменты, как хранилища векторов, поисковые API или API Википедии, API модерации и предыдущие исследовательские данные. Здесь промпт настроен на генерацию кратких ответов на основе 1. контекста (документов) и 2. отношения к исходному вопросу. За исключением первого цикла, текущий вопрос всегда является промежуточным вопросом, сгенерированным на шаге 2 и выбранным на шаге 3. Агент добавляет промежуточный ответ в заметки и последние отрывки (документы, использованные для ответа на текущий вопрос) в закладки. На шаге 2 используются самые последние из этих документов.
  3. Генератор вопросов — Задавайте больше вопросов на основе свежих заметок
  4. Здесь агент использует самые последние результаты поиска векторов, соответствующие текущему вопросу, и использует их для генерации дополнительных вопросов, касающихся исходного вопроса. Он добавляет эти вопросы в список нерешенных вопросов. Здесь промпт настроен таким образом, чтобы ново-сгенерированные вопросы не перекрывались с существующим списком вопросов.
  5. Выбор наиболее подходящего вопроса — Выберите один вопрос, наиболее подходящий для исходного вопроса
  6. Этот промпт выбирает один вопрос из списка нерешенных вопросов, который наиболее подходит к исходному вопросу. Этот вопрос используется как текущий вопрос для следующего цикла. На следующем цикле агент удаляет этот вопрос из списка нерешенных вопросов после генерации нового набора вопросов.
  7. Анализатор — Знаю ли я достаточно?
  8. Я использую параметр max_iterations для выхода из цикла. В настоящее время это работает довольно хорошо. Однако, возможно, лучше динамически определить количество итераций или стратегию выхода на основе развивающегося контекста. В будущем я буду работать над “анализатором”, который сможет делать это автономно.
  9. Компилятор исследований — Компилируйте исследования

Результаты

Исследовательский агент является большим улучшением по сравнению со всеми предыдущими подходами, которые я пробовал. Он дает более подробные и точные ответы, чем любой другой подход. Я играл с этим несколько недель, и меня удивляет богатство получаемых ответов.

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

Вот пример запуска.

Вопросы: Почему Пандавы должны были жить в лесу 12 лет?

Результат —

На всякий случай, вот окончательный ответ

Окончательный ответ: Решение Пандавов жить в лесу 12 лет в первую очередь было обусловлено обстоятельствами и событиями, развернувшимися в их жизни. После проигрыша в игре в кости Кауравам Пандавы были вынуждены отправиться в изгнание на 13 лет, с последним годом, который нужно было провести в тайне. Во время своего изгнания они столкнулись с многочисленными проблемами и трудностями, включая жизнь в лесу. Бхима задумывался о том, чтобы убить всех Куру, но его брат Юдхиштхира всегда успокаивал его, говоря, что сейчас не подходящее время для осуществления их желаний. Таким образом, жизнь в лесу позволила им избежать столкновений и поддерживать мир. Во время пребывания в лесу Пандавы столкнулись с несколькими трудностями. Одной из главных проблем был борьба Бхимы с терпимостью аскетической жизни. Он задумывался о том, чтобы убить всех Куру, но его брат Юдхиштхира всегда успокаивал его и отговаривал от этого. Кроме того, Пандавы должны были жить в лесу и зависеть от просьбы для своего существования, так как их королевство было разграблено во время азартной игры. Они были огорчены потерей своего королевства и оскорблениями, адресованными их королеве Драупади. Сам лес также был полон опасностей, что добавляло трудностей. Кроме того, Пандавы чувствовали себя неспособными удовлетворить потребности некоторых набожных брахманов, которые проживали с ними в лесу, так как у них ничего не было, и они зависели от просьбы для своего собственного выживания. Несмотря на эти проблемы, Пандавы максимально использовали свое время в лесу. Они получали знания от мудрецов и святых, что помогло им получить мудрость и духовное понимание. Великий мудрец Вьяса сообщил им, что многие генералы согласились поддержать их двоюродного брата Дурьодхана, включая Карну, Шакуни, Бхуришраваса, Салу, Дрону и Бхишму. Вьяса также сказал Арджуне, что если он будет сражаться в будущей войне, ему нужно будет получить божественные астры Господа Индры и Господа Шивы. Узнав об этой информации, Юдхиштхира приказал Арджуне отправиться в Гималайские горы, чтобы совершать аскезы, чтобы умилостивить Гос

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

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

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

** Неотвеченные вопросы **'4. Как Пандавы получали знания от мудрецов и святых во время своего пребывания в лесу?''5. Какие конкретные аскезы Арджуна должен был совершить в Гималайских горах, чтобы угодить Лорду Шиве?''6. Как Пандавам удалось скрыться от шпионов Дурыодханы почти на всем тринадцатом году своего изгнания?''8. Как Бхима справился с трудностями жизни аскета в лесу? Стояли ли перед ним особые трудности или борьба во время изгнания?''9. Можете ли вы предоставить больше информации о генералах, которые поддерживали дело Дурыодханы? Каковы были их роли и вклад в Курукшетрскую войну?''10. Как Пандавам удалось поддерживать мирную жизнь в лесу, несмотря на проблемы, с которыми они столкнулись?''11. Какие конкретные учения и знания Пандавы получили от мудрецов и святых во время своего пребывания в лесу?''12. Можете ли вы предоставить больше информации о дворце, где Пандавы жили целый год перед отправкой в лес?''13. Как пребывание Лорда Кришны в лесу повлияло на опыт Пандав во время их изгнания?''14. Можете ли вы предоставить больше информации о опасностях, с которыми столкнулись Пандавы, живя в лесу?''15. Какие конкретные проблемы и трудности стояли перед Юдхиштхирой и его братьями в их повседневной жизни, будучи жителями леса?'

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

Код

И вот блокноты Python с реализацией Агента исследования.

GitHub - rahulnyk/research_agent

Внести вклад в разработку rahulnyk/research_agent, создав учетную запись на GitHub.

github.com

Git-репозиторий набора данных Махабхарата

GitHub - rahulnyk/mahabharata: Текст Махабхараты, собранный из нескольких источников, разделенный на фрагменты...

Текст Махабхараты собран из нескольких источников, разделен на фрагменты и разобран в CSV-файлы с метаданными. Названия сущностей...

github.com

Что дальше?

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

  • Развернуть этого агента по общедоступной ссылке и наблюдать больше шаблонов использования.
  • Использовать агента с различными исходными документами, помимо Махабхараты.
  • Шаг 1 процесса в настоящее время является простой цепочкой вопрос-ответ, которая использует векторное хранилище с корпусом исходного текста. Я работаю над заменой его на агента 'ReAct', чтобы использовать в процессе исследования другие инструменты, такие как поисковые API, Википедия, API модерации и т. д.
  • Я сохраняю данные и метаданные, сгенерированные во время каждого запуска, в векторное хранилище 'runs'. Я также сохраняю векторы исходного вопроса в том же хранилище. Это помогло мне следить за логическими шаблонами, которые возникают в ходе рассуждений агента. Это может помочь настроить агента вопрос-ответ на более жесткую логическую цепочку.
  • В настоящее время агент исследования завершается после определенного числа итераций. Это работает довольно хорошо для большинства вопросов. Однако, может быть лучше динамически определить количество итераций или стратегию завершения на основе развивающегося контекста. Я буду работать над анализатором, который может делать это автономно.
  • Агент хорошо работает с большинством типов вопросов, за исключением мета-вопросов. Например, если я спрашиваю "Опишите, что происходит в книге 5, главе 3", агенту трудно ответить. В будущих версиях я добавлю самообращающуюся систему с агентом 'ReAct', чтобы справиться с такими случаями.
  • До сих пор я пробовал агента только с моделью OpenAI GPT3.5. Это стоит мне около $0.02 за запуск. Вскоре я попробую агента исследования с более маленькой моделью, например Llama, которая может быть размещена локально.

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

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

Спасибо за чтение.

Надеюсь, вы найдете исследовательского агента искусственного интеллекта интересным и полезным.

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

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

Спасибо за чтение.

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

  1. Полный перевод К. М. Гангули: Доступно в общественном достоянии.
  2. Маленькие истории Лауры Гиббс: Это пересказ Махабхараты, использующий двести эпизодов, каждый из которых состоит из 100 слов. Я использую ее работу здесь с ее разрешения.
  3. Репозиторий данных Kaggle от Тилака: Все 18 плав Махабхараты в текстовом формате для обработки естественного языка. Поделено с лицензией общественного достояния от Тилака.