Генеративный AI

GenAI System Design

Компания запустила LLM чат-бот: один Python скрипт, OpenAI API, без архитектуры. 100 пользователей - работает. 10 000 пользователей - timeout, $80K счёт за месяц, данные пользователей в промптах других пользователей (баг в session management). Система design существует не для теории - для того чтобы не оказаться в этой ситуации.

  • **Perplexity AI**: multi-step RAG с custom re-ranker, агентный поиск (несколько запросов поисковику), source attribution с прямыми цитатами. Каждый ответ - 3-10 LLM вызовов за 2-3 секунды. Архитектура оптимизирована под latency.
  • **Notion AI**: Copilot встроенный в документы. Контекст - весь документ и связанные страницы. Специальная обработка long documents через hierarchical summarization. Model routing: быстрые модели для autocompletion, мощные для 'Improve writing'.
  • **Klarna AI**: заменил 700 FTE customer support агентов одним LLM-ботом. Architecture: RAG по документации продуктов + CRM интеграция + sentiment-based escalation + мультиязычность (35+ языков). $40M экономии в год по заявлению компании.

Предварительные знания

  • Function calling и tool use как способ модели обращаться к внешним данным и API
  • Основы inference optimization: latency, throughput, KV cache, quantization
  • Как работает RAG retrieval и почему качество поиска ограничивает качество системы
  • Function Calling и Tool Use
  • Inference Optimization
  • Serving LLM: vLLM, TGI

LLM application stack: как 2023 год превратил модель в продуктовый слой

Когда в конце 2022 вышел ChatGPT, большинство компаний умели вызвать модель, но не имели паттерна для построения вокруг неё продукта. Следующий год дал узнаваемый стек. Harrison Chase выпустил LangChain в октябре 2022, дав словарь для сцепления промптов, инструментов, памяти и retrieval; рядом рос LlamaIndex для приёма данных. Векторные базы перешли из ниши в базовую инфраструктуру: Pinecone, Weaviate, Qdrant и Chroma стали стандартом для хранения эмбеддингов и семантического поиска в масштабе, а pgvector принёс то же в Postgres. Retrieval-augmented generation стал архитектурой по умолчанию для привязки ответов к приватным данным, а agent-паттерны обернули tool use в циклы планирования. К середине 2023 production GenAI система это уже не один вызов API, а пайплайн: приём и chunking, эмбеддинг и индексация, retrieval и reranking, сборка промпта, генерация, guardrails, кэширование и observability. Сдвиг в том, что сложная инженерия ушла из модели в систему вокруг неё, а cost и latency стали первоклассными ограничениями дизайна, а не запоздалой мыслью.

Проектирование чат-бота

Чат-бот на LLM выглядит просто: user message -> LLM -> response. Но production система включает: управление историей диалога, персонализацию, escalation к человеку, аналитику, multi-turn context management, rate limiting, fallback при ошибках LLM. Каждый компонент - архитектурное решение.

**Context window management**: при длинном диалоге история не помещается в context window. Стратегии: sliding window (последние N сообщений), summarization (LLM суммаризирует старые сообщения), hierarchical memory (краткосрочная + долгосрочная). HuggingFace `transformers` + LangChain `ConversationSummaryMemory` реализуют готовые решения.

**Intercom, Zendesk, Salesforce** добавили LLM-ботов поверх существующих CRM. Общий паттерн: LLM-бот обрабатывает 60-80% обращений, остальные эскалируются к человеку. Sentiment analysis определяет когда эскалировать - сердитый клиент не должен разговаривать с ботом.

Пользователь ведёт 50-сообщенный диалог. Context window модели 8K токенов, вся история не помещается. Какая стратегия наиболее эффективна?

AI-поиск: RAG архитектура

AI-поиск - RAG система: retrieve релевантные документы -> augment промпт -> generate ответ. Но production RAG имеет 10+ компонентов с нетривиальными trade-offs. Качество поиска определяет потолок качества всей системы: garbage in, garbage out.

**Chunking strategy** критична: слишком маленькие чанки - теряется контекст. Слишком большие - embedding усредняет разные темы, поиск менее точен. Semantic chunking (разбивать по смысловым границам, не по токенам) лучше fixed-size. **Proposition indexing**: каждый чанк -> отдельные утверждения (propositions) -> индексировать их. Улучшает precision retrieval.

RAG система отвечает правдоподобно, но содержит факты которых нет в документах. Какой компонент решает эту проблему?

Copilot-системы: AI в рабочем процессе

**Copilot** - AI ассистент встроенный в рабочий процесс с доступом к контексту пользователя: открытые файлы, история изменений, текущая задача. GitHub Copilot, Cursor, Notion AI, Google Duet - все используют эту парадигму. Отличие от чат-бота: Copilot имеет rich context и действует в рамках конкретного инструмента.

**Fill-in-the-Middle (FIM)**: специальный режим генерации для code completion. Модель видит код до и после курсора, генерирует то что должно быть в середине. Requires специальную обучающую цель - стандартные decoder-only модели не умеют FIM без дообучения. StarCoder 2 и DeepSeek Coder обучены с FIM.

**Cursor vs GitHub Copilot**: Cursor использует полный файловый контекст проекта через @codebase, Copilot - более ограниченный контекст. Cursor применяет Claude 3.5 Sonnet для complex edits (Composer mode), быстрые модели для autocompletion. Multi-model approach: разные модели для разных задач в одном UX.

Code Copilot должен отвечать за <500ms для хорошего UX. Какая архитектура это обеспечивает?

Масштабирование GenAI систем

MVP GenAI системы запустить просто. Масштабировать до миллионов пользователей - нет. Стоимость LLM API растёт линейно с запросами, latency деградирует под нагрузкой, reliability требует redundancy. Каждое архитектурное решение имеет cost/latency/reliability trade-off.

**Fallback chains**: LLM API могут быть недоступны. Литий fallback: если основная модель недоступна или медленная - переключиться на альтернативу. **LiteLLM** - единый интерфейс к 100+ LLM API с автоматическим fallback и retry. `completion(model='gpt-4o', fallbacks=['claude-3-5-sonnet-20241022', 'gemini/gemini-1.5-pro'])` - одна строчка для resilient production системы.

**Observability**: Langfuse, Phoenix (Arize), LangSmith - платформы для трассировки LLM приложений. Каждый запрос -> trace с: model, tokens, latency, cost, user_id, feedback. Без observability невозможно дебаггинг проблем качества и оптимизация стоимости.

GenAI система = LLM API вызов. Архитектура не важна - главное выбрать правильную модель

Модель определяет потолок качества. Архитектура определяет: стоимость ($10K vs $50K/мес на одинаковом трафике), latency (200ms vs 5s), reliability (99.9% vs 95%), масштабируемость

OpenAI ChatGPT при миллиардах запросов требует: load balancing, prompt caching, model routing, observability, fallback chains, semantic caching. Каждый компонент уменьшает TCO на 20-80%.

GenAI стартап тратит $50K/месяц на OpenAI API, 70% - на простые FAQ-запросы. Какой первый шаг оптимизации?

Связанные темы

System design объединяет все компоненты LLM стека:

  • Function Calling и Tool Use — Copilot и чат-боты используют tool calling для доступа к данным и API - основной механизм расширения возможностей
  • Serving LLM: vLLM, TGI — Self-hosted LLM serving - часть cost optimization при большом трафике. vLLM + GPU vs managed API
  • RAG: Retrieval-Augmented Generation — RAG архитектура - детальное рассмотрение retrieval компонента AI-поиска систем

Ключевые идеи

  • **Чат-бот**: sliding window / summarization для context management, intent classification для routing, sentiment-based escalation к человеку, guardrails на входе и выходе.
  • **RAG-поиск**: chunking strategy (semantic > fixed-size), hybrid search (semantic + BM25), reranking (cross-encoder), faithfulness verification, HyDE для сложных запросов.
  • **Copilot**: rich context из IDE/инструмента, FIM для code completion, специализированные быстрые модели для latency, implicit feedback для улучшения.
  • **Масштабирование**: model routing (-70% cost), semantic caching (-20-40%), prompt caching Anthropic (-90% на повторяющихся контекстах), LiteLLM для fallback chains.
  • **Observability**: Langfuse / LangSmith для трассировки каждого запроса. Без метрик нет оптимизации.

Вопросы для размышления

  • Model routing направляет простые запросы на дешёвые модели. Как классифицировать сложность запроса без вызова дорогой модели для классификации?
  • Semantic cache хранит пары (запрос, ответ). Устаревшие ответы могут быть неактуальны. Как управлять TTL семантического кэша для динамического контента?
  • GenAI система обрабатывает персональные данные пользователей через LLM API. Какие архитектурные паттерны обеспечивают GDPR compliance?

Связанные уроки

  • gai-19 — Системный дизайн предполагает знание оптимизации инференса
  • gai-24 — Системный дизайн - ядро senior-собеседований
  • aie-42-ai-system-design — Продакшен-паттерны системного дизайна GenAI
  • ml-55-ml-system-design — Дизайн GenAI расширяет классический ML system design
  • gai-16 — Дизайн семантического поиска опирается на RAG
GenAI System Design

0

1

Войти