Почему ваш RAG может галлюцинировать? 😱
Часто бывает, что начинающие берут LangChain, бездумно копипастят RecursiveCharacterTextSplitter с каким-нибудь chunk_size=1000, запихивают это в векторную базу и искренне не понимают, почему на выходе получается бред.
А потом идут жаловаться, что модель "тупая", ищут волшебные промпты или пытаются прикрутить агентов туда, где они не нужны. 🙃
Часто проблема именно в том, как вы нарезаете свои данные. Если у вас таблица на много строк или сложный кусок кода не влезают в лимит одного чанка — текст разрывается по частям. Векторная база послушно ищет куски по запросу, но находит оторванный хвост без головы. LLM честно пытается сгенерировать из этого ответ. Garbage in — garbage out.
При этом не существует универсальной стратегии чанкинга. На структурированных документах разница в метрике поиска между разными техниками может достигать 2.5 раз.
На одном из эфиров я рассказывал про основы RAG на основе правил D&D (запись и код доступны на Sponsr). Для тех, кто хочет пойти дальше и погрузиться в стратегии нарезки, я написал мини-бенчмарк со сравнением результатов. Можно протестировать 4 стратегии на демо-документах, либо на своем. Локально, без платных API.
На выходе — тепловая карта и сводная таблица с метриками. данных. Код (Jupyter-ноутбук + модуль) лежат здесь ◀️