Как это работает
На TTFT влияют сеть, очередь на стороне провайдера, длина промпта (чем длиннее контекст, тем дольше его обработка перед первым токеном) и загрузка модели. Кеширование неизменной части промпта может сокращать обработку и, соответственно, TTFT.
Скорость выдачи после первого токена измеряют отдельно (токенов в секунду). Для оценки нужны не средние, а перцентили (p50, p95), потому что выбросы задержки заметны пользователям.
Пример
1import time
2
3def measure_ttft(stream_response, prompt: str) -> float:
4 start = time.perf_counter()
5 for _chunk in stream_response(prompt): # ваш клиент со stream=True
6 return time.perf_counter() - start # время до первого фрагмента
7 raise RuntimeError("пустой ответ")Как применять в тестировании ИИ
Замеряйте TTFT отдельно для «холодного» и «тёплого» запросов и на разной длине контекста, сохраняйте перцентили и сравнивайте между версиями промпта и модели. Порог задавайте по вашему продукту и проверяйте его в CI на стабильном стенде.
Типичные ошибки
- Смотреть только среднее и не смотреть p95.
- Мерить полное время ответа вместо времени до первого токена.
- Сравнивать замеры с разной длиной контекста и разным состоянием кеша.
Частые вопросы
Что такое TTFT?
Время от отправки запроса до получения первого токена ответа при стриминге. Оно показывает, как быстро пользователь увидит начало ответа, и не зависит от того, насколько длинным будет весь ответ.
От чего зависит время до первого токена?
От сети, очереди у провайдера, загрузки модели и длины промпта: чем длиннее контекст, тем дольше его обработка. Кеширование неизменной части промпта у некоторых провайдеров помогает сократить это время.