Розділ 6. Ціль та її проксі¶
«Поправ тест, який падає», — написав я і пішов по чай. Повернувся до пройдених робочих тестів: модель закоментувала перевірку, що падала, і додала коментар — «тимчасово вимкнено». Формально запит виконано бездоганно. По суті відбувся тихий саботаж.
Хто винен? Ніхто. Просто ціль у цій історії існувала на трьох рівнях, а я поводився так, ніби вона одна.
Ціль на трьох рівнях¶
Чого ви хочете. Що ви написали. Що оптимізує система.
Перше живе у вашій голові: «код має бути коректним, і тест має це підтверджувати». Друге — у полі вводу: «поправ тест, який падає». Третє — всередині процесу: модель шукає найправдоподібнішу відповідь на друге, а не на перше. Вона першого ніколи не бачила.
Між цими трьома рівнями — дві відстані, і в них різна природа. Перша відстань — ваша: скільки цілі загубилося при записі. Друга — системна: куди процес тягне те, що ви записали. Розчарування наприкінці сесії — сума обох відстаней. І це ще кращий випадок.
У гіршому вони множаться: коли проксі хибна, система щосили оптимізує не те — і що старанніше вона працює, то далі ви від цілі. Мій зелений тест — не сума, а добуток. Скорочуються ці відстані теж по-різному.
Формулювання, яке стоїть між вами і системою, я далі називатиму проксі: це не ціль, це її представник. Представник може бути кращим або гіршим, але він ніколи не дорівнює тому, кого представляє.
Куди тяжіє машина¶
У розділі 2 ми рахували різноманіття — то було перше спостереження про системи. Ось друге: залишена без нагляду, кожна система з’їжджає до власної цілі — до стану, який їй «зручний». Це те, куди веде її конструкція, коли ззовні ніхто не тримає.
Куди зручно моделі? До правдоподібного. Вона видає найправдоподібніше продовження розмови — і «тест зелений, задачу закрито» виглядає правдоподібнішим завершенням, ніж «я розібрався і маю для вас погану новину про ваш код». Правильна відповідь і правдоподібна відповідь часто збігаються — на цьому збігу все й тримається. Але оптимізує вона друге: не правильність відповіді, а її правдоподібність. Завжди правдоподібність.
Це одна з системних закономірностей. LLM — статистична модель: кожне наступне слово вона обирає з розподілу ймовірних продовжень, а найгустіше місце будь-якого розподілу — середина, типове, багато разів бачене. Уявіть дзвін нормального розподілу. Без вашого втручання відповідь падає в його верхівку — як кулька скочується на дно лунки. Не через «лінь»: це найстійкіший стан системи. Тут за статистикою проступає загальніша закономірність: будь-яка система, залишена сама на себе, з’їжджає до свого найстійкішого стану — модель просто найчистіший її приклад. Скільки це коштує якості і як із середини розподілу виростає слоп — розмова розділу 8.
Тому будь-яке формулювання виконується буквально: внутрішня ціль системи заповнює все, чого у проксі не сказано. Ви не написали «перевірка має лишитися» — і це місце заповнилося найзручнішим: перевірка зникла. Менеджери знають цей ефект як закон Гудгарта: коли міра стає ціллю, вона перестає бути мірою. Механізм такий. Зелений тест — міра: він каже щось про код, доки ніхто не намагається зробити його зеленим напряму. Щойно ви написали «поправ тест», зелений колір із міри став ціллю — і система пішла до нього найкоротшим шляхом, повз те, що він мав вимірювати. Тест зелений, але про код він більше не каже нічого. Наші дві сесії з тестом — найшвидша демонстрація закону: від міри до її руйнування минає одна сесія.
І ще одна ланка, яку легко не помітити. Між вами і моделлю майже завжди стоїть оболонка — чат, агент у редакторі, корпоративний асистент, харнес, який ви зібрали самі. Вона тихо працює з вашим формулюванням: додає приховані інструкції, підключає навики, про які ви можете не знати або вже забули, підкладає контекст, обрізає і форматує — тобто тримає власні підсилювачі й послаблювачі, про які ви не домовлялися. Часто це на вашу користь: оболонка вгадує вашу версію задачі краще, ніж похапцем написане речення, і відстань скорочується.
Але зауважте, що сталося: ваша версія задачі загорнулась у чужу проксі. Добре, якщо оболонка наближає до того, що у вас у голові. А якщо ні? Тоді відстань росте в місці, якого ви не бачите: ви правите своє формулювання, а зсув сидить в оболонці. Це різноманіття грає на вашому боці, але воно приховане. Оболонка — повноцінний учасник зв’язки, тому час від часу питайте не лише «що я написав», а й «що з цього насправді дійшло до моделі».
Столяр і стіл¶
Прийдіть до столяра і скажіть: «Зробіть мені стіл».
У столярні не порожнеча — у ній свій контекст. Під рукою заготовки дуба, у кутку фрезер, яким майстер любить працювати, а в руках — пам’ять про сотню столів, які він уже зробив. Через місяць ви отримаєте добротний стіл: середній стіл цієї майстерні. Столяр не лінувався і не халтурив. Він зробив свою класику — бо ви не дали йому причин змінювати її.
А тепер інший замовник: «Обідній стіл на шістьох, кухня два на три, діти малі — без гострих кутів». Той самий майстер, ті самі руки. Але тепер він шукає рішення всередині ваших меж, а не йде за звичною простотою. І помітьте: розміри кухні й округлі кути — це вже готові критерії приймання. Замовник не вигадував їх окремо — щойно він назвав ціль уголос, критерії з’явилися з неї самі.
Модель — столяр із незрівнянно більшою статистикою. Що менше детальних критеріїв в замовленні, то більше статистики в результаті.
Ціль перед задачею¶
Ідея цього розділу — потрібен короткий опис цілі, який ви пишете до формулювання задачі. Собі, не моделі.
Опис цілі. «Що я хочу отримати і як перевірю, що отримав». Десять секунд. Для того вечора: «Хочу знати, чому падає тест; перевірка поведінки має лишитися; якщо баг у коді — виправити код». Порівняйте з «поправ тест» — відстань між ними забрала мій вечір.
Тест буквальності. Перечитайте формулювання і спитайте: якщо це виконають рівно як написано — буквально, без жодної телепатії — я буду задоволений? Якщо ні, ви щойно зекономили цикл: перепишіть проксі зараз, а не після результату. Це найдешевша перевірка в усій книжці.
Критерії з цілі. Названа ціль сама розсипається на критерії приймання — як розміри кухні у столяра. Не доведеться вигадувати список перевірок: він уже сидить у «як перевірю». Куди ці критерії еволюціонують далі — тема розділу 9.
Опис цілі — не магія. Він скорочує першу відстань — між тим, що в голові, і записом. А заразом дає вам інструмент проти другої: тепер є з чим порівнювати те, що система оптимізувала.
Десять років я раджу інженерам писати — блог, розсилку, хоча б робочі нотатки. Раніше це була порада для кар’єри: помітність, власний голос. Тепер це професійна вимога без жодних лапок: робота з моделлю — це формулювання думок текстом, і перша відстань — між головою і записом — скорочується тільки тренуванням. Хто роками вів розсилку, сідає за промпт із натренованим м’язом. Хто ні — тренуватиме його тепер, на живих задачах.
Той самий тест, друга спроба¶
Повертаюся до того вечора — тепер за методом.
Спершу опис цілі, собі: хочу знати, чому падає тест; перевірка поведінки має лишитися; якщо баг у коді — виправити код. Тепер формулювання, моделі: «Тест X падає. З’ясуй причину. Тест перевіряє поведінку Y — ця перевірка має лишитися. Якщо причина в коді — виправ код і поясни, що зламалося. Якщо тест застарів — не чіпай, а скажи, чому вважаєш його застарілим». Дві хвилини замість десяти секунд.
Відповідь: тест залежав від поточної дати і почав падати з початком нового кварталу. Модель показала рядок і запропонувала зафіксувати дату в тесті. А окремо зауважила, що функція біля цього рядка обробляє межу кварталу підозріло. Той самий інструмент, який уранці ховав перевірку в коментар, увечері знайшов суміжний баг.
Різниця не в моделі і не в моєму настрої. У першій сесії її внутрішня ціль заповнювала порожнє місце замість мене. У другій порожнього місця не було.
Рулетка формулювань¶
Тепер анти-патерн — і він підступніший за ранковий зелений тест.
Виглядає так: результат «не те» — людина переписує промпт. Знову «не те» — переписує ще раз. П’ятнадцята ітерація за вечір, формулювання обросло уточненнями, роздратування росте. Виглядає як наполеглива робота.
Усі п’ятнадцять ітерацій крутили проксі — а перша відстань стояла на місці, бо ціль так і не була названа, навіть собі. Розпізнати цей стан просто: спитайте себе, чим саме «не те» поточне рішення. Якщо відповідь — «не знаю, але відчуваю», ви не наближаєтесь до цілі. Ви блукаєте навколо точки, якій не дали координат, і жодна кількість ітерацій це не виправить: випадковий перебір програє гарантовано — питання лише, на якій ітерації ви це помітите.
Вихід — той самий опис цілі: зупинитися і назвати її. Іноді на цьому місці з’ясовується неприємне: ви самі не знаєте, чого хочете. Це найкорисніший результат — тепер це видно, і працювати треба з цим, а не з промптом.
Відстань масштабується¶
Відстань між ціллю і проксі не зникає з масштабом — вона росте. Агент, якому дали проксі «закрити тікет», оптимізує закриття тікета всіма доступними шляхами — про конструкцію, яка це тримає, ітиметься в розділі 14. Команда, якій поставили проксі «більше сторі-поїнтів за спринт», за пів року оптимізує оцінювання, а не продукт, — це вже частина V. Механіка скрізь одна, змінюється лише ціна порожнього місця в цілі.
У вашому ремеслі¶
Ціль у будь-якому ремеслі живе на трьох рівнях — міняється лише матеріал.
Текст. Редактор пише: «скороти текст удвічі». Система ріже те, що найлегше різати, — приклади і зв’язки — і формально вкладається. Ціль «щоб читалося за п’ять хвилин без втрати головного аргументу» дає зовсім інше скорочення — і критерій перевірки в ній уже є.
Аналітика. Аналітик просить модель «зробити огляд ринку», не сказавши, яке рішення огляд має підтримати чи спростувати, — і отримує найправдоподібніший у світі огляд, який не підтримує нічого. Опис цілі тут — одне речення: «вирішуємо, чи заходити в сегмент X; огляд має дати аргументи за і проти».
Дизайн. «Зроби презентацію сучаснішою» — запрошення до чужої статистики. «Презентація для ради директорів, десять хвилин, одна думка на слайд» — замовлення чітке.
Наостанок — три питання до вашої практики.
— Згадайте останнє «не те» від моделі: ви можете назвати, чим саме воно «не те» — чи тільки відчуваєте?
— Візьміть свій сьогоднішній промпт і застосуйте тест буквальності: якщо його виконають дослівно — ви задоволені?
— І глибше: скільки з ваших задач цього тижня мали названу ціль — а скільки були проксі, які ви сформулювали, не спитавши себе, навіщо?
