Практика: добавление примеров в промпт
Практика: добавление примеров в промпт
В этом уроке мы пройдём полный цикл: возьмём задачу, решим её без примеров, добавим примеры по одному и посмотрим, как меняется качество. Ты увидишь few-shot в действии на реальной задаче.
Задача: нормализация адресов
У нас есть список адресов, записанных в свободной форме. Нужно привести их к единому формату: «Индекс, Город, Улица, Дом».
Тестовые адреса:
- «г. Москва, ул. Тверская, д. 15, 125009»
- «Санкт-Петербург, Невский проспект, 22, 191186»
- «Казань, ул Баумана 5 кв 12»
- «630099, Новосибирск, Красный проспект, дом 34»
Версия 0: Zero-shot (без примеров)
Вход:
Приведи адрес к формату: "Индекс, Город, Улица, Дом".
Адрес: "г. Москва, ул. Тверская, д. 15, 125009"
Выход:
125009, Москва, ул. Тверская, д. 15
Неплохо. Но посмотрим на других адресах:
Вход: "Санкт-Петербург, Невский проспект, 22, 191186"
Выход: 191186, Санкт-Петербург, Невский проспект, 22
Вход: "Казань, ул Баумана 5 кв 12" (здесь нет индекса!)
Выход: , Казань, ул Баумана, 5 — модель придумала запятую перед индексом и потеряла «кв 12».
Вход: "630099, Новосибирск, Красный проспект, дом 34"
Выход: 630099, Новосибирск, Красный проспект, 34 — потеряла «дом».
Проблемы zero-shot: модель не знает, как обрабатывать отсутствующий индекс, что делать с «кв», нужно ли оставлять «дом»/«д.» в номере дома.
Версия 1: One-shot (один пример)
Добавим один пример, покрывающий самый частый случай:
Вход:
Приведи адрес к формату: "Индекс, Город, Улица, Дом".
Если какой-то части адреса нет — оставь пустое место.
Улица: только название, без "ул.", "проспект" и т.д.
Дом: только номер, без "д.", "дом".
Пример:
Вход: "г. Москва, ул. Тверская, д. 15, 125009"
Выход: "125009, Москва, Тверская, 15"
Теперь:
Вход: "Казань, ул Баумана 5 кв 12"
Выход:
, Казань, Баумана, 5
Уже лучше: модель убрала «ул» и «д.». Но индекс пустой (правильно — его нет в адресе). Однако модель проигнорировала «кв 12» — она не знает, что с этим делать, потому что в примере не было квартиры.
Версия 2: Few-shot (три примера с вариациями)
Добавим примеры, покрывающие разные ситуации:
Вход:
Приведи адрес к формату: "Индекс, Город, Улица, Дом".
Правила:
- Если части адреса нет — оставь пустое место, но сохрани запятые.
- Улица: только название (без "ул.", "пр.", "проспект").
- Дом: только номер (без "д.", "дом"). Если есть квартира — не включай.
- Город: без "г.", "город".
- Если индекс в конце — перенеси его в начало.
Пример 1:
Вход: "г. Москва, ул. Тверская, д. 15, 125009"
Выход: "125009, Москва, Тверская, 15"
Пример 2:
Вход: "Санкт-Петербург, Невский проспект, 22, 191186"
Выход: "191186, Санкт-Петербург, Невский, 22"
Пример 3:
Вход: "Казань, ул Баумана 5 кв 12"
Выход: ", Казань, Баумана, 5"
Пример 4:
Вход: "630099, Новосибирск, Красный проспект, дом 34"
Выход: "630099, Новосибирск, Красный, 34"
Теперь:
Вход: "город Екатеринбург, улица Ленина, строение 3А, 620000"
Выход:
620000, Екатеринбург, Ленина, 3А
Отлично! Модель справилась со всеми нюансами: убрала «город», «улица», «строение», перенесла индекс в начало, сохранила литеру «А» в номере дома.
Что изменилось на каждом шаге
| Версия | Примеров | Что пошло не так | Что исправили |
|---|---|---|---|
| Zero-shot | 0 | Не знает, как убирать «ул.»/«д.»; теряется без индекса; не знает про «кв» | — |
| One-shot | 1 | Убирает «ул.»/«д.», но не знает про квартиры | Добавили пример с точным форматом |
| Few-shot | 4 | — | Добавили примеры: без индекса, с индексом в начале, с «кв» |
Правило создания практического few-shot промпта
- Начни с zero-shot. Напиши инструкцию и протестируй на 3–5 примерах.
- Найди ошибки. На каких примерах модель ошибается? Запиши их.
- Классифицируй ошибки. Ошибки одного типа? Или разных? Каждому типу ошибки — свой пример.
- Добавь примеры на каждый тип ошибки. По одному примеру на тип.
- Повтори тестирование. Все ли типы ошибок исчезли? Если нет — добавь ещё пример или уточни инструкцию.
Проверь себя
Дана задача: модель должна извлекать дату из текста в формате «ДД.ММ.ГГГГ». Тексты: «встреча 15 января 2025», «05.02.25», «завтра», «в пятницу», «10/03/2025». Какие примеры добавишь в промпт?
Пример ответа: минимум 3 примера — для словесной даты («15 января 2025» → «15.01.2025»), для сокращённого числового формата («05.02.25» → «05.02.2025»), для формата с "/" («10/03/2025» → «10.03.2025»). Для «завтра» и «в пятницу» — нужен дополнительный контекст (текущая дата), возможно, стоит указать в инструкции: «если дата относительная, напиши ОТНОСИТЕЛЬНАЯ».
Итог
- Few-shot не пишется с первой попытки — это итеративный процесс: тестируешь, находишь ошибки, добавляешь примеры.
- Каждый пример должен закрывать конкретный тип ошибки.
- Начинай с zero-shot. Один пример исправляет один класс ошибок. Три-четыре хорошо подобранных примера покрывают большинство задач.
- Разнообразие примеров важнее их количества. Четыре примера на четыре разных типа ошибок > десяти примеров на один тип.
Что дальше
Few-shot освоен. В следующем модуле перейдём к структурной организации промптов. Ты научишься использовать разделители и XML-теги, чтобы даже очень длинные и сложные промпты оставались понятными — и для тебя, и для модели.