Заказчик просит «чат по нашим регламентам». Демо на пяти PDF проходит красиво. В production модель уверенно ссылается на устаревшую инструкцию, путает отделы и иногда выдумывает пункты, которых не было в файле. RAG (Retrieval-Augmented Generation) как раз про то, чтобы ответы опирались на ваши документы — но только если retrieval, чанкинг, права доступа и оценка качества сделаны как продуктовый контур, а не как prompt в пятницу вечером.
В OtherCode мы внедряем RAG и смежные AI-функции в духе URAP AI (документы → структура → ответы/извлечение), в контентных сценариях Content Factory, в справке и операторских подсказках для SaaS и промышленных интерфейсов. Ниже — архитектура, практика eval, когда RAG не нужен, гибрид с правилами и требования privacy/on-prem.
Что такое RAG в продуктовых терминах
RAG = найти релевантные фрагменты → подставить в контекст модели → сгенерировать ответ с опорой на них (желательно с цитатами).
[Документы заказчика]
↓
[Парсинг / OCR при необходимости]
↓
[Chunking + метаданные + ACL]
↓
[Индекс: dense ± BM25]
↓
[Запрос пользователя] → retrieval top-k
↓
[LLM + политики] → ответ + citations
↓
[Лог / eval / feedback]
Без качественного retrieval LLM либо молчит полезно, либо фантазирует убедительно. Общий каркас AI в продуктах — в статье Разработка с AI.
Когда RAG уместен — и когда нет
| Сценарий | RAG? | Почему | |----------|------|--------| | Ответы по регламентам, FAQ, договорам | Да | Нужна опора на актуальный корпус | | Извлечение полей из одного документа | Часто хватает OCR+правила / NER | Retrieval по базе не обязателен | | Жёсткий расчёт тарифа / налог | Нет как единственный путь | Нужен калькулятор и тесты | | «Поговори с пользователем дружелюбно» | Нет | Нет корпуса знаний | | Поиск по коду ошибок оборудования | Да / гибрид | База + карточка сигнала из телеметрии |
Не используем RAG, если:
- нет корпуса или он не обновляется;
- ошибка недопустима без детерминированного движка;
- вопрос решается SQL/фильтром по БД;
- документы нельзя отдавать модели даже в retrieval-контуре без юр. основания.
Иногда лучше обычный поиск + шаблон ответа, чем LLM.
Архитектура, которую мы собираем на практике
1. Подготовка документов
- Нормализация форматов (PDF, DOCX, HTML, сканы).
- Для сканов — OCR-пайплайн (см. OCR и распознавание документов на Python): без текста нет чанков.
- В URAP-подобных системах сначала извлекаем структуру, потом уже строим knowledge-слой для Q&A.
- Версия документа и дата вступления в силу — обязательные метаданные.
2. Chunking
Плохой чанкинг = хороший повод для галлюцинаций.
| Подход | Плюсы | Минусы | |--------|-------|--------| | Фиксированные 500–1000 токенов + overlap | Просто | Режет таблицы и списки | | По заголовкам / секциям | Сохраняет смысл | Нужен парсер структуры | | Мелкие чанки + parent context | Точный hit + широкий контекст | Сложнее пайплайн |
Практика: для регламентов — секционный чанкинг; для «простыней» без оглавления — окна с overlap; таблицы — отдельно, с сохранением строки заголовков.
3. Эмбеддинги и поиск
- Dense embeddings для семантической близости.
- Keyword/BM25 для точных артикулов, кодов ошибок, номеров ГОСТ.
- Гибрид обычно стабильнее «только vector».
- Rerank (лёгкая модель или cross-encoder) — когда top-20 шумные, а в контекст LLM нужно 4–6 фрагментов.
Индекс храним рядом с продуктом: PostgreSQL + расширения / отдельный vector store — выбор от объёма и ops. Для многих заказчиков проще меньше движков и один PostgreSQL, который команда уже умеет бэкапить на VPS / в Yandex Cloud.
4. Промпт и политики
- «Отвечай только по контексту; если нет данных — скажи, чего не хватает».
- Язык ответа = язык пользователя.
- Запрет на советы вне домена (медицина/право — отдельные дисклеймеры и human review).
- Обязательные citations: id чанка, название документа, якорь секции.
5. ACL
Retrieval без прав доступа — дыра. Фильтр по tenant_id, отделу, грифу до отдачи в LLM. Иначе эмбеддинг «находит» чужой договор.
Eval: как понять, что RAG не врёт
Демо ≠ качество. Собираем набор вопросов с эталонными ответами и допустимыми источниками.
| Метрика | Смысл | |---------|--------| | Retrieval hit rate | Нужный чанк в top-k | | Answer faithfulness | Утверждения подтверждены контекстом | | Citation precision | Цитаты реально использованы | | Latency p95 | UX чата / API | | % escalation | Уход к человеку / «не знаю» |
Релиз нового индекса или промпта — через GitLab CI: smoke на золотом наборе, сравнение с предыдущей версией. Образы пайплайна — Docker; деплой на staging, затем production (VPS + PM2/compose или облако). Тот же MLOps-дух, что в URAP: версия артефакта, откат, мониторинг.
Feedback оператора («ответ неверный», «не та цитата») попадает в eval и в очередь на правку корпуса — не только в чат поддержки.
Гибрид: RAG + правила + инструменты
Самые надёжные продукты не отдают всё модели.
- Правила: если вопрос «какой статус заявки №» — tool/SQL, не RAG.
- RAG: «как по регламенту оформить возврат».
- Калькулятор / Modbus-карта: для Typhoon/Galvatec сначала справочник сигналов и порогов, RAG — по инструкции обслуживания.
- Content Factory: генерация по шаблону бренда + проверка стоп-слов правилами.
- Diom / Next.js UI: показывают источники и кнопку «создать тикет», а не только «красивый абзац».
Двухфазность на критичном: модель предлагает, человек или rule engine подтверждает запись в ERP.
Privacy и on-prem для enterprise
Для многих заказчиков документы нельзя отправлять в публичный SaaS-LLM.
Варианты, которые закладываем:
- On-prem / VPC — модель и индекс в контуре заказчика или в изолированном сегменте Yandex Cloud.
- Self-hosted LLM — ниже «магия» качества, выше контроль; нужен rightsizing GPU и FinOps.
- Маскирование PII до отправки в внешний API, если внешний API вообще допустим договором.
- Аудит: кто что спросил, какие чанки ушли в контекст, какая версия индекса.
- Отключение обучения на данных клиента у провайдера — юридически и технически проверить.
Synapse/Game API и промышленные шлюзы и так живут с разделением контуров; RAG для «внутренней базы знаний завода» наследует те же сетевые границы.
Типичные ошибки внедрения
- Залить 10 000 файлов без очистки дублей и черновиков.
- Чанки по 4k токенов «чтобы всё влезло».
- Нет версий индекса — ответы по старой политике безопасности.
- Один промпт на все типы вопросов без роутера intent.
- Игнорировать latency и стоимость токенов (контекст раздут top-20).
- Считать «пользователи довольны в первую неделю» за eval.
Связка со стеком OtherCode
- Python — парсинг, OCR, индексация, workers.
- Redis — очередь на переиндексацию и тяжёлые запросы.
- PostgreSQL — метаданные документов, иногда векторы.
- GitLab CI + docker runners — тесты retrieval/eval, сборка образов.
- Production — VPS RU / Yandex Cloud, PM2 для веб/API-слоя Next.js, compose для AI-workers.
- Фронты — Next.js и Flutter (Diom) с отображением цитат и состояний «думаю / не нашёл».
UX: как не стыдиться ответа модели
Технически верный RAG легко убить плохим интерфейсом.
- Показываем источники сразу: название файла, дата, фрагмент.
- Состояния: поиск → генерация → «мало контекста» → эскалация человеку.
- Кнопка «ответ полезен / нет» — топливо для eval.
- Для операторов Diom и веб-панелей — копирование цитаты в тикет одним жестом.
- Никаких скрытых «уверен на 97%» без калибровки: лучше честный «нашёл 2 фрагмента, уверенность средняя».
В Content Factory UX другой: не чат, а черновик с правилами бренда и явным diff относительно шаблона. В промышленных сценариях рядом с RAG держим карточку сигнала из телеметрии — модель не должна подменять число с датчика.
Обновление корпуса без простоя знаний
Регламенты меняются. Пайплайн обновления:
- Загрузка новой версии документа (API или админка).
- OCR/парсинг при необходимости (очередь Redis).
- Пересчёт чанков только затронутого документа.
- Атомарная подмена версии в индексе (старая читается, пока строится новая).
- Smoke-eval на вопросах, завязанных на этот документ.
- Аудит: кто опубликовал версию и когда она стала отвечающей.
Без атомарности пользователи полдня получают смесь старых и новых норм — хуже, чем полный даунтайм чата.
Стоимость токенов и кэш
Раздутый контекст — главный враг бюджета. Контролируем:
- top-k после rerank, не «все что нашли»;
- кэш ответа на идентичный вопрос + версия индекса;
- отдельные лимиты на tenant (особенно multi-tenant SaaS);
- сжатие/summary длинных секций только если eval не падает.
FinOps для RAG — часть дизайна, иначе пилот на Yandex Cloud GPU/LLM съедает маржу продукта.
Роутер намерений перед retrieval
Не каждый запрос должен идти в векторный индекс.
| Intent | Путь | |--------|------| | Статус сущности по id | Tool / SQL | | Приветствие / small talk | Короткий шаблон без LLM | | Вопрос по регламенту | RAG | | Расчёт / формула | Калькулятор + пояснение | | Жалоба / эскалация | Создание тикета |
Роутер может быть правилами или лёгкой классификацией. Главное — не смешивать режимы в одном промпте «сделай всё».
Пилот на 4–6 недель: что должно получиться
Реалистичный пилот OtherCode с заказчиком:
- 50–200 очищенных документов одного домена;
- 30–50 золотых вопросов с эталонами;
- UI с цитатами на Next.js или встраивание в существующую панель;
- замер faithfulness и hit rate, а не NPS «понравился бот»;
- решение go/no-go по SLA и privacy до масштабирования на весь архив.
Если за пилот нельзя измерить качество — это не пилот, а шоу.
Кому в команде принадлежит RAG
Без владельца система деградирует тихо: корпус устаревает, промпт «чуть подкрутили», eval никто не гоняет.
| Ответственность | Кто обычно | |-----------------|------------| | Корпус и юридическая актуальность | Заказчик / knowledge owner | | Пайплайн индекса и CI | OtherCode (Python/DevOps) | | UX цитат и escalation | Frontend (Next.js / Diom) | | Бюджет токенов и GPU | Product + FinOps | | Privacy-модель | Security / юристы заказчика + архитектура студии |
На статус-митинге раз в две недели достаточно трёх цифр: hit rate retrieval, доля «не знаю», стоимость 1k ответов. Остальное — в дашборд.
Чеклист готовности RAG к production
- [ ] Корпус очищен, версионирован, с владельцем
- [ ] Chunking и метаданные осмыслены под тип документов
- [ ] Гибридный поиск или осознанный отказ от него
- [ ] ACL на retrieval
- [ ] Citations в API/UI
- [ ] Золотой eval-набор и порог релиза
- [ ] Политика «не знаю» и escalation
- [ ] Решение по privacy (SaaS LLM / VPC / on-prem)
- [ ] Мониторинг стоимости и p95
Итог
RAG в OtherCode — это инженерия корпуса, retrieval и оценки, а не один системный промпт. Мы собираем контуры уровня URAP: документы, цитаты, гибрид с правилами, CI и возможность on-prem для enterprise. Там, где достаточно поиска или калькулятора, не тащим LLM ради галочки.
Если нужно внедрить ответы по вашим документам без сюрпризов в production — оставьте заявку.

