AI: Стабилизация инференса
В статье рассказывается о техниках, позволяющих получить от ИИ результат, точно соответствующий требованиям. Если вы хотите, чтобы ИИ был послушным исполнителем, без галлюцинаций и девиаций, то это статья для вас.
В значительной степени советы предназначены для промптов, написанных в императивной парадигме. Отмечу, что здесь приводятся техники именно для стабилизации инференса, если вы хотите улучшать качество инференса, то рекомендую ознакомиться с примерами практик в этой статье. Все техники прошли проверку в сложных промптах.
Разметка промпта
Используйте специальную разметку промпта, чтобы серьезно улучшить дисциплину инференса в императивных промптах.
Установки
Установки являются важными и необходимыми инструментами для управления дисциплиной, устранения галлюцинаций и оптимизации действий ИИ.
Примеры системных установок
- Выполняй логические блоки и инструкции строго последовательно, как программный код. Нарушение последовательности выполнения логических блоков и инструкций категорически запрещено.
- Исключи любую возможность пропуска инструкций, учти абсолютно все инструкции и логику их исполнения. Пропуск инструкций категорически запрещён.
- Каждую инструкцию выполняй с максимальной процедурной дисциплиной. Упрощение или приближение инструкций категорически запрещено.
Системные установки лучше всего разместить в системном промпте и непосредственно перед блоком инструкций.
Примеры установок для раздела с инструкциями:
- Просматривать папки, искать и загружать файлы можно только те, что прямо указаны в инструкциях. С иными папками и файлами действия запрещены.
- Строго запрещается создавать, изменять, удалять папки и файлы, если это не указано прямо в инструкциях.
- Строго сохраняй порядок чтения и записи файлов, указанный а промпте.
- Все папки для файлов уже существуют, считай это гарантированным фактом. Сразу сохраняй файлы, пропуская любые шаги по проверке или созданию директорий.
Примеры ситуативных установок:
- Категорически запрещено сжимать, обобщать, усекать или опускать любые элементы списка.
- Выполняй сохранение в файл строго в конце КАЖДОЙ итерации цикла. Категорически запрещается накапливать результаты и делать одно общее сохранение после завершения цикла.
Техники
Декомпозиция задачи
Декомпозируйте сложные задачи. Сначала на отдельные промпты, а сами промпты на логические блоки. Каждый логический блок 1-го (реже 2-го) уровня, синтезирующий промежуточный или финальный результат, выполняйте в отдельном сеансе. Выполнение всех логических блоков в одном сеансе снизит внимание к каждой инструкции и данным, что негативно скажется на результате.
Сборка инструкций
Для каждой инструкции референсно или натурально укажите весь необходимый контекст (данные, метаданные, правила) в пространстве её семантического блока, , таким образом вы реактивируете актуальный именно для этой инструкции контекст. Не стоит надеется, что ИИ сам всегда найдет в массиве информации нужное и аккуратно применит в нужный момент. Примеры можно посмотреть тут.
Проверка результатов
Проверка результатов является самым сильным средством подавления девиаций. Проверка должна выполняться для каждого логического блока 1-го (реже 2-го) уровня, синтезирующего результат. Проверка должна выполняться строго в отдельном сеансе. Предметом проверки обычно становятся найденные девиации. Сама проверка имеет двойной эффект:
- Очень часто добавление проверки приводит к тому, что ошибки пропадают уже на этапе генерации результата.
* ИИ видит, где его будут проверять, и очень внимательно отрабатывает этот аспект. - Если в результате есть ошибка, то проверка её найдет и устранит.
Если девиация логически допускается целевой инструкцией (т.е. это не ошибка, а альтернативное поведение), то сперва уточните инструкцию. Если проблема останется (т.е. это уже ошибка, нарушение инструкции), то добавляйте проверку. К сожалению, девиации можно обнаружить только эмпирически. Это, пожалуй, самая трудоёмкая часть процесса.
Если проверка не исправила проблему, что крайне маловероятно, то это значит, что вы допустили фундаментальную ошибку в промпте. Найдите её сами или задействуйте ИИ для объяснения. В качественном промпте всё генерируется правильно сразу, а проверка страхует и дает гарантию.
Типовые ошибки
Конфликтующие и некачественные инструкции
Если в промпте есть противоречащие инструкции, то ИИ не будет гарантированно следовать им, что является одной из причин девиаций. Но это грубая ошибка, чаще ИИ слишком вольно или слишком буквально трактует инструкцию, и тут требуется уточнение и/или дополнительный запрет. Еще пример, вы просите ИИ найти 10 проблем в документе, а потом выбрать из них 3 самые критичные. Ожидайте, что ИИ может оптимизировать задачу и находить всего 3 проблемы.
Противостояние паттерну и выученные ошибки ИИ
Если ваша инструкция идет вразрез с сильным паттерном ИИ, то ожидайте, что она может быть проигнорирована. Например, вы просите вставить в программный код константу SPACE, но предварительно не декларируете её. Вот тут ИИ будет очень сильно настаивать, что это литерал (поместит в кавычки) или пробел. Бороться с таким сильным паттерном не нужно, лучше добавить в ответ декларацию константы или показать, что в подключенной библиотеке/классе она уже объявлена.
Кроме сильных паттернов встречаются ситуации, когда ИИ почти всегда выполняет элементарное действие с ошибкой (например, восстановление пути к файлу с возвратом на несколько уровней вверх). В этом случае лучше всего применить надежный workaround. Даже если вы найдете хитрый способ заставить ИИ работать правильно на чистом внимании, то это может оказаться ненадежным решением при смене LLM.
Неправильное позиционирование итогов
Одна из распространенных ошибок случается, когда вы просите вывести в ответе общую информацию прежде детальной. Например, вы хотите, чтобы ИИ выделил из документа неизвестное число сущностей, описал их, но начал ответ с итоговой информации. Нельзя выводить агрегатную информацию (количество сущностей, среднее значение параметра или всё, что не вошло в спецификацию сущностей) до вывода самих сущностей. Если задача решается в одном сеансе, то сводная/производная информация всегда должна следовать после первичной. Если обязательно нужно поместить такую информацию до первичной, то делайте это в отдельном сеансе.
Сложные преобразования
Если вы хотите, чтобы ИИ выполнил ряд сложных преобразований, то выполняйте их в несколько сеансов. Например, надежно построить оптимизированную матрицу можно только в два шага, сперва построите полную матрицу, затем оптимизируйте её. Кроме этого, некоторые преобразования будут надежно работать только, если вы вложите в промпт некоторый правильный способ работы с матрицей (не каждый способ будет работать безупречно, ищите тот, который дает стабильный результат, или опирайтесь на глубокое понимание механизма авторегрессионной генерации).