RAG на собеседовании Data Scientist
Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.
Содержание:
Зачем RAG
LLM знает только то, что было в трейне. На корпоративные данные / актуальные новости / специализированный domain — fine-tune дорого, RAG дешёвый и обновляемый.
RAG (Retrieval-Augmented Generation): при запросе достаём релевантные документы из своей базы, кладём в контекст LLM, получаем grounded ответ.
В 2024-2026 RAG — стандарт enterprise AI-приложений. На собесе DS обязательно: «как построить RAG для документов компании?», «как evaluate?», «как фиксить hallucinations?».
Высокоуровневая архитектура
[query] → embed → search → top-K docs → LLM (with context) → answer
↑
vector DB
↑
[docs] → chunk → embed → indexДва phase'а:
- Indexing (offline): документы → chunks → embeddings → vector DB
- Retrieval + generation (online): query → embed → search → context → LLM
Sounds simple. На практике каждый шаг — поле для оптимизации.
Chunking
Документ делим на куски, каждый кусок — отдельная единица retrieval.
Стратегии:
- Fixed-size — куски по N токенов с overlap (стандартный baseline). 256-512 токенов, overlap 10-20%.
- Sentence-based — split по предложениям, склеиваем до лимита.
- Semantic chunking — разбиение на семантические секции (через embedding similarity).
- Structured-aware — для markdown/HTML по заголовкам и параграфам. Часто лучший выбор.
Параметры:
chunk_size— больше = больше контекста, меньше = точнее retrieval. 256-512 typically.chunk_overlap— против разрыва информации между chunks. 10-20%.
Грабля: chunk на пол-предложения теряет смысл. Sentence-aware split.
Embeddings и vector search
Каждый chunk → vector через embedding модель. Хранится в vector DB.
Embedding models (2025-2026):
- OpenAI
text-embedding-3-large/small - E5 / BGE — open-source конкуренты
- Cohere — managed alternative
Vector DBs:
- FAISS (in-memory, быстрый)
- Chroma, Qdrant, Pinecone, Weaviate, Milvus (полноценные DB)
ANN search: на миллионах vectors exact search дорогой. ANN-индексы (HNSW, IVF) — приближённо за миллисекунды. Trade-off recall vs speed.
from openai import OpenAI
client = OpenAI()
def embed(text):
return client.embeddings.create(input=text, model='text-embedding-3-small').data[0].embedding
# индексация
for chunk in chunks:
vec = embed(chunk['text'])
vector_db.add(chunk_id, vec, metadata=chunk['metadata'])
# поиск
query_vec = embed(query)
results = vector_db.search(query_vec, k=10)Hybrid retrieval и reranking
Pure vector search не идеален. Не работает на keyword-точные совпадения (термины, числа, имена).
Hybrid retrieval:
- Vector search (semantic) → top-K1
- BM25 / TF-IDF (keyword) → top-K2
- Объединить через RRF (Reciprocal Rank Fusion)
Reranking: топ-K кандидатов прогнать через cross-encoder (более точная, но дорогая модель). Cross-encoder читает query + chunk одновременно, не embedding.
vector + BM25 → top-50 → reranker (cross-encoder) → top-5 → LLMCross-encoder в 10-100× дороже на запрос, но повышает recall@5 значительно. Стандарт в production RAG.
Доступные rerankers:
- Cohere Rerank API
- BGE Reranker (open)
- Cross-encoders на sentence-transformers
Eval RAG
Оценка RAG сложнее, чем classification. Что измеряем:
Retrieval metrics:
- Recall@K — есть ли правильный chunk в top-K
- MRR (Mean Reciprocal Rank) — позиция первого релевантного
Generation metrics:
- Faithfulness — основан ли ответ на retrieved context (не hallucinations)
- Answer relevance — отвечает ли на вопрос
- Context relevance — релевантен ли retrieved context
RAGAS — фреймворк автоматической оценки через LLM-as-judge. Стандарт в индустрии.
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_relevancy
results = evaluate(dataset, metrics=[faithfulness, answer_relevancy])Human eval — gold standard, но дорого. На небольшом наборе (50-100 примеров) для калибровки автоматических метрик.
Частые ошибки
Default chunk size 1000. Слишком много для embedding, теряется precision. 256-512 — лучший дефолт.
Только vector search. Нет recall на keyword-критичных queries. Hybrid почти всегда лучше.
Без reranking. Топ-5 vector search часто не оптимален. Reranker на top-50 → top-5 даёт значимый буст.
Игнорировать metadata. Filter по дате, автору, типу — повышает relevance. Vector search без metadata = «найти что-то похожее в всём корпусе».
Не chunking по структуре. Markdown / HTML с заголовками — chunk по секциям. Иначе теряется контекст.
Embedding модель «которая под рукой». Multilingual для русского, domain-specific где возможно. Бенчмарки на своём dataset.
Hallucinations не измерять. RAG может выдумывать даже с retrieved context. Faithfulness через RAGAS обязательна.
Один retrieval pass. Сложные queries требуют multi-hop. Decompose query → multiple retrievals → composite answer.
Связанные темы
- Embeddings на собесе DS
- Transformer на собесе DS
- Attention механизм для DS
- Подготовка к собесу Data Scientist
- Loss-функции на собесе DS
FAQ
Когда RAG vs fine-tuning?
RAG — когда данные часто обновляются, нужны source citations, бюджет ограничен. Fine-tuning — для устойчивого изменения стиля/формата ответа, когда данные стабильны.
Какой LLM выбрать для RAG?
Для качественного reasoning — GPT-4 / Claude. Для скорости и cost — Claude Haiku, Llama 3.1 8B. Open vs closed — зависит от requirements (privacy, on-prem).
Hybrid search в Pinecone/Qdrant работает?
Да, оба поддерживают через separate indexes (sparse + dense) и серверную RRF.
Как победить hallucinations?
Strict prompt («отвечай только на основе context, иначе скажи «не знаю»»), faithfulness eval, citation требование (LLM указывает source). Не панацея, но снижает в разы.
Сколько chunks подавать в LLM?
Зависит от context window и quality top-K. Обычно top-5 после reranking. Больше — шум, hallucinations растут.
Это официальная информация?
Нет. Статья основана на работах LangChain / LlamaIndex документации, RAGAS paper, общей практике production RAG.
Тренируйте Data Science — откройте тренажёр с 1500+ вопросами для собесов.