Как я решил проблему т.н. "галлюцинаций" большой языковой модели в своем сервисе с помощью двойных зеркальных вопросов.

Кто виноват

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

Здесь будет уместен универсальный совет сохранять спокойствие. Это всегда хорошо, а в случае с внезапно свалившейся на нашу голову новой технологией, тем более. Проблемы с большинством сообщений о "галлюцинациях" языковой модели даже не в том, что в настоящий момент они уже скорее всего не соответствуют действительности (например, ничего из приведенного выше списка вы уже не воспроизведете). Проблема в том, что сейчас почти все сообщения такого рода начинаются с "я тут попробовал..." В этом нет ничего плохого, так как мы имеем дело с новейшей технологией. Но все же между "я попробовал" и реальной работой существует большой зазор. Современные языковые модели так устроены, что если задаться целью их "сломать", то вас почти наверняка ожидает успех. "Пробовать" означает экспериментировать, искать экстремумы. Это почти исследовательская работа. А просто работа означает тихо, спокойно получать то, что вам нужно. Находясь при этом вдали от этих самых экстремумов и совершенно не задумываясь о том, как бы это все можно было сломать. Если взглянуть на проблему под этим углом, то окажется, что это для нереальных проблем сложно искать решения, а для реальных все значительно проще.

У меня есть сервис, который с помощью языковой модели от OpenAI преобразует вопрос на естественном языке в текст SQL запроса. Далее этот SQL запрос отрабатывает, полученные данные предоставляются пользователю. Подключение к процессу нейросети скрыто "под капотом". Пользователь просто вводит свой вопрос и получает ответ из своей же базы данных

Вопросы можно задавать любые и в любом виде. Также можно уточнять вопросы в режиме чата. Рассмотрим следующий пример

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

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

Как видите, результат отличается от предыдущего, который считаем правильным. Получив такую расплывчатую и неоднозначную формулировку, нейросеть не отказалась решать нашу задачу. Она взяла и придумала какое-то свое решение. Вот это самое "придумала свое" и считается чем-то нехорошим. Но давайте задумаемся, а куда мы хотим попасть? В теплый, ламповый мир приложений, разработчики которых лучше нас знают, что нам на самом деле нужно. Они все за нас решили. Дали нам два (или двадцать два, не суть) пункта меню. И жизнь наша проста и незамысловата? Но мы и так уже здесь. Если же мы придерживаемся концепции, что решать что нам нужно можем только мы сами, тогда с неизбежностью нам самим придется как-то определять, получили ли мы то, что хотели или нет.

Что делать

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

Решение есть и дает его та же самая языковая модель. Она ведь может работать и в "другую сторону". Вы можете не знать SQL, но вы можете попросить языковую модель объяснить словами, что именно делает этот SQL запрос.

При нажатии на кнопку, в нейросеть отправляется запрос: "Объясни словами SQL запрос" и далее текст запроса.

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

Что в итоге

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

Комментарии (5)


  1. datacompboy
    20.04.2023 12:56
    +2

    Если высокоуровневое объяснение запроса воткнуть в ответ -- было бы шоколад.

    Q: Потерянные клиенты

    A: Вот список контрагентов, которые имеют продажи в прошлом году но не имеют продаж в текущем:

    Ровно так же работают обычно с людьми.


  1. KivApple
    20.04.2023 12:56
    +3

    А как система себя поведет, если попросить её сделать логичное, но невозможное?

    Например, chatGPT, когда его просишь пример кода работы с библиотекой, который вполне логично попросить (с учётом функционала библиотеки), но авторы библиотеки почему-то решили его не реализовывать, отлично придумывает код как работа с этой функцией могла бы выглядеть. Но код нерабочий, ибо функции нет.


    1. exwill Автор
      20.04.2023 12:56
      -2

      Вы рассуждаете абстрактно. Я лично уже под тысячу запросов сделал в процессе тестирования. Мне еще ни разу нерабочий SQL не попадался


      1. KivApple
        20.04.2023 12:56

        Мой конкретный запрос был "покажи пример кода для определения окончания жеста перетаскивания с использованием GestureDetector для Android". Он показал код с переопределением метода onScrollEnd в Listener, которого там нет, но ему очень логично было бы там быть.

        В общем надо просить очень уверенно то (никаких "можно ли"), что звучит адекватно, но невозможно из-за специфических деталей конкретной реализации системы.

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


        1. exwill Автор
          20.04.2023 12:56
          -2

          SQL в некотором смысле особый язык. Он лучше других подходит для работы с нейросетями