Розробка агентів на основі оцінювання (Eval-Driven): як я перестав налаштовувати промпти на основі відчуттів

Я змінив промпт. Наступний запуск виглядав краще. Чи допомогла зміна, чи мені просто пощастило?

Довгий час моєю відповіддю було «Здається, так». Я підправляв команду, запускав пайплайн, спостерігав за успіхом і випускав продукт. Це інженерія на основі відчуттів (vibes-based engineering). Майже всі, хто створює агентів, роблять саме так, бо альтернатива здається занадто складною.

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

Я вирішив це, застосувавши дисципліну машинного навчання. Я побудував фреймворк оцінювання (evaluation framework), який охоплює всю мою систему.

Ось як працює цей фреймворк:

• Target (Ціль): Зафіксована кодова база. Вона залишається незмінною, щоб результати були порівнянними. • Task (Завдання): Конкретний елемент бенчмарку з промптом та оракулом (oracle). • Oracle (Оракул): Детермінована перевірка. Це shell-команди, які мають бути виконані успішно. • Variant (Варіант): Конкретна зміна, яку ви тестуєте, наприклад, новий планувальник (planner). • Trial (Спроба): Один запуск. Я запускаю кожне завдання кілька разів, щоб врахувати випадковість.

Я використовую два типи оцінювання, щоб виявляти різні помилки:

  • Code Graders (детерміновані): Вони перевіряють відсоток проходження тестів, вартість, час і зміни у файлах.
  • LLM Judge (ймовірнісні): Окрема фіксована модель оцінює якість специфікації та точність реалізації.

Code graders кажуть, чи працює код. Judge каже, чи хороший цей код. Вам потрібні обидва.

Я також перестав використовувати середні значення. Середні показники брешуть щодо агентів. Якщо завдання виконується 2 з 3 разів, це виглядає непогано. Але це не надійно. Замість цього я використовую дві метрики:

  • pass@k: Чи впорався агент хоча б один раз? (Можливості)
  • pass^k: Чи впорався агент кожного разу? (Надійність)

Різке зростання pass^k — це справжня перемога. Це означає, що ви зробили агента стабільним, а не просто везучим.

Щоб система залишалася ефективною, я додаю складні завдання, які потребують глибокого розуміння. Коли агент не справляється з реальним багом, я перетворюю цю помилку на постійне завдання. Це створює замкнений цикл. Бенчмарк стає складнішим у міру того, як агент стає кращим.

Створення такої інфраструктури потребує багато зусиль, але це найефективніше, що я зробив. Це перетворило «Мені здається, так краще» на «це на 20% надійніше за меншу вартість».

Агентів для кодування легко демонструвати, але важко довіряти. Якщо ви хочете вийти за межі демо-версій, ви повинні прийняти рішення вимірювати результати.

Source: https://dev.to/rickjms/eval-driven-agent-development-how-i-stopped-tuning-prompts-on-vibes-1189

Optional learning community: https://t.me/GyaanSetuAi