Мы тут иногда архитектуру LLM-систем изучаем. Продолжаем этот опус.
Паттерн 5. Архитектура надежных RAG-систем
В Паттерне 4 мы поняли, как удобно, когда вся информация, нужная для ответа, находится у LLM в контексте.
Часто эта информация зависит от текущего состояния системы. Тогда возникает RAG.
RAG это синтез двух очень больших и очень разных миров: Поиска и Генерации. Разберем каждый.
Поиск
Основная сложность в Поиске — огромное число кандидатов, с которых можно написать ответ.
Если у вас их десятки, сотни тысяч документов, то уже проблема. Нужно придумывать инженерные трюки, которые позволят быстро находить перспективных кандидатов. Благо за десятки лет их придумали много штук. Перечислим некоторые:
- Эмбеддинги и быстрый векторный поиск. Это то, о чем все думают, когда представляют RAG. Они хороши, что позволяют искать семантически похожие тексты. Но у них есть принципиальные ограничения: не могут найти точные совпадения, не могут выделить дату, не понимают структуру документа
- Текстовый матчинг. Точное совпадение кусков текста. Можно считать по буквам, словам, n-граммам. Работают формулы TF-IDF, BM25 и тд. Не способны ловить семантику
- Графы знаний. Задают структуру ваших данных. Например, что эти документы из одной категории. Или, что тот документ идет после вот этого. Можно делать с помощью LLM, рассказывал про cocoindex в дайджесте.
Можно и нужно генерировать кандидатов разными методами, а затем их ранжировать более тяжелыми формулами. Бертами, LLM или даже ансамблем деревьев решений. Про выбор модели читайте тут.
Генерация
Основная сложность в Генерации - опираться только на найденные Поиском документы. Ничего не выдумывать, не галлюцинировать.
Для решения есть такие опции, от простого к сложному:
- Промптинг.
Попросить, дорогой генератор, ответь только по тому, что у тебя в контексте. Не выдумывать. Для простого RAG, где небольшой контекст и простые вопросы — метод рабочий, можно использовать.
- SFT-дообучение.
Когда промптинга мало, модель все равно галлюцинирует. Собираем датасет троек (запрос, контекст, правильный ответ). Учим на этом генератор. Не забывайте в "правильный ответ" записать "Не могу ответить, ничего не нашла", когда по контексту невозможно ответить. Работает для средней сложности задач.
- RLHF.
Когда даже SFT не справляется. Делаем reward модель, которая оценивает качества ответа. Дальше делаем итерацию PPO/DPO/GRPO, обновляем reward, делаем новую итерацию, потворять до готовности.
Агентность в RAG
В RAG идеально вписываются элементы архитектуры агентов. От простого к сложному:
1) Отдельная модель, которая генерирует удобные запросы.
Позволяет формулировать правильные запросы, снимать омонимию.
2) Итеративные походы в Поиск.
Если в первый раз не нашли, давайте сходим снова. Понять, что не нашли, можно эвристиками или рассуждениями.
3) Настоящий DeepResearch.
Объединение первых двух. Агент рассуждает, ходит итеративно в Поиск с правильными запросами.
Это все можно промтировать, SFT-шить, или через RL. Последнее можно глянуть в статье.
Литература для обязательного изучения
- Глава 1 отсюда. Понятно про архитектуру RAG.
- Видос по основам RAG. Во многом дублируется с постом
- Туториал по оценку RAG-а через LLM-as-a-judge (важная тема, не влезла в пост)
- Статья большой обзор кучи подходов к RAG. Все читать не обязательно, просто посмотрите, что вообще есть
Как всегда, все вопросы пишите в комментарии или в личные сообщения.
#llm_system_design
Post #72
4.1K
- ❤ 26
- 👍 16
- 🔥 12
- 🤔 2
- ❤🔥 1
- 🐳 1