Реализация Few-Shot промптинга
Few-Shot Prompting — включение в промпт 2–10 примеров входа-выхода, демонстрирующих желаемый формат и стиль ответа. Модель обобщает паттерн из примеров и применяет его к новому входу. Наиболее эффективен для задач, где точный формат вывода критичен или желаемое поведение сложно описать словами.
Базовый Few-Shot
from openai import OpenAI
import json
client = OpenAI()
FEW_SHOT_CLASSIFIER = """Классифицируй тональность отзыва.
Отзыв: "Товар пришёл быстро, упаковка целая, всё как на фото. Рекомендую!"
Тональность: positive
Отзыв: "Качество среднее, за такую цену ожидал большего. Но в целом работает."
Тональность: neutral
Отзыв: "Пришёл сломанный, продавец не отвечает на сообщения. Мусор, не покупайте."
Тональность: negative
Отзыв: "{review}"
Тональность:"""
def classify_sentiment(review: str) -> str:
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{
"role": "user",
"content": FEW_SHOT_CLASSIFIER.format(review=review)
}],
max_tokens=10,
temperature=0,
)
return response.choices[0].message.content.strip().lower()
Few-Shot для структурированного вывода
EXTRACTION_EXAMPLES = [
{
"input": "Иванов Иван Иванович, 15 лет опыта Python, Django, PostgreSQL. Работал в Яндекс 3 года.",
"output": '{"name": "Иванов Иван Иванович", "experience_years": 15, "skills": ["Python", "Django", "PostgreSQL"], "companies": ["Яндекс"]}'
},
{
"input": "Мария Петрова — frontend-разработчик, React и Vue, 5 лет в стартапах.",
"output": '{"name": "Петрова Мария", "experience_years": 5, "skills": ["React", "Vue"], "companies": []}'
},
]
def build_extraction_prompt(examples: list[dict], new_input: str) -> str:
parts = ["Извлеки структурированные данные из резюме.\n"]
for ex in examples:
parts.append(f"Текст: {ex['input']}\nJSON: {ex['output']}\n")
parts.append(f"Текст: {new_input}\nJSON:")
return "\n".join(parts)
result = client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": build_extraction_prompt(
EXTRACTION_EXAMPLES,
"Алексей Сидоров, DevOps-инженер с 8 лет опыта. Kubernetes, Terraform, AWS. МТС, VK."
)
}],
temperature=0,
)
Динамический выбор примеров (Dynamic Few-Shot)
from sentence_transformers import SentenceTransformer
import numpy as np
class DynamicFewShotSelector:
"""Выбирает наиболее релевантные примеры для каждого запроса"""
def __init__(self, examples: list[dict]):
self.model = SentenceTransformer("BAAI/bge-small-en-v1.5")
self.examples = examples
# Предварительно кодируем все примеры
self.example_embeddings = self.model.encode([e["input"] for e in examples])
def select(self, query: str, k: int = 3) -> list[dict]:
query_embedding = self.model.encode(query)
# Косинусное сходство
similarities = np.dot(self.example_embeddings, query_embedding) / (
np.linalg.norm(self.example_embeddings, axis=1) * np.linalg.norm(query_embedding)
)
# Топ-k наиболее похожих
top_indices = np.argsort(similarities)[-k:][::-1]
return [self.examples[i] for i in top_indices]
# Пример: банк примеров для классификатора
example_bank = [
{"input": "Не могу войти в систему", "output": "technical"},
{"input": "Списали деньги два раза", "output": "billing"},
{"input": "Хочу изменить тарифный план", "output": "account"},
# ... 100+ примеров
]
selector = DynamicFewShotSelector(example_bank)
def classify_ticket(ticket: str) -> str:
relevant_examples = selector.select(ticket, k=3)
prompt = build_classifier_prompt(relevant_examples, ticket)
return query_llm(prompt, temperature=0)
Few-Shot для кастомного стиля ответов
# Обучаем модель корпоративному стилю через примеры
CORPORATE_STYLE_EXAMPLES = [
{
"question": "Что такое наш продукт?",
"answer": "ProductName — платформа автоматизации бизнес-процессов для средних и крупных компаний. Интегрируется с существующими ERP и CRM-системами."
},
{
"question": "Сколько стоит?",
"answer": "Стоимость зависит от количества пользователей и выбранного модуля. Менеджер подберёт оптимальный вариант для вашего размера компании."
},
]
# Модель перенимает лаконичный, профессиональный стиль без лишних уточнений
Рекомендации по выбору примеров
- Разнообразие: примеры должны покрывать разные паттерны входных данных
- Качество: только примеры с правильными и желаемыми выводами
- Размер: 3–7 примеров оптимально; больше — риск переполнения контекста
- Порядок: последний пример перед запросом — самый релевантный
- Баланс классов: при классификации — примерно равное количество каждой категории
Сроки
- Базовый few-shot для конкретной задачи: 0.5–1 день
- Банк примеров с dynamic selection: 3–5 дней
- A/B тестирование вариантов few-shot: 1–2 дня







