Измерение задержки LLM: TTFT и TPOT
Определите время до первого токена и время на каждый выходной токен как две ключевые метрики задержки, оснастите приложение измерением обеих метрик и установите целевые показатели SLA для каждой конечной точки.
«Измерение задержки 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 - startTPOT: время на один выходной токен
Время на один выходной токен (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 — локальная установка не требуется.
Все уроки этого курса
- Измерение задержки LLM: TTFT и TPOT
- Балансировка нагрузки и стратегии с несколькими ключами
- Резервные поставщики и автоматические размыкатели
- Бюджеты времени ожидания и плавное ухудшение качества