Как учитывать CAP theorem в AI systems?

Краткий тезис

CAP theorem (теорема Эрика Брюера) утверждает, что распределённая система не может одновременно обеспечить все три свойства: Consistency, Availability, Partition tolerance. В AI-системах (RAG, агенты, векторные базы, распределённый кэш LLM) это означает, что архитектор всегда делает компромисс: либо CP (жертвует доступностью ради точности), либо AP (жертвует консистентностью ради доступности). Большинство AI-продуктов выбирают AP — лучше отдать устаревший, но быстрый ответ, чем не ответить вовсе.


1. Что такое CAP theorem и её термины

CAP theorem (теорема CAP) — фундаментальный принцип распределённых систем, сформулированный Эриком Брюером в 2000 году.

СвойствоОписание
Consistency (консистентность)Все узлы одновременно видят одни и те же данные. После записи любой последующий запрос вернёт актуальное значение.
Availability (доступность)Каждый запрос к системе получает успешный ответ (необязательно последнее обновление). Нет простоев.
Partition tolerance (устойчивость к разделению)Система продолжает работать, если связь между узлами нарушена (сетевой сбой).

Ключевое следствие при сетевом разделении (partition) мы обязаны выбрать между Consistency и Availability. Никакая система не может гарантировать все три одновременно.

Для AI-систем, которые часто работают распределённо (векторные БД, кластеры инференса, агентные роутеры), понимание этого компромисса необходимо при проектировании.


2. Почему CAP критичен для AI-инфраструктуры

AI-системы редко состоят из одного узла:

  • Векторные базы данных (Pinecone, Qdrant, Weaviate) реплицируют данные для отказоустойчивости.
  • Кэш LLM-ответов (Redis, Memcached) распределён для низкой задержки.
  • Координация агентов (множество параллельных вызовов LLM, tools, пайплайнов) требует согласования состояний.

Без учёта CAP система может выдавать галлюцинации (из-за неконсистентного контекста) или быть недоступной (когда синхронизация блокирует ответ).


3. Пример 1: Векторная БД с репликами

Рассмотрим кластер векторной БД, где данные реплицированы на 3 узла. Приходит запрос на вставку документа, и одновременно другой пользователь делает поиск.

СтратегияПоведение при partitionПоследствия для AI
CP (Consistency + Partition tolerance)Запись блокируется, пока все реплики не подтвердят синхронизацию. При разрыве сети часть узлов отказывается отвечать до восстановления.Высокая задержка на запись, возможна недоступность поиска. Но ответ retrieval будет точным (все свежие документы).
AP (Availability + Partition tolerance)Любая реплика отвечает сразу, даже если она не получила последнее обновление. Векторные индексы могут быть stale.Низкая задержка, система всегда доступна. Но поиск может пропустить только что добавленный чанк или вернуть «устаревший» контекст → потенциальная галлюцинация LLM.

Вывод в Agentic RAG часто выбирают AP – лучше потерять один новый чанк, чем заставить пользователя ждать 10 секунд.


4. Пример 2: Распределённый кэш LLM-ответов

Кэш (например, Redis Cluster) хранит пары (запрос → генерация). При высокой нагрузке возможны сетевые разделения.

  • AP-режим каждый шард отвечает из своей локальной копии. Ответ может быть от старого кэша (неактуальная генерация), но система отвечает быстро.
  • CP-режим для чтения из кэша необходимо кворумное согласие (сравнение хэшей). При сбое кэш может быть недоступен.

Практика LLM-кэши обычно настраиваются как AP (TTL + eventual consistency). Допустимо вернуть чуть устаревший ответ на частый вопрос, чем заставить пользователя ждать инференса.


5. Пример 3: Координация AI-агентов (Agentic RAG)

Предположим, агент вызывает несколько инструментов (поиск в БД, калькулятор, вызов внешнего API) и агрегирует результат. Если один из вызовов падает из-за разделения сети:

  • CP-подход ждать все инструменты или откатить весь запрос → высокая задержка, возможен таймаут.
  • AP-подход использовать fallback-ответ от самого быстрого инструмента, пропустить отказавший → пользователь получает неполный, но быстрый ответ.

Рекомендация в Agentic RAG обычно применяют AP с механизмами graceful degradation (постепенная деградация). Например, если векторный поиск недоступен – агент идёт в реляционную БД, пусть и с менее релевантными документами.


6. Как выбирать CP или AP: матрица решений

КритерийСклонностьПримеры
Требование к точности ответаCPМедицинская RAG (нельзя пропустить важный документ)
Требование к времени ответаAPЧат-боты, поисковые ассистенты
Частота обновлений данныхЕсли обновления редки – CP проще, если часты – AP снижает блокировкиСистемы с live-документами (новины)
Надёжность сетиВысокая доступность сети → можно ближе к CPOn-premise кластер
Стоимость инфраструктурыAP часто дешевле (меньше синхронизаций)Облачные распределённые БД

7. Инструменты и их CAP-настройки

Многие AI-инструменты позволяют явно регулировать компромисс:

  • Cassandra (используется для хранения состояний агентов) – AP по умолчанию (eventual consistency), можно настроить уровень согласованности (LOCAL_QUORUM → ближе к CP).
  • Elasticsearch (векторный поиск) – CP по умолчанию (запись ждёт обновления всех реплик), но можно отключить репликацию ради скорости.
  • Redis (кэш LLM) – AP (asynchronous replication), для строгой консистентности использовать WAIT.
  • PineconeAP (каждая реплика отвечает независимо).

Пример кода (конфигурация Cassandra для CP):

from cassandra import ConsistencyLevel
from cassandra.cluster import Cluster

cluster = Cluster(['node1', 'node2', 'node3'])
session = cluster.connect('ai_state')
# Гарантировать, что хотя бы 2 реплики согласованы
session.default_consistency_level = ConsistencyLevel.LOCAL_QUORUM

8. PACELC — расширение CAP для AI

PACELC (Daniel J. Abadi, 2010) добавляет компромисс между Latency и Consistency даже при отсутствии разделения сети.

  • PPartition: выбираем A или C.
  • E – Else (без разделения): выбираем между L (низкая задержка) и C (консистентность).

В AI-системах latency часто критична, поэтому даже в нормальном состоянии выбирают AP (жертвуют консистентностью ради скорости). Это объясняет популярность eventual consistency в векторных БД.

Формула принятия решения

Если P (разделение) = True → выбор между A и C
Если P = False → выбор между L (latency) и C

Для AI-приложений, где время ответа < 2 сек, выбирается L (низкая задержка) → AP в обоих случаях.


9. Практические советы для собеседования

  1. Определите, что является Consistency для вашей системы. В RAG это не «копии данных совпадают», а «все релевантные чанки учтены в контексте» (свежесть).
  2. Availability — время до первого байта. Если пользователь ждёт более 5 секунд, это равно недоступности.
  3. Partition — не только сетевой сбой, а и высокая задержка. Таймаут запроса к чанкеру — тоже partition.
  4. Выбирайте AP, если галлюцинация от устаревшего контекста менее страшна, чем отказ ответить.
  5. Для критичных доменов (медицина, финансы) используйте CP с дополнительным fallback-слоем AP. Например, основная векторная БД CP, а кэш — AP.

Пет-проект для закрепления

Задача Создать симулятор CAP-компромиссов в распределённой векторной БД, используемой как backbone для RAG-агента.

Инструменты

Шаги:

  1. Разверните 3 узла, каждый хранит подмножество векторов (шардинг).
  2. Реализуйте два режима:
    • CP запись блокируется до записи во все узлы (использовать asyncio.gather с таймаутом).
    • AP запись только в локальный узел, другие узлы получают данные асинхронно (eventual).
  3. Искусственно обрывайте сетевые соединения (через Docker сети).
  4. Измерьте latency и accuracy retrieval (насколько часто новый чанк не находится после записи).
  5. Отрисуйте график зависимости скорости от консистентности.

Ожидаемый результат

  • Вы увидите, что в CP-режиме при partition система не отвечает (таймаут), в AP — отвечает, но иногда пропускает свежие данные.
  • Сможете аргументировать выбор AP для AI-чата.

Связь с другими вопросами

ВопросТема
Вопрос 1Проектирование RAG-системы для неоднородных документов
Вопрос 7Уменьшение latency RAG-системы
Вопрос 8Обработка запросов без ответа в документах
Вопрос 10Self-RAG и когда его использовать
Вопрос 15Архитектура Agentic RAG (координация)
Вопрос 20Масштабирование RAG под высокую нагрузку

Навигация