Метрики задержки AI API: TTFT, первый ответ и скорость вывода
Руководство по Request Timeline: Upstream Headers, первое SSE Event, эффективный ответ, видимый текст, полная задержка и скорость вывода.
Задержка AI API — не одна цифра. Для streaming-request нужно отдельно фиксировать Upstream Headers, первое непустое SSE Event, первый полезный Content или Action, первый видимый текст и завершение ответа. Эти точки отвечают на разные вопросы и не должны все называться TTFT.
Для текстового чата Time to First Visible Text обычно отражает пользовательское восприятие. В Reasoning- или Tool Workflow Function Arguments могут стать первым эффективным результатом раньше. Generation Speed измеряется отдельно после начала вывода.
Сначала построить Request Timeline
Используйте монотонные часы и единый Origin:
t0 Gateway получает Request
t1 начинает Upstream Request
t2 приходят Upstream Response Headers
t3 первое непустое SSE Event
t4 первый эффективный Content или Action
t5 первый видимый Text Delta
t6 Upstream Body завершается или закрывается
t7 Gateway Handler завершается
Не в каждом запросе есть все точки. Отсутствующее значение должно оставаться absent, а не 0.
| Поле | Что измеряет | Граница |
|---|---|---|
auth_ms |
Аутентификация | Локальная фаза |
distribution_ms |
Channel Selection и Routing | Локальная фаза |
body_read_ms |
Чтение Request Body | Медленная загрузка до Routing |
upstream_headers_ms |
Upstream Start до Headers | Origin — начало upstream |
first_sse_event_ms |
Receipt до первого Event | Может быть только Metadata |
first_response_ms |
Receipt до эффективного Content/Action | Text, Reasoning, Function Arguments |
first_text_delta_ms |
Receipt до видимого текста | Может отсутствовать |
upstream_done_ms |
Receipt до закрытия upstream | Close не всегда означает успех |
total_handler_ms |
Receipt до конца Relay | Ближайшая Gateway E2E мера |
visible_output_tps |
Tokens / видимое окно | Пользовательская диагностика, не общий TPS |
Нельзя вычитать Duration с разными Origins.
У TTFT несколько практических значений
Руководство NVIDIA NIM обычно включает в TTFT сеть, Queue и Prompt Prefill и исключает пустые начальные ответы. Современный Stream до текста может отправить Metadata, Reasoning, Function Arguments, Tool Input или Heartbeat.
| Название | Рекомендуемое значение | Применение |
|---|---|---|
| Time to Headers | Start до Upstream Headers | Сеть и Admission |
| Time to First Event | До первого непустого SSE | Transport Liveness |
| Time to First Effective Response | До полезного Content/Action | Agents и Reasoning |
| Time to First Visible Text | До отображаемого текста | Пользовательский Chat |
Если Dashboard показывает TTFT, он должен указывать конкретное определение.
Разделить Responsiveness и Generation Speed
end_to_end_latency = final_response_time - request_start_time
visible_generation_window = final_response_time - first_visible_text_time
visible_output_tps = output_tokens / visible_generation_window_seconds
Inter-token Latency исключает TTFT и обычно делит оставшееся время на output_tokens - 1. Нельзя считать SSE Events как Tokens: одно Event может содержать ноль или несколько Tokens.
Ранний текст с низким TPS быстро начинается и медленно продолжается; поздний текст с высоким TPS выглядит зависшим и быстро заканчивается. Per-user TPS и Aggregate Throughput также различаются.
Reasoning и Tools могут предшествовать тексту
В Text-only first_response_ms и first_text_delta_ms близки. Function Arguments на 1,8 секунды и текст на 6,4 означают ранний Action без видимой прозы.
- Terminal Agent может измерять First Effective Action;
- Text-only UI — First Visible Text;
- Tool API может вообще не иметь текста;
- ранний SSE Envelope доказывает соединение, но не полезный прогресс.
AI API Streaming Guide описывает Parsing, Cancellation и Idle Timeout. Метрики считаются после корректной классификации Events.
Диагностировать этапы в фиксированном порядке
| Симптом | Метрика | Проверить |
|---|---|---|
| Медленно до Headers | upstream_headers_ms |
Network, Admission, Queue, Route, Region |
| Headers быстро, Output поздно | first_response_ms |
Model Queue, Prefill, Reasoning, Inflight |
| Event быстро, Output поздно | SSE→Response Gap | Metadata, Heartbeat, Reasoning Startup |
| Action быстро, Text поздно | Response→Text Gap | Tool/Reasoning, Composition |
| Text быстро, Generation медленно | visible_output_tps |
Decode, Contention, Long Context |
| Upstream нормален | Локальные поля | Auth, Policy, Client Upload |
Одна метрика не доказывает Root Cause. Нужны Route, Region, Provider и Concurrent Load.
Прочитать три синтетических Trace
Trace A: ожидание Headers
| Metric | Value |
|---|---|
upstream_headers_ms |
6 100 ms |
first_response_ms |
6 350 ms |
first_text_delta_ms |
6 400 ms |
total_handler_ms |
9 200 ms |
visible_output_tps |
42 |
Основное ожидание до Headers. Проверяйте Route, Admission, Network, Region и Load до UI.
Trace B: Action раньше текста
| Metric | Value |
|---|---|
upstream_headers_ms |
240 ms |
first_response_ms |
2 900 ms |
first_text_delta_ms |
8 700 ms |
total_handler_ms |
10 200 ms |
visible_output_tps |
55 |
Action есть на 2,9 секунды, текст — ещё через 5,8. Исследуйте Reasoning или Tools; увеличение Header Timeout бесполезно.
Trace C: быстрый старт, медленная генерация
| Metric | Value |
|---|---|
upstream_headers_ms |
260 ms |
first_response_ms |
420 ms |
first_text_delta_ms |
430 ms |
total_handler_ms |
20 430 ms |
visible_output_tps |
9,8 |
Текст начинается быстро, но генерируется около 20 секунд. Сравните Output Length, Context, Channel, Inflight и Provider. First-output Timeout не обнаружит проблему.
Сравнивать только контролируемые условия
Фиксируйте Model и Route, распределения Tokens, Streaming, Reasoning Effort, Tools, Region, Network Path, Concurrency, Sampling, Max Output, Warmup, Retry Policy, Sample Size и Percentile Method.
Сравнивайте p50, p95 и p99, а не одну среднюю. Ошибки и Timeouts должны оставаться в данных. Разные Prompts, длины и Concurrency нельзя выдавать за рейтинг скорости моделей.
Хранить Metadata, а не Content
Для диагностики достаточно Request ID, Timestamp, Model, Group, Channel Reference, Status, Token Counts, Timing Fields, Event Counts, Inflight, приблизительного Region и классификатора вроде upstream_headers_slow.
Не требуется хранить Prompts, Responses, API Keys или открытые идентификаторы. Metadata также требует Retention и Access Control.
Начинайте с Timeline, используйте Reliable AI API Routing для сравнения Attempts и AI API Error Troubleshooting для связи Timing с итоговым Status. Это разделяет Admission, Model Startup, Reasoning/Tools, Visible Generation и локальный Overhead.