Few-shot learning — одна из самых мощных техник промптинга. Предоставляя примеры того, что вы хотите получить, вы можете обучить модель сложным задачам без какой-либо дополнительной настройки.

<Callout type="info" title="Обучение на примерах">
Подобно тому, как люди учатся, видя примеры, модели ИИ могут усваивать паттерны из примеров, которые вы предоставляете в своём промпте.
</Callout>

## Что такое Few-Shot Learning?

Few-shot learning показывает модели примеры пар «вход-выход» перед тем, как попросить её выполнить аналогичную задачу. Модель изучает паттерн из ваших примеров и применяет его к новым входным данным.

<Compare 
  before={{ 
    label: "Zero-Shot (без примеров)", 
    content: `Классифицируй этот отзыв как положительный или отрицательный:

"Батарея держит вечно, но экран слишком тусклый."

→ Модель может быть непоследовательной в пограничных случаях` 
  }}
  after={{ 
    label: "Few-Shot (с примерами)", 
    content: `"Обожаю!" → Положительный
"Ужасное качество" → Отрицательный  
"Хорошо, но дорого" → Смешанный

Теперь классифицируй:
"Батарея держит вечно, но экран слишком тусклый."

→ Модель усваивает ваши точные категории` 
  }}
/>

<div className="my-4 grid grid-cols-2 md:grid-cols-4 gap-2">
  <div className="p-3 bg-muted/50 rounded-lg text-center">
    <div className="text-2xl font-bold">0</div>
    <div className="text-xs text-muted-foreground">Zero-shot</div>
  </div>
  <div className="p-3 bg-muted/50 rounded-lg text-center">
    <div className="text-2xl font-bold">1</div>
    <div className="text-xs text-muted-foreground">One-shot</div>
  </div>
  <div className="p-3 bg-primary/10 rounded-lg text-center border-2 border-primary">
    <div className="text-2xl font-bold">2-5</div>
    <div className="text-xs text-muted-foreground">Few-shot</div>
  </div>
  <div className="p-3 bg-muted/50 rounded-lg text-center">
    <div className="text-2xl font-bold">5+</div>
    <div className="text-xs text-muted-foreground">Many-shot</div>
  </div>
</div>

## Почему примеры работают

<FewShotDemo />

Примеры передают:
- **Формат**: Как должен быть структурирован вывод
- **Стиль**: Тон, длина, словарный запас
- **Логика**: Паттерн рассуждений, которому нужно следовать
- **Пограничные случаи**: Как обрабатывать особые ситуации

## Базовый паттерн Few-Shot

Фундаментальная структура few-shot промптинга следует простому паттерну: покажите примеры, затем задайте новую задачу. Последовательность в форматировании между примерами критически важна. Модель учится на установленном вами паттерне.

```
[Пример 1]
Вход: [вход 1]
Выход: [выход 1]

[Пример 2]
Вход: [вход 2]
Выход: [выход 2]

[Пример 3]
Вход: [вход 3]
Выход: [выход 3]

Теперь сделай это:
Вход: [новый вход]
Выход:
```

## Few-Shot для классификации

Классификация — один из самых сильных вариантов использования few-shot learning. Показывая примеры каждой категории, вы определяете границы между классами точнее, чем это могли бы сделать одни лишь инструкции.

### Анализ тональности

<Callout type="info" title="Что такое анализ тональности?">
Анализ тональности классифицирует текст по эмоциональному тону: положительный, отрицательный, нейтральный или смешанный. Он широко используется для анализа отзывов клиентов, мониторинга социальных сетей и отслеживания восприятия бренда.
</Callout>

Классификация тональности выигрывает от показа примеров каждого типа настроения, особенно пограничных случаев, таких как «смешанная» тональность, которая может быть неоднозначной.

<TryIt compact prompt={`Классифицируй тональность этих отзывов клиентов.

Отзыв: "Этот продукт превзошёл все мои ожидания! Куплю ещё."
Тональность: Положительная

Отзыв: "Пришёл сломанным, и служба поддержки не помогла."
Тональность: Отрицательная

Отзыв: "Работает нормально, ничего особенного, но со своей задачей справляется."
Тональность: Нейтральная

Отзыв: "Качество потрясающее, но доставка заняла целую вечность."
Тональность: Смешанная

Теперь классифицируй:
Отзыв: "Обожаю дизайн, но время работы батареи разочаровывает."
Тональность:`} />

### Классификация по темам

Для многоклассовой категоризации включите хотя бы один пример на каждую категорию. Это помогает модели понять вашу конкретную таксономию, которая может отличаться от её понимания по умолчанию.

<TryIt compact prompt={`Категоризируй эти заявки в службу поддержки.

Заявка: "Не могу войти в свой аккаунт, сброс пароля не работает"
Категория: Аутентификация

Заявка: "Как мне перейти на премиум-план?"
Категория: Биллинг

Заявка: "Приложение падает, когда я пытаюсь экспортировать данные"
Категория: Отчёт об ошибке

Заявка: "Можете добавить тёмную тему в мобильное приложение?"
Категория: Запрос функции

Теперь категоризируй:
Заявка: "Платёж был отклонён, но я вижу списание на своей карте"
Категория:`} />

## Few-Shot для трансформации

Задачи трансформации преобразуют входные данные из одной формы в другую, сохраняя смысл. Примеры здесь необходимы, потому что они точно определяют, что означает «трансформация» для вашего конкретного случая.

### Переписывание текста

Трансформация стиля требует примеров, показывающих точный сдвиг тона, который вы хотите. Абстрактные инструкции вроде «сделай более профессионально» интерпретируются по-разному. Примеры делают это конкретным.

<TryIt compact prompt={`Перепиши эти предложения в профессиональном тоне.

Неформально: "Привет, просто хотел узнать, получил ли ты моё письмо?"
Профессионально: "Хотел уточнить относительно моего предыдущего письма."

Неформально: "Это супер важно и нужно сделать СРОЧНО!"
Профессионально: "Данный вопрос требует безотлагательного внимания и оперативных действий."

Неформально: "Сорри за поздний ответ, был завален делами!"
Профессионально: "Прошу прощения за задержку с ответом. У меня был особенно напряжённый график."

Теперь перепиши:
Неформально: "Не смогу прийти на встречу, кое-что случилось."
Профессионально:`} />

### Преобразование формата

Задачи преобразования формата выигрывают от примеров, показывающих пограничные случаи и неоднозначные входные данные. Модель изучает ваши конкретные соглашения для обработки сложных случаев.

<TryIt compact prompt={`Преобразуй эти даты на естественном языке в формат ISO.

Вход: "в следующий вторник"
Выход: 2024-01-16 (предполагая, что сегодня 2024-01-11, четверг)

Вход: "послезавтра"
Выход: 2024-01-13

Вход: "последний день этого месяца"
Выход: 2024-01-31

Вход: "через две недели"
Выход: 2024-01-25

Теперь преобразуй:
Вход: "первый понедельник следующего месяца"
Выход:`} />

## Few-Shot для генерации

Задачи генерации создают новый контент, следуя изученному паттерну. Примеры устанавливают длину, структуру, тон и то, на каких деталях нужно акцентировать внимание. Это трудно указать только в инструкциях.

### Описания продуктов

Маркетинговые тексты значительно выигрывают от примеров, потому что они передают голос бренда, акценты на характеристиках и техники убеждения, которые сложно описать абстрактно.

<TryIt compact prompt={`Напиши описания продуктов в этом стиле:

Продукт: Беспроводные Bluetooth-наушники
Описание: Погрузитесь в кристально чистый звук с нашими лёгкими беспроводными наушниками. 40 часов автономной работы, активное шумоподавление и мягкие амбушюры с эффектом памяти для комфорта в течение всего дня.

Продукт: Бутылка для воды из нержавеющей стали
Описание: Поддерживайте водный баланс стильно с нашей термоизолированной бутылкой с двойными стенками. Сохраняет напитки холодными 24 часа или горячими 12. Герметичная крышка и совместимость со стандартными подстаканниками.

Продукт: Эргономичное офисное кресло
Описание: Преобразите своё рабочее пространство с нашим регулируемым эргономичным креслом. Дышащая сетчатая спинка, поясничная поддержка и поворот на 360° обеспечат комфорт во время долгих рабочих сессий.

Теперь напиши:
Продукт: Портативное зарядное устройство для телефона
Описание:`} />

### Документация кода

<Callout type="info" title="Зачем документировать код?">
Хорошая документация объясняет, что делает код, его параметры, возвращаемые значения и примеры использования. Единообразные докстринги позволяют автоматически генерировать документацию API и помогают IDE предоставлять лучшее автодополнение кода.
</Callout>

Стиль документации сильно варьируется между проектами. Примеры обучают вашему конкретному формату, тому, что включать (аргументы, возвращаемые значения, примеры), и ожидаемому уровню детализации.

<TryIt compact prompt={`Напиши документационные комментарии для этих функций:

Функция:
def calculate_bmi(weight_kg, height_m):
    return weight_kg / (height_m ** 2)

Документация:
"""
Вычисляет индекс массы тела (ИМТ) по весу и росту.

Args:
    weight_kg (float): Вес в килограммах
    height_m (float): Рост в метрах

Returns:
    float: Значение ИМТ (вес/рост²)

Example:
    >>> calculate_bmi(70, 1.75)
    22.86
"""

Теперь задокументируй:
Функция:
def is_palindrome(text):
    cleaned = ''.join(c.lower() for c in text if c.isalnum())
    return cleaned == cleaned[::-1]

Документация:`} />

## Few-Shot для извлечения данных

Задачи извлечения получают структурированную информацию из неструктурированного текста. Примеры определяют, какие сущности важны, как форматировать вывод и как обрабатывать случаи, когда информация отсутствует или неоднозначна.

### Извлечение сущностей

<Callout type="info" title="Что такое распознавание именованных сущностей?">
Распознавание именованных сущностей (NER) идентифицирует и классифицирует именованные сущности в тексте по категориям, таким как персоны, организации, места, даты и продукты. Это фундаментальная технология для информационного поиска и построения графов знаний.
</Callout>

NER выигрывает от примеров, показывающих ваши конкретные типы сущностей и то, как обрабатывать сущности, которые могут относиться к нескольким категориям.

<TryIt compact prompt={`Извлеки именованные сущности из этих предложений.

Текст: "Генеральный директор Apple Тим Кук представил iPhone 15 в Купертино."
Сущности:
- КОМПАНИЯ: Apple
- ПЕРСОНА: Тим Кук
- ПРОДУКТ: iPhone 15
- МЕСТО: Купертино

Текст: "Европейский союз оштрафовал Google на €4,34 миллиарда в 2018 году."
Сущности:
- ОРГАНИЗАЦИЯ: Европейский союз
- КОМПАНИЯ: Google
- ДЕНЬГИ: €4,34 миллиарда
- ДАТА: 2018

Теперь извлеки из:
Текст: "SpaceX Илона Маска запустила 23 спутника Starlink с мыса Канаверал 3 декабря."
Сущности:`} />

### Извлечение структурированных данных

Извлечение структурированных данных из естественного языка требует примеров, показывающих, как обрабатывать отсутствующие поля, неявную информацию и различные форматы ввода.

<TryIt compact prompt={`Извлеки детали встречи в структурированный формат.

Письмо: "Давай встретимся завтра в 15:00 в Переговорной Б, чтобы обсудить бюджет на 4 квартал. Пожалуйста, возьми свой ноутбук."

Встреча:
- Дата: [завтрашняя дата]
- Время: 15:00
- Место: Переговорная Б
- Тема: Обсуждение бюджета на Q4
- Требования: Принести ноутбук

Письмо: "Командная синхронизация перенесена на пятницу 10:00, будем использовать Zoom вместо этого. Ссылка в приглашении в календаре. Максимум 30 минут."

Встреча:
- Дата: Пятница
- Время: 10:00
- Место: Zoom (виртуально)
- Тема: Командная синхронизация
- Продолжительность: 30 минут

Теперь извлеки из:
Письмо: "Можем созвониться в понедельник утром около 9:30, чтобы обсудить презентацию для клиента? Я пришлю ссылку на Teams."

Встреча:`} />

## Продвинутые техники Few-Shot

Помимо базового few-shot, существует несколько техник, которые могут улучшить результаты для сложных задач.

### Разнообразные примеры

Разнообразие примеров ценнее, чем их количество. Охватывайте разные сценарии, пограничные случаи и потенциальные неоднозначности вместо того, чтобы показывать похожие примеры многократно.

<TryIt compact prompt={`Ответь на жалобы клиентов.

Пример 1 (Проблема с товаром):
Клиент: "Мой заказ пришёл повреждённым."
Ответ: "Искренне приношу извинения за повреждённую доставку. Я немедленно отправлю замену бесплатно. Вам не нужно возвращать повреждённый товар. Могу я уточнить ваш адрес доставки?"

Пример 2 (Проблема с обслуживанием):
Клиент: "Я ждал на линии 2 часа!"
Ответ: "Мне очень жаль за долгое время ожидания. Это недопустимо. Я сейчас здесь и лично позабочусь о том, чтобы ваш вопрос был решён. Чем могу помочь сегодня?"

Пример 3 (Проблема с оплатой):
Клиент: "Вы списали с меня дважды за один заказ!"
Ответ: "Приношу извинения за эту ошибку в платеже. Я подтвердил двойное списание и инициировал возврат XX.XX₽ на ваш первоначальный способ оплаты. Вы должны увидеть его в течение 3-5 рабочих дней."

Теперь ответь на:
Клиент: "Товар не соответствует тому, что было показано на сайте."
Ответ:`} />

### Отрицательные примеры

<Callout type="tip" title="Контрастное обучение">
Показ «хороших» и «плохих» примеров называется контрастным обучением. Это помогает модели понять не только то, что вы хотите, но и чего следует избегать. Это особенно полезно для оценки стиля и качества.
</Callout>

Иногда показать, чего *не* нужно делать, так же ценно, как показать правильные примеры. Отрицательные примеры помогают модели понять границы и избежать типичных ошибок.

<TryIt compact prompt={`Напиши лаконичные темы писем.

Хорошо: "Отчёт за Q3 готов к проверке"
Плохо: "Привет, я закончил тот отчёт, о котором мы говорили"

Хорошо: "Требуется действие: Согласовать отпуск до пятницы"
Плохо: "Мне нужно, чтобы ты кое-что сделал, пожалуйста, прочитай это"

Хорошо: "Встреча перенесена: Синхронизация проекта → Четверг 14:00"
Плохо: "Планы изменились!!!!!"

Теперь напиши тему для:
Письмо о: Запрос обратной связи по черновику предложения
Тема:`} />

### Примеры пограничных случаев

Пограничные случаи часто определяют, будет ли решение работать в продакшене. Включение необычных входных данных в ваши примеры предотвращает сбои модели на реальных данных, которые не соответствуют «идеальному сценарию».

<TryIt compact prompt={`Разбери имена в структурированный формат.

Вход: "Иван Петров"
Выход: {"first": "Иван", "last": "Петров", "middle": null, "suffix": null}

Вход: "Мария Ивановна Кузнецова-Смирнова"
Выход: {"first": "Мария", "middle": "Ивановна", "last": "Кузнецова-Смирнова", "suffix": null}

Вход: "Д-р Мартин Лютер Кинг мл."
Выход: {"prefix": "Д-р", "first": "Мартин", "middle": "Лютер", "last": "Кинг", "suffix": "мл."}

Вход: "Мадонна"
Выход: {"first": "Мадонна", "last": null, "middle": null, "suffix": null, "mononym": true}

Теперь разбери:
Вход: "Сэр Патрик Стюарт III"
Выход:`} />

## Сколько примеров нужно?

<div className="my-4 grid gap-2">
  <div className="flex gap-3 p-3 bg-muted/50 rounded-lg">
    <span className="font-semibold min-w-40">Простая классификация</span>
    <span className="text-primary font-mono">2-3</span>
    <span className="text-muted-foreground">Минимум один на категорию</span>
  </div>
  <div className="flex gap-3 p-3 bg-muted/50 rounded-lg">
    <span className="font-semibold min-w-40">Сложное форматирование</span>
    <span className="text-primary font-mono">3-5</span>
    <span className="text-muted-foreground">Показать вариации</span>
  </div>
  <div className="flex gap-3 p-3 bg-muted/50 rounded-lg">
    <span className="font-semibold min-w-40">Нюансированный стиль</span>
    <span className="text-primary font-mono">4-6</span>
    <span className="text-muted-foreground">Охватить полный диапазон</span>
  </div>
  <div className="flex gap-3 p-3 bg-muted/50 rounded-lg">
    <span className="font-semibold min-w-40">Пограничные случаи</span>
    <span className="text-primary font-mono">1-2</span>
    <span className="text-muted-foreground">Наряду с обычными примерами</span>
  </div>
</div>

## Качество примеров важно

<Compare 
  before={{ 
    label: "Плохие примеры", 
    content: `"Хороший продукт" → Хорошо
"Хороший сервис" → Хорошо
"Хорошая цена" → Хорошо

✗ Все слишком похожи
✗ Одно слово повторяется
✗ Пограничные случаи не показаны` 
  }}
  after={{ 
    label: "Хорошие примеры", 
    content: `"Превзошёл ожидания!" → Положительный
"Пришёл сломанным" → Отрицательный
"Работает нормально, ничего особенного" → Нейтральный
"Отличное качество, но переоценён" → Смешанный

✓ Разнообразные сценарии
✓ Чёткие границы
✓ Охвачены пограничные случаи` 
  }}
/>

## Комбинирование Few-Shot с другими техниками

Few-shot learning мощно сочетается с другими техниками промптинга. Примеры обеспечивают «что», в то время как другие техники могут добавить контекст, рассуждения или структуру.

### Few-Shot + Роль

Добавление роли даёт модели контекст *почему* она выполняет задачу, что может улучшить качество и последовательность.

```
Ты — рецензент юридических договоров.

[примеры анализа пунктов договора]

Теперь проанализируй: [новый пункт]
```

### Few-Shot + CoT

Сочетание few-shot с Chain of Thought показывает не только *какой* ответ дать, но и *как* рассуждать, чтобы прийти к этому ответу. Это эффективно для задач, требующих оценки.

```
Классифицируй и объясни рассуждение.

Отзыв: "Отличные функции, но слишком дорого"
Размышление: Отзыв упоминает положительные аспекты ("отличные функции"), 
но также значительный негатив ("слишком дорого"). Негатив, кажется, 
перевешивает позитив на основе союза "но".
Классификация: Смешанно-негативный

[больше примеров с рассуждениями]

Теперь классифицируй с рассуждением:
Отзыв: "Именно то, что мне было нужно, пришло быстрее, чем ожидалось"
```

## Резюме

<Callout type="tip" title="Ключевые выводы">
Few-shot learning обучает через демонстрацию и часто более эффективен, чем одни лишь инструкции. Используйте 2-5 разнообразных, правильных примеров и комбинируйте с другими техниками для лучших результатов.
</Callout>

<Quiz 
  question="Сколько примеров обычно следует предоставлять в few-shot learning?"
  options={[
    "Как можно больше (10+)",
    "Одного примера всегда достаточно",
    "2-5 разнообразных, правильных примеров",
    "Примеры не нужны, если инструкции понятны"
  ]}
  correctIndex={2}
  explanation="2-5 разнообразных, правильных примеров обычно работают лучше всего. Слишком мало может не охватить паттерн, а слишком много тратит токены и может запутать модель. Качество и разнообразие важнее количества."
/>

В следующей главе мы рассмотрим итеративное уточнение: искусство улучшения промптов через последовательные попытки.
