Практика: итеративное улучшение промпта
Практика: итеративное улучшение промпта
Пройдём полный цикл из четырёх итераций с метриками на каждой. Ты увидишь, как данные управляют улучшением промпта.
Задача
Промпт должен извлекать из описания товара: название, бренд, цену, цвет и наличие (в наличии / нет / не указано). Ответ — JSON.
Eval set (8 товаров):
| ID | Описание | Ожидаемый JSON |
|---|---|---|
| 1 | «iPhone 15 Pro, Apple, 120 000 руб., чёрный, в наличии» | {"name":"iPhone 15 Pro","brand":"Apple","price":120000,"color":"чёрный","stock":"в наличии"} |
| 2 | «Samsung Galaxy S24, 80 000 ₽» | {"name":"Samsung Galaxy S24","brand":"Samsung","price":80000,"color":null,"stock":"не указано"} |
| 3 | «Ноутбук Lenovo ThinkPad X1» | {"name":"ThinkPad X1","brand":"Lenovo","price":null,"color":null,"stock":"не указано"} |
| 4 | «Redmi Note 13 Pro, зелёный, нет в наличии» | {"name":"Redmi Note 13 Pro","brand":"Xiaomi","price":null,"color":"зелёный","stock":"нет"} |
(Ещё 4 примера в eval set)
Итерация 1: Zero-shot baseline
Промпт v1:
Извлеки из описания товара название, бренд, цену, цвет, наличие.
Ответь JSON. Если данных нет — null.
Описание: {{description}}
Результат на 8 примерах: точность 4/8 = 50%.
Анализ ошибок:
- Ошибка 1 (ID 3): модель вернула
"brand": "ThinkPad"вместо"Lenovo"— перепутала бренд и модель. - Ошибка 2 (ID 4): модель вернула
"brand": "Redmi"— хотя Redmi это не бренд, а суббренд Xiaomi. - Ошибка 3: модель не извлекла цену числом — вернула
"price": "120 000 руб.". - Ошибка 4: для отсутствующего товара модель вернула
"stock": "нет"вместо"stock": "нет в наличии".
Гипотеза: модель не знает, какой формат данных нужен, и путает поля.
Итерация 2: Уточняем формат
Изменение: добавил типы полей и пример.
Промпт v2:
Извлеки из описания товара информацию. Ответь СТРОГО по схеме:
{
"name": "название модели (строка)",
"brand": "бренд-производитель (строка или null). ВНИМАНИЕ: Redmi —
суббренд Xiaomi, в таких случаях brand = 'Xiaomi'.",
"price": "цена числом в рублях (число или null). Например: '120 000 руб.' → 120000.",
"color": "цвет (строка или null)",
"stock": "одно из: 'в наличии', 'нет', 'не указано'"
}
Пример:
Описание: "iPhone 15 Pro, Apple, 120 000 руб., чёрный, в наличии"
Ответ: {"name": "iPhone 15 Pro", "brand": "Apple", "price": 120000,
"color": "чёрный", "stock": "в наличии"}
Описание: {{description}}
Результат: точность 6/8 = 75%. (+25%!)
Анализ ошибок:
- Ошибка 1: «Ноутбук Lenovo ThinkPad X1» →
"brand": "ThinkPad"— модель всё ещё путает бренд и модель в многословных названиях. - Ошибка 2: для описания «Чехол для телефона, красный, 500 руб.» модель вернула
"name": "Чехол для телефона"но"brand": "Чехол"— приняла категорию за бренд.
Итерация 3: Few-shot с краевыми случаями
Изменение: добавил примеры на проблемные случаи.
Промпт v3:
(та же инструкция и схема, что в v2)
Дополнительные примеры:
Пример 2:
Описание: "Ноутбук Lenovo ThinkPad X1"
Ответ: {"name": "ThinkPad X1", "brand": "Lenovo", "price": null,
"color": null, "stock": "не указано"}
Пример 3:
Описание: "Чехол для телефона, красный, 500 руб."
Ответ: {"name": "Чехол для телефона", "brand": null, "price": 500,
"color": "красный", "stock": "не указано"}
Результат: точность 7/8 = 87.5%. (+12.5%!)
Анализ ошибки: последняя ошибка — «Планшет iPad, Apple, серый, был в наличии 2 дня назад» → модель вернула "stock": "в наличии". Спорный случай: «был в наличии» ≠ «в наличии сейчас». Но модель не уловила временной нюанс.
Итерация 4: Уточнение правила
Изменение: добавил уточнение про «был в наличии».
Промпт v4:
(всё из v3 +)
Уточнение: если про наличие написано в прошедшем времени («был»,
«было», «закончился») — stock = "не указано".
Результат: точность 8/8 = 100%.
График прогресса
Точность
100% ┤ ●
90% ┤ ●
80% ┤ ●
70% ┤
60% ┤
50% ┤●
└───┬───────┬───────┬───────
v1 v2 v3 v4
Чему мы научились
- Каждая итерация решала КОНКРЕТНУЮ проблему, найденную через анализ ошибок.
- Изменения: формат (v2) → примеры (v3) → уточнение правила (v4).
- Каждое изменение — ОДНО. Не смешивали.
- Метрики подтверждали улучшение на каждом шаге.
- 4 итерации превратили 50% в 100% на этом eval set.
Проверь себя
Возьми любой промпт, который ты писал ранее в курсе. Создай eval set из 5 примеров, измерь baseline, проведи 2 итерации улучшения.
Итог
- Итеративный подход — это не «исправляю всё сразу», а методичный процесс.
- Каждая итерация: анализ ошибок → гипотеза → одно изменение → замер.
- Четыре итерации — и промпт может вырасти с 50% до 90%+ точности.
- В реальной работе редко достигают 100% — 90–95% обычно достаточно.
Что дальше
Ты освоил полный цикл создания и улучшения промптов: от базовых принципов до итеративной оптимизации с метриками. В следующем модуле — безопасность и production-практики: что нужно знать, чтобы твои промпты были не только точными, но и безопасными.