Сравнение 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 ║ Нет ║ Средняя ║ ║ ║ устройства ║ ║ ║ ║ ╚═══════════════╩══════════════════╩══════════════╩══════════════╩══════════════╝
# Установка: 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
# 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:
# 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 # Проверка автоскейлинга
# 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')}" )
╔═══════════════╦════════════╦══════════╦══════════════╦═══════════════╦══════════════╗ ║ Модель ║ Стоимость ║ 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 (локальные модели)