ChatGPT: влияем на галлюцинации или как потопаешь, так и полопаешь

В этой статье посмотрим как можно влиять на так называемые «галлюцинации» ChatGPT.

А что такое эти «галлюцинации»? По сути это придумывание фактов нейронной сетью, ну или просто — враньё. Управление «галлюцинациями» позволит получать то что мы хотим, ну или по крайней мере улучшит вероятность получения правдивого ответа.

4ffe980823bb3ef6d1108d74ab56f692.png

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

Я рекомендую почитать статью про то как устроена и работает ChatGPT. Понятно и с мемами, все как мне нравится — https://habr.com/ru/company/ods/blog/716918/
Главное не забудьте вернуться и дочитать эту статью.

Ждет пока ты вернешься

Ждет пока ты вернешься

Здесь же я очень кратко опишу языковая модель генерирует ответ:

  1. на вход модели подается контекст (любой текст)

  2. модель анализирует весь контекст и генерирует всего ОДИН токен (токен — слово, часть слова или символ)

  3. модель добавляем токен к контексту и передает новый контекст в пункт 1, до тех пор пока не будет получен ответ

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

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

Во-вторых, контекст (текст на вход). Тут чем больше и точнее — тем лучше. Можно разделить контекст на несколько составляющих.

Инструкции нейронной сети

Как ей себя вести и кем вы её хотите видеть. Вариантов может быть множество и зависит от вашей задачи и воображения:

  • дружелюбный ассистент по всем вопросам (много софта использует именно этот вариант)

  • детский писатель (очень популярно, написал уже несколько книг)

  • подчиненный, который всегда опаздывает и давит на жалость, когда оправдывается (тренируемся быть черствыми)

  • Linux terminal (для меня было неожиданно)

  • » — ничего не указывать тоже нормальный выбор, сеть сама решит кем ей быть в зависимоти от контекста

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

В общем если не знаете, что использовать, можно потом посмотреть здесь.

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

С контекстом немного разобрались, идем дальше.

Штатный Web UI ChatGPT, который стоит 20$ в месяц, никаких возможностей, кроме как управлением контекстом не предоставляет. Но у OpenAI есть еще API, посмотрим, что там можно настраивать.

API предоставляет возможность задавать несколько дополнительных параметров. Нас в рамках статьи интересуют следующие параметры:

  • temperature — используется для контроля случайности и креативности сгенерированного текста. Более высокое значение температуры приводит к более разнообразным и креативным результатам, тогда как более низкое значение производит более сфокусированные и детерминированные ответы. (принимает значение от 0 до 2)

  • presence_penalty — влияет на вероятность того, что модель повторит слова или фразы в своем ответе. Более высокое значение этого параметра уменьшает вероятность повторений, тогда как более низкое значение позволяет использовать больше повторений (от -2 до 2)

  • frequency_penalty — контролирует предпочтение модели использовать более распространенные слова или фразы. Более высокое значение этого параметра поощряет использование менее распространенных слов, тогда как более низкое значение отдает предпочтение более распространенным словам (от -2 до 2)

Пара примеров:

  • Хочу написать рассказ. Увеличиваем temperature для креативности, presence_penalty чтобы не повторяться, frequency_penalty чтобы использовать менее распространенные слова.

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

В примерах я конечно сильно упрощаю и по сути под каждый запрос необходимо отдельно подбирать параметры. Если посмотреть на примеры (https://platform.openai.com/examples), то можно подсмотреть какие параметры в каких случаях стоит использовать.

Таблица с типичными запросами и соответствие параметров:

  1. Написание кода:

    • temperature: 0.3

    • presence_penalty: 0.1

    • frequency_penalty: 0.1

  2. Код ревью:

    • temperature: 0.5

    • presence_penalty: 0.1

    • frequency_penalty: 0.1

  3. Перевод:

    • temperature: 0.6

    • presence_penalty: 0.1

    • frequency_penalty: 0.1

  4. Написание детских книг:

    • temperature: 1

    • presence_penalty: 0.5

    • frequency_penalty: 0.5

  5. Рекламные тексты:

    • temperature: 0.8

    • presence_penalty: 0.3

    • frequency_penalty: 0.3

  6. Креативные тексты:

    • temperature: 1.2

    • presence_penalty: 0.5

    • frequency_penalty: 0.5

  7. Научные тексты:

    • temperature: 0.5

    • presence_penalty: 0.1

    • frequency_penalty: 0.1

  8. Чат на общие темы:

    • temperature: 1

    • presence_penalty: 0.5

    • frequency_penalty: 0.5

  9. Техническая поддержка:

    • temperature: 0.6

    • presence_penalty: 0.5

    • frequency_penalty: 0.5

Как я получил данную таблицу — конечно же спросил ChatGPT:). Достоверность непонятная, у GPT-3 и 4 разные показания, советую подбирать ориентируясь на примеры из примеров OpenAI (https://platform.openai.com/examples)

Если посмотреть на дефолтные значения API из документации:

  • temperature — 1

  • presence_penalty — 0

  • frequency_penalty — 0

Значения параметров Web версии ChatGPT неизвестны. Open source решения (telegramm боты, кастомные UI) зачастую позволяют указывать данные параметры, правда только ко всем запросам в рамках приложения.

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

Языковая модель имеет ограничение на суммарное количество токенов, которое мы можем передать на вход и получить на выходе. GPT-3 имеет ограничение до 4к токенов, тогда как GPT-4 предоставляет возможность работать с 8к или даже с 32к токенами.

Токен это слово или часть слова, символ и тд. 1 токен не всегда равен 1 слову. Для английского языка 1000 токенов в среднем равны 750 словам. Для русского языка все хуже, здесь 1000 токенов это всего около 375 слов. Точные цифры могут отличаться, сильно зависит от конкретного текста, но для ориентира подойдет.

GTP-4 может поддерживать до 32к, то есть 24к слов на английском и 12к слов на русском. То есть в самом хорошем варианте, мы можем отправить GPT-4 6к слов на русском, например мы хотим исправить орфографию в тексте и сможем получить в ответ отредактированные 6к слов. Звучит в принципе не плохо, но выглядит как то тесновато :). Да и на текущий момент ограничение в 32к не доступно всем пользователям.

GPT-3, максимальная количество токенов 4к. Получается 3000 слов на английском и 1500 слов на русском. Если взять лимиты GPT-3, то тут уже можно будет отправить на редактирование не больше 1500 слов на английском или 750 слов на русском. А вот это уже не очень комфортные ограничения и при большем объеме текста придется как то уменьшать текст на вход.

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

Если посмотреть на характеристики GPT-3 и GPT-4, то надо брать GPT-4. Заявляется, что он более совершенный, да и максимальная длина токенов больше. Но есть и минусы, во-первых скорость работы GPT-4 заметно ниже (особенно если писать на русском), во-вторых стоимость в случае использования API GPT-4 может быть больше в 15 раз.

Что происходит, когда мы достигаем лимита максимального количества токенов в рамках беседы? Возможны различные варианты поведения:

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

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

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

В целом, нам необходимо контролировать длину контекста…
Промежуточные советы по работе с контекстом:

Какие алгоритмы мы можем использовать для обхода максимального количества токенов? Давайте рассмотрим несколько вариантов:

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

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

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

  • Ручное управление контекстом. При ручном управлении контекстом мы полностью контролируем, что важно для ответа на вопрос. Это, вероятно, самый трудоемкий способ.

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

Далее я постараюсь дать рекомендации по управлению контекстом.

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

Штатный пользовательский интерфейс позволяет генерировать ответ заново в случае ошибок. Также можно изменить предыдущее сообщение, и ChatGPT выдаст ответ уже с учетом нового контекста. Этот подход более эффективен, чем режим чата, где мы добавляем детали, расширяя контекст не только нашими уточнениями, но и ответами языковой модели. Редактирование сообщений позволяет использовать иерархический подход, указывая весь контекст в первом сообщении и изменять только его. Кроме того, пользовательский интерфейс позволяет просматривать переписку по старым сообщениям.

Если рассмотреть альтернативы стандартному пользовательскому интерфейсу, можно обратить внимание на клон UI ChatGpt. Данный интерфейс дополнительно предоставляет возможность поиска по сообщениям. Также интерфейс позволяет задавать и сохранять инструкции для языковой модели, но именно эта функциональность сделана не очень удобно, так как после создания, текст инструкции нельзя изменить. Задавать дополнительные параметры (temperature) можно, но только если править код. Тем не менее, данный интерфейс работает более стабильно, чем официальный. По крайней мере, не пропадают старые беседы, и имеется возможность использования других API. Более того, модель GPT-3.5 достаточно дешева, и маловероятно, что получится потратить более $20 для чата или для работы с текстом.

Телеграмм боты.

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

Если есть возможность захостить бота, то можно посмотреть на: https://github.com/karfly/chatgpt_telegram_bot. В данном боте можно настраивать инструкции. «temperature» и другие параметры, но они к сожалению зашиты в код — получится установить только одно значение для всех диалогов. При переполнении контекста надо сбрасывать историю разговора.

К плюсам можно отнести поддержку «whisper» — API, которое позволяет получать текст по голосовому сообщению, достаточно полезная вещь. Быстро наговорил что-то, бот перевел в текст и это сохранилось в вашей истории. Вот в этом боте (https://github.com/n3d1117/chatgpt-telegram-bot) можно настроить, чтобы голосовое сообщение преобразовывалось в текст и отправлялось ChatGPT. Как говориться: всегда приятно поговорить с умным человеком.

Расширение для VS Code: https://marketplace.visualstudio.com/items? itemName=genieai.chatgpt-vscode

Позволяет настраивать инструкции для разных команд, таких как «Implement Tests», «Write Code», «Review» и т.д. Можно настроить температуру и другие параметры, но для всех запросов сразу. Если мы говорим о разработке, то я думаю, что этого будет достаточно в большинстве случаев. Есть возможность чата и выбор нескольких режимов ответа (Precise, Balanced, Creative), но не очень понятно, какие именно значения температуры используются в данном случае. Данное расширение для VS Code понятно ведет себя при переполнении контекста, выдавая ошибку и нужно начинать новый чат. Также есть возможность изменять свои сообщения, что является несомненным плюсом. Также, расширение позволяет менять Url для отправки запросов.

Ну и последнее — Obsidian.
Obsidian — это редактор текста, который позволяет создавать, организовывать и связывать между собой заметки. Он использует формат Markdown для форматирования текста, а также имеет функциональность для создания ссылок между заметками, создания тегов и поиска информации. Бесплатный, если используешь для своих личных целей, в том числе и для бизнеса, если у тебя бизнес на одного. Плюс здесь по сути нет вендор лока, так как весь контент это просто текст, можно сделать синхронизацию на разные устройства, если прикрутить к OneDrive например.

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

С настройкой плагина и созданием своих шаблонов конечно придется повозиться, но сильно помогает видео и штатный набор шаблонов к этому плагину. Затем можно посмотреть, как именно устроены эти шаблоны и сделать по аналогии. Чтобы понять куда добавлять параметры, можно посмотреть конфигурацию вот этого шаблона — https://text-gen.com/dalle-2-configuration

PromptInfo:
 promptId: newTemplate
 name: 
    
            

© Habrahabr.ru