中文翻译暂不可用,显示俄语原文。
RAG с cost-aware routing
ТЕХНИЧЕСКОЕ ЗАДАНИЕ: RAG с cost-aware routing
1. Цель задачи
Разработать систему интеллектуального роутинга запросов в RAG-пайплайне, которая направляет простые запросы на быстрый и дешёвый LLM (Groq), а сложные — на мощный, но дорогой (GPT-4). Цель — снизить среднюю стоимость одного запроса не менее чем на 50% по сравнению с использованием только GPT-4, сохранив качество ответов на приемлемом уровне (оценка пользователей не хуже 4 из 5).
Ключевой результат Рабочий прототип RAG-системы с cost-aware роутингом, метрики затрат и качества собранные за неделю тестирования.
2. Исходные данные
| Что нужно | Откуда взять |
|---|---|
| Набор реальных или синтетических запросов к RAG | Собрать из логов существующей системы или сгенерировать 500-1000 вопросов по теме документации |
| Разметка «простой» / «сложный» для каждого запроса | Вручную или с помощью LLM (GPT-4 mini) с последующей верификацией |
| Документы для RAG (корпус знаний) | Любая техническая документация (API, руководства) — 100-500 страниц текста |
| API-ключи: Groq (бесплатный/платный), OpenAI (GPT-4) | Зарегистрироваться на platform.openai.com и console.groq.com |
| Бюджет на API (опционально) | Виртуальная карта / промо-кредиты |
Если нет реального инструмента — симулируем:
- Для Groq используем groq Python SDK (бесплатная квота)
- Для GPT-4 — OpenAI API (paid, но можно тестировать на small датасете)
- Корпус знаний — скачать Markdown-документацию из открытого репозитория (например, LangChain docs)
- Метрики cost рассчитываем как стоимость токенов * тариф
- Для замера качества используем оценку ответа GPT-4 (LLM-as-a-judge) на выборке 100 запросов
3. Технологический стек
| Компонент | Инструменты | Назначение |
|---|---|---|
| Язык программирования | Python 3.11+ | Основная разработка |
| RAG-фреймворк | LangChain / LlamaIndex | Сборка пайплайна |
| Векторная БД | Chroma (in-memory) / FAISS | Хранение эмбеддингов документов |
| Эмбеддинг-модель | text-embedding-3-small (OpenAI) или sentence-transformers/all-MiniLM-L6-v2 | Генерация эмбеддингов |
| LLM (дешёвый) | Groq (mixtral-8x7b-32768 или llama3-70b) | Ответ на простые запросы |
| LLM (дорогой) | OpenAI GPT-4 (gpt-4-turbo) | Ответ на сложные запросы |
| Классификатор (роутер) | scikit-learn (LogisticRegression) + эмбеддинги | Определение сложности запроса |
| Мониторинг | Python logging, CSV-лог | Фиксация стоимости, времени, качества |
| Оценка качества | OpenAI GPT-4 (judge) или RAGAS | Сравнение ответов |
4. Этапы выполнения
Этап 1: Сбор и разметка датасета запросов (2–3 часа)
Действия
- Собрать или сгенерировать 500–1000 вопросов, релевантных корпусу документов.
- Вручную или с помощью GPT-4 mini разметить каждый вопрос как
simple(0) илиcomplex(1):- Простой: фактологический ответ, короткий (до 3 предложений), чёткий контекст.
- Сложный: требует анализа, сравнения, многошагового рассуждения, ответ > 3 предложений.
- Сохранить датасет в CSV: query, label, difficulty_score (0–1).
- Разделить на train (70%), validation (15%), test (15%).
Ожидаемый результат этапа Файл queries_labeled.csv с размеченными запросами.
Этап 2: Разработка классификатора сложности (2–3 часа)
Действия
- Вычислить эмбеддинги всех запросов (через text-embedding-3-small или MiniLM).
- Обучить логистическую регрессию на train + val для предсказания label по эмбеддингам.
- Оценить точность (accuracy ≥ 85%) и F1-score на тесте.
- Если точность низкая — добавить дополнительные признаки:
- длина запроса (количество символов/токенов)
- количество вопросительных слов
- наличие специфических паттернов («сравните», «объясните», «почему»)
- Экспортировать модель в sklearn pickle для использования в рантайме.
# Пример обучения классификатора
from sklearn.linear_model import LogisticRegression
from sentence_transformers import SentenceTransformer
encoder = SentenceTransformer('all-MiniLM-L6-v2')
X_train = encoder.encode(train_queries.tolist())
clf = LogisticRegression(max_iter=1000)
clf.fit(X_train, train_labels)
Ожидаемый результат этапа Файл complexity_classifier.pkl и метрики качества.
Этап 3: Интеграция роутинга в RAG-пайплайн (3–4 часа)
Действия
- Реализовать базовый RAG: загрузить документы → нарезать на чанки (500 токенов, overlap 50) → индексировать в Chroma.
- Написать функцию route_query(query) -> str:
- Создать единый интерфейс generate_answer(query, context):
- Найти топ-5 чанков по косинусной близости.
- Сформировать промпт с контекстом.
- Отправить в выбранный LLM.
- Реализовать логирование: query, routed_to, prompt_tokens, completion_tokens, cost, latency.
- Написать скрипт для пакетного прогона test-датасета через пайплайн.
Ожидаемый результат этапа Работающий роутинг в RAG, файл cost_log.csv за 50 запросов.
Этап 4: Оценка cost и качества (2–3 часа)
Действия
- Прогнать test-датасет (100 запросов) через роутинг и отдельно только через GPT-4 (baseline).
- Собрать метрики:
- Вычислить процент снижения cost:
(cost_baseline - cost_routed) / cost_baseline * 100. - Построить график зависимости cost vs качество (scatter plot).
Ожидаемый результат этапа Отчёт в виде Jupyter Notebook с цифрами и выводами.
Этап 5: Оптимизация и итерация (2–3 часа)
Действия
- Проанализировать ошибки классификации (запросы, которые роутер отправил не туда).
- Попробовать улучшить классификатор:
- Добавить порог уверенности (если вероятность < 0.6 → отправлять на GPT-4).
- Использовать ансамбль (LogReg + правило длины).
- Оценить влияние на cost при пороге
confidence_threshold= 0.5, 0.6, 0.7. - Выбрать оптимальный порог по метрике
cost / avg_quality. - Зафиксировать финальную конфигурацию в
config.yaml.
Ожидаемый результат этапа Финальная конфигурация роутинга, итоговые метрики (cost -50%, quality ≥ 4.5).
5. Критерии приемки (Definition of Done)
- Датасет размечен и разделен на train/val/test.
- Классификатор обучен и показывает accuracy ≥ 85% на тесте.
- RAG-пайплайн с роутингом запускается одной командой.
- Собран CSV-лог стоимости для 100 запросов.
- Снижение среднего cost ≥ 50% относительно baseline (только GPT-4).
- Средняя оценка качества ответов (LLM-as-a-judge) ≥ 4.0 из 5.
- Написан Jupyter Notebook с анализом результатов (графики, таблицы).
- Код выложен в репозиторий с README (инструкция по запуску).
6. Ожидаемый результат
Основной артефакт Папка проекта rag_cost_routing/ с:
complexity_classifier.pkl— обученный классификатор.rag_pipeline.py— скрипт с функциями роутинга.queries_labeled.csv— размеченные запросы.cost_log.csv— логи стоимости.analysis.ipynb— Jupyter Notebook с метриками и выводами.
Опционально
config.yamlс параметрами (порог уверенности, top-k).- Dockerfile для воспроизводимости.
7. Возможные сложности и их решение
| Сложность | Решение |
|---|---|
| Нет доступа к реальным API (Groq/GPT) | Использовать локальные модели через Ollama (llama3:70b для GPT, tinyllama для Groq) и эмулировать задержки |
| Низкая точность классификатора на простых эмбеддингах | Добавить handcrafted признаки (длина, ключевые слова); обучать больше данных (синтезировать) |
| Перекос классов (больше простых, чем сложных) | Использовать взвешенную логистическую регрессию (class_weight='balanced') |
| Сложность оценки качества (субъективно) | Использовать метрики RAGAS (faithfulness, answer_relevancy) как дополнительный объективный критерий |
| Нестабильное время ответа Groq (ratelimiting) | Ввести retry с backoff и логировать ошибки; при падении Groq — fallback на GPT-4 |
8. Бюджет времени (оценка)
| Этап | Время (часы) |
|---|---|
| 1. Сбор и разметка датасета | 2–3 |
| 2. Разработка классификатора | 2–3 |
| 3. Интеграция роутинга в RAG | 3–4 |
| 4. Оценка cost и качества | 2–3 |
| 5. Оптимизация и итерация | 2–3 |
| Итого | 11–16 |
Примечание: Для первого исполнения задача займёт до 20 часов из-за отладки API и сбора данных.
9. Связанные вопросы из базы знаний
| Вопрос | Тема |
|---|---|
| 47 | Какие метрики использовать для оценки RAG-системы? |
| 53 | Что такое cost-aware routing в ML-системах? |
| 124 | Как классифицировать запросы в production? |
| 201 | Как интегрировать Groq API с LangChain? |
| 258 | Как оценить качество ответов LLM без человеческой разметки? |
| 312 | Какие пороги уверенности использовать в классификаторах? |
| 419 | Прайсинг LLM API (OpenAI, Anthropic, Groq) |
| 533 | Как логировать cost и latency в RAG-пайплайне? |
| 617 | Чем отличается простой запрос от сложного? |
| 738 | Как провести A/B-тест роутинга LLM? |
10. Чек-лист самопроверки
- Я обучил классификатор и проверил его на тестовой выборке.
- Я реализовал роутинг: простые запросы → Groq, сложные → GPT-4.
- Я залогировал стоимость хотя бы 100 запросов.
- Я проверил, что среднее снижение cost ≥ 50%.
- Я оценил качество ответов и убедился, что средняя оценка ≥ 4.0.
- Код и документация готовы к передаче (README, config, требования).