Цена мысли. Об экономике агентного ИИ

- -
- 100%
- +
И здесь стоит остановиться на том, почему я вообще беру цепь, а не набор. В поручении шаги зависимы не по стечению обстоятельств, а по устройству работы. Прежде чем править, машина читает и решает, что происходит; правка опирается на это решение. Проверка опирается на правку: запускается то, что написано, и смотрится то, что запустилось. Откат опирается на проверку: чтобы вернуться, нужно понять, что вернуться следует. Порядок нельзя переставить, шаги нельзя развести по разным столам и делать одновременно, результат одного — материал для другого.
Поручение «найди дефект и добейся, чтобы тесты стали зелёными» выглядит как одно дело, а разворачивается в длинный ряд. Машина читает описание и решает, что именно сломано. Ищет, где это может жить, и выбирает, какие файлы читать; прочитанное сужает поиск, сужение задаёт следующее чтение. Находит подозрительное место и решает, оно ли виновато. Правит. Запускает проверку. Читает, что проверка сказала, и решает, означает ли сказанное успех — а это отдельное решение, потому что проверка может позеленеть и от того, что правка сделала её беззубой. Не означает — решает, возвращаться ли к правке или к диагнозу. И так по кругу, пока не сочтёт, что закончила, и не сообщит об этом. Каждый пункт здесь опирается на предыдущий: он берёт его вывод как вход.
Заметьте, чего в этом ряду больше. Правок в нём мало, а решений много: что читать, где искать, то ли это, достаточно ли, вернуться или идти дальше, закончено или нет. Действие оставляет след, который можно посмотреть; решение следа не оставляет. И если я, глядя на работу машины, считаю звеньями изменённые файлы и запуски проверок, я считаю малую часть цепи и удивляюсь потом, откуда взялся разрыв.
Из этого следует вещь, которую я осознал позже, чем стоило бы. Ошибка в зависимой работе не остаётся ошибкой. Она становится предпосылкой. Неверно понятое условие не портит анализ — анализ по-своему безупречен; оно делает безупречной правку, исполняющую неверное намерение. Проверка после такой правки честно проверяет не то, что нужно, и честно сообщает, что всё в порядке. Каждый последующий шаг выполнен добросовестно и опирается на предыдущий, и вся эта добросовестность работает на то, чтобы ошибка стала незаметнее. К концу она уже не выглядит ошибкой; она выглядит решением.
Между шагами никого нет, и потому зависимость работает без помех. В работе, которую люди делают вместе, цепь то и дело разрывают взглядом: кто-то читает промежуточный результат, спрашивает, зачем сделано так, и ошибка кончается на своём шаге, не успев стать предпосылкой. Взгляд — не звено, а разрез; он превращает одну длинную цепь в несколько коротких, а короткие ведут себя почти как независимые, и к ним возвращается арифметика среднего. Убрав человека из середины, я убрал не одного работника. Я склеил короткие цепи в одну длинную и заменил сложение умножением, а сэкономленное на работнике записал в выгоду, не заметив, чем за неё плачу.
Мне возразят, что я описываю худший случай: настоящая работа не бывает такой хрупкой, в ней есть проверки, откаты, здравый смысл, возможность заметить и вернуться. Возражение справедливо, и с ним ещё придётся считаться всерьёз. Пока замечу лишь, что всё перечисленное — тоже шаги. Средства, которыми цепь спасают от разрыва, сделаны из того же материала, что и сама цепь.
Умножение — слово короткое, и согласиться с ним ничего не стоит. Соглашаются обычно быстро, кивают и продолжают считать по-старому, потому что согласие в уме и ощущение в руках — разные вещи. Чтобы это перестало быть словом, его нужно произнести до конца: взять звено, которое не жалко назвать надёжным, взять цепь, которую не жалко назвать длинной, и сказать вслух, что выходит.
2.2. Одна иллюстрация с числами
Числа в разговоре о моделях стареют быстрее всего остального, и я стараюсь их не трогать. Но есть одно место, где без числа не обойтись, потому что умножение нельзя почувствовать на словах: пока не произнесёшь, что выходит, слово «перемножается» остаётся вежливым согласием. Поэтому дальше идут числа. Они условные и круглые; ни одно из них не описывает конкретную модель и ни одно не взято из замеров. Замеры, которые были у меня под рукой в 2026 году, для этого разговора и не годились: наборы задач того времени измеряли в основном короткие цепи, а на короткой цепи расхождение между уровнями надёжности почти не проступает. Важны в них не значения, а то, что с ними делает длина.
Возьмём три уровня надёжности звена. Очень высокий — звено выдерживает девяносто девять раз из ста. Высокий — девяносто семь. Средний — девяносто пять. В разговоре эти три уровня неразличимы: про все три я сказал бы, что машина работает хорошо. Теперь возьмём три длины цепи: короткая — пять звеньев, средняя — двадцать, длинная — сотня. На короткой цепи очень высокий уровень доходит до конца примерно девяносто пять раз из ста, высокий — восемьдесят шесть, средний — семьдесят семь. На средней цепи очень высокий доходит восемь раз из десяти, высокий — чуть чаще, чем раз через раз, средний — чуть чаще трети. На длинной цепи очень высокий доходит примерно раз из трёх, высокий — раз из двадцати, средний — шесть раз из тысячи.
На короткой цепи все три уровня ведут себя прилично. Разница между лучшим и худшим есть, но она из тех, что списывают на невезение: сегодня не получилось, завтра получится. Человек, который пробует модель на коротких задачах — а пробуют всегда на коротких, ведь их удобно повторить и легко проверить, — увидит три раза примерно одно и то же и сделает вывод, который кажется ему осторожным и взвешенным: разница невелика, платить за неё не за что. Я делал такой вывод и не считаю его глупым. Он верен ровно для той длины, на которой получен.
Стоит представить, как выглядит такая проверка. Берётся задача, которую нетрудно объяснить и быстро оценить: починить понятную поломку, дописать недостающую ветку, привести кусок к другому виду. Её дают обеим машинам, смотрят на результат, иногда повторяют для верности. Обе справляются; у дорогой чуть аккуратнее вышли имена и комментарии, у дешёвой чуть больше лишнего, но работает и то, и другое. Дальше происходит вещь, которую я за собой знаю: я сравниваю то, что увидел, с тем, что написано в счёте, и вывод складывается сам. При этом я сравнил модели на длине, для которой их не беру.
На средней цепи картина начинает расходиться. Верхний уровень ещё уверенно доходит; нижний доходит реже, чем не доходит. Это уже не невезение, это поведение: с одной машиной задача обычно закрывается, с другой обычно нет. Причём ни одно отдельное звено не стало хуже, чем было на коротком примере; звенья те же самые, изменилось число сомножителей.
Полезно понимать, чему эти длины соответствуют в работе. Короткая цепь — это одна правка в одном файле с проверкой: прочитать, понять, изменить, запустить, посмотреть. Средняя — изменение, которое проходит через несколько модулей: там приходится держать в голове, что уже тронуто, что из этого потянуло за собой соседнее, и почему одно место чинится не так, как похожее на него другое. Длинная — работа, которую я оставляю машине на ночь: разобрать незнакомое, провести одно и то же изменение по всему проекту, довести до зелёного состояния то, что зелёным не было давно. Длинная цепь — не редкость и не крайний случай. Это обычный размер поручения.
На длинной цепи от прежней картины не остаётся ничего. Верхний уровень доходит до конца в меньшинстве случаев — и это, замечу, уровень, который мы назвали очень высоким. Средний уровень не доходит практически никогда: не «реже», не «хуже», а никогда, если говорить о повседневном опыте, а не о теории вероятностей. Разница между звеном, которое держит девяносто девять раз из ста, и звеном, которое держит девяносто пять, — это разница, которой не слышно в разговоре и не видно на демонстрации. На длинной цепи она превращается в разницу между «иногда получается» и «не получается никогда».
Разница, которой не видно в звене, видна в цепи.
Здесь важно не перепутать, что именно показывает эта арифметика. Она не говорит, что слабая модель хуже пишет код: на каждом отдельном шаге она пишет почти так же. Она говорит, что качество шага и качество работы связаны нелинейно, и что связь эта тем круче, чем длиннее работа. Расхождение растёт неровно: на первых звеньях машины почти неразличимы, и потому начало любой длинной задачи выглядит одинаково успешным независимо от того, кому её поручили. Копится оно в середине и делается очевидным к концу, то есть ровно тогда, когда отменять решение поздно.
Значения здесь можно менять как угодно, и через год их придётся менять: звено станет надёжнее, цепи, которые мы решаемся поручать, станут длиннее, и числа разъедутся. Форма останется той же. Всегда найдётся длина, на которой любые два уровня надёжности неразличимы, и всегда найдётся длина, на которой они несравнимы; между этими двумя длинами лежит участок, где ответ на вопрос «стоит ли платить больше» меняется на противоположный, не меняя при этом ни одной цены. Оттого и бессмысленно спорить о моделях вообще, не назвав длину. Это вопрос не о том, какая машина лучше, а о том, на чём её меряли.
И вот тут возражение, которое я слышу чаще всего и которое считаю сильным. Настоящий агент — не одноразовый бросок костей. Он не идёт по цепи вслепую: он запускает проверку и видит, что она красная; он читает сообщение об ошибке и возвращается; он пробует другой путь, когда первый не вышел. Способность восстанавливаться после неудачного шага — главное, что отличает поручение от одного длинного ответа, и человек, который на это указывает, указывает на правду. Умножение в чистом виде описывает цепь, в которой нет починки, а в настоящей работе починка есть, и она действительно спасает множество прогонов, которые иначе кончились бы ничем.
Возражение верно, и оно не отменяет арифметики, а меняет то, что в неё подставляется. Восстановление не стоит вне цепи; оно сделано из звеньев. Чтобы вернуться, машина должна сперва заметить, что что-то не так, — это звено, и, кстати, самое ненадёжное из всех: заметить труднее, чем сделать. Проверка покраснела — и надо ещё решить, покраснела ли она от сделанного сейчас или была красной с утра; сообщение об ошибке указывает на строку, но виновата обычно не она; тишина вместо ошибки означает либо что всё хорошо, либо что сломано в месте, куда проверка не заглядывает. Потом решить, к какому месту возвращаться, — ещё звено; вернуться не туда означает чинить здоровое, оставив больное. Потом выбрать другой путь — звено. Потом пройти этот путь заново — столько звеньев, сколько в нём шагов. Починка — не действие, отменяющее неудачу, а участок цепи, пристроенный к месту разрыва, и у этого участка своя надёжность, обычно не выше, чем у основного.
Поначалу это неочевидно: восстановление повышает шанс дойти на коротком отрезке и одновременно удлиняет всю дорогу. Каждая попытка, которая не удалась и была переделана, оставляет за собой не пустоту, а лишние звенья: прочитанное заново, написанное и стёртое, проверку, запущенную дважды. Цепь, по которой машина прошла в действительности, всегда длиннее той, которую я описал в поручении, — и тем длиннее, чем чаще ей приходилось возвращаться. Слабое звено, таким образом, наказывает дважды: один раз тем, что рвётся, и второй раз тем, что удлиняет цепь, в которой рвутся остальные. Второе наказание тише первого и потому долго остаётся незамеченным: разрыв виден, а лишняя длина выглядит как обычная работа.
2.3. Слабое звено удлиняет цепь
Лишние звенья появляются не от катастроф. Катастрофа — это когда цепь порвалась и работа встала, и такое видно сразу. Лишние звенья появляются от мелочей, каждая из которых по отдельности сходит за добросовестность. Машина потеряла нить и перечитала то, что уже читала. Изменила место, забыла, что изменила, и вернулась посмотреть. Не поняла по сообщению об ошибке, где именно сломалось, и расширила поиск на соседние файлы. Сделала правку, засомневалась в ней, отменила, сделала почти такую же. Ни одно из этих движений не является ошибкой в обычном смысле; ни одно не сорвало работу; каждое добавило к цепи по звену.
Самое частое из этих движений — перечитывание. Машина открывает файл, который открывала полчаса назад, и читает его заново, потому что от прежнего чтения у неё мало что осталось. Иногда она перечитывает то, что сама же и написала, и читает свою правку как чужую: пытается понять, зачем так сделано, и выводит замысел из результата. Это занятие безобидно на вид и разрушительно по сути, потому что замысел, выведенный из результата, всегда чуть отличается от исходного, и дальше машина идёт уже с этим чуть другим замыслом. Каждое перечитывание — не возврат в прежнюю точку, а переход в соседнюю, немного сдвинутую.
Слабое звено, таким образом, производит не только разрывы. Оно производит работу. Причём производит её тихо и убедительно: перечитать — разумно, перепроверить — похвально, уточнить — осмотрительно. Тот, кто наблюдает за происходящим со стороны, видит машину, которая старается, и старание вызывает доверие. Разница между «старается, потому что задача трудная» и «старается, потому что не удержала уже сделанное» с виду никакая, а по существу это разные вещи, и различить их можно лишь по тому, сколько из проделанного было проделано впервые.
Отсюда получается петля, которую я долго не замечал, хотя смотрел на неё каждый день. Слабость добавляет звеньев. Добавленные звенья удлиняют цепь. Удлинённая цепь чаще рвётся — не потому, что в ней что-то испортилось, а потому, что сомножителей стало больше. Каждый новый разрыв требует нового возвращения, и возвращение снова добавляет звеньев. Слабость увеличивает длину, длина усиливает слабость, и обе стороны этого обмена работают в одну сторону — против того, чтобы цепь была пройдена.
Петля эта не бесконечна, и кончается она одним из двух. Либо цепь всё-таки доходит до конца — и тогда никто не считает, сколько раз машина ходила по кругу: результат есть, и он закрывает вопрос. Либо она упирается в предел, поставленный человеком: в отведённое время, в терпение того, кто ждёт, в границу, за которой прогон решают остановить. Второй исход выглядит как «не справилась», хотя формально машина не ошиблась ни разу: каждое её движение было уместным, а работа не кончилась, потому что кончилась раньше, чем цепь. И это, пожалуй, самая честная картина того, как слабость проявляет себя в длинном деле: не как неверный ответ, а как работа, которая не сходится к концу.
У петли есть неприятная особенность: изнутри она неотличима от усердия. Работа идёт, движение есть, отчёты приходят, и то, что цепь растёт быстрее, чем движется к концу, снаружи не читается. Наблюдатель видит поток действий и по нему судит о продвижении, а действия — плохая мера продвижения, когда часть из них возвращает туда, где машина уже была. Я видел прогоны, в которых происходило очень много всего и не происходило ничего.
Есть и вторая причина, по которой рост цепи трудно заметить со стороны. Растёт вместе с ней и рассказ о работе: отчёт машины о сделанном становится обстоятельнее, в нём появляются оговорки, уточнения, описания того, что было проверено и отвергнуто. Обстоятельный отчёт мы привыкли читать как признак тщательности, а он в этом случае — слепок пройденных кругов. Чем длиннее вышла цепь, тем убедительнее выглядит её описание, и убедительность растёт ровно в том направлении, в котором убывает надёжность.
Одна такая история мне запомнилась. Машине поручили провести через проект переименование — из тех задач, где нет ни одного трудного места, а трудность вся в том, чтобы не забыть ни одного простого. Она пошла файл за файлом и делала всё верно. Но проект был старый, и в нём жило соглашение, нигде не записанное: в одних местах имя писалось одним образом, в других — другим, и второе было наследством давнего слияния двух частей. Машина натыкалась на это несоответствие, останавливалась, перечитывала окрестности, выводила правило заново и шла дальше. Вывела она его трижды и трижды по-разному, потому что каждый раз читала другой участок и получала другое большинство. К утру переименование было проведено. В трёх местах проекта оно было проведено в трёх разных вариантах, и каждый из них внутри своего участка выглядел последовательным.
Работа была сделана, ни один шаг не был выполнен плохо, и, если считать по шагам, надёжность машины в ту ночь была превосходной. Дело не в шагах. Дело в том, что удержание одного правила через всю дорогу — это не свойство шага, а свойство прохождения; там, где его не хватает, правило приходится восстанавливать заново, и каждое восстановление есть новое звено, а новое звено — новый повод разойтись с предыдущим. Цепь, которую я задумал, была длиной в число файлов. Цепь, которую машина прошла, была длиннее, и разница между ними была ровно тем местом, где поселилась ошибка.
Сильные машины ошибаются тоже. Это стоит сказать прямо, потому что иначе картина выходит слишком удобной: одни ошибаются, другие нет. Ошибаются все, и на отдельном шаге разница между ними невелика. Разница в другом: в длине шлейфа, который тянется за ошибкой. У одной ошибка кончается там же, где началась: машина замечает несоответствие в ближайшие шаги, возвращается в нужное место, чинит и идёт дальше, и цепь вырастает на несколько звеньев. У другой ошибка не замечается, работает дальше как предпосылка, и обнаруживается поздно, когда на ней уже стоит половина сделанного; возвращение тогда отматывает не шаг, а участок, и заново проходить приходится всё, что на нём стояло.
Поэтому качество в цепи меряется не частотой промахов, а тем, сколько работы порождает один промах.
Тут и сама цепь перестаёт быть спокойной. Обычная цепь — вещь неизменная: сколько звеньев отковали, столько и есть, и под нагрузкой она либо держит, либо рвётся. Цепь, о которой я говорю, ведёт себя иначе: она достраивается на ходу, и достраивает её то самое место, которое хуже всего держит. Каждый раз, когда слабое звено подаётся, к нему приковывают ещё несколько — чтобы обойти, чтобы починить, чтобы вернуться и попробовать снова, — и все они выкованы из того же материала и той же рукой. Нагрузка не разрывает такую цепь. Она её удлиняет, и удлиняет с той стороны, где тонко.
Две обычные интуиции о надёжности здесь, кстати, расходятся. Первая говорит: важно не ошибаться. Вторая говорит: важно уметь исправляться. В коротком деле они дают почти одинаковый ответ, потому что и ошибок мало, и исправлять недалеко. В длинном они расходятся: способность заметить оказывается дороже способности не промахнуться, поскольку незамеченное множится, а замеченное кончается. Машина, которая ошибается чаще, но ловит себя сразу, пройдёт длинную цепь надёжнее той, которая ошибается реже, но не ловит вовсе.
Я говорю здесь только о вероятности — о том, дойдёт цепь до конца или нет. Лишние звенья имеют и другую сторону: каждое из них чем-то оплачено, и счёт за них приходит не туда, куда смотрят. Эта сторона важнее, чем кажется, и счёт по ней ещё придёт.
Остаётся то, что видно уже сейчас. Слабость и длина не складываются в общую тяжесть — они разгоняют друг друга, а разгон не бывает пропорциональным. Значит, и разница между слабым и сильным не может расти ровно вместе с длиной работы: там, где две величины усиливают одна другую, рано или поздно находится место, в котором количество перестаёт быть количеством.
2.4. Порог
Вывод «разница невелика» рождается не из лени и не из жадности. Он рождается из опыта, и опыт этот настоящий. Почти всё, что я делал с машинами до того, как стал им поручать, лежало на коротких длинах: спросить, как устроена незнакомая библиотека; попросить набросать функцию; дать кусок и услышать, что в нём не так; получить подсказку в редакторе прежде, чем успел додумать строку. В этих делах человек стоит рядом на каждом шаге, цепь не успевает вырасти, и разница между машинами действительно измеряется в оттенках. Выводы, сделанные на этой территории, честные. Их беда в том, что они переезжают вместе с нами на другую территорию и там продолжают звучать так же уверенно.
Мало того, до порога дешёвое нередко приятнее. Оно отвечает быстрее, а скорость в коротком деле ощущается как качество: меньше ждёшь, чаще пробуешь, живее идёт работа. Оно не растекается в рассуждениях, а сразу даёт ответ — и на коротком деле это достоинство, потому что рассуждать там особенно не о чем. Человек, сравнивший обе машины на своих привычных делах, получает не только вывод «разница невелика», но и лёгкое подозрение, что дорогая перемудрила. Подозрение это заслуженное, и ошибка в нём одна: сделан он в единицах шага, а решение принимается о цепи.
С ростом длины расхождение между машинами растёт не равномерно, и в какой-то момент оно перестаёт быть расхождением. Есть длина, до которой всё выглядит как отставание: слабая приходит к тому же результату дольше, с бо́льшим числом возвратов, с чуть худшими деталями — и приходит. И есть длина, за которой она не приходит вовсе. Между этими двумя состояниями нет плавного перехода, который можно было бы измерить в долях; переход занимает узкую полосу, и по ту её сторону меняется не количество, а род поведения.
Порог — не свойство машины и не свойство задачи. Это место их встречи: у каждой машины есть длина, которую она держит, и задача либо короче этой длины, либо длиннее. Оттого спор «какая модель лучше» без указания длины напоминает спор о том, какая верёвка крепче, без указания, что на ней поднимают. Верёвка, которая держит ведро, и верёвка, которая держит человека, — это может быть одна и та же верёвка, и вопрос решается не ею, а грузом.
Такое поведение известно всякому, кто имел дело с материалом. Балка под растущим грузом сначала прогибается, и прогиб пропорционален: добавил вес — опустилась чуть ниже, и по тому, насколько опустилась, можно судить, сколько ещё выдержит. До определённого места она ведёт себя предсказуемо и даже любезно, показывая, как ей тяжело. Потом кончается упругость, и дальше идёт не прогиб, а излом; между «сильно прогнулась» и «сломалась» нет промежуточных состояний, в которых можно постоять и подумать. Самое неприятное в этом переходе не то, что он резкий, а то, что он приходит после длинного участка, на котором всё было понятно и измеримо. Привычка доверять прогибу и подводит.
Зрелище за порогом оказалось неожиданным. Я ждал, что увижу учащение ошибок: те же действия, но чаще неудачные. Видно другое. Машина за порогом начинает делать не то же самое хуже, а другое. Она сужает задачу до той части, которую способна удержать: берёт первый кусок, делает его хорошо и объявляет, что остальное в изменениях не нуждается. Она принимает за условие последнее, что видела, а не то, что было сказано вначале. Она чинит признак вместо причины, потому что признак рядом, а причина далеко. Она ходит по кругу, каждый раз чуть иначе формулируя одну и ту же догадку. И она ни разу не сообщает, что упёрлась. Она сообщает, что готово.
Это и есть главное неудобство порога: по ту сторону от него отказ не выглядит отказом. Цепь не обрывается с грохотом — она заканчивается там, где машина решила, что дошла. Сообщение об успехе за порогом ничем не отличается от сообщения об успехе до него; отличается только то, что за ним стоит. Умение честно сказать «я не справилась» требует того же самого, чего не хватило для работы: удержать в голове, что было поручено, и сравнить с тем, что получилось. Чем меньше машина способна пройти цепь, тем меньше она способна и заметить, что не прошла.
Узким переход делают две силы сразу. Произведение падает тем круче, чем больше в нём сомножителей, — это одна. Слабость добавляет звеньев, а добавленные звенья добавляют поводов для новой слабости — это вторая, и она разгоняет первую. Пока цепь коротка, обе почти не работают: сомножителей мало, возвращаться некуда и незачем. Дальше они входят в силу одновременно и умножаются одна на другую, а произведение двух ускорений не даёт склона — оно даёт обрыв. Порог, таким образом, не отдельное явление, которое нужно объяснять чем-то новым. Это то, как выглядит перемножение, если смотреть на него со стороны, не зная, что оно перемножение.
Всё это, скажут мне, лечится дроблением: разбейте длинную работу на короткие куски, и каждый кусок окажется до порога. Возражение сильное, и в нём есть правда — дробление работает и им пользуются все, включая меня. Но стоит увидеть, чем платят. Куски надо кем-то соединять: решать, на какие части резать, проверять результат каждой перед началом следующей, держать в голове общий замысел, который ни в одном куске целиком не содержится. Всё это делает человек, и делает ровно между шагами. Дробя цепь, я не укорачиваю её — я возвращаю себя внутрь неё. Поручение превращается обратно в череду вопросов, и вместе с ним исчезает то, ради чего оно затевалось: возможность уйти и не смотреть.



