AI/journal
RAG в продакшне
RAG в продакшне: грабли, на которые наступили на пяти проектах
← ЖурналAI8 мин чтения

RAG в продакшне: грабли, на которые наступили на пяти проектах

Команда nordiqdev
студия

За полгода мы запустили RAG-системы на пяти проектах: внутренняя база знаний банка, support для SaaS, помощник по нормативам, поиск по медицинской документации, ассистент для юристов. Все пять работают, но ни один не работал «из коробки». Собрали грабли, на которые гарантированно наступит каждая команда.

Грабля 1: наивный чанкинг по символам

Самый частый стартовый код: «бьём документ на куски по 1000 символов с overlap 200». Проблема - режется посреди предложений, таблиц, списков. Embedding получается шумный, retrieval промахивается.

Что работает: structure-aware splitter, который понимает заголовки, абзацы, списки и таблицы. Для PDF - отдельный пайплайн с разметкой страниц. На юр-документах правильный сплиттер дал нам +14 пунктов precision@5 без замены модели.

Грабля 2: vector-only retrieval

Чистый dense retrieval плохо работает на запросах с конкретными терминами, кодами, артикулами, фамилиями. «Положение № 590-П» в эмбеддинге выглядит как любой другой набор символов. BM25 такие запросы ловит на ура.

Решение - гибридный поиск: BM25 + dense, потом reranker (Cohere Rerank или открытый bge-reranker). Это плюс одна-две секунды латентности и плюс заметное качество. На банковской базе recall@10 вырос с 71% до 89%.

Грабля 3: evaluations задним числом

Команды строят RAG, демонстрируют 5 «впечатляющих» примеров, выходят в прод. Через месяц приходят отзывы «он несёт чушь». Без размеченного eval-набора вы не знаете, стало хуже или лучше после каждой правки.

Минимум, который мы делаем перед запуском: 50 пар вопрос-ответ от реальных пользователей, размеченных экспертом. Прогон при каждом изменении. Метрики - faithfulness и answer relevancy через LLM-as-judge плюс ручная проверка.

Грабля 4: контекст без источников

LLM подаём 8 кусков, она генерирует ответ. Пользователь спрашивает «откуда это?», а ответ - синтетика из четырёх источников, никакой ссылки не покажешь. Это блокер для юр/мед/банковских применений.

Что делаем: каждый чанк передаём с уникальным id и заголовком, в системном промпте просим возвращать ответ как JSON с ключами text и citations. Citations - массив id чанков, на которых основано утверждение. Проверяем в постпроцессинге.

Грабля 5: переоценка возможностей модели

Когда LLM получает 12k токенов контекста, кажется, что она читает всё. На практике lost-in-the-middle никуда не делся: важная информация в середине большого промпта проседает.

Поэтому: top-k обычно 5–8 после реранкера, не 20. Если нужно больше - лучше подумать про map-reduce или иерархическую суммаризацию, чем просто доливать.

Теги
#rag#llm#vector search#embeddings#продакшн
Студия nordiqdev

Делаем мобильные приложения, веб-сервисы и AI на заказ

Если задача из текста выглядит знакомой и нужна команда, которая соберёт продукт - расскажите подробнее. Вернёмся в течение 24 часов с разбором.