JSON-лог вызовов LLM на Python: задача с проверкой

JSON Lines хранит каждое событие отдельным JSON-объектом в одной строке. Такой формат удобен для потоковой обработки журналов и агрегации стоимости или задержки вызовов.

Разделите данные события и формат сериализации. В этом упражнении точный порядок полей и представление значений входят в контракт вывода. Работа идёт с готовыми входными записями, покупать доступ к LLM API не требуется.

Это бесплатное упражнение из платного курса. Проверьте решение без регистрации. Объяснения и последовательная практика — в курсе «LLMOps & Evaluation: из песочницы в продакшн».

Задача: сформируй JSON-лог вызовов LLM

Соберите минимальный лог для вызовов модели: на вход подаются параметры каждого вызова, на выходе нужно вывести по строке JSON (одна строка на один вызов) со строго заданными полями и форматированием.

Формат ввода

Первая строка: целое N — число вызовов (1 ≤ N ≤ 1000).
Далее N строк, разделитель полей — символ |:

model|prompt|input_tokens|output_tokens|latency_ms|price_in|price_out|ok

  • model — строка без |

  • prompt — строка без | (пробелы допустимы)

  • input_tokens, output_tokens, latency_ms — целые

  • price_in, price_out — вещественные (цена в $ за 1000 токенов входа/выхода)

  • ok — 1 или 0 (флаг «успех»)

Формат вывода

Ровно N строк; каждая — минифицированный JSON-объект (без пробелов) с полями в таком порядке:

{"request_id":..., "ts":..., "model":..., "prompt_hash":..., "input_tokens":..., "output_tokens":..., "latency_ms":..., "cost_usd":..., "status":...}

Точные правила заполнения:

  • request_id — первые 12 шестнадцатеричных символов SHA-256 от строки
    model + "|" + prompt + "|" + input_tokens + "|" + output_tokens

  • ts — всегда строка "2025-01-01T00:00:00Z" (фиксированное значение)

  • model, input_tokens, output_tokens, latency_ms — как во входе

  • prompt_hash — SHA-256 от prompt (hex, строчные)

  • cost_usd — число: (input_tokens/1000)*price_in + (output_tokens/1000)*price_out, округлённое до 6 знаков после запятой (в JSON без незначащих нулей, например 0.35, 0.00325, 0.002). Для нуля пишем 0, а не 0.0

  • status — "ok", если ok=1 и latency_ms>0, иначе "error"

Ограничения и подсказки

  • Сравнение ответа — покомпонентное, точное.

  • JSON должен быть минифицирован (separators=(',',':')), ключи — строго в указанном порядке.

  • SHA-256 берите стандартной hashlib.sha256(...).hexdigest().

РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи