Спросите языковую модель, сколько букв в слове «strawberry». Велика вероятность, что она ошибется. Она может сказать десять. Может, угадает одиннадцать. Она будет звучать совершенно уверенно, но всё равно будет неправа. Попросите ту же модель рассчитать сложные проценты по кредиту, сложить два больших числа или посчитать количество рабочих дней между двумя датами, и вы часто будете получать правдоподобный на вид ответ, цифры в котором будут слегка, но опасно неточными.
Это происходит потому, что большие языковые модели рассуждают о числах не так, как люди. Они предсказывают токены. Токен может быть целым словом, частью слова или одной цифрой. Когда модель видит «strawberry», она не видит восемь отдельных букв, выстроенных в ряд. Она видит несколько фрагментов. Её никогда не учили считать символы, её учили только предсказывать, какой фрагмент текста будет следующим. То же самое относится и к арифметике. У модели нет внутреннего калькулятора. У неё отсутствует логика переноса разряда. Она не понимает разрядную систему. Когда она умножает 148 на 279, она не выполняет умножение. Она сопоставляет паттерны с похожими выражениями, которые видела во время обучения, угадывая, какая последовательность цифр должна следовать за ними. Для совсем маленьких сумм паттерн достаточно силен, чтобы сработать. Но для всего, что требует реальной точности, догадка в конечном итоге дает сбой.
Две задачи, один бот
Стандартные методы промптинга требуют от одной системы выполнения двух очень разных задач одновременно. Во-первых, понять логику задачи. Во-вторых, выполнить точный математический расчет. В первой задаче модель действительно впечатляет. Она может прочитать текстовую задачу, извлечь переменные, установить взаимосвязи и спланировать путь решения. Но затем ей приходится выступать в роли собственного калькулятора. Именно здесь цепочка рвется. Одна неверная цифра на третьем шаге заражает все последующие шаги. Сама логика может быть идеальной, но итоговый ответ окажется мусором, потому что модель ошиблась в сложении.
Программно-ориентированные языковые модели, или PAL, решают эту проблему, разделяя работу. Вместо того чтобы просить модель дать ответ, вы просите её написать программу.
Вот как этот процесс работает на самом деле. Вы ставите задачу. Модель выстраивает логику, определяет переменные и структурирует алгоритм. Затем, вместо того чтобы вычислять результат самостоятельно, она пишет короткий скрипт, обычно на Python. Этот скрипт передается реальному интерпретатору кода. Интерпретатор выполняет логику и возвращает точный, детерминированный результат. Модель описывает математические действия. Python выполняет расчеты.
Исполняемые рассуждения на практике
Считайте PAL исполняемыми рассуждениями. Если скрипт может решить задачу, пусть модель напишет этот скрипт.
Рассмотрим конкретный пример. Вам нужно рассчитать сумму к выплате по срочному депозиту в размере ₹50,000 при годовой процентной ставке 8,5% с ежеквартальной капитализацией сроком на семь лет. Если спросить языковую модель напрямую, она может выписать формулу, подставить значения и вычислить результат в рамках цепочки рассуждений. Однако, если присмотреться, можно заметить, что она неправильно рассчитала ежеквартальную капитализацию, неверно разделив ставку, или округлила промежуточный результат, перенеся ошибку дальше. Ответ выглядит разумным, но ошибается на сотни рупий.
С использованием PAL взаимодействие меняется. Вы инструктируете модель сгенерировать код на Python, который определяет principal = 50000, rate = 0.085, time = 7 и n = 4, а затем вычисляет amount = principal * (1 + rate/n) ** (n * time). Модель выдает код. Среда выполнения Python исполняет его. Вы получаете точную цифру, вплоть до последнего знака после запятой, каждый раз. В умножении нет гаданий, нет галлюцинаций с остатком и нет уверенных, но ошибочных округлений.
Тот же принцип применим и к вычислениям с датами. Спросите модель, какая дата наступит ровно через 120 рабочих дней, исключая выходные. Модель, работающая только с текстом, может начать отсчет и ошибиться на субботе. Подход PAL заставляет модель написать скрипт, используя логику datetime и calendar, а затем позволяет интерпретатору выполнить итерации с абсолютной точностью. Манипуляция данными работает так же. Если вам нужно распарсить запутанный CSV, отфильтровать вложенный JSON или провести быструю статистическую трансформацию, модель должна составить логику, в то время как интерпретатор возьмет на себя итерации.
Почему это действительно важно
Переход от текстовых ответов к исполняемому коду дает три практических преимущества.
Детерминизм. Языковая модель, которой зададут один и тот же вопрос дважды, может изменить формулировку или подставить другую цифру. Интерпретатор же каждый раз возвращает один и тот же результат для одних и тех же входных данных. Такая стабильность критически важна в бухгалтерии, логистике, планировании и любых инженерных расчетах, где последовательность результатов не является опцией.
Проверяемость. Когда модель выдает вам три абзаца рассуждений, вам приходится перечитывать каждое предложение в поисках одной неверной цифры. Когда же она выдает десятистрочный скрипт, вы можете проверить код. Вы можете убедиться, что формула сложных процентов верна, еще до запуска интерпретатора. Вы можете проверить имена переменных, заметить ошибки на единицу и даже использовать систему контроля версий для решения. Область возникновения скрытых ошибок значительно сокращается.
Надежность. Модель придерживается своей роли. Она делает то, для чего была создана: рассуждает о структуре, семантике и декомпозиции задач. Машина делает то, для чего была создана: точно вычисляет. Такое разделение ответственности — именно то, как проектируется надежное программное обеспечение. Композиция лучше монолитного дизайна.
Запускайте это как недоверенный код
Необходима предосторожность. Сгенерированный код следует рассматривать как недоверенные входные данные. Модель может написать скрипт с бесконечным циклом, ненужным сетевым запросом или операцией с файловой системой, о которой вы не просили. Всегда запускайте такие программы внутри изолированной «песочницы». Используйте контейнеры с ограниченными привилегиями, бессерверные функции без доступа к сети или строго контролируемые среды с ограниченным временем работы процессора и без постоянного хранилища. Безопасность здесь — не примечание на полях. Это часть проектирования системы.
Где PAL проявляет себя лучше всего, а где его возможности заканчиваются
PAL прекрасно справляется с математикой, датами и манипуляциями со структурированными данными. Он устраняет механические ошибки, которые часто встречаются при рассуждениях, основанных только на тексте.
Однако он не исправляет плохую логику. Если модель выберет неверную формулу,
