За что вы платите 50 центов за запрос?
Вы построили систему семантического поиска по видео. Пайплайн работает: видео разбивается на сцены, извлекаются кадры, мультимодальный эмбеддинг Nova превращает их в векторы. Пользователь вводит запрос "кошка в шляпе играет на гитаре", и система находит нужный фрагмент. Все довольны. Пока не приходит счет от AWS.
Самый жирный кусок стоимости — семантический роутер. Та самая модель (скажем, Claude 3.5 Sonnet или даже Haiku), которая решает, к какому векторному индексу отправить запрос, нужно ли искать по субтитрам или по визуалу, требует ли запрос временной привязки. Она вызывается на каждый запрос. И каждый вызов — это 300-500 мс задержки и $0.10-$0.50 в зависимости от модели. Масштабируетесь до 10 000 запросов в день? Готовьте $5000 в месяц только за роутинг. Абсурд.
Вот цифры на 17.04.2026 для Bedrock: вызов Claude 3.5 Haiku (input) обходится в $0.25 за 1M токенов, а Sonnet — уже $3.0. Разница в 12 раз. Но даже Haiku для роутинга — это как использовать спортивный автомобиль для поездки в булочную.
Дистилляция: кража интеллекта у большой модели
Дистилляция — это не обучение с нуля. Это воровство. Вы берете тяжелую, дорогую модель-учителя (скажем, Claude 3.5 Sonnet) и заставляете ее генерировать "мягкие" метки (soft labels) — не просто ответ "ищи по визуалу", а распределение вероятностей: "визуал: 0.87, аудио: 0.05, текст: 0.08". Потом вы берете маленькую, дешевую модель-ученика (например, дистиллированную версию BERT или даже кастомную архитектуру) и учите ее имитировать эти распределения. Не факты, а сам стиль мышления учителя.
Результат? Модель в 100 раз меньше, в 50 раз быстрее и в 20 раз дешевле на инференсе. А точность падает на 2-5%. Это та сделка, на которую стоит пойти. В контексте семантического роутинга для видео-RAG (как в этой архитектуре) эти 5% — ничто по сравнению с экономией.
1 Соберите датасет "вопрос-ответ учителя" через Bedrock
Не нужно размечать данные вручную. Возьмите 5000-10000 реальных пользовательских запросов к вашей системе поиска по видео. Для каждого запроса вызовите модель-учителя (Claude 3.5 Haiku или Sonnet) через Bedrock API с промптом, который заставляет ее действовать как роутер.
import boto3
import json
bedrock = boto3.client('bedrock-runtime', region_name='us-east-1')
def get_teacher_routing(query):
prompt = f"""Ты — семантический роутер для системы поиска по видео.
Запрос пользователя: {query}
Определи, к какому типу данных он относится. Верни JSON:
{{
"visual_search_score": 0.0-1.0,
"audio_search_score": 0.0-1.0,
"text_search_score": 0.0-1.0,
"needs_temporal": true/false
}}
"""
response = bedrock.invoke_model(
modelId='anthropic.claude-3-5-sonnet-20241022-v2:0',
body=json.dumps({
"prompt": prompt,
"max_tokens_to_sample": 100
})
)
result = json.loads(response['body'].read())
return result
Сохраните запрос и полученное распределение вероятностей. Это ваши soft labels. Не используйте просто argmax (брать только максимальное значение) — в этом убийство всей пользы дистилляции.
Ошибка №1: Собирать датасет на синтетических запросах. Модель-учитель отлично справляется с "идеальными" запросами, но в продакшене пользователи пишут "тот момент с собакой в черной куртке". Если ваш датасет не содержит таких неформальных формулировок, дистиллированная модель упадет на них.
2 Выберите модель-ученика. Да, можно свою
Вам не обязательно использовать готовые модели Bedrock для инференса ученика. Дистиллированную модель можно развернуть как отдельный эндпоинт. Варианты на 2026 год:
- DistilBERT или TinyBERT: классика, но для роутинга может быть избыточна.
- Кастомная маленькая трансформерная архитектура: 4-6 слоев, скрытый размер 256-512. Обучается с нуля на дистиллированных данных. Экономичнее.
- SageMaker JumpStart Foundation Models: используйте готовые маленькие модели (например, FLAN-T5 Small) и дообучите их на своих данных через SageMaker JumpStart.
Критерий выбора: модель должна делать инференс быстрее 50 мс на CPU. Да, на CPU. Это избавит вас от затрат на GPU инстансы.
3 Обучите ученика с температурой (Temperature)
Вот где магия. При обучении используете функцию потерь KL-дивергенции между выходными распределениями учителя и ученика. Но не забудьте параметр температуры (T) в softmax учителя.
import torch
import torch.nn as nn
import torch.optim as optim
# Пример функции потерь для дистилляции
def distillation_loss(student_logits, teacher_probs, temperature=3.0):
# teacher_probs уже с температурой
student_log_softmax = nn.functional.log_softmax(student_logits / temperature, dim=-1)
teacher_softmax = nn.functional.softmax(teacher_probs / temperature, dim=-1)
kl_loss = nn.functional.kl_div(student_log_softmax, teacher_softmax, reduction='batchmean')
return kl_loss * (temperature ** 2) # масштабируем обратно
Температура "размягчает" распределение учителя, делая менее вероятные классы более заметными. Это помогает ученику усвоить не только очевидные связи, но и скрытые закономерности. Начните с T=3, поиграйте от 2 до 5.
4 Валидация: смотрите на latency и cost, не только accuracy
Разверните модель-ученика как AWS Lambda функцию с контейнером (до 10 ГБ) или на AWS Inferentia инстансе, если нужна сверхнизкая задержка. Замерьте:
| Метрика | Claude 3.5 Haiku | Дистиллированная модель |
|---|---|---|
| Задержка (p95) | 420 мс | 18 мс |
| Стоимость за 1M запросов | ~$250 | ~$5 (на Lambda) |
| Точность роутинга | 94.5% | 91.2% |
Потеря 3.3% точности за 50-кратное ускорение и 98% экономии — это не сделка, это ограбление банка.
5 Интеграция: замените монолит на гибридную систему
Не выкидывайте модель-учителя полностью. Используйте ее как fallback. Ваша новая архитектура должна выглядеть так:
- Запрос приходит на дистиллированный роутер (Lambda).
- Если уверенность модели (максимальная вероятность в распределении) выше порога (например, 0.85), используем ее решение для маршрутизации.
- Если ниже — отправляем запрос к оригинальной Claude Haiku через Bedrock. Ее ответ используем для поиска и одновременно добавляем в датасет для последующего дообучения ученика.
Таким образом, вы покрываете 90% трафика дешевой моделью, а на сложных 10% не теряете качество. Это называется семантический роутинг для семантического роутера. Мета.
Ловушки, в которые падают все
- Дрифт данных: запросы пользователей меняются. Раз в месяц запускайте пайплайн пересбора датасета и дообучения. Автоматизируйте это с помощью AWS Step Functions.
- Слишком маленький ученик: если сожмете модель до 1 слоя, она не сможет усвоить даже мягкие метки. Начните с архитектуры, которая в 10-20 раз меньше учителя, а не в 100.
- Игнорирование аппаратного ускорения: дистиллированную модель можно оптимизировать под AWS Inferentia или даже компилировать с AWS Neuron для минимальной задержки. Не останавливайтесь на PyTorch .pt файле.
- Забыть про мультимодальность: если ваш поиск работает с фото и видео, убедитесь, что датасет содержит запросы, требующие кроссмодального понимания.
FAQ: ответы на вопросы, которые вы постеснялись задать
Можно ли дистиллировать сразу в модель, которая работает на устройстве пользователя?
Да. После дистилляции на Bedrock вы можете конвертировать модель в формат TensorFlow Lite или ONNX и запускать на мобильных устройствах. Это следующий уровень экономии — нулевая задержка сети и нулевая стоимость инференса на вашей инфраструктуре. Но готовьтесь к битве с квантованием и аппаратной фрагментацией.
А если нет исторических запросов для датасета?
Сгенерируйте их с помощью той же Claude Haiku. Попросите модель придумать разнообразные запросы к системе поиска по видео. Но затем обязательно "прогоните" эти запросы через настоящую систему, чтобы получить реалистичные векторы и контекст. Синтетика — это лучше, чем ничего, но ненамного.
Стоит ли дистиллировать модели для других задач, кроме роутинга?
Абсолютно. Например, для кроссмодального поиска вы можете дистиллировать тяжелую модель эмбеддингов в маленькую, которая будет работать в реальном времени. Или для классификации эмоций в аудиодорожке. Любая задача, где стоимость инференса доминирует над стоимостью обучения.
И последний совет, который противоречит интуиции: иногда дешевле не дистиллировать модель, а полностью переосмыслить архитектуру. Может быть, ваш семантический роутер вообще не нужен, если использовать гибридный поиск в OpenSearch, который сам релевантно ранжирует мультимодальные результаты. Прежде чем оптимизировать стоимость инференса, спросите себя: а нужен ли этот инференс вообще?
Прогноз на 2027 год: Amazon Bedrock представит встроенный сервис автоматической дистилляции, где вы укажете модель-учителя и целевые метрики (latency, cost), а система сама подберет архитектуру ученика и обучит ее. Цена будет определяться процентом сэкономленных средств. Готовьте свои датасеты уже сейчас.