Уничтожение RAG - ML System Design 😁
Давайте пойдем по базе из этого
поста, ещё можете чекнуть этот
пост с разбором MLSD для обучения LLM
Как отвечать на вопрос вопрос:
«Постройка мне Retrieve модель в RAG»? Давайте разбираться!
1️⃣ В начале разработки MLSD важно понять, что нам нужно сделать, поэтому в первую очередь формулируем задачу и ограничения.
Задача ❓
Построить Retrieve модель для рага в e-commerce. Мы большой магазин навоза и нам надо рекомендовать товар по запросу пользователя в LLM. Напомню, retrieve модель - это штука, которая на основе запроса пользователя ищет подходящий контекст, чтобы засунуть в ЛЛМ.
Ограничения:
Ограничения: Минимальная задержка (
<3
–5
сек.), иначе пользователь ливнёт и поставит нашему сервису какашку 💩
2️⃣ Метрики
Бизнесовые метрики 📞
➡️
Conversion Rate - доля пользователей, совершивших покупку после взаимодействия с чат-ботом.
➡️
Average Order Value (AOV) / Средний чек - средняя сумма покупки после взаимодействия с ботом (или в сравнении с пользователями, которые не общались с ботом).
Онлайн-метрики:➡️Удовлетворенность клиентов (CSAT) — пользовательская оценка (1–5).
➡️CTR - процент кликов по товарам/категориям, которые Retrieval-модуль (и далее LLM) порекомендовал.
Оффлайн метрик:
➡️Precision@k: Доля релевантных документов среди топ-k результатов поиска.
➡️
ROC-AUC: способность модели отделять релевантные документы от нерелевантных
➡️
mAP,
nDCG - Метрики ранжирования
3️⃣ Что там с данными? Откуда и сколько их получить, и как поделить на Train/Test ?
Источник:Мы большой магазин навоза и нам ну прям нужен RAG, то скорее всего мы доросли до того момента, когда у нас есть своя БД с описанием сортов навоза и их уникальных особенностей -
5 млн записей 😋
Разметка:Для Retrieve модели нам нужно получить данные: «запрос → релевантные документы». нанимаем копирайтера - Валюху, которая будет размечать нам данные. Но Валюха просит много рублей за свою работу, а мы не можем ей дать столько денег, то можем сделать начальную разметку с помощью
TF-IDF или других
BERT-like моделей.
Train/Test:
Случайно поделить на t
rain/val/test (например,
70/15/15 - именно так мы должны разбивать навоз!) 🍫
4️⃣
Построение пайплайна обучения BaseLine:Сначала нужно сделать самое простое решение в качестве затычки. Нашей затычкой будет
Elasticsearch на основе
TF-IDF, который будет возвращать
top-k=5 чанков. Чанк делим на 256 токенов или по структуре данных.
Норм решение для продажи навоза 💪
Гибридный подход - TF-IDF & ANN + E5 & Cosine Similarity + RerankerЗаранее считаем все эмбеддинги
BM25 и
E5 и храним всё в БД -
Faiss, ChromeDB.
➡️Поступил запрос, находим
1000 ближайших записей на основе
TF-IDF & ANN - то есть пихаем эмбеддинги
TF-IDF в
ANN, и получаем кластер из
1000 ближайших элементов к запросу. Считаем
precision@k,
k = 1000 - количество релевантных документов из всех элементов в кластере.
➡️Среди
1000 найденных записей находим топ
10 элементов с помощью E5 и cosine sim. Метрика:
precision@k,
k = [10, 5, 3, 1].
➡️Переранжируем эти
10 элементов обученной моделькой:
CatBoost, LambdaRank или энкодер. Измеряем
ROC-AUC, mAP, nDCG - если есть разметка.
Как обучать модели:➡️
TF-IDF - обучаем свой токенайзер и на всём корпусе документов обучаем
TF-IDF. Для экономии памяти можем через
PCA сжать эмбеддинги.
➡️
E5 -
X: (
Query, Positive Doc, Negative Doc - синтетику генерим с помощью GPT, проверяем через G-Eval и копирайтеров),
y: метки релевантности (
Positive, Negative),
Loss:
Triplet Loss - он сближает релевантные пары с навозом и отдаляет нерелевантные.
ReRanker:X: (
Query, Document) + доп. фичи (
score BM25/ANN/E5, клики, цена, популярность и т.д.).
y: бинарная (
релевант/нерелевант) или градуированная (
0–5).
Loss: Pairwise Ranking (LambdaRank), Cross-Entropy (если классификация) или Listwise (
nDCG-based).
5️⃣
A/B-тесты и мониторинг
Количество семплов:
1000, Train/Test =
70/30%, Онлайн-метрика:
CTR, CSATИтог:
Вот мы и построили базовый документ модели ретривы в RAG`е для
магазина навоза, который ещё можно дорабатывать. Если он вам был полезен, то надеюсь вы им воспользуетесь на собесах по MLSD 🐹