Сравнить cost efficiency провайдеров LLM (GPT-4 vs Claude vs Llama-3 self-hosted)

ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Сравнить cost efficiency провайдеров LLM (GPT-4 vs Claude vs Llama-3 self-hosted)

1. Цель задачи

Разработать воспроизводимый pipeline для сравнения cost efficiency трёх популярных LLM-провайдеров: GPT-4 (API OpenAI), Claude (API Anthropic) и Llama-3 70B (self-hosted). Провести замеры стоимости, качества и времени генерации на едином наборе промптов, чтобы принять обоснованное решение о выборе провайдера для production-сценария.

Ключевой результат Аналитический отчёт с таблицей cost per quality unit и рекомендацией оптимального провайдера для заданного профиля нагрузки.

2. Исходные данные

Перед началом работы необходимо подготовить:

Что нужноОткуда взять
Набор тестовых промптов (100–200 запросов)Собрать из реального production-лога или синтезировать (классификация, суммаризация, генерация кода, QA)
API ключи для GPT-4 и ClaudeOpenAI API key, Anthropic API key (можно триальные)
Инфраструктура для self-hosted Llama-3 70BGPU-сервер (A100 или H100) или облачный инстанс (AWS p4d, GCP a2-highgpu)
Бюджет на тестирование API~ $50–100 (зависит от числа запросов)
Калькулятор себестоимости self-hostedСкрипт, учитывающий аренду GPU, электроэнергию, амортизацию

Если нет реального self-hosted окружения — симулируем:

  1. Взять цену на аренду GPU из прайс-листов облачных провайдеров (AWS, GCP, Lambda Labs).
  2. Использовать opensource-бенчмарк (например, llama.cpp с флагом --bench) для получения latency и throughput на целевой модели.
  3. Вычислить стоимость за токен по формуле: (GPU cost per hour) / (tokens per second * 3600).

3. Технологический стек

КомпонентИнструментыНазначение
LLM APIopenai (Python), anthropic (Python)Запросы к GPT-4 и Claude
Self-hosted LLMllama.cpp / vLLMИнференс Llama-3 70B
Оценка качестваrouge-score, bert-score, gpt-4o-mini-as-judgeВычисление метрик качества ответов
Стоимость APIЛогирование счётчиков токенов (input + output)tiktoken для GPT, claude_tokenizer для Claude
Self-hosted costСкрипт PythonРасчёт стоимости за токен (GPU аренда, энергия)
Аналитикаpandas, matplotlib, seabornПостроение таблиц и графиков
ВерсионированиеGit + DVC (опционально)Версионирование промптов и результатов

4. Этапы выполнения

Этап 1: Подготовка тестового набора промптов (1.5 часа)

Действия

  1. Определить сценарии использования (3–4 категории):

    • Классификация (5 классов, ~30 промптов)
    • Суммаризация (документы 500–2000 токенов, ~50 промптов)
    • Генерация кода (Python / JS задачи, ~40 промптов)
    • QA по документации (вопрос-ответ по заданному контексту, ~40 промптов)
  2. Сформировать единый датасет prompts.csv со столбцами:

    id,category,prompt,expected_output,context
    1,classification,"Classify sentiment: 'I love this product'",positive,
    ...
    
  3. Проверить, что каждый промпт укладывается в контекстное окно 8K (Llama-3 70B).

    • Использовать tiktoken для подсчёта токенов.
  4. Зафиксировать гиперпараметры генерации (строго одинаковые для всех провайдеров):

    • temperature = 0.1 (детерминированный режим)
    • max_tokens = 512 (для суммаризации 1024)
    • top_p = 0.9

Ожидаемый результат этапа prompts.csv (150–200 записей) и конфиг hyperparams.yaml.

Этап 2: Запуск инференса и сбор метрик (3–4 часа)

Действия

  1. Написать скрипт run_inference.py, который для каждого провайдера:

    • Читает промпты из CSV
    • Отправляет запрос (API или llama.cpp/vLLM)
    • Сохраняет ответ, количество input/output токенов, latency (секунды)
    • Добавляет стоимость: для API — по прайсу за токен, для self-hosted — по расчётной стоимости за токен

    Пример для GPT-4

    import openai, tiktoken, time, csv
    tokenizer = tiktoken.encoding_for_model("gpt-4-0125-preview")
    
    def get_cost(input_tokens, output_tokens, model="gpt-4-0125-preview"):
        # Цены по странице OpenAI
        price_input = 10.0 / 1_000_000   # $10 per 1M input tokens
        price_output = 30.0 / 1_000_000  # $30 per 1M output tokens
        return input_tokens * price_input + output_tokens * price_output
    
    # ... запрос и логирование
    

    Пример для self-hosted (vLLM):

    from vllm import LLM, SamplingParams
    gpu_cost_per_hour = 3.5  # A100 80GB на AWS
    model = LLM("meta-llama/Meta-Llama-3-70B")
    # ... inference
    tokens_per_second = total_tokens / total_time
    cost_per_token = gpu_cost_per_hour / (tokens_per_second * 3600)
    
  2. Для каждой категории вычислить средние метрики качества:

    • ROUGE-L, BERTScore (против expected_output)
    • LLM-as-judge score (gpt-4o-mini: оценивает от 0 до 10 по критериям: точность, полнота, читаемость)
  3. Сохранить результаты в results/

    • results/gpt4_results.csv
    • results/claude_results.csv
    • results/llama3_results.csv

Ожидаемый результат этапа Три CSV-файла со столбцами: id, prompt, response, input_tokens, output_tokens, latency_s, cost, quality_score, category.

Этап 3: Анализ cost efficiency (2 часа)

Действия

  1. Загрузить все результаты в pandas DataFrame и объединить.

  2. Построить сводную таблицу cost_performance

    ПровайдерСредняя latency (с)Throughput (req/min)Средняя стоимость за запрос ($)Средний качество (score)Cost per quality unit
    GPT-42.1280.0218.70.00241
    Claude3.4170.0188.50.00212
    Llama-31.8 (A100 80G)330.0097.90.00114

    Формула cost per quality unit cost_per_request / quality_score (чем меньше, тем эффективнее).

  3. Построить графики

    • Scatter plot: качество vs стоимость, размер точки = latency
    • Bar chart: cost per quality unit по категориям
  4. Провести анализ чувствительности

    • Что изменится при увеличении числа concurrent запросов? (для self-hosted throughput может просесть)
    • Что если использовать меньшую модель Llama-3 8B? (качество упадёт, стоимость снизится)

Ожидаемый результат этапа Таблицы и графики в Jupyter Notebook (или PDF).

Этап 4: Написание отчёта с рекомендацией (1 час)

Действия

  1. Описать профиль нагрузки (среднее число запросов в день, пиковые нагрузки, SLA по latency).

  2. На основе cost per quality unit выбрать оптимальный вариант:

    • Если качество критично и бюджет позволяет — GPT-4 или Claude.
    • Если нагрузка высокая (>10k req/day) и latency важна — self-hosted Llama-3 (при наличии GPU).
    • Компромисс: гибридная схема (self-hosted для простых запросов, API для сложных).
  3. Оформить отчёт в формате Markdown с разделами:

    • Executive Summary
    • Методология
    • Результаты (таблицы и графики)
    • Анализ чувствительности
    • Рекомендация

Ожидаемый результат этапа report.md и презентация (опционально).

Этап 5: Документирование pipeline (30 минут)

Действия

  1. Написать README с инструкцией по воспроизведению:

    • Установка зависимостей
    • Запуск run_inference.py --provider all
    • Генерация отчёта python generate_report.py
  2. Зафиксировать ограничения

    • API-тесты проводились в непиковые часы.
    • Self-hosted тестировался на single GPU (без Tensor Parallelism).
    • Качество оценивалось ограниченным набором метрик.

Ожидаемый результат этапа README.md и воспроизводимый pipeline в репозитории.

5. Критерии приемки (Definition of Done)

  • Все промпты из prompts.csv успешно обработаны всеми тремя провайдерами (без ошибок превышения лимитов).
  • Для каждого запроса зафиксированы: input/output токены, latency, стоимость.
  • Качество оценено минимум по двум метрикам (одна автоматическая, одна LLM-as-judge).
  • Построена сводная таблица cost per quality unit.
  • Написана рекомендация с обоснованием (описаны trade-offs).
  • Pipeline воспроизводим (README с инструкцией, requirements.txt).
  • Все исходные данные, скрипты и результаты лежат в Git-репозитории (без API-ключей).
  • Проведён анализ чувствительности для key variables (нагрузка, качество).

6. Ожидаемый результат

Основной артефакт
report.md — аналитический отчёт, содержащий:

  • Цель и вводные
  • Таблицу cost performance для GPT-4, Claude, Llama-3
  • График cost per quality unit
  • Обоснованную рекомендацию (выбор провайдера/схемы)
  • Зафиксированные ограничения

Дополнительно

  • Скрипты инференса (run_inference.py)
  • Скрипт расчёта стоимости self-hosted (selfhosted_cost.py)
  • Jupyter Notebook с анализом (analysis.ipynb)
  • CSV-файлы с сырыми результатами
  • prompts.csv и hyperparams.yaml

7. Возможные сложности и их решение

СложностьРешение
Различия в форматах вызова API (разные параметры)Унифицировать через абстракцию: создать класс LLMProvider с методами generate(prompt, params)
Self-hosted Llama-3 не помещается в память одного GPUИспользовать квантизацию (Q4_K_M в llama.cpp) или multiple GPUs (vLLM tensor parallelism)
Стоимость API может нелинейно меняться при batch-запросахУчесть это в анализе чувствительности: сравнить стоимость пакетного режима (batch API)
Оценка качества LLM-as-judge может быть нестабильнойИспользовать 3-5 попыток и усреднять; задать чёткие критерии в промпте-судье
Зашумлённость latency из-за сетевых задержекПовторить каждый запрос 3 раза, взять медиану

8. Бюджет времени (оценка)

ЭтапВремя
Этап 1: Подготовка промптов1.5 часа
Этап 2: Запуск инференса и сбор метрик3–4 часа
Этап 3: Анализ cost efficiency2 часа
Этап 4: Написание отчёта1 час
Этап 5: Документирование pipeline0.5 часа
Итого8–9 часов

Примечание При первом выполнении рекомендуется добавить 2–3 часа на отладку интеграций с API и настройку self-hosted инференса.

9. Связанные вопросы из базы знаний

ВопросТема
410Расчёт стоимости инференса LLM
412Сравнение API vs self-hosting для LLM
415Оптимизация стоимости RAG-систем
420Cost per token у разных провайдеров
430Анализ TCO для LLM-инфраструктуры
450Бенчмаркинг качества LLM
475Выбор модели под бюджетные ограничения
500Эффективность квантизации Llama-3
550Batch inference и cost efficiency
600LLM-as-judge для оценки качества

10. Чек-лист самопроверки

  • Я подготовил единый датасет промптов для всех провайдеров (не менее 100 запросов).
  • Я зафиксировал все гиперпараметры генерации (temperature, max_tokens, top_p) идентичными.
  • Я корректно рассчитал стоимость для self-hosted (учёл аренду GPU и амортизацию).
  • Я оценил качество минимум двумя метриками и усреднил результат.
  • Я проверил, что pipeline воспроизводится на чистом окружении (requirements.txt, инструкция README).