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

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

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. Данный интерфейс дополнительно предоставляет возможность поиска по сообщениям. Также интерфейс позволяет задавать и сохранять инструкции для языковой модели со всеми дополнительными параметрами. Данный интерфейс работает стабильнее, чем официальный. По крайней мере, не пропадают старые беседы, и имеется возможность использования других 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: ????️newTemplate 
 description: newTemplate
 required_values: 
 author: 
 tags: 
 version: 0.0.1
config:
 append:
  bodyParams: true
  reqParams: false
bodyParams:
 temperature: 1.2
---
You are creative text writer.
Write text about: {{selection}}

Надеюсь, эти советы помогут вам подружиться с ChatGpt и решать свои задачи немного эффективнее.

Update (08.04.2023): Обновил информацию про альтернативный UI. Теперь он позволяет гибко управлять инструкциями и задавать дополнительные параметры.

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


  1. belomestnyy
    06.04.2023 16:29
    +1

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


    1. leftToddler Автор
      06.04.2023 16:29

      Мне кажется нам еще предстоит понять как это встраивать в жизнь для решения повседневных задач. Но уже сейчас мне кажется, что русский и английский он знает лучше меня :)


  1. phenik
    06.04.2023 16:29
    +1

    Спасибо, хорошие пояснения, многие в коментах плавают в этих вопросах. Примеры с кодом можно найти в этом переводе.


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

    Замечание психофизиологического характера. Хотя жаргон уже сложился, он не совсем удачный как кажется, и может вызывать неприятные ассоциации. Во-первых, в отношении ЯМ это все же не глюки, а бред получается. Во-вторых, глюки и бред больше признаки психопатологических отклонений или необычных условий. Вряд-ли это можно отнести к ЯМ, они такие, как их спроектировали, и ничего не принимают, если только разработчики) Более удачная терминология — фантазии сетей. Люди также фантазируют на разные темы по множеству раз на день. Это вполне нормально в некоторых пределах, одна из составляющих креативности, и является следствием ассоциативного мышления и памяти человека. В ЯМ как раз пытаются моделировать этот уровень психических процессов (Система 1 — быстрые, автоматические процессы мышления. В том же источнике приводятся идеи как улучшить это процесс с помощью логического уровня мышления — Системы 2, тем самым уменьшая объем совсем необоснованных фантазий. Исследование на тему, как работает ассоциативность в GPT).


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

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


    И еще интересно, почему GPT сама прекращает генерацию текста, а жена нет, пока не заткнешь? ;)


    1. leftToddler Автор
      06.04.2023 16:29
      +1

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

      Если говорить почему оно прекращает генерацию текста, то можно посмотреть на API, которое может возвращать информацию о выбранных токенах и их вероятностях. Видимо вероятности сильно падают и получается, что найти подходящего токена не получается.
      Когда игрался с API, в режиме "простого" completion (например davinci), сеть может разговаривать сама с собой, если неправильно указать стоп слова (например "." или перенос строки), то сеть разговаривает сама с собой.
      Например:
      "Hi, how are you?"
      "Fine, thank you, what about you?"
      "I am fine too, thank you."
      В режиме "простого" completion, разработчики сами организуя режим чата, добавляя User и ChatGpt, например:
      "User: Hi, how are you? ChatGpt:"
      "Fine, thank you, what about you? User:"
      "User: I am fine too, thank you."
      В данном случае стоп слово: "User:" как бы говорит, что сеть ожидает ответа.

      В режиме chat/completion (Gpt 3.5 и Gpt 4) сама Open AI реализует указанное поведение и возиться со стоп словами не нужно.

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


      1. phenik
        06.04.2023 16:29
        +1

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

        Согласен, нужно брать в кавычки, но только потому что это не дотягивает до уровня человека, причем пока довольно сильно. Хотя принцип правильный, человек также ослабляет контроль, чтобы найти новые идеи в заданном контексте. В мозговом штурме впрямую предписывается ослабить логический и критический контроль, и разрешается нести глупости по теме) Однако, затем начинается разбор идей, и эти уровни должны включаться. В существующих архитектурах таких возможностей пока нет, и человеку приходится их брать на себя. Более того человек для генерации идей привлекает не только ассоциативный уровень мышления, облеченный в языковую форму, но и эмоциональный, и образный — воображение. Использование таких возможностей пока не просматривается в существующих реализациях. Хотя GPT-4 может работать с изображениями, и это, видимо, можно как-то приспособить, как для генерации новых идей, так и для контроля результатов, наряду с логическим анализом. Есть пример использования такого "воображения" для улучшения качества переводов текста. Однако, для полноценного использования этих возможностей, точнее их моделирования как у человека, нужны иерархически организованные рекуррентные архитектуры. Прямых трансформерных недостаточно, как не увеличивай их размерность, и объемы обучения.


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

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


  1. support917
    06.04.2023 16:29
    +1

    до тех пор пока не будет получен ответ

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


    1. leftToddler Автор
      06.04.2023 16:29

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


  1. IreneRadix
    06.04.2023 16:29

    Статья, конечно, интересная, но заголовок больно кликбейиный


    1. leftToddler Автор
      06.04.2023 16:29

      Ну да, статья не сложная, кому то возможно будет полезно.