Привет, Хабр, меня зовут Ксения Плесовских и я развиваю генеративный ИИ в компании lad, разрабатывая чат-боты для бизнеса на основе LLM. В процессе работы над точностью ответов чат-бота, проверкой фактов и устранением галлюцинаций от LLM, мне довелось проанализировать и опробовать разные подходы к этой проблеме, чем сегодня и хочу с вами поделиться. Поскольку объем материала получился достаточно большой, на несколько публикаций, в этой части расскажу лишь о подходе самокритики.
О том, что такое RAG (Retrieval Augmented Generation) и как он работает написано уже немало статей, поэтому лишь кратко напомню, что это - механизм, который позволяет языковой модели получать информацию о тех знаниях, которые не были вложены в нее на этапе обучения и благодаря ему мы имеем возможность без дообучения модели использовать ее в сочетании с собственной базой знаний.
Хотя RAG-боты интуитивно понятны, они сталкиваются с определенными практическими проблемами. Например, мы просим модель сообщить о том, кто в нашей компании отвечает за выдачу справок в бухгалтерии, в базе знаний этой информации нет, но модель поиска все равно пытается нам ее предоставить, называя имя и контактные данные несуществующего сотрудника. Сгенерированный ответ будет ошибочным и неинформативным, особенно для неанглоязычных запросов, в которые гораздо чаще попадает контент, изначально не участвовавший в их обучении. Кроме того, при большом объеме запросов для платных LLM, например, ChatGPT, стоимость использования может привести к значительным затратам .
Для обеспечения длительного диалога с RAG необходимо сохранять историю общения и передавать ее в LLM при каждом запросе, но это может привести к падению точности или галлюцинациям поскольку у LLM возникает дополнительная задача по выбору актуальной информации из большого контекста.
Для борьбы с этими проблемами уже придумано несколько методов, об одном из которых пойдет речь ниже.
SELF-RAG - гибкое обращение к базе знаний
В качестве одного из решений обозначенных проблем исследователи из Вашингтонского университета, Института искусственного интеллекта Аллена и IBM Research AI представили структуру под названием Self-Reflective Retrival-Augmented Generation (SELF-RAG) [1]. Эта структура направлена на улучшение LLM за счет динамического получения соответствующей информации и анализа ее поколений, что приводит к повышению качества, фактологии и производительности.
В отличие от традиционных подходов, Self-RAG гарантирует, что информация, включенная в промпт модели, необходима и актуальна, тем самым улучшая качество генерируемых ответов. С помощью токенов саморефлексии, модель может контролировать и оценивать свои собственные результаты, что приводит к более точным и качественным ответам. В основе SELF-RAG лежит идея, что модели могут проверить свои собственные результаты повторным запросом с другим промптом.
Процесс саморефлексии отвечает на 2 вопроса: 1. необходимо ли в данной ситуации применение ретривера, если нет, то последующего обращения к RAG не произойдет. 2. действительно ли полученная ретривером информация релевантна промпту. В результате внешние знания добавляются к промпту только тогда, когда модель определяет, что это действительно необходимо. Для этого она возвращает специальный токен ретривера.
В дополнение к токену ретривера есть три токена критики.
IsRel показывает, соответствует ли ответ данному вопросу и контексту.
IsSup - обоснован ли ответ информацией в контексте.
IsUse - насколько полезен ответ, оценивается от 1 до 5.
IsRel генерируется во всех случаях, когда пришел токен ретривера. Если модель посчитала информацию релевантной, то проверяется isSup, и если ответ снова да, то isUse присвоит ему высокую оценку.
В случаях, когда ретривер не требуется, модель генерирует только isUse.
Дополнительным положительным эффектом метода является возможность проверки фактов, т.к мы располагаем сведениями о том, обращалась ли модель к базе знаний и какой именно фрагмент данных был взят в основу ее ответа.
Почему и этого может быть недостаточно
Подход с SELF-RAG выглядит достаточно разумным, но вызывает вопрос. а не станут ли сами токены еще одной галлюцинацией модели? Можем ли мы быть уверены в том, что модель способна раскритиковать собственное решение?
В поисках ответа на вопрос, способна ли LLM к самокритике группа исследователей [2] решила проверить это на задаче раскраски графа. Результаты критики от LLM сравнивались с результатами внешнего верификатора.
В эксперименте генератор получал экземпляр данных DIMACS (графовый формат данных) и создавал промпт на естественном языке, переводя каждое ребро графа в предложение, а затем включая все это в общий набор инструкций. Исследователи намеренно свели к минимуму различия между промптами, чтобы уменьшить потерю информации в LLM.
Схема эксперимента показана рисунке ниже. Красные ромбы указывают на последовательность действий: планарный граф сначала передается в GPT-4, действующий как генератор (1), который возвращает предложенную раскраску (2). GPT-4 используется в качестве средства проверки правильности раскраски. Если это не так, GPT-4 предоставляет обратную связь вместе с предыдущей историей через обратный промпт (т.е. промпт с обратной связью (3), которая будет использоваться в запросе следующего шага (4)). Каждая новая окраска будет оцениваться GPT-4, выступающим в качестве проверяющего. Если GPT-4 определяет, что раскраска правильная или прошло 15 итераций, он утверждает окончательный ответ, где он затем сравнивается с надежным верификатором.
В режиме проверки LLM получала промпт другого типа. Помимо стандартных инструкций, он содержал только описание графа и предлагаемую раскраску. Его задача была — проверить правильность, оптимальность и то, что каждой вершине присвоено значение. Если раскраска неправильная, она должна быть проявиться набором противоречивых ребер.
Для валидации результата был создан гарантированно правильный программный верификатор. В проверке участвовали три различных типа обратного промпта. В первом случае верификатор просто просил LLM повторить попытку, если раскраска неверна. Во втором случае верификатор выдавал обратный промпт, показывающий первое нарушенное ограничение в текущей раскраске-кандидате, а в третьем - показывал все нарушенные ограничения раскраски.
Эксперимент показал, что предложенные стратегии действительно приводят к небольшому улучшению точности – с 16% до почти 40%, причем стратегия «попробуй еще раз» оказалась почти так же эффективна, как и содержательный обратный промпт. Но в момент, когда критика шла непосредственно от LLM, только 4 из 100 экспериментов были оценены негативно, и ни один из них не был оценен правильно.
К похожему выводу пришли и авторы [3], исследуя задачи планирования на языке PDDL.
Система планирования LLM+LLM состояла из генератора LLM и верификатора LLM. Генератор LLM создавал план-кандидат, а верификатор LLM определял его правильность. Если план оказывался неправильным, верификатор предоставлял обратную связь с подробным описанием причин его неудачи. Эта обратная связь приводила к созданию нового плана-кандидата. Система прекращала генерацию либо тогда, когда верификатор LLM утверждал план-кандидат как действительный, либо когда количество попыток превышало установленный порог в 15 итераций.
Основное различие между первым и вторым подходом к проверке заключалось в типе используемого верификатора.
Из 100 PDDL планов верификатор LLM выдал 54 истинных положительных результата и 38 ложных, т.е посчитал планы фактически недействительными.
Так стоит применять SELF-RAG или нет?
Проведенные эксперименты в итоге показали, что по сравнению с заменой проверки на основе LLM внешним верификатором, подход на основе LLM страдает от ложных срабатываний и полученные решения становятся менее надежными
Кроме того, после тестирования нескольких различных уровней детализации обратного промпта, предоставляемого LLM при пересмотре его решения, выяснилось что нет почти никакой корреляции между объемом информации, предоставленной LLM, и точностью конечного результата
Общий вывод, который можно сделать из анализа, такой, что метод способен найти себя лишь в ограниченном круге задач. Поскольку для самокритики используется LLM, то очевидно, что хорошо справляться с критикой она сможет только на тех задачах, которые и без критики выполняет весьма уверенно, т.е. в случае, когда запрос и критика выполняются одной LLM, эта критика будет способна скорректировать случайные ошибки.
Более интересным выглядит сценарий, когда действия производит слабая модель, оптимизированная по ресурсам и обладающая худшим качеством, а критику осуществляет более сильная LLM. Этот подход дает возможность сэкономить на ресурсах там, где задача может быть выполнена с меньшими требованиями, когда основной объем токенов приходится на более дешевую LLM, а более сильная и дорогая в использовании модель получает лишь ответ первой модели для его оценки.
В случаях же, когда от модели требуется искать сложные причинно-следственные связи, или генерировать код без возможности его запуска, высока вероятность, что, и действие, и критика одинаково приведут к галлюцинациям и тут на помощь приходит другой подход, о котором мы поговорим далее во второй части публикации.
Первоисточники: