System Design Space
Граф знанийНастройки

Обновлено: 21 июня 2026 г. в 21:58

GenAI/RAG System Architecture

средний

Авторская глава о рабочей RAG-архитектуре: загрузка знаний, извлечение контекста, оркестрация ответа, защитные ограничения, оценивание и компромиссы между SLO и стоимостью.

Почти любая RAG-система ломается не в модели, а на стыках загрузки знаний, извлечения контекста, оркестрации ответа и проверок безопасности.

Глава раскладывает рабочий контур на части и показывает, как загрузка знаний, ранжирование, защитные ограничения, оценивание и контроль стоимости вместе определяют, будет ли ответ действительно полезным.

Для интервью и архитектурных разговоров она полезна как способ обсуждать RAG не как быстрый прототип, а как систему с SLO, режимами отказа и эксплуатационными компромиссами.

Практическая польза главы

Практика проектирования

Переводите знания о рабочей RAG-архитектуре, качестве извлечения контекста и управлении знаниями в архитектурные решения для потоков данных, сервинга моделей и контрольных точек качества.

Качество решений

Оценивайте систему через метрики модели и платформы одновременно: precision/recall, задержки, дрейф, стоимость и операционные риски.

Аргументация на интервью

Структурируйте ответ как цепочку данные -> модель -> сервинг -> мониторинг, показывая, где возникают ограничения и как вы ими управляете.

Явные компромиссы

Явно фиксируйте компромиссы по рабочей RAG-архитектуре, качестве извлечения контекста и управлении знаниями: скорость экспериментов, качество, объяснимость, бюджет ресурсов и сложность поддержки.

Основной источник

Retrieval-Augmented Generation (2020)

Работа, которая формализовала RAG как подход, где генерация опирается на извлечение контекста из внешних источников.

Открыть статью

GenAI/ System Architecture — это не один сервис вокруг , а связка нескольких контуров: загрузки знаний, , оркестрации ответа, и операционного оценивания качества. Пригодной к рабочей эксплуатации система становится только тогда, когда эти контуры проектируются как единый контракт по задержке, качеству и стоимости.

Дальше — практическая схема, с которой можно стартовать архитектуру корпоративного AI-ассистента, помощника по базе знаний или бота поддержки.

Референсная архитектура генерации с извлечением контекста (GenAI/RAG)

Диаграмма показывает -контур по слоям: от загрузки знаний и индекса до генерации ответа, защитных ограничений и резервного пути.

Источники знаний и загрузка
документацияинструкции для дежурныхобращения поддержкивладельцы данных
Переход между слоями
Очистка, чанки и индекс
дедупликациянормализациячанкиверсии документов
Переход между слоями
Извлечение и фильтры доступа
семантический поисклексический поискACLфильтры запроса
Переход между слоями
Повторное ранжирование и сборка контекста
rerankertop-kблоки контексталимит контекста
Переход между слоями
Генерация и оформление ответа
системные инструкцииLLMцитатыформат клиента
Переход между слоями
Защитные ограничения и резервный путь
PII-проверкипроверки правилfallbackаудит

Что держать под контролем

RAG-контур полезно смотреть не только как цепочку сервисов, но и как баланс качества извлечения, задержки ответа, стоимости и безопасности выпуска.

Качество извлечения

hit ratemiss reasonscitation coveragegrounded-answer rate

Рабочие ограничения

p95 latencycontext windowACL correctnessprovider timeout

Безопасный выпуск

replay setshadow rolloutfreshnessregression checks

Путь запроса: от вопроса до ответа с опорой на источники

Ниже показан синхронный путь -запроса: от первичных проверок вопроса через извлечение и сборку контекста до ответа с цитатами, ссылками на источники и финальными проверками.

Как вопрос проходит через RAG-контур

Синхронный путь от запроса до ответа с цитатами и проверками

Интерактивный прогонШаг 1/5

Активный шаг

Бюджет шага: ~30-80 ms

1. Вопрос и предварительные проверки

Система нормализует запрос, определяет сценарий, отсекает вопросы вне домена и запускает ранние проверки правил до извлечения контекста.

Онлайновый путь ответа с опорой на источники

  • Контур жёстко ограничен задержкой.
  • Качество извлечения контекста влияет на итог не меньше, чем сама модель.
  • Проверки доступа и защитные ограничения работают и до генерации, и после неё.
Бюджет задержкиACLЦитатыРезервный путь

Исследование

Chroma: Evaluating Chunking Strategies (2024)

Сравнение стратегий чанкинга на единых метриках: разница между наивной и продуманной нарезкой достигает 9% полноты (recall) на одном корпусе.

Открыть отчёт

Стратегии чанкинга: нарезка корпуса задаёт потолок качества

— первое архитектурное решение платформы знаний: всё, что нарезано неудачно, не спасут ни , ни промпт. Каждая стратегия ниже разобрана по одной схеме: как работает, какой компромисс приносит и когда её выбирать.

Фиксированные окна (fixed-size)

Как работает: Текст режется на окна по 200-800 токенов с перекрытием 10-20% без оглядки на структуру документа. Реализуется одной функцией, а стоимость индексации предсказуема и легко считается заранее.

Компромисс: Граница окна попадает в середину предложения, таблицы или примера кода, и факт, разрезанный пополам, не находится ни по одной из половин. Перекрытие частично страхует границы, но раздувает индекс и плодит дубликаты в первых k результатах (top-k).

Когда выбирать: Базовый вариант для первого запуска и однородных текстов без выраженной структуры. С него стоит начинать, чтобы получить точку отсчёта для метрик, а не как финальное решение.

По структуре документа (structure-aware)

Как работает: Нарезка идёт по естественным границам: заголовкам, абзацам, спискам и таблицам. Рекурсивное деление спускается по иерархии разделителей — сначала разделы, затем абзацы, затем предложения, — пока чанк не уложится в лимит.

Компромисс: Чанки совпадают со смысловыми границами, а путь заголовков бесплатно попадает в метаданные. Цена: размер чанков скачет от пары строк до целого раздела, и под каждый формат (Markdown, HTML, PDF, wiki) нужен свой парсер.

Когда выбирать: Документация, базы знаний, регламенты и контракты, где автор уже разметил структуру. На корпусах с сильными внутренними границами выигрыш относительно наивной нарезки максимален.

Семантический чанкинг (semantic)

Как работает: Эмбеддинги соседних предложений сравниваются между собой, и граница чанка ставится там, где сходство резко падает, то есть на смене темы. Вариант с разметкой границ большой языковой моделью (LLM) ещё точнее, но и заметно дороже.

Компромисс: В отчёте Chroma (2024) семантические стратегии и разметка большой языковой моделью дали до ~92% полноты (recall) против ~88% у рекурсивной нарезки — единицы процентов выигрыша за заметно более дорогую индексацию. Границы к тому же привязаны к модели эмбеддингов: её замена меняет нарезку.

Когда выбирать: Длинные слитные тексты без явной структуры: расшифровки звонков, исследования, лонгриды. Выбирайте, когда полнота первичного поиска упирается именно в неудачные границы, а не в качество эмбеддера.

Размер чанка: точность против контекста

Маленькие чанки (~128-256 токенов) дают точечные попадания и высокую точность (precision), но отрывают факт от окружения: условие из соседнего абзаца теряется. Большие (~512-1024) чаще захватывают ответ целиком, но тянут в контекст шум и быстрее съедают окно модели. Подбирайте размер по метрикам на собственном эталонном наборе, а не по чужим дефолтам.

Перекрытие (overlap)

Перекрытие 10-20% страхует факты, попавшие на границу окна: фраза, разрезанная одним чанком, целиком живёт в соседнем. Но каждый процент перекрытия — это рост индекса и дубликаты среди соседних чанков в первых k результатах, поэтому перед сборкой контекста нужна дедупликация почти одинаковых фрагментов.

Метаданные чанка

У каждого чанка должны быть источник и версия документа, путь заголовков, дата обновления, список управления доступом (ACL) или арендатор и тип контента. Именно метаданные превращают индекс в управляемую систему: они дают фильтры до поиска, цитаты в ответе и точечную инвалидацию при переиндексации изменившегося документа.

Гибридный поиск: лексика, векторы и слияние списков

Ни один способ поиска не покрывает все запросы: поверх буквально находит точные термины, плотный поиск ловит смысл, а объединяет оба списка так, чтобы сильные стороны не усредняли друг друга.

Лексический поиск: формула BM25

Как работает: Классика полнотекстового поиска поверх инвертированного индекса: вес термина растёт с частотой в документе с насыщением и нормируется на длину документа (типовые параметры k1 = 1.2, b = 0.75). Именно формула BM25 используется по умолчанию в Lucene, Elasticsearch и OpenSearch.

Компромисс: Точные совпадения отрабатывают идеально: коды ошибок, артикулы, имена API и аббревиатуры находятся буквально. Но синонимы и перефразированные вопросы для формулы BM25 невидимы: «как удалить учётку» и «деактивация аккаунта» — разные запросы.

Когда выбирать: Запросы с точными идентификаторами и редкими терминами. В корпоративном поиске это постоянный случай: номера тикетов и договоров, коды ошибок, названия внутренних сервисов.

Плотный (dense) поиск по эмбеддингам

Как работает: Bi-encoder заранее превращает каждый чанк в вектор; запрос кодируется той же моделью, а индекс приближённого поиска соседей (обычно HNSW) находит ближайшие векторы за миллисекунды даже на миллионах чанков.

Компромисс: Ловит смысл, синонимы и перефразирования, работает между языками. Но редкие точные токены размываются: запрос с кодом «ERR-1042» вернёт чанки про похожие ошибки, а не именно эту. На внутреннем жаргоне, которого эмбеддер не видел при обучении, качество падает.

Когда выбирать: Вопросы на естественном языке, синонимия, многоязычный корпус. Основной режим для ассистентов по базе знаний — но в одиночку он проигрывает гибриду на точных терминах.

Слияние списков: Reciprocal Rank Fusion

Как работает: Каждый источник возвращает свой ранжированный список, и итоговый скор документа считается как сумма 1/(k + rank) по всем спискам (k = 60 в оригинальной работе Cormack et al., 2009). Скоры движков игнорируются — только позиции, поэтому несравнимые шкалы формулы BM25 и косинусной близости не нужно нормализовать.

Компромисс: RRF премирует консенсус: документ на десятом месте в обоих списках обойдёт лидера только одного из них. Цена — потеря информации о силе совпадения; при сильно неравных по качеству источниках простой сумме понадобятся веса.

Когда выбирать: Дефолтный способ слияния для гибридного поиска: одна формула без обучения и нормализации, встроенная в Elasticsearch, OpenSearch, Qdrant, Weaviate и большинство векторных движков.

Фильтры по метаданным: до или после поиска

Фильтрация по , арендатору и свежести — не деталь реализации, а граница безопасности: применить фильтр до обхода индекса или после — решение, от которого зависит и качество выдачи, и то, участвуют ли запрещённые документы в ранжировании вообще.

Pre-filter: маска до обхода индекса

Как работает: Фильтры по метаданным — список управления доступом (ACL), арендатор, свежесть, тип документа — строят маску допустимых чанков до векторного поиска, и обход векторного индекса рассматривает только разрешённые вершины.

Компромисс: Гарантирует, что в первые k результатов попадают только допустимые документы. Но очень селективный фильтр на классическом HNSW рвёт связность графа и ломает качество обхода — поэтому движки строят filterable-индексы, встраивающие фильтр прямо в навигацию по графу (так делает, например, Qdrant).

Когда выбирать: Права доступа и границы арендатора — всегда pre-filter: документ, который пользователю нельзя видеть, не должен даже участвовать в поиске. Это требование безопасности, а не оптимизация качества.

Post-filter: отсев после поиска

Как работает: Сначала выполняется обычный векторный поиск, затем из первых k результатов выбрасываются те, что не прошли фильтр по метаданным.

Компромисс: Не трогает индекс и прост в реализации, но при селективном фильтре выдача схлопывается: искали 10 ближайших, после фильтра осталось 1-2, и приходится перезапрашивать с большим k. Когда фильтр — это список управления доступом (ACL), появляется ещё и риск: недопустимый документ уже участвовал в ранжировании.

Когда выбирать: Слабо селективные фильтры без требований безопасности: тип контента, язык, грубая отсечка по дате — случаи, когда отфильтровывается малая доля кандидатов.

Повторное ранжирование: дорогая точность поверх дешёвого охвата

разводит две несовместимые цели по разным этапам: первичный поиск отвечает за охват и дёшев, cross-encoder отвечает за точность и дорог — поэтому его пускают только по короткому списку кандидатов.

1. Широкое извлечение: top-100 кандидатов

~30-80 ms

Гибридный поиск собирает широкий список кандидатов. На этом этапе важна полнота (recall) — нужный документ обязан попасть в выборку, а точность порядка вторична: расширение k здесь почти бесплатно.

2. Cross-encoder: повторное ранжирование пар

~50-300 ms

Cross-encoder читает пару «запрос + чанк» одним проходом и видит взаимодействие токенов, поэтому ранжирует точнее bi-encoder'а — но ничего нельзя предвычислить: k полных проходов модели на каждый запрос. Лёгкие модели уровня MiniLM обрабатывают ~100 пар за десятки миллисекунд на GPU; API-реранкеры дают порядка 100-400 ms вместе с сетью.

3. Отбор top-5 в контекст

~0 ms

В контекст большой языковой модели уходит короткий точный список вместо длинного шумного. Меньше токенов — дешевле генерация, слабее эффект lost in the middle и ниже шанс, что модель обопрётся на нерелевантный чанк.

Цена и выигрыш

Бюджет повторного ранжирования «retrieve 100 → rerank → top 5» добавляет к ответу примерно 100-300 ms, но в типичных замерах даёт двузначный прирост доли запросов, где нужный документ попал в финальный контекст. Экономически реранкер почти всегда выгоднее альтернативы — скармливать большой языковой модели 30-50 чанков «на всякий случай»: длинный контекст дороже по токенам и хуже используется моделью.

Чего реранкер не лечит

Cross-encoder только переставляет уже найденное. Если нужного документа нет в top-100 первичного поиска, переранжированию нечего спасать — сначала чините чанкинг, эмбеддер или слияние источников. Поэтому полноту смотрят парой метрик: recall@100 для первичного поиска и recall@5 после реранкера.

Оценка качества извлечения контекста: метрики, эталоны и дрейф

— единственная часть , которую можно измерять детерминированно и дёшево, без -судьи. Поэтому контур оценки строится от -метрик: , MRR и на эталонном наборе ловят регрессии до выката, а онлайн-сигналы подтверждают их на живом трафике.

МетрикаЧто измеряетКогда смотреть
recall@kПопал ли релевантный документ в первые k результатов вообще, без учёта порядка.Главная метрика потолка системы: чего нет в выдаче, того большая языковая модель не увидит ни при каком промпте. Смотрите при k финального контекста и при k первичного поиска.
MRRНасколько высоко стоит первый релевантный результат: среднее значение 1/rank по запросам.Сценарии с одним правильным ответом: фактологические вопросы, поиск конкретного регламента. Метрика чувствительна именно к верхушке выдачи.
nDCG@kКачество всего ранжирования с учётом градаций релевантности и логарифмического дисконта позиции.Выдачи, где релевантных документов много и они разной полезности; стандартный способ сравнивать ранжировщики между собой.

Golden set: размеченный эталон

Основа оффлайн-оценки: реальные запросы из логов с разметкой, какие документы и факты релевантны. Синтетика (большая языковая модель генерирует вопросы по чанкам) дёшево расширяет покрытие, но требует ручной проверки выборки — иначе вы измеряете способность модели отвечать на собственные вопросы.

Ловушка: Размечайте релевантность на уровне документов и фактов, а не идентификаторов чанков: смена стратегии чанкинга или переиндексация перенумерует чанки и молча обнулит разметку.

Оффлайн-контур: регрессионный гейт

Метрики recall@k (полнота в топ-k), MRR и nDCG (нормализованный дисконтированный выигрыш) на golden set прогоняются при каждом изменении пайплайна: новой стратегии чанкинга, другой модели эмбеддингов, параметрах слияния, версии реранкера. Это превращает настройку извлечения контекста из «на глаз стало лучше» в управляемый эксперимент.

Ловушка: Оффлайн-метрики сравнимы только при зафиксированном корпусе: если индекс изменился между прогонами, разница в полноте — это смесь эффекта изменения и дрейфа данных.

Онлайн-сигналы

В проде прямых меток нет, поэтому смотрят на косвенные сигналы: долю ответов с цитатами, долю честных отказов «не нашёл», клики по источникам, повторные переформулировки одного вопроса, явный фидбек. Сегментируйте по типам запросов: средние значения прячут деградацию отдельных сценариев.

Ловушка: Онлайн-сигналы запаздывают и шумят: падение качества извлечения контекста доходит до продуктовых метрик через недели. Без оффлайн-контура вы узнаете о деградации последним.

Дрейф корпуса

Корпус живёт: документы добавляются, переименовываются и устаревают, появляются новые продукты и термины. Golden set, собранный год назад, продолжает показывать зелёные метрики — на вопросах годовалой давности, а не на сегодняшнем трафике.

Ловушка: Держите в golden set свежий срез (документы и запросы последних недель), регулярно досэмплируйте запросы из прода и мониторьте долю запросов с низким скором извлечения контекста: она растёт первой, когда корпус уезжает от индекса.

Целевой уровень сервиса (SLO) и базовые ориентиры по ёмкости

Задержка

P95 < 2.0s

Разделяйте бюджет отдельно на извлечение контекста, вывод модели и постобработку.

Качество

Доля ответов с опорой на источники > 90%

Оценивайте, насколько ответ опирается на найденный контекст, а не только насколько он гладко звучит.

Экономика

Стоимость закрытой задачи в целевом коридоре

Держите стоимость под контролем через маршрутизацию моделей, кэш и лимиты на размер контекста.

Исследование

Lost in the Middle (Liu et al., 2023)

Работа, показавшая U-образную кривую: модели заметно хуже используют факты из середины длинного контекста, чем из его начала и конца.

Открыть статью

Режимы сбоев генерации с извлечением контекста (RAG): симптом, причина, архитектурный ответ

Большинство проблем выглядят одинаково — «модель отвечает плохо» — но лечатся в разных местах пайплайна. Полезно вести каталог сбоев в формате «симптом → причина → архитектурный ответ»: он переводит разговор от «улучшить промпт» к конкретному слою, где сломан контракт. Например, при пустом — это не проблема модели, а отсутствующая ветка отказа в оркестраторе.

Уверенные галлюцинации при пустом извлечении контекста

Симптом: Система отвечает гладко и уверенно, но без цитат или с нерелевантными источниками; на вопросы вне корпуса выдаёт выдуманные детали.

Причина: Пайплайн не отличает «нашли релевантное» от «ничего не нашли»: даже при слабых скорах первые k результатов всё равно уходят в большую языковую модель, и та достраивает ответ из параметрической памяти.

Архитектурный ответ: Порог на скор извлечения контекста с явной веткой честного отказа, обязательные цитаты в контракте ответа и проверка опоры на источники на выходе — как отдельный шаг пайплайна, а не пожелание в промпте.

Lost in the middle

Симптом: Нужный факт точно был в собранном контексте, но ответ его игнорирует; качество скачет в зависимости от позиции чанка в промпте.

Причина: U-образная кривая внимания: модели стабильно лучше используют начало и конец длинного контекста, чем середину (Liu et al., 2023). Чем больше чанков «на всякий случай», тем глубже эта середина.

Архитектурный ответ: Меньше, но точнее: повторное ранжирование до top-5 вместо top-30, самые релевантные чанки в начало и конец контекста, размер контекста как явный бюджет, а не «сколько влезет».

Устаревший индекс (stale index): ответы из прошлого

Симптом: Ассистент цитирует прошлогоднюю версию политики или удалённую страницу; пользователи жалуются, что «в документации уже не так».

Причина: Индексация батчем раз в сутки или неделю без инвалидации при изменении источника. Индекс — это кэш знаний, и без стратегии инвалидации он устаревает так же тихо, как любой кэш.

Архитектурный ответ: Событийная переиндексация изменившихся документов вместо полного пересбора, версия и дата источника в метаданных чанка с фильтром «только актуальная версия», дата документа рядом с цитатой в ответе.

Prompt overflow: переполнение контекста

Симптом: На длинных диалогах качество резко падает, ответы теряют системные инструкции, цитаты обрезаются на середине.

Причина: Контекст собирается без бюджета: история диалога, чанки извлечения контекста и инструкции складываются, пока не упрутся в окно модели, и при переполнении что-то молча отрезается.

Архитектурный ответ: Явный токен-бюджет на каждый блок (система, история, извлечение контекста, ответ), приоритетное вытеснение — сначала суммаризация старой истории, затем чанки с худшим скором — и алерт на долю запросов у потолка окна.

Словарный разрыв запроса и корпуса

Симптом: Пользователи спрашивают своими словами, и извлечение контекста стабильно промахивается на целых классах запросов, хотя ответы в корпусе есть.

Причина: Пользовательский жаргон и официальная терминология корпуса не пересекаются лексически, а модель эмбеддингов не обучалась на доменных синонимах.

Архитектурный ответ: Переписывание и расширение запроса перед поиском (query rewriting), гибридный поиск вместо чисто плотного и регулярный разбор промахов извлечения контекста как источник словаря синонимов.

Рекомендации

  • Проектируйте RAG как две связанные системы: платформу знаний (загрузка и индекс) и онлайн-контур ответа (извлечение контекста и генерация).
  • Делайте наблюдаемость извлечения контекста первоклассной: долю попаданий, причины промахов, задержку и качество по сегментам.
  • Стабилизируйте контракты: структуру чанков, фильтры запроса, блоки контекста и формат ответа для клиентов.
  • Перед поэтапным запуском новой модели прогоняйте её и на теневом трафике, и на историческом эталонном наборе задач.

Частые ошибки

  • Оценивать систему только BLEU/ROUGE без продуктовых метрик и проверки опоры на источники.
  • Индексировать данные «как есть» без очистки, дедупликации и контроля версий источников.
  • Пытаться чинить качество только текстом запроса, игнорируя качество извлечения контекста и свежесть данных.
  • Применять контроль доступа после генерации ответа, а не до извлечения контекста.

Мини-чеклист запуска

  1. Есть каталог источников знаний и назначенные владельцы данных.
  2. Для каждого сценария определены метрики качества, целевой уровень сервиса (SLO) по задержке и ограничения по стоимости.
  3. Включены проверки правил на входе и выходе, а также аудит логов решений.
  4. Настроены поэтапный и теневой запуск, а также регрессионные тесты на наборе для прогонов по историческим данным.
  5. Сделаны резервные сценарии для отказов извлечения контекста, повторного ранжирования и провайдера большой языковой модели.

Источники

Связанные главы

  • AI Engineering (short summary) - Инженерная рамка для AI-приложений: оценивание, выпуск изменений и рабочая эксплуатация.
  • Hands-On Large Language Models (short summary) - Базовый материал по эмбеддингам, извлечению контекста и устройству систем на больших языковых моделях (LLM).
  • Prompt Engineering for LLMs (short summary) - Контракт запроса и практики проектирования контекста для генерации с извлечением контекста (RAG).
  • Enterprise AI Copilot - Прикладной GenAI-кейс с извлечением контекста, учитывающим список управления доступом (ACL), ссылками на источники, защитными ограничениями и изоляцией арендаторов.
  • Оценивание и наблюдаемость для AI-систем - Как измерять опору на источники, качество извлечения контекста и поведение системы после запуска.
  • Generative AI System Design Interview (short summary) - Даёт интервью-контекст для генерации с извлечением контекста (RAG): требования, данные, качество ответа, безопасность и мониторинг после запуска.
  • An Illustrated Guide to AI Agents (short summary) - Следующий шаг после генерации с извлечением контекста (RAG): использование инструментов, планирование и оркестрация.
  • Data Governance & Compliance - Контроль персональных данных (PII), происхождение датасетов и регуляторные требования для базы знаний.

Чтобы отмечать прохождение, включи трекинг в Настройки