AI Engineering Academy · Урок

Измерение задержки LLM: TTFT и TPOT

Определите время до первого токена и время на каждый выходной токен как две ключевые метрики задержки, оснастите приложение измерением обеих метрик и установите целевые показатели SLA для каждой конечной точки.

Урок 1 из 413 шагов

«Измерение задержки LLM: TTFT и TPOT» — бесплатный урок AI Engineering Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Engineering Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Engineering Academy содержит 4 уроков всего.

Почему задержка LLM состоит из двух компонентов

Измерять задержку LLM одним числом misleading. На самом деле есть две разные фазы: время до появления первого токена (ощущаемая скорость отклика) и время генерации последующих токенов (скорость вывода). У модели может быть отличная TTFT, но медленная TPOT, из-за чего длинные ответы кажутся медленными, хотя первоначальный отклик появился мгновенно.

TTFT: время до первого токена

Время до первого токена (TTFT) — это промежуток от отправки запроса к API до получения самого первого токена ответа. В него входят задержка сети, время ожидания в очереди на сервере вывода и время предварительной обработки (обработки входных токенов). TTFT определяет ощущаемую скорость отклика: пользователи замечают, если ничего не появляется дольше 1–2 секунд, независимо от того, насколько быстро затем поступают токены.

import time
from openai import OpenAI

client = OpenAI()

def measure_ttft(prompt: str) -> float:
    start = time.perf_counter()
    first_token_time = None
    stream = client.chat.completions.create(
        model='gpt-4o',
        messages=[{'role': 'user', 'content': prompt}],
        stream=True
    )
    for chunk in stream:
        if chunk.choices[0].delta.content:
            first_token_time = time.perf_counter()
            break  # stop after first token
    return first_token_time - start

TPOT: время на один выходной токен

Время на один выходной токен (TPOT) — это среднее время между последовательными токенами после начала генерации. Оно вычисляется как общее время генерации, делённое на общее число выходных токенов. TPOT определяет скорость чтения: люди читают примерно 250 слов в минуту, поэтому TPOT выше 100 мс на токен (10 токенов в секунду) будет заметно медленным для длинных ответов.

import time
from openai import OpenAI

client = OpenAI()

def measure_tpot(prompt: str) -> dict:
    start = time.perf_counter()
    first_token_time = None
    token_count = 0
    stream = client.chat.completions.create(
        model='gpt-4o',
        messages=[{'role': 'user', 'content': prompt}],
        stream=True
    )
    for chunk in stream:
        delta = chunk.choices[0].delta.content or ''
        if delta:
            if first_token_time is None:
                first_token_time = time.perf_counter()
            token_count += 1
    end = time.perf_counter()
    ttft = first_token_time - start
    generation_time = end - first_token_time
    tpot = generation_time / max(token_count, 1)
    return {'ttft_ms': ttft * 1000, 'tpot_ms': tpot * 1000, 'tokens': token_count}

Общая задержка, TTFT и TPOT

Связь между этими метриками выражается так: total_latency = TTFT + (output_tokens × TPOT). Для ответа из 500 токенов при TPOT 50 мс генерация занимает 25 секунд. В потоковых приложениях сначала оптимизируйте TTFT: пользователи лучше переносят медленную потоковую выдачу, чем пустой экран. При пакетной обработке без потоковой выдачи важна общая задержка, поэтому оптимизируйте TPOT, выбирая модели с более быстрым выводом.

# Latency breakdown for a 200-token response
ttft_ms = 450       # half a second to first token
tpot_ms = 25        # 25ms per token = 40 tokens/sec
output_tokens = 200

total_latency = ttft_ms + (tpot_ms * output_tokens)
print(f'TTFT:  {ttft_ms}ms')
print(f'Generation: {tpot_ms * output_tokens}ms')
print(f'Total: {total_latency}ms ({total_latency/1000:.1f}s)')
# Output:
# TTFT:  450ms
# Generation: 5000ms
# Total: 5450ms (5.5s)

Факторы, влияющие на TTFT

На TTFT главным образом влияет стоимость предварительной обработки, которая растёт вместе с числом входных токенов. Системный запрос из 10 000 токенов при прочих равных даст TTFT в 10 раз выше, чем запрос из 1 000 токенов. Также важны нагрузка на сервер (время ожидания в очереди), время прохождения запроса до конечной точки API и то, уменьшает ли кэширование запросов фактический объём предварительной обработки. Чтобы снизить TTFT, сокращайте длину системного запроса.

# TTFT scales approximately linearly with input tokens
# Measured typical values for gpt-4o (2026):
# 500 input tokens:   ~400ms TTFT
# 2000 input tokens:  ~600ms TTFT
# 10000 input tokens: ~1500ms TTFT
# 32000 input tokens: ~4000ms TTFT

# Use prompt caching to avoid paying for repeated long prefixes:
# Cached tokens: ~200ms saved per 1000 cached tokens

Факторы, влияющие на TPOT

TPOT в первую очередь определяется размером модели и аппаратным обеспечением. Небольшие модели (GPT-4o-mini) декодируют данные гораздо быстрее крупных моделей (GPT-4o). Для моделей на собственных серверах главными факторами являются размер партии и пропускная способность памяти GPU. Для моделей, размещённых OpenAI, TPOT меняется в зависимости от нагрузки на сервер, но обычно составляет 15–40 мс на токен. Непосредственно управлять TPOT в размещённых API нельзя — главным инструментом выбора остаётся модель.

# Typical TPOT benchmarks (approximate, 2026):
# gpt-4o-mini:   15-20ms per token (50-65 tokens/sec)
# gpt-4o:        25-40ms per token (25-40 tokens/sec)
# claude-3.5-haiku: 20-25ms per token
# claude-3.5-sonnet: 30-50ms per token
# local llama-3.1-8B on A100: 8-12ms per token
# local llama-3.1-70B on 4xA100: 25-35ms per token

Установка целевых показателей SLA для каждой конечной точки

Не для всех конечных точек нужна одна и та же целевая задержка. У конечной точки чата жёсткий SLA для TTFT (пользователи ожидают <500 мс), тогда как конечная точка пакетного реферирования может допускать задержку в несколько секунд. Определите явные целевые значения SLA для каждой конечной точки и собирайте метрики по каждой из них отдельно. Распространённые цели: интерактивный чат = p95 TTFT <600 мс, извлечение данных из документов = общий p95 <10 с, пакетная обработка = отсутствие SLA реального времени.

SLA_TARGETS = {
    'chat':       {'ttft_p95_ms': 600,  'total_p95_ms': 8000},
    'extraction': {'ttft_p95_ms': 1500, 'total_p95_ms': 10000},
    'summary':    {'ttft_p95_ms': 2000, 'total_p95_ms': 30000},
    'batch':      {'ttft_p95_ms': None, 'total_p95_ms': None},
}

Журналирование показателей задержки

Записывайте TTFT и TPOT для каждого рабочего запроса с помощью структурированного журналирования. Указывайте название модели, конечную точку, количество токенов в запросе, количество токенов в ответе и факт попадания в кэш. Это даёт данные для вычисления распределений процентилей (p50, p95, p99), выявления ухудшений после обновлений модели и сопоставления скачков задержки с глубиной очереди или сбоями у поставщика.

import structlog

log = structlog.get_logger()

def log_latency(endpoint: str, model: str, metrics: dict):
    log.info(
        'llm_latency',
        endpoint=endpoint,
        model=model,
        ttft_ms=round(metrics['ttft_ms'], 1),
        tpot_ms=round(metrics['tpot_ms'], 1),
        output_tokens=metrics['tokens'],
        total_ms=round(metrics['ttft_ms'] + metrics['tpot_ms'] * metrics['tokens'], 1)
    )

Вычисление процентилей по выборкам

Простые средние вводят в заблуждение при оценке задержки: несколько медленных выбросов увеличивают среднее значение, не затрагивая большинство пользователей. Всегда сообщайте процентили p50, p95 и p99. P95 — наиболее распространённая метрика SLA: она означает, что 95% запросов завершились за указанное время. Используйте NumPy или модуль statistics, чтобы вычислять процентили по записанным выборкам задержки.

import numpy as np

def compute_percentiles(samples: list, label: str = 'latency_ms'):
    arr = np.array(samples)
    stats = {
        'count': len(arr),
        'p50': np.percentile(arr, 50),
        'p95': np.percentile(arr, 95),
        'p99': np.percentile(arr, 99),
        'mean': np.mean(arr),
        'max': np.max(arr)
    }
    print(f'{label}:')
    for k, v in stats.items():
        print(f'  {k}: {v:.1f}')
    return stats

Снижение задержки с помощью max_tokens

Установка подходящего ограничения max_tokens уменьшает максимальную общую задержку, предотвращая чрезмерно длинные ответы. Если для вашего сценария нужны ответы не более чем на 200 токенов, установите max_tokens=250. Это также ограничивает стоимость. Сочетайте ограничение с потоковой передачей, чтобы пользователи сразу видели вывод, пока полный ответ ещё формируется. Никогда не оставляйте max_tokens без ограничения в рабочих конечных точках.

response = client.chat.completions.create(
    model='gpt-4o',
    messages=[{'role': 'user', 'content': question}],
    max_tokens=300,  # cap at 300 tokens
    stream=True
)

# With max_tokens=300 and TPOT=30ms:
# worst-case total generation = 9000ms
# Without limit: could run to 4096+ tokens = 123s+

Приоритеты оптимизации задержки

Если задержка слишком велика, устраняйте узкие места в порядке приоритета. Во-первых, включите потоковую передачу, чтобы пользователи сразу видели вывод, даже если общая задержка велика. Во-вторых, сократите системный запрос, чтобы уменьшить TTFT. В-третьих, добавьте кэширование префикса запроса, чтобы распределить стоимость предварительного заполнения между повторяющимися запросами. В-четвёртых, перейдите на меньшую модель, если это позволяет качество. Наконец, рассмотрите возможность самостоятельного размещения вывода для максимального контроля над TTFT и TPOT.

# Latency optimization checklist (in priority order):
# 1. Enable streaming (perceived latency: immediate)
# 2. Shorten system prompt by 50% (TTFT: -20%)
# 3. Enable prompt prefix caching (TTFT: -40% on cache hits)
# 4. Downgrade to gpt-4o-mini for simple queries (TPOT: -40%)
# 5. Self-host llama-3.1-8B for high-volume simple queries
#    (TPOT: 8ms vs 25ms; TTFT: 100ms vs 450ms)

Быстрая проверка

Проверьте своё понимание TTFT и TPOT как метрик задержки LLM.

Итоги урока

В этом уроке Вы узнали: TTFT (время до получения первого токена) измеряет воспринимаемую отзывчивость и растёт вместе с количеством входных токенов; TPOT (время на один выходной токен) определяет скорость генерации и в основном зависит от размера модели; а целевые значения SLA для каждой конечной точки вместе с метриками процентилей — правильный способ отслеживать задержку в рабочей среде. Далее мы реализуем балансировку нагрузки между несколькими ключами API.

Можно начать бесплатно

Изучай Python с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
30
Уроки
120

Часто задаваемые вопросы

Урок «Измерение задержки LLM: TTFT и TPOT» бесплатный?

Да — полный текст урока «Измерение задержки LLM: TTFT и TPOT» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Engineering Academy, подпишись на CoddyKit PRO. Курс AI Engineering Academy содержит 4 уроков всего.

Чему я научусь в уроке «Измерение задержки LLM: TTFT и TPOT»?

Определите время до первого токена и время на каждый выходной токен как две ключевые метрики задержки, оснастите приложение измерением обеих метрик и установите целевые показатели SLA для каждой коне… Ты практикуешь AI Engineering Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать AI Engineering Academy?

Предыдущий опыт не требуется. AI Engineering Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Измерение задержки LLM: TTFT и TPOT»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке AI Engineering Academy?

Да. Каждый урок AI Engineering Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Измерение задержки LLM: TTFT и TPOT
  2. Балансировка нагрузки и стратегии с несколькими ключами
  3. Резервные поставщики и автоматические размыкатели
  4. Бюджеты времени ожидания и плавное ухудшение качества
← Назад к AI Engineering Academy