Как создать продакшн AI-чат-бота на Python: FastAPI, стриминг SSE и память в Redis
Создать игрушечный чат-бот в консоли на 10 строк умеет каждый. Но построить масштабируемый сервис, выдерживающий тысячи параллельных соединений, отдающий токены в реальном времени через Server-Sent Events (SSE) и сохраняющий контекст пользователя в Redis — задача уровня Senior Backend Engineer. Разбираем архитектуру от первого до последнего байта.

Почему Server-Sent Events (SSE) превосходят WebSockets для чат-ботов
Большинство новичков пытаются использовать WebSockets для текстовых нейросетей, что часто является архитектурной ошибкой:
- WebSockets требуют сложного поддержания двустороннего состояния, переподключений и пробивания корпоративных фаерволов и прокси.
- Server-Sent Events (SSE) работают поверх стандартного HTTP/2 или HTTP/1.1, нативно поддерживаются браузерами через EventSource, автоматически переподключаются при сбоях и идеально подходят для паттерна «один запрос от клиента — непрерывный поток токенов от сервера».
Полный серверный код на FastAPI со стримингом токенов
Вот готовый к деплою микросервис с асинхронным генератором и поддержкой прерывания клиентом:
import json
import asyncio
from fastapi import FastAPI, HTTPException
from fastapi.responses import StreamingResponse
from pydantic import BaseModel
from openai import AsyncOpenAI
app = FastAPI(title="Production AI Chat Service 2026")
client = AsyncOpenAI(api_key="your-api-key", base_url="https://api.deepseek.com")
class ChatRequest(BaseModel):
user_id: str
message: str
async def generate_token_stream(prompt: str):
"""Асинхронный генератор SSE-потока токенов."""
try:
response = await client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": "Ты — полезный ассистент сервиса."},
{"role": "user", "content": prompt}
],
stream=True
)
async for chunk in response:
token = chunk.choices[0].delta.content or ""
if token:
# Формат SSE: "data: <payload>\n\n"
payload = json.dumps({"token": token})
yield f"data: {payload}\n\n"
yield "data: [DONE]\n\n"
except Exception as e:
yield f"data: {json.dumps({'error': str(e)})}\n\n"
@app.post("/api/chat/stream")
async def chat_stream_endpoint(req: ChatRequest):
return StreamingResponse(
generate_token_stream(req.message),
media_type="text/event-stream",
headers={
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"X-Accel-Buffering": "no" # Отключает буферизацию в Nginx!
}
)Долговременная память контекста диалога в Redis с TTL
- Чтобы модель помнила предыдущие сообщения, сохраняйте историю в виде списка JSON в Redis с автоматическим удалением через 24 часа неактивности:
- Сохраняйте последние 10-15 реплик.
- Перед отправкой в LLM подсчитывайте токены через tiktoken. Если контекст превышает лимит, вызывайте быструю модель для суммаризации старых сообщений в единый абзац summary.
Аппаратная верификация и метрики кремния
vllm serve how-to-build-ai-chatbot-python --tensor-parallel-size 4 --gpu-memory-utilization 0.95 --max-model-len 32768 --kv-cache-dtype fp8Artur Moiseyev
AI Systems Architect
Независимый AI-исследователь и архитектор распределенных систем. Разрабатываю мультиагентные системы, открытые reasoning-модели и инфраструктуру реального времени.
Связанные статьи справочника

Архитектура DeepSeek-V3 и R1: Почему Multi-Head Latent Attention (MLA) потрясла индустрию
Как DeepSeek обучил флагманскую модель на 671 млрд параметров всего за 6 миллионов долларов? Полный разбор Multi-Head Latent Attention (MLA), DualPipe и смешанной точности FP8.

Голосовой ИИ реального времени: Speech-to-Speech агенты с задержкой до 200 мс на WebRTC
Почему классический каскад STT -> LLM -> TTS устарел. Инженерный разбор нативных сквозных моделей речи (OpenAI Realtime, Moshi) с дискретными аудио-токенами и WebRTC.

Топ-10 бесплатных AI-инструментов для программистов в 2026 году
От бесплатных AI-помощников в коде и офлайн-терминалов до валидаторов схем и парсеров: 10 лучших инструментов, ускоряющих разработку в 5 раз.