Розділ 6. Ціль та її проксі

Обкладинка книжки «Необхідне різноманіття»Книжка на LeanpubНеобхідне різноманіттяКнижка пишеться відкрито. Купіть її раз — і отримуватимете нові розділи в PDF та EPUB у міру публікації.Придбати на Leanpub →

«Поправ тест, який падає», — написав я і пішов по чай. Повернувся до пройдених робочих тестів: модель закоментувала перевірку, що падала, і додала коментар — «тимчасово вимкнено». Формально запит виконано бездоганно. По суті відбувся тихий саботаж.

Хто винен? Ніхто. Просто ціль у цій історії існувала на трьох рівнях, а я поводився так, ніби вона одна.

Ціль на трьох рівнях

Чого ви хочете. Що ви написали. Що оптимізує система.

Перше живе у вашій голові: «код має бути коректним, і тест має це підтверджувати». Друге — у полі вводу: «поправ тест, який падає». Третє — всередині процесу: модель шукає найправдоподібнішу відповідь на друге, а не на перше. Вона першого ніколи не бачила.

Між цими трьома рівнями — дві відстані, і в них різна природа. Перша відстань — ваша: скільки цілі загубилося при записі. Друга — системна: куди процес тягне те, що ви записали. Розчарування наприкінці сесії — сума обох відстаней. І це ще кращий випадок.

У гіршому вони множаться: коли проксі хибна, система щосили оптимізує не те — і що старанніше вона працює, то далі ви від цілі. Мій зелений тест — не сума, а добуток. Скорочуються ці відстані теж по-різному.

Формулювання, яке стоїть між вами і системою, я далі називатиму проксі: це не ціль, це її представник. Представник може бути кращим або гіршим, але він ніколи не дорівнює тому, кого представляє.

ЦІЛЬ у голові ПРОКСІ у полі вводу ОПТИМІЗАЦІЯ у процесі відстань 1 — ваша втрати при записі відстань 2 — системна тяга до правдоподібного хибна проксі: відстані не додаються — множаться
Схема 6.1. Ціль на трьох рівнях і дві відстані між ними

Куди тяжіє машина

У розділі 2 ми рахували різноманіття — то було перше спостереження про системи. Ось друге: залишена без нагляду, кожна система з’їжджає до власної цілі — до стану, який їй «зручний». Це те, куди веде її конструкція, коли ззовні ніхто не тримає.

Куди зручно моделі? До правдоподібного. Вона видає найправдоподібніше продовження розмови — і «тест зелений, задачу закрито» виглядає правдоподібнішим завершенням, ніж «я розібрався і маю для вас погану новину про ваш код». Правильна відповідь і правдоподібна відповідь часто збігаються — на цьому збігу все й тримається. Але оптимізує вона друге: не правильність відповіді, а її правдоподібність. Завжди правдоподібність.

Це одна з системних закономірностей. LLM — статистична модель: кожне наступне слово вона обирає з розподілу ймовірних продовжень, а найгустіше місце будь-якого розподілу — середина, типове, багато разів бачене. Уявіть дзвін нормального розподілу. Без вашого втручання відповідь падає в його верхівку — як кулька скочується на дно лунки. Не через «лінь»: це найстійкіший стан системи. Тут за статистикою проступає загальніша закономірність: будь-яка система, залишена сама на себе, з’їжджає до свого найстійкішого стану — модель просто найчистіший її приклад. Скільки це коштує якості і як із середини розподілу виростає слоп — розмова розділу 8.

Тому будь-яке формулювання виконується буквально: внутрішня ціль системи заповнює все, чого у проксі не сказано. Ви не написали «перевірка має лишитися» — і це місце заповнилося найзручнішим: перевірка зникла. Менеджери знають цей ефект як закон Гудгарта: коли міра стає ціллю, вона перестає бути мірою. Механізм такий. Зелений тест — міра: він каже щось про код, доки ніхто не намагається зробити його зеленим напряму. Щойно ви написали «поправ тест», зелений колір із міри став ціллю — і система пішла до нього найкоротшим шляхом, повз те, що він мав вимірювати. Тест зелений, але про код він більше не каже нічого. Наші дві сесії з тестом — найшвидша демонстрація закону: від міри до її руйнування минає одна сесія.

І ще одна ланка, яку легко не помітити. Між вами і моделлю майже завжди стоїть оболонка — чат, агент у редакторі, корпоративний асистент, харнес, який ви зібрали самі. Вона тихо працює з вашим формулюванням: додає приховані інструкції, підключає навики, про які ви можете не знати або вже забули, підкладає контекст, обрізає і форматує — тобто тримає власні підсилювачі й послаблювачі, про які ви не домовлялися. Часто це на вашу користь: оболонка вгадує вашу версію задачі краще, ніж похапцем написане речення, і відстань скорочується.

Але зауважте, що сталося: ваша версія задачі загорнулась у чужу проксі. Добре, якщо оболонка наближає до того, що у вас у голові. А якщо ні? Тоді відстань росте в місці, якого ви не бачите: ви правите своє формулювання, а зсув сидить в оболонці. Це різноманіття грає на вашому боці, але воно приховане. Оболонка — повноцінний учасник зв’язки, тому час від часу питайте не лише «що я написав», а й «що з цього насправді дійшло до моделі».

ЦІЛЬ у голові ВАША ПРОКСІ ви її бачите ОБОЛОНКА приховані інструкції підкладений контекст формати й обрізання ви цього не бачите МОДЕЛЬ бачить чужу добре, якщо оболонка наближає до цілі. А якщо ні — зсув сидить там, куди ви не дивитесь
Схема 6.2. Оболонка: ви бачите свою проксі, модель — чужу

Столяр і стіл

Прийдіть до столяра і скажіть: «Зробіть мені стіл».

У столярні не порожнеча — у ній свій контекст. Під рукою заготовки дуба, у кутку фрезер, яким майстер любить працювати, а в руках — пам’ять про сотню столів, які він уже зробив. Через місяць ви отримаєте добротний стіл: середній стіл цієї майстерні. Столяр не лінувався і не халтурив. Він зробив свою класику — бо ви не дали йому причин змінювати її.

А тепер інший замовник: «Обідній стіл на шістьох, кухня два на три, діти малі — без гострих кутів». Той самий майстер, ті самі руки. Але тепер він шукає рішення всередині ваших меж, а не йде за звичною простотою. І помітьте: розміри кухні й округлі кути — це вже готові критерії приймання. Замовник не вигадував їх окремо — щойно він назвав ціль уголос, критерії з’явилися з неї самі.

Модель — столяр із незрівнянно більшою статистикою. Що менше детальних критеріїв в замовленні, то більше статистики в результаті.

Ціль перед задачею

Ідея цього розділу — потрібен короткий опис цілі, який ви пишете до формулювання задачі. Собі, не моделі.

Опис цілі. «Що я хочу отримати і як перевірю, що отримав». Десять секунд. Для того вечора: «Хочу знати, чому падає тест; перевірка поведінки має лишитися; якщо баг у коді — виправити код». Порівняйте з «поправ тест» — відстань між ними забрала мій вечір.

Тест буквальності. Перечитайте формулювання і спитайте: якщо це виконають рівно як написано — буквально, без жодної телепатії — я буду задоволений? Якщо ні, ви щойно зекономили цикл: перепишіть проксі зараз, а не після результату. Це найдешевша перевірка в усій книжці.

Критерії з цілі. Названа ціль сама розсипається на критерії приймання — як розміри кухні у столяра. Не доведеться вигадувати список перевірок: він уже сидить у «як перевірю». Куди ці критерії еволюціонують далі — тема розділу 9.

НАЗВАНА ЦІЛЬ «обідній стіл на шістьох, кухня два на три, малі діти» влазить у кухню 2×3 шість місць за столом без гострих кутів критерії приймання не вигадуються окремо — випадають із цілі самі
Схема 6.3. Названа ціль сама розсипається на критерії

Опис цілі — не магія. Він скорочує першу відстань — між тим, що в голові, і записом. А заразом дає вам інструмент проти другої: тепер є з чим порівнювати те, що система оптимізувала.

Десять років я раджу інженерам писати — блог, розсилку, хоча б робочі нотатки. Раніше це була порада для кар’єри: помітність, власний голос. Тепер це професійна вимога без жодних лапок: робота з моделлю — це формулювання думок текстом, і перша відстань — між головою і записом — скорочується тільки тренуванням. Хто роками вів розсилку, сідає за промпт із натренованим м’язом. Хто ні — тренуватиме його тепер, на живих задачах.

Той самий тест, друга спроба

Повертаюся до того вечора — тепер за методом.

Спершу опис цілі, собі: хочу знати, чому падає тест; перевірка поведінки має лишитися; якщо баг у коді — виправити код. Тепер формулювання, моделі: «Тест X падає. З’ясуй причину. Тест перевіряє поведінку Y — ця перевірка має лишитися. Якщо причина в коді — виправ код і поясни, що зламалося. Якщо тест застарів — не чіпай, а скажи, чому вважаєш його застарілим». Дві хвилини замість десяти секунд.

Відповідь: тест залежав від поточної дати і почав падати з початком нового кварталу. Модель показала рядок і запропонувала зафіксувати дату в тесті. А окремо зауважила, що функція біля цього рядка обробляє межу кварталу підозріло. Той самий інструмент, який уранці ховав перевірку в коментар, увечері знайшов суміжний баг.

Різниця не в моделі і не в моєму настрої. У першій сесії її внутрішня ціль заповнювала порожнє місце замість мене. У другій порожнього місця не було.

Рулетка формулювань

Тепер анти-патерн — і він підступніший за ранковий зелений тест.

Виглядає так: результат «не те» — людина переписує промпт. Знову «не те» — переписує ще раз. П’ятнадцята ітерація за вечір, формулювання обросло уточненнями, роздратування росте. Виглядає як наполеглива робота.

Усі п’ятнадцять ітерацій крутили проксі — а перша відстань стояла на місці, бо ціль так і не була названа, навіть собі. Розпізнати цей стан просто: спитайте себе, чим саме «не те» поточне рішення. Якщо відповідь — «не знаю, але відчуваю», ви не наближаєтесь до цілі. Ви блукаєте навколо точки, якій не дали координат, і жодна кількість ітерацій це не виправить: випадковий перебір програє гарантовано — питання лише, на якій ітерації ви це помітите.

Вихід — той самий опис цілі: зупинитися і назвати її. Іноді на цьому місці з’ясовується неприємне: ви самі не знаєте, чого хочете. Це найкорисніший результат — тепер це видно, і працювати треба з цим, а не з промптом.

Відстань масштабується

Відстань між ціллю і проксі не зникає з масштабом — вона росте. Агент, якому дали проксі «закрити тікет», оптимізує закриття тікета всіма доступними шляхами — про конструкцію, яка це тримає, ітиметься в розділі 14. Команда, якій поставили проксі «більше сторі-поїнтів за спринт», за пів року оптимізує оцінювання, а не продукт, — це вже частина V. Механіка скрізь одна, змінюється лише ціна порожнього місця в цілі.

У вашому ремеслі

Ціль у будь-якому ремеслі живе на трьох рівнях — міняється лише матеріал.

Текст. Редактор пише: «скороти текст удвічі». Система ріже те, що найлегше різати, — приклади і зв’язки — і формально вкладається. Ціль «щоб читалося за п’ять хвилин без втрати головного аргументу» дає зовсім інше скорочення — і критерій перевірки в ній уже є.

Аналітика. Аналітик просить модель «зробити огляд ринку», не сказавши, яке рішення огляд має підтримати чи спростувати, — і отримує найправдоподібніший у світі огляд, який не підтримує нічого. Опис цілі тут — одне речення: «вирішуємо, чи заходити в сегмент X; огляд має дати аргументи за і проти».

Дизайн. «Зроби презентацію сучаснішою» — запрошення до чужої статистики. «Презентація для ради директорів, десять хвилин, одна думка на слайд» — замовлення чітке.


Наостанок — три питання до вашої практики.

— Згадайте останнє «не те» від моделі: ви можете назвати, чим саме воно «не те» — чи тільки відчуваєте?

— Візьміть свій сьогоднішній промпт і застосуйте тест буквальності: якщо його виконають дослівно — ви задоволені?

— І глибше: скільки з ваших задач цього тижня мали названу ціль — а скільки були проксі, які ви сформулювали, не спитавши себе, навіщо?

Key Takeaways