/
Вопросы и ответы
/
Промт-инжиниринг
/

Что логировать в продакшне, чтобы разбирать сбои языковой модели

Что логировать в продакшне, чтобы разбирать сбои языковой модели

17 дней назад

Никита Вихров

Ответы

0

Что логировать в продакшне, чтобы разбирать сбои языковой модели

Без журналирования нельзя понять, почему модель выдала плохой ответ, когда это началось и что именно нужно исправить.

Минимально необходимые данные в каждой записи

  • Время запроса.
  • Версия запроса (системной инструкции).
  • Текст пользователя.
  • Ответ модели.
  • Модель и параметры.
  • Число использованных токенов.
  • Время выполнения.
  • Ошибка (если была).

Пример структуры записи

from dataclasses import dataclass, field, asdict
from datetime import datetime, timezone
import uuid
import time
import json
from openai import OpenAI

client = OpenAI()

@dataclass
class LlmLog:
    request_id: str
    timestamp: str
    prompt_version: str
    model: str
    temperature: float
    user_text: str
    answer: str
    prompt_tokens: int
    completion_tokens: int
    elapsed_ms: int
    error: str = ""

def ask_with_log(user_text: str, prompt_version: str = "1.0.0") -> str:
    request_id = str(uuid.uuid4())
    start = time.monotonic()
    error = ""
    answer = ""
    usage = None

    try:
        resp = client.chat.completions.create(
            model="gpt-4.1",
            temperature=0.3,
            max_tokens=512,
            messages=[
                {"role": "system", "content": "Ты помощник службы поддержки."},
                {"role": "user", "content": user_text}
            ]
        )
        answer = resp.choices[0].message.content
        usage = resp.usage
    except Exception as e:
        error = str(e)
    finally:
        elapsed = int((time.monotonic() - start) * 1000)

    log = LlmLog(
        request_id=request_id,
        timestamp=datetime.now(timezone.utc).isoformat(),
        prompt_version=prompt_version,
        model="gpt-4.1",
        temperature=0.3,
        user_text=user_text,
        answer=answer,
        prompt_tokens=usage.prompt_tokens if usage else 0,
        completion_tokens=usage.completion_tokens if usage else 0,
        elapsed_ms=elapsed,
        error=error
    )

    # В продакшне — пишите в хранилище (Postgres, ClickHouse, S3)
    print(json.dumps(asdict(log), ensure_ascii=False))

    if error:
        raise RuntimeError(error)

    return answer

Что делать с журналом

  • Считайте долю ошибок и медианное время ответа по версиям запроса.
  • Помечайте плохие ответы вручную — это основа для проверочного набора.
  • Отслеживайте стоимость по числу токенов в разрезе версий и задач.
  • Настройте оповещение, если доля ошибок за последний час превысила порог.

Правила

  • Никогда не логируйте пароли, токены доступа и персональные данные в открытом виде.
  • Идентификатор запроса передавайте пользователю как код ошибки — удобно при обращениях.
  • Храните журнал отдельно от основной базы: объём быстро растёт.

17 дней назад

Никита Вихров

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845