Гайд · TNWS AI
Как показывать ответ LlamaIndex по мере генерации через streaming
streaming=True, response_gen и проверка полного ответа, отмены запроса и ограничений streaming-модели.
Задача и применимость
Поисковый запрос: «как включить потоковый ответ LlamaIndex query engine». Факты и синтаксис сверены с официальной документацией LlamaIndex Framework для Python 19 сентября 2026 года. Пример предназначен для актуального Python-пакета llama-index и указанных в коде интеграций; доступность конкретной модели и конфигурация её провайдера зависят от среды запуска. Если код обращается к embeddings или LLM, ключ задаётся через серверное окружение и здесь не приводится. Точный релиз локально не установлен, поэтому перед рабочим запуском фиксируйте номер установленной версии и повторите тест на ней.
Для потокового ответа LlamaIndex задают streaming=True при index.as_query_engine; возвращается StreamingResponse с response_gen. Требуется LLM с поддержкой streaming, иначе документация предупреждает о NotImplementedError. При нескольких вызовах LLM внутри query engine транслируется только последний вызов, а не весь процесс извлечения.
Нумерованный порядок работы
- Убедитесь, что выбранная модель и её интеграция действительно поддерживают потоковую выдачу.
- Постройте индекс на проверенном источнике и создайте query engine с streaming=True.
- Вызовите query с вопросом и последовательно выводите части из response_gen.
- Соберите полную строку и сравните её фактический смысл с исходным документом.
- Добавьте в своё приложение обработку отключения клиента и прекращения работы по правилам выбранной интеграции.
Готовый шаблон Python
from llama_index.core import Document, VectorStoreIndex
index = VectorStoreIndex.from_documents([
Document(text="Правило R7: возврат возможен 14 дней.")])
# Настройте LLM с подтверждённой поддержкой streaming и embedding-модель.
engine = index.as_query_engine(streaming=True, similarity_top_k=1)
response = engine.query("Каков срок возврата по R7?")
parts = []
for piece in response.response_gen:
print(piece, end="", flush=True)
parts.append(piece)
print("\nИтог:", "".join(parts))
Код ниже в статье предназначен для тестовых источников без персональных сведений. Вызовы SDK не выполнялись в данном окружении с реальной моделью; синтаксис Python проверен отдельно. Не переносите вывод демонстрационного эксперимента на любой корпус и любого провайдера без повторной проверки.
Пример входа и ожидаемого результата
Вход: документ R7 с фразой «14 дней» и вопрос о сроке. Ожидается появление частей текста до завершения всей генерации и полный ответ со сроком 14 дней после объединения. Момент появления первого фрагмента и точная формулировка зависят от модели и сети; streaming не гарантирует меньшего общего времени.
Сохраните входные файлы, идентификаторы документов и ожидаемое утверждение в отдельном проверочном наборе. При неуспехе выделяйте слой ошибки: чтение источника, преобразование в nodes, получение embedding, поиск, синтез ответа или UI. Правильная форма ответа ещё не гарантирует правильного происхождения сведений.
Диагностика и границы решения
Потоковая выдача улучшает ощущение отклика, но не исправляет ошибку извлечения. Если релевантный документ отсутствует в top_k, быстрые токены просто быстрее покажут неправильный ответ. Клиент может закрыть вкладку до получения конца; приложение должно отличать частичный вывод от законченного и не сохранять его как финальный подтверждённый факт. Держите состояние запроса отдельно от UI-анимации: ошибка после первых токенов всё ещё означает неуспешное выполнение. Для источников и цитат осторожнее: список source_nodes и итоговую проверку надо отображать только по завершении соответствующего этапа, не придумывая ссылки в середине текста. Документация говорит, что при многошаговом query engine стримится лишь последний вызов LLM, поэтому не обещайте токены немедленно после нажатия кнопки. Если интеграция не поддерживает поток, ловите NotImplementedError и выбирайте честный непотоковый режим, а не имитацию по символам.
Дополнительный проверочный сценарий
Протестируйте три сценария: обычное завершение, разрыв соединения после первых слов и исключение до старта LLM. В первом результат полностью собирается и сверяется с R7; во втором пользователь видит маркировку «ответ прерван», а аналитика не учитывает его как успешный; в третьем выводится понятная ошибка подключения. Если query возвращает несколько независимых ответов модели, измерьте время до первого видимого токена и время полного ответа отдельно. Не используйте частично показанную фразу как основание автоматической отправки письма или записи в CRM: действия выполняют только после проверки полного результата. Храните только допустимые пользователю источники в trace и логах.
Критерии проверки
- Поток поддерживается выбранной LLM.
- Итоговая строка собрана без потери частей.
- Прерванный ответ не помечен завершённым.
Помимо положительного теста проводите отрицательный: отсутствующий факт, чужой документ, старая редакция либо несовместимая модель — в зависимости от задачи. Если одна проверка не проходит, не объявляйте настройку готовой. При работе с чужими источниками доступ к исходнику и цитате должен проверяться отдельно от поисковой релевантности.
Типичные ошибки и что не делать
- Не выдавать поток за ускорение всей цепочки.
- Не принимать частичный текст за завершённый факт.
- Не подделывать поддержку streaming при NotImplementedError.
Не передавайте ключи, личные документы и приватные пути в опубликованный пример или сторонний trace без оценки прав доступа. Не исправляйте отсутствие нужного текста одним только промптом: генератор не восстановит источник, который не загрузили или не нашли. При смене модели либо backend повторяйте тест на зафиксированном наборе вопросов.
FAQ
Где включить streaming?
В index.as_query_engine(streaming=True).
Как читать части?
Итерировать response.response_gen.
Стримятся ли все вызовы LLM?
При нескольких вызовах руководство указывает только последний.
Официальные источники
Частые вопросы
Где включить streaming?
В index.as_query_engine(streaming=True).
Как читать части?
Итерировать response.response_gen.
Стримятся ли все вызовы LLM?
При нескольких вызовах руководство указывает только последний.
Читайте также
Как измерить hit rate и MRR поиска в LlamaIndex RetrieverEvaluator
Размеченный вопрос, expected_ids и оценка позиции релевантного узла до тестирования ответов генератора.
Как ограничить размер пакета при индексации в LlamaIndex VectorStoreIndex
insert_batch_size при from_documents: контролируем память и задержки загрузки, не путая пакет с размером чанка.
Как обновить одну редакцию документа в LlamaIndex без смешивания версий
Стабильный id_, update_ref_doc и контроль старого и нового правила в поисковой выдаче.
Комментарии
Пока тихо. Скажите первое слово