RAG на собеседовании Data Scientist

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Карьерник — 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.

Каждый 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)
Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

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 → LLM

Cross-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.

Связанные темы

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+ вопросами для собесов.