/
Вопросы и ответы
/
Промт-инжиниринг
/

Что такое streaming в LLM и как его реализовать?

Что такое streaming в LLM и как его реализовать?

10 часов назад

Никита Вихров

Ответы

0

Что такое streaming в LLM и как его реализовать

Без streaming пользователь ждёт пока модель сгенерирует весь ответ — и только потом видит текст. На длинных ответах это 5–15 секунд белого экрана. Со streaming текст появляется по мере генерации, как в ChatGPT.


Без streaming: всё или ничего

from anthropic import Anthropic

client = Anthropic()

# Пользователь ждёт 8 секунд, потом видит всё сразу
response = client.messages.create(
    model="claude-opus-4-5",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Объясни как работает TCP/IP"}]
)

print(response.content[0].text)  # печатает мгновенно после 8 секунд ожидания

Со streaming: текст идёт по мере генерации

# В консоли — токены появляются сразу
with client.messages.stream(
    model="claude-opus-4-5",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Объясни как работает TCP/IP"}]
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)

print()  # перевод строки в конце

Streaming в FastAPI

from fastapi import FastAPI
from fastapi.responses import StreamingResponse
from anthropic import Anthropic

app = FastAPI()
client = Anthropic()


@app.post("/chat")
async def chat(message: str):

    def generate():
        with client.messages.stream(
            model="claude-opus-4-5",
            max_tokens=1024,
            messages=[{"role": "user", "content": message}]
        ) as stream:
            for text in stream.text_stream:
                # Server-Sent Events формат
                yield f"data: {text}\n\n"

        yield "data: [DONE]\n\n"

    return StreamingResponse(
        generate(),
        media_type="text/event-stream",
        headers={
            "Cache-Control": "no-cache",
            "X-Accel-Buffering": "no",  # отключаем буферизацию nginx
        }
    )

Streaming на фронтенде

async function chat(message) {
    const response = await fetch('/chat', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ message })
    });

    const reader = response.body.getReader();
    const decoder = new TextDecoder();
    const output = document.getElementById('output');

    while (true) {
        const { done, value } = await reader.read();
        if (done) break;

        const chunk = decoder.decode(value);
        const lines = chunk.split('\n');

        for (const line of lines) {
            if (line.startsWith('data: ')) {
                const text = line.slice(6);
                if (text === '[DONE]') return;
                output.textContent += text;  // добавляем текст по мере прихода
            }
        }
    }
}

Streaming с накоплением полного ответа

Иногда нужно и показывать постепенно, и сохранить полный ответ:

async def stream_and_save(message: str, user_id: int):
    full_response = []

    with client.messages.stream(
        model="claude-opus-4-5",
        max_tokens=1024,
        messages=[{"role": "user", "content": message}]
    ) as stream:
        for text in stream.text_stream:
            full_response.append(text)
            yield text  # отправляем клиенту

    # После завершения — сохраняем в БД
    complete_text = "".join(full_response)
    await save_to_db(user_id, message, complete_text)

Когда streaming не нужен

Фоновые задачи без UI, пакетная обработка, задачи где нужен полный ответ для дальнейшей обработки (парсинг JSON, валидация) — здесь streaming только усложняет код.

Правило: streaming нужен там где пользователь ждёт и видит интерфейс. Для фоновых задач — обычный вызов.


На курсе «ИИ для разработчиков» на Хекслете разбирают как интегрировать LLM в веб-приложения: streaming, обработка ошибок, мониторинг в продакшне.

10 часов назад

Никита Вихров

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845