Модели деплоя AI-агентов: сравнительный обзор

Сравнение 5 моделей деплоя: холодный старт, масштабирование, стоимость. Рекомендации для каждого сценария.

📊 Средний⏱ 12 мин

# 1. 5 МОДЕЛЕЙ ДЕПЛОЯ — ОБЗОР

╔═══════════════╦══════════════════╦══════════════╦══════════════╦══════════════╗
║   Модель      ║   Инфраструктура ║ Холодный     ║   Лимит      ║  Сложность   ║
║               ║                  ║ старт        ║   времени    ║  настройки   ║
╠═══════════════╬══════════════════╬══════════════╬══════════════╬══════════════╣
║ Serverless    ║ AWS Lambda /     ║ 200-800ms    ║  15 мин     ║    Низкая    ║
║               ║ GCP Cloud Run    ║              ║ (Lambda)    ║              ║
╠═══════════════╬══════════════════╬══════════════╬══════════════╬══════════════╣
║ Docker        ║ VPS / Dedicated  ║     0        ║     Нет     ║    Средняя   ║
║ Single-Node   ║ Server           ║              ║             ║              ║
╠═══════════════╬══════════════════╬══════════════╬══════════════╬══════════════╣
║ Kubernetes    ║ K8s Cluster      ║    5-15s     ║     Нет     ║   Высокая    ║
║ (K8s)         ║ (GKE/EKS/AKS)    ║              ║             ║              ║
╠═══════════════╬══════════════════╬══════════════╬══════════════╬══════════════╣
║ Stateful      ║ K8s StatefulSet  ║   30-60s     ║     Нет     ║   Высокая    ║
║               ║ + Persistent Vol ║              ║             ║              ║
╠═══════════════╬══════════════════╬══════════════╬══════════════╬══════════════╣
║ Edge          ║ Локальные        ║     0        ║     Нет     ║    Средняя   ║
║               ║ устройства       ║              ║             ║              ║
╚═══════════════╩══════════════════╩══════════════╩══════════════╩══════════════╝

# 2. SERVERLESS — AWS LAMBDA + FASTAPI

# Установка: FastAPI + Mangum (адаптер Lambda)
pip install fastapi mangum uvicorn langchain langchain-openai

# app.py — Serverless агент на FastAPI
from fastapi import FastAPI
from mangum import Mangum
from langchain_openai import ChatOpenAI
from langchain.agents import create_openai_functions_agent
from pydantic import BaseModel

app = FastAPI(title="AI Agent API")

# Инициализация агента ВНЕ хендлера (переиспользование)
llm = ChatOpenAI(model="gpt-4o", temperature=0.1)

class QueryRequest(BaseModel):
    query: str
    context: str = ""

class QueryResponse(BaseModel):
    answer: str
    tokens_used: int

@app.post("/ask", response_model=QueryResponse)
async def ask_agent(req: QueryRequest):
    response = await llm.ainvoke(
        f"Context: {req.context}\nQuestion: {req.query}"
    )
    return QueryResponse(
        answer=response.content,
        tokens_used=response.usage_metadata["total_tokens"]
    )

# Mangum — адаптер для AWS Lambda
handler = Mangum(app)

# Деплой на AWS Lambda:
# 1. Собрать зависимости: pip install -t ./package -r requirements.txt
# 2. Упаковать: zip -r lambda.zip app.py package/
# 3. Загрузить в Lambda, указать handler=app.handler
# 4. Настроить API Gateway → Lambda proxy

# 3. DOCKER SINGLE-NODE — АГЕНТ + REDIS + CHROMADB

# docker-compose.yml — Полный стек AI-агента
# Файл: docker-compose.yml

version: '3.8'

services:
  agent-api:
    build: .
    ports:
      - "8000:8000"
    environment:
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - REDIS_URL=redis://redis:6379
      - CHROMA_HOST=chromadb
    depends_on:
      - redis
      - chromadb
    restart: unless-stopped
    volumes:
      - ./data:/app/data

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
    restart: unless-stopped

  chromadb:
    image: chromadb/chroma:latest
    ports:
      - "8001:8000"
    volumes:
      - chroma_data:/chroma/chroma
    restart: unless-stopped

volumes:
  redis_data:
  chroma_data:

# 4. KUBERNETES — МАСШТАБИРОВАНИЕ АГЕНТОВ

# Helm values.yaml — конфигурация деплоя агентов в K8s
# Файл: values.yaml

replicaCount: 3

image:
  repository: registry.example.com/ai-agent
  tag: "1.2.0"
  pullPolicy: IfNotPresent

autoscaling:
  enabled: true
  minReplicas: 2
  maxReplicas: 10
  targetCPUUtilizationPercentage: 70
  targetMemoryUtilizationPercentage: 80

resources:
  requests:
    cpu: "500m"
    memory: "512Mi"
  limits:
    cpu: "2000m"
    memory: "2Gi"

env:
  - name: OPENAI_API_KEY
    valueFrom:
      secretKeyRef:
        name: agent-secrets
        key: openai-key
  - name: LOG_LEVEL
    value: "INFO"

# Деплой:
# helm upgrade --install ai-agent ./chart -f values.yaml -n agents
# kubectl get hpa -n agents  # Проверка автоскейлинга

# 5. STATEFUL ДЕПЛОЙ — АГЕНТЫ С ДОЛГОЙ ПАМЯТЬЮ

# K8s StatefulSet для агента с persistent памятью
# Файл: statefulset.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: agent-memory
spec:
  serviceName: "agent-memory"
  replicas: 3
  selector:
    matchLabels:
      app: agent-memory
  template:
    metadata:
      labels:
        app: agent-memory
    spec:
      containers:
      - name: agent
        image: registry.example.com/ai-agent:1.2.0
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: MEMORY_PATH
          value: /data/memory
        volumeMounts:
        - name: agent-memory-storage
          mountPath: /data/memory
  volumeClaimTemplates:
  - metadata:
      name: agent-memory-storage
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 10Gi

# Python: код агента с persistent memory
import os
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings

MEMORY_PATH = os.getenv("MEMORY_PATH", "/data/memory")
embedding = OpenAIEmbeddings()

# Persistent векторная память агента
agent_memory = Chroma(
    persist_directory=MEMORY_PATH,
    embedding_function=embedding,
    collection_name=f"agent-{os.getenv('POD_NAME','default')}"
)

# 6. СРАВНИТЕЛЬНАЯ ТАБЛИЦА + РЕКОМЕНДАЦИИ

╔═══════════════╦════════════╦══════════╦══════════════╦═══════════════╦══════════════╗
║   Модель      ║ Стоимость  ║ Latency  ║ Сложность    ║ Масштаби-    ║ Лучше всего  ║
║               ║ (мес/100к  ║ (p95)    ║ поддержки    ║ рование      ║ для          ║
║               ║  запросов) ║          ║              ║              ║              ║
╠═══════════════╬════════════╬══════════╬══════════════╬═══════════════╬══════════════╣
║ Serverless    ║  $15-40    ║ 0.5-3s   ║ Низкая       ║ Авто (0-N)   ║ MVP, редкие  ║
║               ║            ║          ║              ║              ║ вызовы       ║
╠═══════════════╬════════════╬══════════╬══════════════╬═══════════════╬══════════════╣
║ Docker VPS    ║  $20-80    ║ 0.1-0.5s ║ Низкая       ║ Вертикальное ║ Стартапы,    ║
║               ║            ║          ║              ║              ║ dev-среды    ║
╠═══════════════╬════════════╬══════════╬══════════════╬═══════════════╬══════════════╣
║ Kubernetes    ║ $200-800   ║ 0.1-0.5s ║ Высокая      ║ Горизонталь- ║ High-load    ║
║               ║            ║          ║              ║ ное (HPA)    ║ production   ║
╠═══════════════╬════════════╬══════════╬══════════════╬═══════════════╬══════════════╣
║ Stateful K8s  ║ $300-1200  ║ 0.2-0.8s ║ Оч. высокая  ║ Ограниченное ║ Агенты с     ║
║               ║            ║          ║              ║              ║ памятью      ║
╠═══════════════╬════════════╬══════════╬══════════════╬═══════════════╬══════════════╣
║ Edge          ║  $0-10     ║ <0.05s   ║ Средняя      ║ Нет           ║ Локальные    ║
║               ║            ║          ║              ║              ║ агенты       ║
╚═══════════════╩════════════╩══════════╩══════════════╩═══════════════╩══════════════╝

# РЕКОМЕНДАЦИИ:
# • Прототип/MVP → Serverless (Lambda + API Gateway)
# • Стартап до 10k DAU → Docker Compose на VPS
# • Продакшен >10k DAU → Kubernetes + HPA
# • Агенты с долгой памятью → K8s StatefulSet + PVC
# • On-device / PII-safe → Edge (локальные модели)

🔗 Полезные ссылки

📖 Docker Docs📖 Kubernetes Docs📖 AWS Lambda Docs📖 FastAPI Docs