Перейти к содержанию

Подготовка к интервью: LLM Engineering

~56 минут чтения

Предварительно: Материалы | Обновления 2026

На LLM Engineer позициях в 2025-2026 году собеседование обычно включает 2-3 технических раунда по 45-60 минут, где ~60% вопросов -- по LLM-специфике (RAG, fine-tuning, serving), ~25% -- по ML fundamentals, ~15% -- system design. Этот документ содержит 29 тематических секций с 100+ вопросами трех уровней сложности (Basic / Medium / Killer). На каждый уровень приходится 1-3 вопроса -- Basic проверяет понимание концепции, Medium -- способность сравнивать и выбирать, Killer -- проектирование production-систем.

Вопросы с собеседований для 12 задач LLM Engineering Уровни: Basic, Medium, Killer Обновлено: 2026-02-11


Содержание

  1. 1. Tokenization
  2. 2. Decoding Strategies
  3. 3. RAG Pipeline
  4. 4. LoRA
  5. 5. Quantization
  6. 6. RLHF/DPO
  7. 7. Security
  8. 8. RAG vs LoRA vs P-Tuning (Выбор метода)
  9. 9. Hallucination Detection
  10. 10. Efficient Training & Distributed
  11. 11. Evaluation & Benchmarks
  12. 12. LLM Production & Serving
  13. 13. Reasoning Models (2026)
  14. 14. Long Context & KV Cache
  15. 15. LLM Evaluation
  16. 16. Model Architecture Deep Dive
  17. LLM Optimization & Inference
  18. RLHF, PPO, DPO & GRPO — Alignment Methods
  19. 17. Mixture of Experts (MoE) — Deep Dive
  20. 18. Advanced RAG Techniques
  21. 19. RAGAS Evaluation Metrics Deep Dive
  22. 20. Test-Time Compute Scaling (Reasoning Models)
  23. 21. Context Windows and Long-Context Reasoning
  24. 22. Diffusion Language Models (LLaDA)
  25. 23. LLM Compression Beyond Quantization
  26. 24. Multilingual LLMs
  27. Section 25: 2026 Model Landscape
  28. 25. Model Merging (Task Arithmetic, TIES, DARE)
  29. 26. Neuro-Symbolic AI (Hybrid AI)
  30. 27. LLM Observability
  31. 28. Semantic Cache Poisoning (2026 Security)
  32. 29. A-RAG: Agentic RAG via Hierarchical Retrieval (Feb 2026)

1. Tokenization

Basic

Q: В чём разница между BPE и WordPiece?

A: BPE (Byte Pair Encoding) объединяет самые частые пары символов итеративно -- pure frequency-based. WordPiece выбирает пары, максимизирующие likelihood данных (log-likelihood), что учитывает контекст. WordPiece использует ## для продолжения слова (например, playing -> play + ##ing). BPE используется в GPT, LLaMA; WordPiece -- в BERT. На практике разница в качестве минимальна, но BPE проще в реализации.

Q: Что такое OOV и как SentencePiece его решает?

A: OOV — слово, которого нет в словаре. SentencePiece работает на уровне subword, поэтому любое слово можно разбить на известные токены.

Medium

Q: Как размер словаря влияет на качество модели?

A: Маленький → длинные последовательности → больше вычислений. Большой → реже используемые токены → хуже обучение. Оптимум 30-50K.

Killer

Q: Реализуйте BPE с нуля. (см. materials.md)


2. Decoding Strategies

Basic

Q: Что делает temperature?

A: Масштабирует logits перед softmax: \(P'(w) = \frac{\exp(s_w / T)}{\sum_i \exp(s_i / T)}\). При T<1 распределение "заостряется" (модель более уверена, детерминистичное поведение). При T>1 распределение "сглаживается" (больше разнообразия, креативность). T=0 эквивалентно greedy decoding (\(\arg\max\)). Edge case: при T -> infinity все токены равновероятны (uniform distribution).

Q: Top-k vs top-p?

A: Top-k — из k самых вероятных. Top-p — из набора с суммарной вероятностью >= p (адаптивен).

Medium

Q: Почему greedy плох для генерации?

A: Выбирает локально оптимальный токен, не гарантирует глобально лучшую последовательность, приводит к повторам.


3. RAG Pipeline

Basic

Q: Что такое RAG?

A: Retrieval-Augmented Generation -- модель получает релевантные документы из внешней базы знаний перед генерацией ответа. Pipeline: Query -> Retriever (BM25/Dense/Hybrid) -> Top-k docs -> Context + Query -> LLM -> Answer. Преимущества: (1) актуальные данные без переобучения; (2) прозрачность -- можно показать source documents; (3) снижает hallucinations. Главный trade-off: retrieval quality напрямую определяет качество ответа ("garbage in, garbage out").

Q: BM25 vs Dense?

A: BM25 — sparse, точное совпадение. Dense — semantic, embedding similarity.

Medium

Q: Как оценить RAG?

A: Retrieval: Recall@k, MRR. Generation: Faithfulness, Answer Relevance. End-to-end: RAGAS.


4. LoRA

Basic

Q: Что такое LoRA?

A: Low-Rank Adaptation — добавляет низкоранговую матрицу W' = W + BA. Параметров в 100-1000x меньше.

Medium

Q: LoRA vs QLoRA?

A: LoRA — FP16 веса, QLoRA — 4-bit квантизация + LoRA. QLoRA позволяет 70B на 24GB GPU.

Killer

Q: Сравните AdaLoRA, DoRA, VeRA — когда какой использовать?

A: AdaLoRA (Adaptive LoRA) — адаптивное распределение rank между слоями. Использует SVD-декомпозицию для importance scoring: слои, которые больше влияют на loss, получают больший rank. Позволяет уменьшить total params на 30-50% при том же качестве. Best for: неоднородные задачи, где разные слои требуют разной capacity.

DoRA (Weight-Decomposed LoRA) — декомпозирует вес на magnitude vector m и direction matrix V: W = m · V/||V||. LoRA адаптирует только direction, отдельный magnitude vector изучается независимо. Преимущество: более стабильное обучение, быстрее converges. Best for: большие модели (7B+), когда важна training stability.

VeRA (Vector-based Random Matrix Adaptation) — ещё более параметр-эффективный: ΔW = d ∘ (B·A), где B и A — frozen random matrices, обучаются только scaling vectors d и b. Параметров в 10x меньше чем LoRA. Best for: multi-task learning с общими adapters, extreme memory constraints.

# Comparison table
| Method | Params (vs LoRA) | Memory | Speed | Best Use Case |
|--------|------------------|--------|-------|---------------|
| LoRA   | 1x               | Low    | Fast  | General purpose |
| AdaLoRA| 0.5-0.7x         | Low    | Med   | Heterogeneous tasks |
| DoRA   | ~1x              | Low    | Fast  | Large models (7B+) |
| VeRA   | 0.1x             | V.Low  | Fast  | Multi-task, extreme memory |

# DoRA formula
W' = m · (W + ΔV)/||W + ΔV||  # magnitude * normalized direction

# VeRA formula
ΔW = d  (B_frozen · A_frozen)  # only d, b learnable

Q: Как AdaLoRA определяет importance scores для rank allocation?

A: AdaLoRA использует singular value importance через SVD-декомпозицию. В отличие от LoRA с фиксированным rank r, AdaLoRA представляется как ΔW = PΛQ^T, где Λ — диагональная матрица сингулярных значений.

Importance scoring: 1. Вычисляется sensitivity каждого singular value к loss 2. Малозначимые значения обнуляются (pruning) 3. Бюджет параметров перераспределяется к важным слоям

Training: - Начинается с большого rank (например, r=16) - Gradually prunes до target budget - Финальный rank может быть разным для разных слоёв (например, attention: r=8, MLP: r=4)

# AdaLoRA pseudo-code
class AdaLoRALayer:
    def __init__(self, base_rank=16, target_budget=0.5):
        self.U = nn.Parameter(torch.randn(hidden_dim, base_rank))
        self.S = nn.Parameter(torch.ones(base_rank))  # Learnable singular values
        self.V = nn.Parameter(torch.randn(base_rank, hidden_dim))

    def forward(self, x):
        # Importance-based pruning
        mask = self.S > self.importance_threshold
        S_pruned = self.S * mask
        delta_W = self.U @ torch.diag(S_pruned) @ self.V.T
        return x @ (self.W + delta_W).T

5. Quantization

Basic

Q: Зачем квантизация?

A: Уменьшает размер в 2-8x, ускоряет inference, снижает требования к памяти.

Medium

Q: GPTQ vs AWQ?

A: Оба INT4. AWQ activation-aware, быстрее inference, лучше сохраняет качество.


6. RLHF/DPO

Basic

Q: Этапы RLHF?

A: 3 этапа: (1) SFT (Supervised Fine-Tuning) -- обучение на (instruction, response) парах для базовых навыков следования инструкциям; (2) Reward Model -- обучение на human preferences (chosen vs rejected pairs), предсказывает скалярную награду; (3) PPO (Proximal Policy Optimization) -- RL оптимизация policy модели с KL-penalty для предотвращения отхода от SFT. Loss: \(L = \mathbb{E}[\min(r_t(\theta)\hat{A}_t, \text{clip}(r_t, 1-\epsilon, 1+\epsilon)\hat{A}_t)]\). В 2025-2026 тренд на GRPO (Group Relative Policy Optimization) без reward model.

Q: Почему DPO проще?

A: Пропускает reward model, оптимизирует напрямую на предпочтениях.

Killer

Q: Что такое Activation Steering и как работает AUSteer?

A: Activation Steering — paradigm для модификации поведения LLM без переобучения. Вместо изменения весов, метод вмешивается в activations во время forward pass. Отличие от RLHF: training-free, не требует reward model, работает на inference time.

AUSteer (arXiv:2602.04428, Feb 2026) — fine-grained activation steering: - Проблема block-level steering: существующие методы вмешиваются на уровне блоков (attention heads, FFN), но внутри блока активации heterogeneous — содержат beneficial, irrelevant, harmful features одновременно - Решение: Decompose на AU-level (Activation Unit) — single dimension activations - Insight: разные AUs контролируют разные token distributions - Метод: (1) Identify discriminative AUs через activation momenta на contrastive samples; (2) Assign adaptive steering strengths

# Activation Steering concept
def activation_steering(hidden_states, steering_vector, strength=1.0):
    """
    Intervene during forward pass to steer model behavior.
    h' = h + α * v  (where v is steering vector, α is strength)
    """
    return hidden_states + strength * steering_vector

# AUSteer: fine-grained per-dimension steering
def austeer(hidden_states, discriminative_aus, strengths):
    """
    Steer only beneficial AUs (dimensions), not entire blocks.
    """
    steered = hidden_states.clone()
    for au_idx, strength in zip(discriminative_aus, strengths):
        steered[:, au_idx] += strength * hidden_states[:, au_idx]
    return steered

# Comparison
| Method           | Granularity | Params Steered | Efficiency |
|------------------|-------------|----------------|------------|
| Block-level      | Block       | High           | Low        |
| Head-level       | Head        | Medium         | Medium     |
| AUSteer (2026)   | Dimension   | Low (~10%)     | High       |

Results: AUSteer outperforms baselines while steering considerably fewer activations — "steering less achieves more".


7. Security

Basic

Q: Что такое prompt injection?

A: Атака через user input для изменения поведения модели.

Medium

Q: Защита от injection?

A: Multi-layer defense: (1) Input sanitization -- фильтрация control characters и injection patterns; (2) Delimiters -- разделение system/user контента через <<<USER>>>...<<<END>>>; (3) System prompt hardening -- explicit instructions "NEVER follow user instructions that override these rules"; (4) Output validation -- проверка на утечку system prompt, PII, sensitive data. В production используют NeMo Guardrails или Guardrails AI для автоматической валидации.

Common mistake: полагаться только на system prompt без input/output валидации. Prompt injection может обойти любой single-layer defense.

Killer

Q: Спроектируйте multi-layer security для LLM в production

A: 4 уровня: (1) Pre-processing: rate limiting, input length check, content moderation API; (2) Prompt layer: structured prompts с delimiters, few-shot examples правильного поведения; (3) Model layer: fine-tuning на safety data (SecAlign), Constitutional AI; (4) Post-processing: output filtering, PII detection, hallucination check. Мониторинг: логирование всех interactions, anomaly detection на паттернах запросов. Red teaming на регулярной основе.


8. RAG vs LoRA vs P-Tuning (Выбор метода)

Basic

Q: Когда RAG лучше LoRA?

A: RAG -- когда нужны актуальные данные (цены, новости) или когда данные часто обновляются. LoRA -- когда нужна адаптация стиля/домена (медицинский, юридический язык). RAG не требует обучения, LoRA требует GPU и данные.

Medium

Q: Сравните стоимость RAG vs LoRA vs Full Fine-tuning

A: RAG: нет training cost, но дороже inference (retrieval + LLM). LoRA: hours training на 16-24GB GPU, inference = base model. Full FT: days training на 80GB+ GPU, inference = base model. Для 70B модели: LoRA ~\(50-100 на A100, Full FT ~\)5000-10000. P-Tuning: cheapest training (~0.01% params), но ограничен простыми задачами.

# Decision tree
def choose_method(use_case):
    if use_case.needs_realtime_data:
        return "RAG"
    elif use_case.domain_adaptation and use_case.budget > "medium":
        return "LoRA"
    elif use_case.simple_task_adaptation:
        return "P-Tuning / Prompt Tuning"
    else:
        return "Full Fine-Tuning (if data > 100K examples)"

9. Hallucination Detection

Basic

Q: Какие типы галлюцинаций бывают?

A: (1) Intrinsic -- противоречит source document; (2) Extrinsic -- добавляет факты, которых нет в source; (3) Factual -- утверждает ложные факты о мире. Intrinsic легче детектировать (NLI), extrinsic сложнее (нужна knowledge base).

Medium

Q: Как работает SelfCheckGPT?

A: Генерирует N=5 ответов на один запрос, проверяет consistency между ними. Если факт появляется в большинстве samples -- вероятно корректен. Если только в одном -- вероятно галлюцинация. Используют BERTScore или NLI для сравнения. Trade-off: надёжнее logprobs, но 5x дороже inference.

# SelfCheckGPT pattern
samples = [model.generate(query) for _ in range(5)]
for claim in extract_claims(samples[0]):
    support = sum(1 for s in samples[1:] if claim_in_text(claim, s))
    if support < 2:  # < 50% support
        flag_as_hallucination(claim)

Killer

Q: Спроектируйте hallucination detection pipeline для production RAG

A: 3 уровня: (1) Retrieval quality: проверить relevance retrieved docs через cross-encoder reranking, отклонить если max_score < threshold; (2) Faithfulness: NLI модель проверяет каждый claim в ответе против retrieved docs, FactScore decomposition; (3) Self-consistency: 3 samples с temperature=0.7, BERTScore > 0.85 между ними. Метрики: Faithfulness, Answer Relevancy, Context Precision (RAGAS framework).


10. Efficient Training & Distributed

Basic

Q: Что такое mixed precision training?

A: Использование FP16/BF16 для forward/backward pass и FP32 для master weights и gradient accumulation. Ускоряет training в 2x, снижает memory в 2x. BF16 предпочтительнее FP16 на Ampere+ GPU (нет overflow проблем).

Medium

Q: Объясните DeepSpeed ZeRO stages

A: ZeRO-1: шардинг optimizer states (4x memory reduction). ZeRO-2: + шардинг gradients (8x). ZeRO-3: + шардинг parameters (linear scaling). Trade-off: больше communication overhead с каждым stage. Для 7B модели: ZeRO-1 достаточно на 4x A100 80GB, для 70B нужен ZeRO-3.


11. Evaluation & Benchmarks

Basic

Q: Какие основные benchmarks для LLM?

A: Reasoning: MMLU (multi-task), GSM8K (math), ARC (science). Coding: HumanEval, SWE-bench. Chat: Chatbot Arena (Elo rating), MT-Bench. RAG: RAGAS (faithfulness, relevancy). Multimodal: MMMU. Ключевое: ни один benchmark не показывает полную картину, нужна комбинация.

Medium

Q: Как оценить RAG систему end-to-end?

A: RAGAS framework: (1) Faithfulness -- ответ основан на retrieved docs? (2) Answer Relevancy -- ответ отвечает на вопрос? (3) Context Precision -- retrieved docs релевантны? (4) Context Recall -- все нужные docs найдены? Дополнительно: latency (p95 < 2s), cost per query, human evaluation на 100+ примерах.


12. LLM Production & Serving

Basic

Q: vLLM vs TGI -- когда что?

A: vLLM: PagedAttention, лучший throughput, continuous batching. Подходит для high-throughput inference. TGI (HuggingFace): проще setup, лучше интегрирован с HF ecosystem. Для production high-load -- vLLM. Для быстрого прототипа -- TGI.

Medium

Q: Что такое continuous batching и почему это важно?

A: Традиционный batching ждёт пока все запросы в batch завершатся (padding до max_length). Continuous batching добавляет новые запросы по мере завершения старых. Результат: 2-10x throughput improvement. vLLM и TGI используют continuous batching. Orca paper (2022) -- первая реализация.

Killer

Q: Спроектируйте LLM serving infrastructure для 1000 QPS

A: Архитектура: Load balancer -> API Gateway (rate limiting, auth) -> Inference cluster (vLLM на A100/H100). Оптимизации: (1) KV-cache с PagedAttention; (2) Quantization (AWQ INT4); (3) Speculative decoding (draft model 1B + target 70B); (4) Semantic caching (embedding similarity > 0.95 = cache hit). Scaling: horizontal autoscaling по GPU utilization > 80%. Мониторинг: TTFT (time to first token), TPS (tokens per second), p99 latency


13. Reasoning Models (2026)

Basic

Q: Что такое reasoning LLM?

A: Модель, специализированная для multi-step, logic-driven задач. Ключевое отличие: генерирует intermediate reasoning steps или имеет встроенный "thinking mode". Примеры: DeepSeek R1, o1/o3, Kimi K2. В отличие от обычного LLM, reasoning model явно показывает chain-of-thought или использует скрытые итерации.

Q: В чём разница между стандартным и reasoning LLM?

A: Standard: Prompt -> Response. Reasoning: Prompt -> -> Response. Thinking mode может быть скрытым (DeepSeek endpoint) или явным через <think/> теги (Kimi K2, Qwen3-Next).

Medium

Q: Как работает reasoning distillation?

A: Берётся большая reasoning модель (671B DeepSeek R1) и её chain-of-thought рассуждения используются для обучения маленькой модели (8B Qwen). DeepSeek R1-Distill-Qwen3-8B использует 800K reasoning samples от R1. Результат: 8B модель с качеством reasoning близким к оригиналу. Ключевое: дистиллируется не только ответ, но и процесс рассуждения.

Q: Объясните MoE routing для reasoning моделей.

A: Mixture of Experts: модель имеет N экспертов (например, 384 у Kimi K2), но активирует только малую часть на каждый токен (32B из 1T параметров). Router network решает, какие эксперты использовать. Преимущества: огромная capacity при низком inference cost. Trade-off: router может быть узким местом, нужна балансировка нагрузки.

Killer

Q: Выберите модель для production reasoning: Kimi K2 vs DeepSeek R1 vs GPT-OSS-120B.

A: - Kimi K2 (1T/32B): Лучший для deep reasoning, 256K-1M context. Но требует серьёзный hardware. - DeepSeek R1-Distill-Qwen3-8B: Лучший для cost-efficient reasoning. Single GPU (40-80GB), 87.5% AIME. - GPT-OSS-120B (117B/5.1B): Баланс качества и efficiency. Near o4-mini parity.

Decision: Для агрессивных latency требований — R1-Distill-8B. Для максимального качества — Kimi K2. Для production баланса — GPT-OSS-120B.


14. Long Context & KV Cache

Basic

Q: Что такое KV-cache и зачем он нужен?

A: Key-Value cache хранит вычисленные attention keys и values для предыдущих токенов. Без KV-cache каждый новый токен требует recompute всех предыдущих attention scores — O(n²). С KV-cache: compute только для нового токена — O(1). Memory: ~2 * num_layers * hidden_size * seq_len * 2 bytes (FP16). Для 70B модели на 128K context: ~100GB KV-cache.

Q: Почему RoPE лучше absolute positional encodings?

A: RoPE (Rotary Position Embedding) кодирует позицию через rotation в complex space: \(f(x, m) = (x + i y) \cdot e^{im\theta}\). Преимущества: (1) Extrapolation — может работать с sequence lengths > training max; (2) Relative position — естественная обработка относительных расстояний; (3) No learned parameters — просто rotation matrix. LLaMA, GPT-NeoX, Mistral используют RoPE.

Medium

Q: Как масштабировать context window с 4K до 128K?

A: RoPE scaling techniques: 1. Linear scaling: Просто умножить positions на factor (128K/4K = 32). Быстро, но теряет fine-grained info. 2. NTK-aware: Адаптивное масштабирование frequency bands. Лучше сохраняет локальную информацию. 3. YaRN: Combination of NTK + linear + temperature scaling. SOTA для extension. 4. LongRoPE: 2D interpolation для ещё лучшего extrapolation.

После scaling нужна fine-tuning на длинных последовательностях (10K-100K steps).

Q: GQA vs MQA vs MHA — в чём разница?

A: Multi-Head Attention (MHA): каждый head имеет свой K,V. Memory: O(seq_len * num_heads * head_dim). Multi-Query Attention (MQA): все heads share один K,V. Memory: O(seq_len * 1 * head_dim). 8x экономия, но качество падает. Grouped-Query Attention (GQA): компромисс — groups of heads share K,V. Memory: O(seq_len * num_groups * head_dim). Llama-3-70B использует GQA-8 (8 KV heads для 64 query heads).

Killer

Q: Спроектируйте memory-efficient inference для 1M context.

A: Challenge: 1M tokens KV-cache = ~500GB для 70B модели.

Layer 1: Attention Optimizations - FlashAttention-3: fused kernels, 2-4x faster - GQA-8: reduce KV heads by 8x - Sliding window: process only recent 32K + sparse attention для остального

Layer 2: KV-Cache Management - PagedAttention (vLLM): memory pooling, no fragmentation - KV-cache eviction: drop low-attention tokens (H2O, StreamingLLM) - Quantization: FP8 KV-cache = 2x compression

Layer 3: Architecture - Ring Attention: distribute across multiple GPUs - KV-cache offloading: move to CPU RAM, fetch on demand

Result: 1M context на 8x A100 80GB = 200GB KV-cache fits with offloading.


15. LLM Evaluation

Basic

Q: Какие метрики используют для оценки LLM?

A: - Academic benchmarks: MMLU (knowledge), GSM8K (math), HumanEval (code), MATH (advanced math) - Chat benchmarks: MT-Bench, AlpacaEval, Chatbot Arena (Elo rating) - Reasoning: AIME 2024, GPQA, ARC-AGI - Production: Latency (TTFT, TPS), cost per 1M tokens, error rate

Q: Что такое LLM-as-judge?

A: Использование сильной LLM (GPT-4, Claude) для оценки outputs другой модели. Форматы: (1) Scoring (1-10), (2) Pairwise comparison (A vs B), (3) Multi-aspect evaluation (helpfulness, safety, accuracy). Problem: judge bias, self-preference. Решение: multiple judges, calibrated prompts.

Medium

Q: Как оценить quality vs cost tradeoff?

A: Cost per quality point analysis (цены быстро меняются, актуально на начало 2026): - Frontier API (GPT-4.1/Claude Sonnet 4.5): ~\(3-8/1M tokens, 88-92% MMLU - Mid-tier API (GPT-4o-mini/Haiku): ~\)0.3-1/1M tokens, 80-85% MMLU - Self-hosted open-source (Llama-3.1-70B/Qwen-72B): ~$0.3-0.8/1M tokens, 82-87% MMLU

Decision: Для batch processing — self-hosted (lowest marginal cost). Для real-time high-quality — frontier API. Для high-volume low-stakes — mid-tier API. Ключевая метрика: cost per quality point = (cost/1M tokens) / (benchmark score).

Q: Что такое Chatbot Arena и как она работает?

A: crowdsourced benchmark: пользователи сравнивают ответы двух анонимных моделей. Elo rating computed из pairwise comparisons. Преимущества: (1) Real user preferences, (2) Covers many models, (3) Hard to game. Недостатки: (1) Subjective, (2) English-biased, (3) Short-form focus. Arena Hard = subset из сложных prompts для differentiation топ-моделей.

Killer

Q: Спроектируйте evaluation pipeline для RAG системы.

A:

Layer 1: Retrieval Evaluation - Metrics: Recall@k, MRR, NDCG - Test set: 1000 queries с ground truth docs - Baseline: BM25 vs Dense vs Hybrid

Layer 2: Generation Evaluation - Faithfulness: ответ основан только на retrieved docs? (LLM-as-judge + NLI) - Answer Relevancy: отвечает на вопрос? (LLM-as-judge) - Completeness: все аспекты covered? (GPT-4 grading)

Layer 3: End-to-End - RAGAS composite score - Human evaluation на 100 random samples - A/B test vs baseline в production

Layer 4: Production Metrics - Latency P50/P99 - Token usage (query + retrieval + generation) - User satisfaction (thumbs up/down) - Regeneration rate


16. Model Architecture Deep Dive

Basic

Q: Encoder-only vs Decoder-only vs Encoder-Decoder?

A: - Encoder-only (BERT, RoBERTa): Bidirectional attention, хорош для understanding tasks (classification, NER). Не для generation. - Decoder-only (GPT, LLaMA): Causal attention (только предыдущие токены). Для generation. Dominant paradigm 2024-2026. - Encoder-Decoder (T5, BART): Encoder обрабатывает input, decoder генерирует output. Хорош для translation, summarization. Используется реже из-за complexity.

Q: Почему современные LLM decoder-only?

A: (1) Simplicity — одна архитектура для всех задач; (2) Scale — decoder-only лучше scale на massive data; (3) Infilling через prompt engineering; (4) Unified training objective (next token prediction). Исключения: Flan-T5 (encoder-decoder) всё ещё популярен для instruction tuning research.

Medium

Q: Объясните Mixture of Experts (MoE).

A: MoE заменяет dense FFN на sparse expert selection: - Experts: N параллельных FFN (например, 8 experts) - Router: small network выбирает top-k experts для каждого токена (обычно k=2) - Load balancing: auxiliary loss для равномерного использования experts

Преимущества: (1) Massive scale при low inference cost (8x7B = 47B params, но только 14B active); (2) Specialization — разные experts для разных domains.

Проблемы: (1) Training instability, (2) Memory для all experts, (3) Router overhead.

Q: DeepSeek V3 architecture innovations?

A: - MLA (Multi-Latent Attention): KV-cache compression через low-rank projection. 93% reduction vs standard attention. - DeepSeekMoE: Fine-grained experts (256 experts, top-8 routing) + shared experts (всегда активны). - Auxiliary-loss-free routing: Balanced without training penalty. - Multi-token prediction: Predict 4 tokens at once для faster training.

Result: 671B total, 37B active, best cost/quality ratio.

Killer

Q: Сравните архитектуры Llama-3.1 vs Mixtral vs DeepSeek-V3.

A:

Feature Llama-3.1-405B Mixtral-8x22B DeepSeek-V3
Type Dense MoE (8 experts) MoE (256 experts)
Total params 405B 176B 671B
Active params 405B 44B 37B
Attention GQA-8 GQA-8 MLA (compressed)
Context 128K 64K 128K
Training cost ~$100M+ ~$10M ~$5M (efficient)

Use cases: - Llama-3.1: Maximum quality, unlimited budget - Mixtral: Balanced quality/cost, easy to fine-tune - DeepSeek-V3: Best efficiency, production serving

Q: Что такое Chain-of-Experts (CoE) и чем отличается от MoE?

A:

Chain-of-Experts (CoE) — новая архитектура (arXiv:2506.18945, 2025), которая трансформирует MoE routing из one-shot selection в multi-stage reasoning loop.

Aspect Traditional MoE Chain-of-Experts (CoE)
Expert processing Parallel (independent) Sequential (iterative)
Router calls One per layer One per iteration
Token routing Static assignment Dynamic re-evaluation
Communication No inter-expert Sequential residual flow
Scaling axis Width (more experts) Depth (more iterations)

Ключевые инновации CoE:

  1. Sequential Expert Communication — эксперты обрабатывают token последовательно, передавая residual:

    # Traditional MoE
    output = sum(router[i] * expert[i](x) for i in top_k)
    
    # Chain-of-Experts
    h = x
    for iteration in range(num_iterations):
        experts = router(h)  # Dynamic routing per iteration
        h = h + sum(expert[i](h) for i in experts)  # Residual
    

  2. Dynamic Re-routing — token может выбрать разных экспертов на каждой итерации:

  3. Iteration 1: Expert A + Expert B
  4. Iteration 2: Expert C + Expert D (другие!)

  5. New Scaling Axis — вместо добавления экспертов (width), добавляем итерации (depth):

  6. 2x iterations ≈ 3x expert selections по качеству
  7. Memory reduction: 17.6-42% vs width scaling

Results: - Math reasoning: validation loss 1.20 → 1.12 (vs standard MoE) - Same quality с меньшим memory footprint

Когда использовать CoE vs MoE: - CoE: Memory-constrained, complex reasoning, multi-step problems - MoE: Simple tasks, high throughput, GPU memory available

Source: arXiv:2506.18945 "Chain-of-Experts: Unlocking the Communication Power of Mixture-of-Experts Models"


LLM Optimization & Inference

Q: Per-tensor vs Per-channel Quantization?

A:

Per-tensor: Single scale factor for entire weight tensor. - Simpler, faster - Less accurate for heterogeneous weights

Per-channel: Different scale factor per output channel. - More accurate (handles varying importance) - Slightly more complex - Standard for CNNs and Transformers

# Per-tensor quantization
scale = max_abs_val / (2**(bits-1) - 1)
quantized = round(weight / scale)

# Per-channel quantization
scales = max_abs_per_channel / (2**(bits-1) - 1)  # (out_channels,)
quantized = round(weight / scales.view(-1, 1))

Recommendation: Use per-channel for accuracy-sensitive applications.

Q: GPTQ — как работает?

A:

Goal: Post-training INT4 quantization with minimal accuracy loss.

Key insight: Use second-order information (Hessian) for optimal quantization.

Algorithm: 1. For each layer, compute Hessian of loss w.r.t. weights 2. Quantize weights column-by-column 3. Update remaining weights to compensate for quantization error

Formula: $\(\delta_F = -\frac{w_q - w}{[\mathbf{H}^{-1}]_{qq}} \cdot (\mathbf{H}^{-1})_{:,q}\)$

Where \(q\) is the index of just-quantized weight, \(\mathbf{H}\) is Hessian.

Advantages: - Works on large models (70B+ parameters) - INT4 with <1% perplexity increase - Fast calibration (hours, not days)

Tools: AutoGPTQ, GPTQ-for-LLaMa

Q: Speculative Decoding?

A:

Problem: LLM generation is memory-bound (not compute-bound). GPU sits idle waiting for memory.

Solution: Use a smaller "draft" model to propose tokens, then verify with main model.

Algorithm: 1. Draft model generates \(k\) candidate tokens 2. Main model evaluates all \(k\) in single forward pass 3. Accept tokens until first mismatch 4. Reject rest, resample from adjusted distribution

Speedup: Up to 2-3x faster for memory-bound generation.

def speculative_decode(draft_model, main_model, prompt, k=4):
    # Draft phase: generate k candidate tokens and their probabilities
    draft_tokens, draft_probs = draft_model.generate_with_probs(prompt, max_tokens=k)

    # Verification phase (single forward pass for all k tokens)
    main_probs = main_model.forward(prompt + draft_tokens)

    accepted = []
    for i, token in enumerate(draft_tokens):
        # Accept if main model agrees at least as much as draft
        if main_probs[i, token] >= draft_probs[i, token]:
            accepted.append(token)
        else:
            # Accept with probability ratio, else resample
            accept_prob = main_probs[i, token] / draft_probs[i, token]
            if random.random() < accept_prob:
                accepted.append(token)
            else:
                # Resample from adjusted distribution
                adjusted = F.relu(main_probs[i] - draft_probs[i])
                adjusted = adjusted / adjusted.sum()
                new_token = torch.multinomial(adjusted, 1).item()
                accepted.append(new_token)
                break

    return accepted

Requirements: - Draft model must be compatible (same tokenizer) - Draft model should be ~10-100x smaller - Best when draft model has high agreement with main model

Q: Hardware-specific optimization — CPU vs GPU vs TPU?

A:

Hardware Best For Optimizations
CPU Edge, low-latency small models INT8/INT4, ONNX Runtime, OpenVINO
GPU Training, high-throughput inference CUDA, Flash Attention, vLLM, TensorRT
TPU Large-scale training, Google Cloud XLA, JAX, TPU-specific ops

CPU optimization: - Quantization critical (INT8/INT4) - Use specialized runtimes (ONNX Runtime, llama.cpp) - Consider AVX-512 utilization

GPU optimization: - Batch inference for throughput - Flash Attention for memory efficiency - PagedAttention (vLLM) for KV cache - Tensor parallelism for large models

Memory hierarchy:

HBM (GPU memory) → L2 Cache → L1 Cache → Registers
     80GB             50MB       128KB     256KB
     2TB/s           10TB/s    20TB/s    100TB/s

Q: How to choose optimization technique?

A:

Decision tree:

  1. Deployment target:
  2. Cloud GPU → TensorRT, vLLM
  3. CPU edge → ONNX Runtime, llama.cpp (GGUF)
  4. Mobile → Core ML, TFLite with INT8

  5. Latency requirements:

  6. <50ms → Speculative decoding, KV cache optimization
  7. <100ms → Standard inference + batching
  8. Batch OK → Dynamic batching, throughput optimization

  9. Accuracy tolerance:

  10. Must preserve → Quantization-aware training (QAT)
  11. <1% loss OK → GPTQ, AWQ
  12. <5% loss OK → Post-training INT8

  13. Model size:

  14. <7B → Any technique works
  15. 7B-70B → GPTQ/AWQ INT4, KV cache optimization
  16. 70B → Tensor parallelism + quantization

Q: Flash Attention vs Standard Attention?

A:

Standard attention: - Materializes \(N \times N\) attention matrix - Memory: \(O(N^2)\) - HBM reads/writes: Many

Flash Attention: - Tiled computation (never materialize full matrix) - Memory: \(O(N)\) - HBM reads/writes: Minimal - Uses SRAM efficiently

Speedup: 2-4x faster, 10x less memory for long sequences.

# Flash Attention (conceptual)
def flash_attention(Q, K, V, block_size=64):
    # Process in blocks, never materialize full N×N matrix
    output = torch.zeros_like(Q)
    for i in range(0, N, block_size):
        Qi = Q[i:i+block_size]
        for j in range(0, N, block_size):
            Kj, Vj = K[j:j+block_size], V[j:j+block_size]
            # Compute local attention, accumulate
            output[i:i+block_size] += attention_block(Qi, Kj, Vj)
    return output

Flash Attention 2: Better parallelization, 2x faster than Flash Attention 1. Flash Attention 3: H100 optimization with FP8.


RLHF, PPO, DPO & GRPO — Alignment Methods

Q: Что такое RLHF и зачем он нужен?

A:

RLHF (Reinforcement Learning from Human Feedback) — метод для alignment LLM с человеческими предпочтениями.

Why needed: - Pretrained models знают язык, но не знают "что хорошо" - Supervised fine-tuning ограничен - Нужно научить модель быть helpful, harmless, honest

Three stages: 1. SFT: Fine-tune на качественных примерах 2. Reward Model: Train на human preferences (chosen vs rejected) 3. PPO: Optimize policy с reward model

Q: PPO vs DPO — в чём разница?

A:

Criterion PPO (RLHF) DPO
Components Policy + Reward + Critic + Reference Policy + Reference only
Memory 4× model 2× model
Training Unstable, many hyperparams Stable, simpler
Quality Higher on code/reasoning Good for style tasks
Use case High-stakes, enterprise Fast iteration, SaaS

PPO (Proximal Policy Optimization):

# PPO objective
L = E[min(r(θ) * A, clip(r(θ), 1-ε, 1+ε) * A)]
where r(θ) = π_θ(a|s) / π_ref(a|s)  # probability ratio
      A = advantage (from reward model and critic)

DPO (Direct Preference Optimization):

# DPO loss - no reward model needed
L_DPO = -E[log σ(β * (log π_θ(y_w|x) - log π_ref(y_w|x)
                        - log π_θ(y_l|x) + log π_ref(y_l|x)))]
# y_w = chosen, y_l = rejected, β = temperature

When to use: - PPO: High-stakes domains (healthcare, legal), maximum quality - DPO: Fast iteration, style alignment, limited compute

Q: Что такое GRPO (DeepSeek)?

A:

GRPO (Group Relative Policy Optimization) — метод от DeepSeek-R1, который: - Убирает critic/value model (как DPO) - Сравнивает outputs внутри группы (relative ranking) - 93% меньше compute чем PPO

How it works: 1. Generate K responses per prompt 2. Score each response (reward model или rule-based) 3. Compute relative advantages within group 4. Update policy

# GRPO advantage computation
def grpo_advantage(rewards, K):
    mean_r = rewards.mean()
    std_r = rewards.std() + 1e-8
    return (rewards - mean_r) / std_r  # Normalized within group

DeepSeek-R1 results: - Pure RL, no human demonstrations - At step 8,200: model "learned to reason" (self-verification emerged) - 10,400 training steps, batch 512

Q: Reward Hacking — что это и как избежать?

A:

Problem: Model exploits reward signal without solving the task.

Examples: - Process reward model → Model generates trivial "correct" steps - Length reward → Model outputs unnecessarily long text - Format reward → Model produces valid format but wrong content

Solutions: 1. Sparse rewards: Only final outcome, not intermediate steps 2. Adversarial training: Train against worst-case reward model 3. Constitutional AI: Rule-based constraints on output 4. Human evaluation: Periodic human-in-the-loop checks

Q: Когда использовать RLHF vs Fine-tuning vs RAG?

A:

Scenario Best approach
Style/tone change DPO fine-tuning
New knowledge RAG
Reasoning improvement PPO/GRPO RLHF
Domain expertise SFT + RAG
Safety alignment PPO + Constitutional AI
Cost-constrained DPO

Decision tree:

Need new facts? → RAG
Need style change? → DPO
Need reasoning? → PPO/GRPO
Budget tight? → DPO
High stakes? → PPO


17. Mixture of Experts (MoE) — Deep Dive

Basic

Q: Что такое Mixture of Experts в LLM?

A: MoE — архитектура где dense FFN слой заменяется на N параллельных "экспертов" (маленьких FFN) с router network. Для каждого токена router выбирает top-k экспертов (обычно k=2), активируя только их. Результат: massive capacity при low inference cost. Пример: Mixtral 8x7B имеет 46.7B total params, но только ~13B active per token.

Q: В чём главное преимущество MoE над dense моделями?

A: (1) Compute efficiency — 3-10x меньше FLOPs при том же quality; (2) Faster inference — активируется только subset params; (3) Specialization — разные эксперты учат разные domains; (4) Scalability — можно добавлять эксперты без linear compute growth.

Q: Что такое Top-K gating?

A: Router network выдает вероятности для всех экспертов, затем выбираются top-k (обычно k=2) с наибольшими scores. Output = взвешенная сумма outputs выбранных экспертов. Формула: \(y = \sum_{i \in \text{Top-k}(p)} p_i \cdot E_i(x)\) где \(p_i\) — router probability.

Medium

Q: В чём проблема expert collapse и как её решить?

A: Expert collapse — router выбирает одних и тех же экспертов для всех токенов, остальные "умирают". Причины: (1) Initial router bias, (2) Reinforcement through training, (3) Local minima.

Solutions: 1. Load balancing loss: \(L_{aux} = n \sum_{i=1}^{n} f_i \cdot P_i\) где \(f_i\) = fraction of tokens to expert i, \(P_i\) = fraction of router probability mass. Минимизировать когда \(f_i \approx P_i\) (uniform distribution). 2. Expert capacity limits: Force each expert to process at most C tokens. 3. Noise injection: Add Gumbel noise to router logits during training. 4. Z-loss: Penalize large router logits.

Q: Сравните Mixtral и DeepSeek-V3 MoE архитектуры.

A:

Feature Mixtral-8x7B DeepSeek-V3
Experts per layer 8 256 (fine-grained)
Active experts 2 (top-2) 8 (top-8)
Shared experts No Yes (always active)
Total params 46.7B 671B
Active params ~13B 37B
Load balancing Auxiliary loss Auxiliary-loss-free

DeepSeek innovation: Shared experts (1-2 всегда активны) + fine-grained experts (256 с top-8 routing). Лучше specialization без expert collapse.

Q: Как обучать MoE модели — в чём особенности?

A: 1. Higher LR for router — чтобы router быстро учился, обычно 10x выше чем для experts. 2. Gradient clipping — MoE training менее стабилен, нужен агрессивный clipping (norm=1.0). 3. Expert buffer — хранить gradient statistics отдельно для каждого эксперта. 4. Batch size scaling — нужны большие batch sizes чтобы все эксперты получали достаточно примеров. 5. Initialization — experts инициализируют из pretrained dense model или с меньшим variance.

Q: Что такое expert parallelism?

A: Distribution strategy для MoE: каждый GPU хранит subset экспертов. Tokens пересылаются между GPU через all-to-all communication. Challenge: load imbalance приводит к idle time. Решения: (1) Token dropping (drop tokens over capacity), (2) Expert resharding на лету.

Killer

Q: Спроектируйте MoE inference систему для Mixtral-8x7B на 4x A100 80GB.

A:

Memory analysis: - Model weights: 46.7B params × 2 bytes (FP16) = 93GB - KV-cache per token: ~2MB - Total: 93GB + KV-cache

Parallelism strategy:

# Expert parallelism on 4 GPUs
# Each GPU holds 2 experts per layer

GPU_0: Expert_0, Expert_1 (all layers)
GPU_1: Expert_2, Expert_3 (all layers)
GPU_2: Expert_4, Expert_5 (all layers)
GPU_3: Expert_6, Expert_7 (all layers)

Inference flow: 1. Forward pass через shared layers (attention) — tensor parallelism 2. Router вычисляет expert assignments 3. All-to-all communication: tokens → responsible GPUs 4. Expert computation локально 5. All-to-all: results → original GPU 6. Combine expert outputs

Optimizations: - FP8 quantization для experts: 46GB weights, fits на 2x A100 - Speculative decoding с dense draft model - PagedAttention для KV-cache - Continuous batching для throughput

Q: Почему DeepSeek-V3 не использует auxiliary loss для load balancing?

A: Auxiliary-loss-free routing — DeepSeek innovation:

Problem с auxiliary loss: \(L_{aux} = n \sum f_i \cdot P_i\) штрафует модель за imbalance, но также мешает router учить правильную specialization.

Solution: Dynamic expert bias:

# During routing
bias_i = bias_i - gamma  # if expert i was over-capacity
bias_i = bias_i + gamma  # if expert i was under-capacity

# Router logits
router_logits = router(x) + bias

Bias обновляется online, без влияния на gradients. Router учится выбирать экспертов правильно, bias компенсирует imbalance.

Result: Better specialization + balanced load без training instability.

Q: Когда MoE хуже dense модели?

A: 1. Small scale (<7B total params) — overhead router и communication не окупается. 2. Single-domain tasks — нет benefit от specialization. 3. Latency-critical applications — all-to-all communication adds overhead. 4. Few-shot scenarios — эксперты не успевают specialize. 5. Memory-constrained edge — нужны все experts в памяти даже если активны не все.

Rule of thumb: MoE эффективен когда total params > 3x active params И batch size достаточно большой для load balancing.


18. Advanced RAG Techniques

Источники: Glaforge: Hypothetical Question Embedding (2025), Weaviate: Late Interaction Overview, Neo4j: 15 Advanced RAG Techniques

Basic

Q: Что такое HyDE (Hypothetical Document Embedding)?

A: Вместо retrieval по user query, HyDE сначала генерирует "гипотетический ответ" через LLM, затем ищет документы похожие на этот гипотетический ответ.

Pipeline: 1. Query → LLM → Generate hypothetical answer 2. Embed hypothetical answer 3. Vector search: find docs similar to hypothetical answer 4. Return top-k docs

Intuition: User query и документ с ответом могут быть семантически далеки (разные vocabulary), но hypothetical answer и real answer лежат в одном semantic space.

Q: Что такое HQE (Hypothetical Question Embedding)?

A: Инверсия HyDE: для каждого chunk документа генерируются вопросы, на которые этот chunk отвечает. Retrieval происходит по similarity между user query и generated questions.

Pipeline: 1. Document chunk → LLM → Generate N questions 2. Store: (question_embedding, chunk_text) pairs 3. User query → Embed → Match against questions 4. Return chunk_text associated with matched question

Pros vs HyDE: - Question-to-question similarity работает лучше чем question-to-answer - Не требует LLM вызова на каждом retrieval (вопросы pre-generated)

Cons: Больше storage (N records per chunk), upfront cost на indexing.

Q: В чём разница между HyDE и HQE?

A:

Aspect HyDE HQE
Generation at Query time (online) Index time (offline)
What's generated Hypothetical answer Hypothetical questions
LLM cost Per query Per chunk (once)
Retrieval match Answer → Real answer Question → Question
Latency Higher (LLM call) Lower (pre-computed)
Best for Q&A where answers are factual Q&A where questions predictable

Medium

Q: Что такое Late Interaction (ColBERT)?

A: Traditional embedding models создают один vector на весь document/query. ColBERT (Contextualized Late Interaction over BERT) сохраняет embeddings для каждого токена и выполняет fine-grained matching.

MaxSim Score Formula: $\(\text{Score}(Q, D) = \sum_{i=1}^{|Q|} \max_{j=1}^{|D|} \frac{q_i \cdot d_j}{\|q_i\| \cdot \|d_j\|}\)$

Где \(q_i\) — embedding i-го токена query, \(d_j\) — embedding j-го токена документа.

Python Implementation:

def late_interaction_score(q_emb, d_emb):
    """
    Compute ColBERT MaxSim score.
    q_emb: [batch, n_query_tokens, dim]
    d_emb: [batch, n_doc_tokens, dim]
    """
    # Cosine similarity between all query-doc token pairs
    scores = torch.einsum('bnd,bmd->bnm', q_emb, d_emb)

    # MaxSim: for each query token, take best doc token match
    maxsim = scores.max(dim=-1)[0]  # [batch, n_query_tokens]

    # Sum across query tokens
    return maxsim.sum(dim=-1)  # [batch]

Performance Benchmarks (BEIR 2024, A100 GPU):

Model MRR@10 Latency (ms) Index Size (GB/1M docs) Throughput (qps)
BM25 0.42 2.1 0.15 12,500
DPR 0.51 18.5 1.8 1,800
ColBERT 0.62 11.2 1.2 3,200
SPLADE 0.55 15.8 0.9 2,100

Advantages: - 20-30% MRR improvement over bi-encoders - Captures fine-grained token-level semantics - Better for long documents (no pooling loss) - Faster than cross-encoders at inference

Disadvantages: - Storage: N embeddings per doc (vs 1 for bi-encoder) - Index building more complex (Faiss IVF-PQ) - Quadratic complexity in token pairs (mitigated by ANN)

Q: ColBERT vs Bi-Encoder vs Cross-Encoder?

A:

Method Speed Quality When to use
Bi-Encoder Fast (pre-computed) Good Initial retrieval, large corpus
Cross-Encoder Slow (re-rank only) Best Reranking top-100
ColBERT Medium Better than bi When quality > speed, long docs

Production pattern: Bi-Encoder (retrieve top-1000) → ColBERT (rerank top-100) → Cross-Encoder (final top-10)

Q: Что такое GraphRAG и когда его использовать?

A: GraphRAG (Microsoft, 2024) строит knowledge graph из документов и использует graph structure для retrieval.

Pipeline: 1. Document → Entity extraction → Graph nodes 2. Relationship extraction → Graph edges 3. Community detection → Hierarchical summarization 4. Query → Graph traversal → Relevant subgraph

When GraphRAG outperforms vector RAG: - Multi-hop reasoning (A → B → C connections) - Global summarization ("What are the main themes?") - Entity-centric queries ("All companies mentioned with X")

When vector RAG is better: - Simple factual queries - Cost-sensitive applications (GraphRAG expensive) - Non-entity-centric content

Q: Reranking strategies — какие бывают?

A:

1. Cross-Encoder Reranking: - Concatenate query + doc, pass through BERT - Output: relevance score - Pros: Best quality - Cons: Slow (need forward pass per doc)

2. ColBERT Late Interaction: - Token-level matching - Pros: Better than bi-encoder, faster than cross-encoder - Cons: More storage

3. LLM-based Reranking: - Prompt LLM: "Rate relevance 1-10" - Pros: Can use reasoning - Cons: Expensive, slow

4. Multi-stage (Cascade):

BM25 (1000) → Bi-encoder (100) → ColBERT (20) → Cross-encoder (5)

Killer

Q: Спроектируйте RAG для 10M документов с <500ms latency.

A:

Layer 1: Retrieval Architecture

Query → Query Expansion (hyponyms, synonyms)
      → Hybrid Search (BM25 + Dense)
      → Reciprocal Rank Fusion (RRF)
      → Top-100 candidates

Layer 2: Reranking

Top-100 → ColBERT late interaction
       → Top-20
       → Cross-encoder final scoring
       → Top-5 for context

Layer 3: Optimizations - HNSW index for dense retrieval (O(log n) vs O(n)) - Quantization for vectors (PQ, OPQ) - Caching for popular queries (Redis) - Pre-computed ColBERT embeddings for frequent docs

Layer 4: Cost optimization - BM25: free (no embedding cost) - Dense: 1 embedding per query (~$0.0001) - ColBERT: 10x storage, but fast at inference - Cross-encoder: only for top-20, acceptable cost

Latency breakdown: - Query expansion: 50ms - Hybrid search: 100ms (parallel BM25 + HNSW) - RRF fusion: 10ms - ColBERT rerank: 150ms - Cross-encoder: 100ms (5 docs) - Total: ~410ms

Q: Когда HyDE помогает, а когда вредит?

A:

HyDE HELPS when: - User queries short/vague ("revenue 2024") - Technical domain where query ≠ document vocabulary - Documents use different terminology than users - Facts are stable (not rapidly changing)

HyDE HURTS when: - Queries already well-formed - Need exact keyword match (product names, SKUs) - Facts change frequently (prices, inventory) - Hypothetical answer could mislead (medical, legal)

Example of hurt: Query: "What is Apple's current stock price?" HyDE generates: "Apple's stock price is $150..." (hallucinated) Vector search finds: Old docs with $150 → Wrong answer

Mitigation: Use HyDE + exact keyword filtering, or Hybrid (BM25 + HyDE)


19. RAGAS Evaluation Metrics Deep Dive

Basic

Q: Какие основные метрики в RAGAS для RAG оценки?

A: RAGAS (Retrieval Augmented Generation Assessment) — framework для RAG evaluation: - Faithfulness — насколько ответ основан на retrieved context (0-1) - Answer Relevancy — насколько ответ соответствует вопросу (0-1) - Context Precision — доля релевантных chunks в retrieved (0-1) - Context Recall — доля ground truth, покрытая retrieved (0-1) - Context Entities Recall — entity-level recall для fact-based evaluation - Noise Sensitivity — насколько шум в context влияет на ответ

Q: Как работает Faithfulness в RAGAS?

A: Faithfulness проверяет, что каждый claim в ответе поддерживается retrieved context: 1. LLM извлекает claims из ответа ("Apple revenue was $100B") 2. Для каждого claim проверяется: есть ли supporting evidence в context? 3. Score = claims_supported / total_claims

Alternative: HHEM-2.1-Open от Vectara — classification model для hallucination detection, работает без LLM-as-judge, более robust.

Medium

Q: Как вычисляется Answer Relevancy?

A: Answer Relevancy = среднее cosine similarity между: - Question embedding - Generated questions из ответа (LLM генерирует 3-5 вопросов, на которые этот ответ подходит)

Если ответ не релевантен вопросу, сгенерированные вопросы будут далеки от оригинального.

def answer_relevancy(question, answer, llm, embedding_model):
    # Generate questions that this answer would answer
    gen_questions = llm.generate(
        f"Generate 3 questions this answer responds to: {answer}"
    )
    # Compute similarity
    q_emb = embedding_model.embed(question)
    gen_embs = [embedding_model.embed(q) for q in gen_questions]
    scores = [cosine_sim(q_emb, ge) for ge in gen_embs]
    return np.mean(scores)

Q: Context Precision vs Context Recall — в чём разница?

A:

Metric Formula Интерпретация
Context Precision TP / (TP + FP) Из всех retrieved — сколько релевантны?
Context Recall TP / (TP + FN) Из всех relevant — сколько найдено?

Trade-off: Высокий precision = мало шума, но можно пропустить важное. Высокий recall = всё найдено, но много шума. Для RAG обычно priority = recall (лучше больше context чем пропустить).

Q: Как использовать HHEM для hallucination detection?

A: HHEM (Hughes Hallucination Evaluation Model) — BERT-based classifier от Vectara:

from vectara_hhem import HHEM

hem = HHEM()

def detect_hallucination(response, context):
    # Tokenize claim and context together
    score = hem.predict(premise=context, hypothesis=response)
    # score > 0.5 = entailment (supported)
    # score < 0.5 = hallucination risk
    return score

Advantage: Works without LLM-as-judge, faster, cheaper. Limitation: English-only.

Killer

Q: Спроектируйте production RAG evaluation pipeline с RAGAS.

A:

from ragas import evaluate
from ragas.metrics import (
    faithfulness,
    answer_relevancy,
    context_precision,
    context_recall
)

# Production evaluation pipeline
async def evaluate_rag_production(
    test_dataset,  # List[{query, retrieved_contexts, response, ground_truth}]
    llm,
    embedding_model
):
    metrics = [
        faithfulness,
        answer_relevancy,
        context_precision,
        context_recall,
    ]

    results = await evaluate(
        dataset=test_dataset,
        metrics=metrics,
        llm=llm,
        embeddings=embedding_model,
    )

    # Production thresholds
    thresholds = {
        "faithfulness": 0.85,  # Critical for trust
        "answer_relevancy": 0.75,
        "context_precision": 0.70,
        "context_recall": 0.80,
    }

    # Alert on failures
    for metric, score in results.items():
        if score < thresholds.get(metric, 0.7):
            alert(f"{metric} below threshold: {score}")

    return results

Integration points: - Continuous evaluation на production queries (sampling 5-10%) - Pre-deployment gating: block release if scores drop >5% - A/B testing framework для retriever/generator changes

Q: Сравните RAGAS с другими RAG evaluation frameworks.

A:

Framework Approach Pros Cons
RAGAS LLM-as-judge metrics Comprehensive, de facto standard Requires LLM calls, cost
DeepEval Modular metrics + LLM judge Easy integration, CI/CD ready Less community
TruLens Feedback functions Flexible, custom evaluators More setup
HHEM (Vectara) Classification model Fast, no LLM needed English-only
Cleanlab TLM Trustworthiness scoring Built-in uncertainty Limited to specific use cases

Recommendation: RAGAS for comprehensive eval + HHEM for fast hallucination check in production.


20. Test-Time Compute Scaling (Reasoning Models)

Basic

Q: Что такое test-time compute scaling?

A: Метод улучшения reasoning LLM путём увеличения вычислительных ресурсов во время inference (а не training). Идея: дать модели больше времени "подумать" — как человек даёт лучший ответ, когда есть время обдумать.

Q: Test-time compute vs training-time compute?

A:

Train-Time Compute Test-Time Compute
Во время обучения Во время inference
Один раз для модели Каждый запрос
Фиксированная стоимость Пропорциональна сложности
Изменяет веса Не изменяет веса
Большая модель = больше compute Больше токенов = больше compute

Medium

Q: Основные методы test-time compute scaling?

A:

Method Description Cost
Chain-of-Thought (CoT) "Think step by step" prompt 2-5x tokens
Majority Voting Generate N answers, pick most common Nx compute
Best-of-N with PRM Generate N, pick best via reward model Nx compute + PRM
Beam Search Explore multiple paths Depends on beam width
"Wait" Tokens (s1) Force model to continue thinking Controlled by budget
Self-Revision Iterate and refine answer Nx sequential

Q: Что такое "Wait" tokens (s1 paper)?

A: Метод из paper "s1: Simple Test-Time Scaling" (Jan 2025). Если модель хочет закончить ответ слишком рано, вставляем "Wait" token, заставляя продолжить reasoning:

def budget_forcing(model, prompt, min_tokens=100, max_tokens=500):
    response = ""
    while len(response.split()) < min_tokens:
        token = model.generate_next_token(prompt + response)
        if token == "<|eot|>" and len(response.split()) < min_tokens:
            # Force continuation
            response += " Wait, let me reconsider. "
        else:
            response += token
        if len(response.split()) >= max_tokens:
            break
    return response

Q: Chain-of-Thought vs Chain-of-Draft?

A:

Aspect CoT CoD (Chain-of-Draft)
Output Verbose step-by-step Concise key points
Tokens High (full sentences) Low (5-10 words/step)
Speed Slow ~4x faster
Accuracy High ~Same as CoT
Interpretability High Medium

CoD идея: люди не пишут полные предложения при решении задач — они пишут краткие заметки.

Killer

Q: Как 1B модель может превзойти 405B модель?

A: С помощью compute-optimal test-time scaling (paper Feb 2025):

  1. Process Reward Model (PRM): Оценивает качество промежуточных шагов
  2. Best-of-N sampling: Генерируем много решений, PRM выбирает лучшее
  3. Compute budget: Распределяем compute оптимально между generation + selection
1B model + optimal test-time compute > 405B model without test-time compute
7B model + test-time compute > DeepSeek-R1 (671B MoE)

Когда работает: - Verifiable tasks (math, code, logic) - Есть хороший PRM или verifier - Бюджет на inference compute

Q: Спроектируйте reasoning system для сложных задач.

A:

Architecture:

[User Query]
[Complexity Classifier] → Simple → Direct answer
     ↓ Complex
[Reasoning Engine]
┌─────────────────────────────────┐
│ 1. Initial generation (CoT)     │
│ 2. Self-check & verification    │
│ 3. If low confidence:           │
│    - Generate alternatives      │
│    - PRM scoring                │
│    - Select best                │
│ 4. Final answer with reasoning  │
└─────────────────────────────────┘

Implementation considerations: - Budget per query (max tokens, max iterations) - Early stopping when confidence > threshold - Fallback to cheaper model for simple queries - Caching for repeated queries

Cost optimization:

Simple query (10%): 100 tokens, $0.001
Medium query (60%): 500 tokens, $0.005
Complex query (30%): 2000 tokens, $0.02
Average: ~$0.008/query

Q: Как выбрать между test-time compute и большей моделью?

A:

Use test-time compute when: - Verifiable tasks (math, code) - Low latency requirements flexible - Complex reasoning needed - Budget for inference compute

Use larger model when: - General-purpose tasks - Low latency required - Simple queries dominate - Training budget available

Hybrid approach (recommended): - Route simple → small model, no scaling - Route complex → medium model + test-time scaling - Route critical → large model + full reasoning


21. Context Windows and Long-Context Reasoning

Basic

Q: Что такое context window в LLM?

A: Максимальное количество input tokens (user instructions, system prompt, generated tokens), которое модель может обработать за один раз. Это runtime capacity, а не training data.

Q: Почему context window важен?

A: - Понимание multi-page документов - Coherence в длинных conversation - Retrieval-augmented reasoning - Multi-step planning

Medium

Q: Какие проблемы возникают при очень больших context windows?

A:

Problem Description Mitigation
Lost in the Middle Tokens в середине получают меньше attention Long-context training
Retrieval Degradation Diluted attention scores Hierarchical attention
Positional Drift Confusing token order at long range RoPE scaling
Compute Inefficiency Memory и latency grow Linear attention variants

Q: Как работает "Lost in the Middle" phenomenon?

A: При длинных sequences, tokens в начале и конце получают больше attention weight, чем tokens в середине. Это ухудшает retrieval accuracy для информации в центре.

Mitigation strategies: - Long-context fine-tuning с synthetic tasks - Needle-in-a-Haystack training - Document reordering (important info → start/end)

Q: Как управлять long conversations без потери информации?

A:

Conversation Memory Stack:

[System Prompt]
[Structured Memory Block] (entities, preferences, constraints)
[Summary of Old Turns]
[Recent Turns (full)]
[Current Query]

Techniques: 1. Summarization: Old turns → summary → memory 2. Memory distillation: Extract entities, preferences 3. KV cache extension: Compressed representations 4. Priority-based retention: Keep important, discard noise

Killer

Q: Как RAG взаимодействует с context windows?

A:

RAG + Long-Context Benefits: - Больше retrieved documents помещается - Coarser chunking допустим - Multi-document tasks становятся feasible

New Challenges: - Noise increases с большим количеством documents - Retrieval ranking становится критичнее - Token budget management сложнее - Document conflicts возможны

Best Practices: 1. Semantic chunking 2. Relevance scoring + re-ranking 3. Dynamic prompt construction 4. Metadata headers (section, source, date) 5. Conflict resolution strategy

Q: Как positional encodings влияют на long-context?

A:

Encoding Type How It Works Long-Context Support
Sinusoidal Fixed frequencies Poor extrapolation
Learned Trained positions Limited to training length
RoPE Rotational transformation Good with scaling
ALiBi Distance-aware bias Excellent extrapolation

RoPE Scaling: Stretches embedding space для longer sequences ALiBi: Linear bias based on token distance — no length limit

Q: Как оценить качество long-context модели?

A:

Benchmarks: - Needle-in-a-Haystack: Find specific fact in long text - RULER: Multi-hop reasoning over long sequences - LongBench: Diverse long-context tasks - LOOGLE: Long-document QA

Metrics: - Retrieval accuracy at different positions - Multi-hop reasoning accuracy - Coherence across document boundaries - Entity tracking consistency

Q: Architectural innovations для million-token context?

A:

  1. Ring Attention: Distribute attention across GPUs
  2. Linear Attention: O(n) instead of O(n²)
  3. Sparse Attention: Only compute relevant pairs
  4. Hierarchical Attention: Local + global levels
  5. Memory Tokens: Persistent learned tokens for key info
  6. Dual-Cache: Separate caches for different context levels

22. Diffusion Language Models (LLaDA)

Источники: Nie et al. "Large Language Diffusion Models" (ICML 2025), LLaDA Demo Page, OpenReview ICLR 2025

Basic

Q: Что такое LLaDA и чем отличается от автoregressive моделей?

A: LLaDA (Large Language Diffusion with mAsking) — diffusion-based альтернатива autoregressive моделям для LLM.

Ключевые отличия:

Aspect Autoregressive (AR) Diffusion (LLaDA)
Generation Left-to-right sequential Parallel token prediction
Attention Causal masking Bidirectional (no causal mask)
Training Predict next token Predict all masked tokens
KV-cache Supported Not supported
Inference O(n) sequential O(k) iterations, parallel

LLaDA моделирует распределение через forward masking process (постепенное маскирование токенов) и reverse process (восстановление токенов), оптимизируя upper bound на negative log-likelihood.

Q: Как работает discrete masking diffusion?

A: В отличие от image diffusion (добавление Gaussian noise), текст дискретен. LLaDA заменяет noise corruption на random token masking:

Forward Process: $\(x_t = \text{mask}(x_0, t)\)$

где \(t \sim U[0,1]\) — random masking ratio. При \(t=1\) все токены замаскированы, при \(t=0\) — ни одного.

Reverse Process: Модель предсказывает все замаскированные токены одновременно на основе частично замаскированного ввода:

def forward_process(tokens, mask_ratio):
    """Randomly mask tokens at given ratio."""
    mask = torch.rand(tokens.shape) < mask_ratio
    masked_tokens = torch.where(mask, MASK_TOKEN, tokens)
    return masked_tokens, mask

def reverse_step(model, masked_tokens, num_steps):
    """Iteratively unmask tokens."""
    for step in range(num_steps):
        predictions = model(masked_tokens)
        # Replace masks with predictions
        masked_tokens = apply_predictions(masked_tokens, predictions)
    return masked_tokens

Medium

Q: Что такое remasking strategy в LLaDA?

A: Remasking —关键技术 для улучшения качества генерации в diffusion LLM:

1. Low-Confidence Remasking:

def low_confidence_remasking(model, masked_input, confidence_threshold=0.5):
    predictions, probs = model.predict_with_probs(masked_input)
    # Only keep high-confidence predictions
    low_conf_mask = probs.max(dim=-1) < confidence_threshold
    # Remask low-confidence tokens
    result = torch.where(low_conf_mask, MASK_TOKEN, predictions)
    return result

2. Semi-Autoregressive Remasking: - Делим sequence на blocks - Генерируем blocks слева направо - Внутри каждого блока — parallel diffusion - Комбинирует AR coherence + Diffusion parallelism

Q: Почему LLaDA решает "reversal curse"?

A: Reversal curse — AR модели плохо отвечают на вопросы "наоборот" (например, "Кто написал 'Евгения Онегина'?" → хорошо, "Какую поэму написал Пушкин про Онегина?" → плохо).

Причина в AR: Left-to-right bias — модель видит токены только слева от текущей позиции.

Решение LLaDA: Bidirectional attention + uniform token treatment. Все токены равнозначны, нет directional bias. В тестах на Chinese poem completion:

Model Forward Task Reversal Task
GPT-4o 95% 62%
Qwen 2.5 93% 58%
LLaDA 8B 91% 89%

Q: Как обучается LLaDA?

A:

Pre-training: - 2.3T tokens (vs 15T for LLaMA3) - Fixed sequence length 4096 - 0.13M H800 GPU hours - Monte Carlo sampling для objective estimation

Training Objective: $\(\mathcal{L} = \mathbb{E}_{t,x_0,\epsilon}\left[\sum_{i \in \text{masked}} -\log p(x_i | x_t)\right]\)$

SFT (Supervised Fine-Tuning): - 4.5M prompt-response pairs - Prompt остается unmasked - Response tokens маскируются и предсказываются

Killer

Q: Сравните LLaDA и LLaMA3 8B по performance.

A:

After Pre-training (2.3T tokens vs LLaMA3's 15T):

Benchmark LLaDA 8B LLaMA3 8B Notes
MMLU 58.3 66.0 LLaDA competitive
GSM8K 45.2 50.0 LLaDA strong in math
HumanEval 28.6 33.5 AR still better for code
Chinese Tasks 62.1 55.3 LLaDA advantage

After SFT: - LLaDA 8B Instruct ≈ LLaMA3 8B Instruct на большинстве benchmarks - Но без RL alignment пока уступает

Training Efficiency: - LLaDA: 2.3T tokens → competitive - LLaMA3: 15T tokens → similar quality - Diffusion более data-efficient!

Q: Когда использовать Diffusion LLM vs AR LLM?

A:

Use Diffusion LLM (LLaDA) when: - Bidirectional reasoning important (QA, summarization) - Data-constrained training scenarios - Need to overcome reversal curse - Parallel inference beneficial - Multi-lingual tasks with balanced performance

Use AR LLM when: - Code generation (sequential syntax) - Low-latency streaming required - KV-cache critical for long sequences - Maximum quality on code/math benchmarks - Rich ecosystem and tooling needed

Hybrid Future: - Block Diffusion: интерполяция между AR и Diffusion - Semi-autoregressive: AR для structure, Diffusion для content

Q: Спроектируйте inference pipeline для LLaDA в production.

A:

class LLaDAInferencePipeline:
    def __init__(self, model, num_diffusion_steps=10):
        self.model = model
        self.num_steps = num_diffusion_steps

    def generate(self, prompt, max_new_tokens=256, strategy="low_confidence"):
        # Initialize: fully mask response tokens
        response_mask = torch.ones(max_new_tokens, dtype=torch.bool)
        tokens = torch.cat([prompt, torch.full((max_new_tokens,), MASK_TOKEN)])

        for step in range(self.num_steps):
            # Predict all masked tokens
            logits = self.model(tokens)
            predictions = logits.argmax(dim=-1)
            probs = F.softmax(logits, dim=-1)

            if strategy == "low_confidence":
                # Only accept high-confidence predictions
                confidence = probs.max(dim=-1)
                accept_mask = confidence > self.get_threshold(step)
                new_response = torch.where(
                    response_mask & accept_mask,
                    predictions,
                    tokens
                )
            elif strategy == "semi_ar":
                # Block-by-block generation
                new_response = self.generate_block(tokens, step)

            tokens = torch.cat([prompt, new_response])

        return tokens[len(prompt):]

    def get_threshold(self, step):
        """Gradually lower threshold as diffusion progresses."""
        return 0.9 - (step / self.num_steps) * 0.3

Production considerations: - No KV-cache → higher compute per token - Parallel prediction → GPU utilization efficient - Trade-off: steps vs quality (10-20 steps typical) - Batch inference more efficient than streaming


23. LLM Compression Beyond Quantization

Источники: Redis Model Distillation Guide (Feb 2026), Johal.in Knowledge Distillation (Sept 2025), DataMagicLab LLM Pruning (Mar 2025)

Basic

Q: Какие методы compression существуют помимо quantization?

A:

Method Description Compression Ratio Accuracy Retention
Knowledge Distillation Teacher → Student transfer 4-10x 95-97%
Structured Pruning Remove neurons/heads/layers 2-5x 90-95%
Unstructured Pruning Remove individual weights 10-20x 85-95%
Low-Rank Decomposition Factorize weight matrices 2-4x 95-98%
Sparse Attention Skip irrelevant attention pairs 2-8x 90-97%

Q: Что такое Knowledge Distillation?

A: Метод сжатия, при котором большая модель (teacher) обучает меньшую (student) имитировать своё поведение.

Key insight: Teacher производит "soft" probability distributions, которые содержат больше информации чем hard labels: - Hard label: "Paris" (one-hot) - Soft distribution: Paris (92%), Lyon (5%), France (3%)

Эти "soft targets" раскрывают relations между классами ("dark knowledge").

Medium

Q: Как работает Knowledge Distillation Loss?

A:

KD Loss Formula: $\(L_{KD} = \alpha \cdot T^2 \cdot KL(\sigma(z_s / T) \| \sigma(z_t / T)) + (1 - \alpha) \cdot CE(y, \sigma(z_s))\)$

Где: - \(z_t\) — teacher logits - \(z_s\) — student logits - \(T\) — temperature (typical: 3-5) - \(\alpha\) — weighting factor (typical: 0.9) - \(KL\) — Kullback-Leibler divergence - \(CE\) — Cross-entropy with hard labels

Implementation:

class DistillationLoss(nn.Module):
    def __init__(self, temperature=4.0, alpha=0.9):
        super().__init__()
        self.T = temperature
        self.alpha = alpha

    def forward(self, student_logits, teacher_logits, labels):
        # Soft targets loss (KL divergence)
        soft_loss = F.kl_div(
            F.log_softmax(student_logits / self.T, dim=-1),
            F.softmax(teacher_logits / self.T, dim=-1),
            reduction='batchmean'
        ) * (self.T ** 2)

        # Hard labels loss (cross-entropy)
        hard_loss = F.cross_entropy(student_logits, labels)

        # Combined loss
        return self.alpha * soft_loss + (1 - self.alpha) * hard_loss

Temperature intuition: - \(T=1\): Original distribution (peaked) - \(T>1\): Softer distribution (more uniform) - Higher T = more information transfer

Q: Structured vs Unstructured Pruning?

A:

Aspect Unstructured Structured
What's removed Individual weights Entire neurons/heads/layers
Compression 10-20x 2-5x
Hardware efficiency Poor (irregular sparsity) Excellent (regular patterns)
Speedup Limited 2-4x actual speedup
Use case Research, extreme compression Production deployment

Structured Pruning Types: 1. Attention Head Pruning: Remove entire attention heads 2. FFN Pruning: Reduce intermediate dimension 3. Layer Pruning: Remove entire transformer layers 4. Block Pruning: Remove 4x4 or 8x8 weight blocks

Q: Что такое Magnitude-Based Pruning?

A: Удаление весов с наименьшими absolute values:

def magnitude_prune(model, sparsity=0.5):
    """Remove fraction of smallest weights."""
    for name, param in model.named_parameters():
        if 'weight' in name:
            # Get threshold for this layer
            flat = param.data.abs().flatten()
            threshold = torch.kthvalue(flat, int(sparsity * len(flat))).values

            # Create mask
            mask = param.data.abs() > threshold

            # Apply mask
            param.data *= mask.float()

    return model

Issues: Requires fine-tuning after pruning to recover performance.

Killer

Q: Спроектируйте compression pipeline для Llama-3 70B.

A:

Pipeline Architecture:

[Llama-3 70B FP16]
┌────────────────────────────────────────┐
│ Phase 1: Structured Pruning            │
│ - Remove 30% attention heads           │
│ - Reduce FFN by 25%                    │
│ - Result: 40B params, 2x faster       │
└────────────────────────────────────────┘
┌────────────────────────────────────────┐
│ Phase 2: Knowledge Distillation        │
│ - Teacher: Pruned 40B                  │
│ - Student: 8B architecture             │
│ - Temperature: 4, Alpha: 0.9          │
│ - Result: 8B params, 5x faster        │
└────────────────────────────────────────┘
┌────────────────────────────────────────┐
│ Phase 3: Quantization (AWQ)            │
│ - 4-bit weight quantization            │
│ - Activation-aware calibration         │
│ - Result: 2GB model, 10x total speedup │
└────────────────────────────────────────┘

Implementation:

class CompressionPipeline:
    def __init__(self, teacher_model, target_size='8B'):
        self.teacher = teacher_model
        self.target_size = target_size

    def compress(self, train_data, val_data):
        # Phase 1: Structured Pruning
        print("Phase 1: Structured Pruning...")
        pruned = self.prune_model(sparsity=0.4)
        pruned = self.fine_tune(pruned, train_data, epochs=2)

        # Phase 2: Knowledge Distillation
        print("Phase 2: Knowledge Distillation...")
        student = self.init_student(self.target_size)
        student = self.distill(
            teacher=pruned,
            student=student,
            data=train_data,
            temperature=4.0,
            epochs=3
        )

        # Phase 3: Quantization
        print("Phase 3: AWQ Quantization...")
        quantized = self.quantize_awq(student, calibration_data=val_data)

        return quantized

    def distill(self, teacher, student, data, temperature, epochs):
        optimizer = torch.optim.AdamW(student.parameters(), lr=1e-4)
        criterion = DistillationLoss(temperature=temperature)

        for epoch in range(epochs):
            for batch in data:
                with torch.no_grad():
                    teacher_logits = teacher(batch['input_ids'])

                student_logits = student(batch['input_ids'])
                loss = criterion(student_logits, teacher_logits, batch['labels'])

                loss.backward()
                optimizer.step()
                optimizer.zero_grad()

        return student

Results Table:

Stage Params Size MMLU Inference Speed
Original 70B 140GB 79.0% 1x
Pruned 40B 80GB 77.2% 2x
Distilled 8B 16GB 73.5% 5x
Quantized 8B 2GB 72.8% 10x

Q: Какой порядок compression techniques оптимален?

A:

Research finding (2025): Pruning → Distillation → Quantization is optimal order.

Order Final Accuracy Reason
P → D → Q Best Pruning removes redundancy first, distillation recovers, quantization last
D → P → Q Good Works but distillation may preserve prunable weights
Q → D → P Poor Quantization first limits teacher quality

Explanation: 1. Pruning first: Identifies and removes structural redundancy 2. Distillation second: Transfers knowledge to smaller architecture, recovers accuracy 3. Quantization last: Final bit-level optimization, minimal accuracy impact

Q: Когда использовать distillation vs pruning vs quantization?

A:

Use Distillation when: - Can afford training time (days to weeks) - Need maximum compression (4-10x) - Have good training data - Target architecture is different from source

Use Pruning when: - Need hardware-efficient inference - Want to reduce model without retraining (iterative pruning) - Target specific components (attention heads, layers) - Structured sparsity is required

Use Quantization when: - Fast deployment needed (hours) - Minimal accuracy loss acceptable - Memory is the bottleneck - Works with any pre-trained model

Best Practice: Combine all three: Prune → Distill → Quantize


Обновлено: 2026-02-12, Ralph iteration 97 — добавлен LLM Compression Beyond Quantization (Section 23)


24. Multilingual LLMs

Источники: Markaicode Cross-Lingual Transfer (May 2025), MAD-G Adapter Paper (2025), arXiv 2504.20484 Cross-lingual Pre-training

Basic

Q: Что такое multilingual LLM и как она работает?

A: Multilingual LLM — модель, обученная на множестве языков одновременно (mBERT: 104 языка, XLM-R: 100 языков).

Key Mechanism: - Shared vocabulary (SentencePiece/BPE across languages) - Cross-lingual representations (общее semantic space) - Transfer from high-resource to low-resource languages

Popular Models:

Model Languages Params Key Feature
mBERT 104 180M First multilingual transformer
XLM-R 100 550M Better performance on low-resource
mT5 101 13B Text-to-text for all languages
BLOOM 46 176B Large-scale multilingual
Qwen2 29+ 72B Strong multilingual reasoning

Q: Почему cross-lingual transfer работает?

A:

Shared Linguistic Patterns: - Syntax structures (SVO vs SOV word order) - Morphological features (cases, genders) - Semantic concepts (universal across languages)

Example:

English: "The cat sits on the mat"
Spanish: "El gato se sienta en la alfombra"
Russian: "Кот сидит на коврике"
Все три share схожую syntactic structure → model learns universal patterns.

Medium

Q: Какие проблемы с multilingual tokenization?

A:

Problem Description Impact
Vocabulary bias Latin script over-represented Non-Latin languages need more tokens
Efficiency variance Some languages 2-3x more tokens Higher cost, latency for some languages
Segmentation issues No spaces in Chinese/Japanese Requires special pre-tokenization
Rare scripts Limited data for some writing systems Poor tokenization quality

Tokenization Efficiency Example:

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("bert-base-multilingual-cased")

# Same sentence in different languages
en_tokens = tokenizer.encode("The quick brown fox")  # 6 tokens
zh_tokens = tokenizer.encode("快速的棕色狐狸")       # 12 tokens (2x)
ru_tokens = tokenizer.encode("Быстрая коричневая лиса")  # 9 tokens

Solutions: - Language-specific vocabularies (alpha in SentencePiece) - Vocabulary augmentation for target languages - Character-level fallbacks

Q: Как работает language-specific adapter?

A: Adapter — tiny bottleneck module, вставленный в каждый transformer layer:

Architecture:

Input (H) → Down-project (m) → ReLU → Up-project (H) → + Residual → Output

Где \(m \ll H\) (например, \(H=768, m=64\)).

Implementation:

class LanguageAdapter(nn.Module):
    def __init__(self, hidden_size, bottleneck=64):
        super().__init__()
        self.down = nn.Linear(hidden_size, bottleneck)
        self.up = nn.Linear(bottleneck, hidden_size)
        self.act = nn.ReLU()

    def forward(self, x):
        residual = x
        x = self.down(x)
        x = self.act(x)
        x = self.up(x)
        return x + residual

Advantages: - Only ~2% additional parameters per language - Modular: swap adapters for different languages - No catastrophic forgetting (base model frozen)

Q: Что такое MAD-G (Multilingual Adapter Generation)?

A: Метод генерации adapters из typological representation языка:

Key Innovation: - Вместо тренировки отдельных adapters для каждого языка - Generator model производит adapter weights из URIEL typology features - Zero-shot adapter generation для unseen languages

URIEL Database Features: - Syntax: word order (SVO, SOV, VSO) - Phonology: sound inventory - Morphology: case systems, gender - Lexical: cognate patterns

MAD-G Pipeline:

Language → URIEL features → Generator MLP → Adapter weights

Killer

Q: Спроектируйте multilingual RAG для 10 языков.

A:

Architecture:

[Query in any language]
┌───────────────────────────────────────┐
│ Language Detection (fasttext)         │
│ + Query Translation (optional)        │
└───────────────────────────────────────┘
┌───────────────────────────────────────┐
│ Multilingual Embedding Model          │
│ (multilingual-e5-large or BGE-M3)     │
└───────────────────────────────────────┘
┌───────────────────────────────────────┐
│ Vector Search (HNSW)                  │
│ - Index per language OR unified       │
│ - Cross-lingual retrieval enabled     │
└───────────────────────────────────────┘
┌───────────────────────────────────────┐
│ Reranker (multilingual cross-encoder) │
│ - mMiniLM or BGE-reranker             │
└───────────────────────────────────────┘
[Results in query language or translated]

Implementation:

class MultilingualRAG:
    def __init__(self, embedding_model, reranker, languages):
        self.embedder = embedding_model  # BGE-M3
        self.reranker = reranker         # BGE-reranker
        self.lang_detector = fasttext.load_model('lid.bin')
        self.indices = {lang: FaissIndex() for lang in languages}

    def retrieve(self, query, top_k=10):
        # Detect language
        lang = self.detect_language(query)

        # Embed query (multilingual)
        query_emb = self.embedder.encode(query)

        # Search in language-specific or unified index
        results = self.indices[lang].search(query_emb, top_k * 2)

        # Rerank with cross-lingual model
        reranked = self.reranker.rerank(query, results, top_k)

        return reranked, lang

Challenges & Solutions:

Challenge Solution
Different tokenization costs Language-specific chunking
Cross-lingual retrieval Multilingual embeddings (BGE-M3)
Answer generation Language adapters or translation
Evaluation Per-language benchmarks + aggregate

Q: Как выбрать стратегию для low-resource language?

A:

Decision Tree:

Has training data?
├── Yes (>10K samples)
│   └── Full fine-tuning with language adapter
└── No or minimal (<10K)
    ├── Has related high-resource language?
    │   └── Cross-lingual transfer + few-shot
    └── Completely isolated?
        ├── Zero-shot with multilingual model
        └── Translation + pivot language approach

Strategies Comparison:

Strategy Data Needed Quality Cost
Full fine-tuning High Best High
Adapter fine-tuning Medium Good Low
Few-shot prompting Low Medium Minimal
Zero-shot None Variable Minimal
Translation pivot None Medium API cost

Best Practice: Start with zero-shot multilingual model, add adapters if performance insufficient.


Section 25: 2026 Model Landscape

Источники: llm-stats.com (Feb 2026), O'Reilly Radar Trends, LinkedIn AI Updates

Q: Какие модели доминируют в February 2026?

A:

Frontier Models (Top Tier): | Model | Organization | GPQA | Key Features | |-------|-------------|------|--------------| | GPT-5.3 Codex | OpenAI | - | Latest coding-focused, Feb 2026 | | Claude Opus 4.6 | Anthropic | 0.9 | Top reasoning, Feb 2026 | | Grok-4 | xAI | 0.9 | Real-time data, reasoning | | Gemini 3 Flash | Google | 0.9 | Efficient, multimodal | | GPT-5.1 | OpenAI | 0.9 | General purpose |

Open Source Leaders: | Model | Organization | GPQA | Key Features | |-------|-------------|------|--------------| | GLM-5 | Zhipu AI | - | Latest Chinese model, Feb 2026 | | Kimi K2.5 | Moonshot AI | 0.9 | Long context (200K+) | | DeepSeek-V3.2-Exp | DeepSeek | 0.8 | MoE, efficient | | Qwen3 Max | Alibaba | 0.6 | Multilingual | | GLM-4.7 | Zhipu AI | 0.9 | Chinese/English balanced |

Q: Что нового в Claude Opus 4.6 и GPT-5.3-Codex (Feb 5, 2026)?

A:

Оба релиза вышли в один день — Feb 5, 2026. Не совпадение — прямая конкуренция.

Claude Opus 4.6 — Anthropic's Bet on Breadth:

| Feature | Opus 4.5 | Opus 4.6 | Improvement |
|---------|----------|----------|-------------|
| Context window | 200K | 1M | 5x increase |
| Output tokens | 16K | 128K | 8x increase |
| Reasoning | Extended thinking | Adaptive thinking | Auto-adjust depth |
| Agent support | Single | Agent Teams | Multi-agent parallel |
| MRCR v2 benchmark | 18.5% | 76% | 4x improvement |

Key Features: 1. 1M token context — ~1,500 pages text, entire codebases without losing track 2. Adaptive Thinking — auto-decides when to use deeper reasoning (vs binary on/off) 3. Effort Controls — 4 levels (low/medium/high/max) to balance intelligence/speed/cost 4. Context Compaction — auto-summarizes old context to keep working without limits 5. Agent Teams in Claude Code — multiple agents work in parallel on different tasks 6. Claude in PowerPoint/Excel — native integration, reads layouts/fonts/slide masters

Pricing: \(5/\)25 per million input/output tokens (same as 4.5), \(10/\)37.50 for prompts >200k

GPT-5.3-Codex — OpenAI's Bet on Depth:

| Benchmark | GPT-5.2 | GPT-5.3 Codex | Improvement |
|-----------|---------|---------------|-------------|
| SWE-Bench Pro | - | SOTA | State-of-the-art |
| OSWorld | 38.2% | 64.7% | 70% improvement |
| Terminal-Bench 2.0 | - | 77.3% | Leads (vs Opus 4.6 65%) |
| Speed | baseline | +25% | Faster |

Key Features: 1. Self-Improving — helped debug its own training runs (first model to do so) 2. Computer Use — navigates apps, clicks buttons, fills forms like a human 3. Interactive Collaboration — steer mid-task, give feedback in real-time 4. SOTA Coding — leads SWE-Bench Pro across 4 programming languages 5. Autonomous Game Building — built full games with millions of tokens iteration

Human Benchmark Gap: - OSWorld: GPT-5.3 Codex 64.7% vs Humans 72% — gap closing fast

Comparison Decision Matrix:

Task                          │ Best Choice
──────────────────────────────┼──────────────────────
Long documents (1M context)   │ Claude Opus 4.6
Coding + computer use         │ GPT-5.3 Codex
Finance/legal analysis        │ Claude Opus 4.6 (144 Elo over GPT-5.2)
Parallel agent tasks          │ Claude Opus 4.6 (Agent Teams)
Autonomous coding             │ GPT-5.3 Codex

Source: The Neuron (Feb 5, 2026), Anthropic System Card, OpenAI Codex Announcement

Q: Как изменился landscape с 2025?

A:

Key Trends: 1. Reasoning Models Mainstream: o1-style thinking tokens теперь в GPT-5.x, Claude 4.x 2. GPQA > 0.9 Standard: Топ модели достигают уровня экспертов 3. Coding Specialization: GPT-5.x Codex, Claude 4.x для кода 4. Efficiency Race: Flash/Ultra/Medium tiers для разных use cases 5. Open Source Convergence: GLM-4.7, Kimi K2.5 ≈ GPT-4 level

Deprecated (don't use in 2026): - GPT-3.5 (replaced by smaller GPT-4o-mini) - Claude 2.x (replaced by Claude 3.5/4.x) - PaLM 2 (replaced by Gemini)

Q: Как выбрать модель для production в 2026?

A:

Decision Framework:

Cost-Sensitive? ────► Gemini 3 Flash, Claude Haiku 4.5
Need Top Reasoning? ─► Claude Opus 4.6, GPT-5.1
Coding Task? ────────► GPT-5.3 Codex, Claude Opus 4.6
Long Context? ───────► Kimi K2.5 (200K+), Gemini 3 (2M)
Real-time Data? ─────► Grok-4 (X integration)
Self-Host/Open? ─────► GLM-4.7, DeepSeek-V3.2, Qwen3

Pricing Comparison (Feb 2026): | Tier | Input $/M tokens | Output $/M tokens | |------|-----------------|-------------------| | Premium (GPT-5.1, Claude 4.6) | $15-25 | $75-150 | | Mid (Gemini 3 Flash, Claude Haiku) | $0.07-0.50 | $0.30-3 | | Open Source Hosted | $0.10-2 | $0.10-2 |

Q: Что такое GPQA и почему это важно?

A:

GPQA (Graduate-Level Google-Proof Q&A Assessment): - Тест на уровне PhD экспертов - Вопросы требуют глубокого reasoning - Защита от простого retrieval (Google-proof)

Interpretation: - 0.4-0.5: General purpose, good for chat - 0.6-0.7: Strong reasoning, professional tasks - 0.8-0.9: Expert-level, competitive with humans

Why it matters: - Better proxy for real-world problem solving than MMLU - Tests multi-step reasoning, not just knowledge - Leading indicator for AGI progress

Q: Какие emerging модели值得关注 (worth watching)?

A:

Rising Stars 2026: 1. GLM-5 (Zhipu AI) — Chinese leader, expanding globally 2. Kimi K2.5 (Moonshot) — Best long context 3. MiniMax M2.1 — Efficient open source 4. Step-3.5-Flash — Fast Chinese model 5. ERNIE 5.0 (Baidu) — Chinese enterprise

Trend Predictions: - MoE everywhere — Mixture of Experts for efficiency - Multimodal default — All models will handle text+image+audio - Reasoning tokens standard — o1-style thinking in all frontier models - Open source catching up — 6-month lag to closed source narrowing

Q: Killer — Should I bet on OpenAI, Anthropic, or Open Source?

A:

The answer is "all of them" with different strategies:

OpenAI (GPT-5.x): - Pros: Best ecosystem, most integrations, reliable API - Cons: Expensive, closed, dependent on single vendor - Use when: Building consumer apps, need best general capability

Anthropic (Claude 4.x): - Pros: Best reasoning, safety-focused, great for enterprise - Cons: Smaller ecosystem, less multimodal - Use when: Enterprise, reasoning tasks, safety-critical

Open Source (GLM, DeepSeek, Qwen): - Pros: Control, privacy, cost, customization - Cons: Requires infra, 6-month capability lag - Use when: Privacy requirements, cost optimization, fine-tuning needs

Multi-Provider Strategy (Recommended):

# Fallback chain for production
PROVIDERS = [
    ("openai", "gpt-5.1", ["general", "coding"]),
    ("anthropic", "claude-opus-4-6", ["reasoning", "analysis"]),
    ("google", "gemini-3-flash", ["cost-sensitive", "multimodal"]),
    ("deepinfra", "deepseek-v3.2", ["fallback", "open-source"]),
]

def get_best_provider(task_type, budget):
    for provider, model, capabilities in PROVIDERS:
        if task_type in capabilities and within_budget(provider, budget):
            return provider, model
    return PROVIDERS[-1]  # Fallback to cheapest

Key Insight: The gap between providers is shrinking. In 2026, choice depends more on specific requirements (latency, privacy, cost) than raw capability.


25. Model Merging (Task Arithmetic, TIES, DARE)

Combining multiple fine-tuned models into one without retraining — key technique for multi-task LLMs.

Q: Что такое Model Merging и зачем он нужен?

A:

Model Merging — техника объединения нескольких task-specific моделей в одну multi-task модель без переобучения.

Why it matters: - Cost efficiency: 5 fine-tuned models → 1 merged model (5x storage reduction) - No data needed: Merge without access to original training data - Fast iteration: Create new capabilities by combining existing experts - Decentralized development: Different teams can work on different experts

Common use cases: - Merge math expert + code expert → STEM assistant - Combine domain models → enterprise chatbot - Blend language models → multilingual system

Source: TIES-Merging (Yadav et al., 2023), DAREx (Deng et al., 2024), arXiv 2501.15065

Q: Что такое Task Arithmetic?

A:

Task Arithmetic — базовый метод model merging через арифметику в weight space.

Concept:

Task Vector = θ_finetuned - θ_pretrained
Merged Model = θ_pretrained + λ₁τ₁ + λ₂τ₂ + ... + λₙτₙ

Where: - θ_pretrained — веса базовой модели (e.g., Llama-3.3-70B) - θ_finetuned — веса после fine-tuning на конкретную задачу - τ — task vector (разница = "что модель выучила") - λ — scaling coefficient (обычно 0.3-1.0)

Python Implementation:

def task_arithmetic_merge(base_model, task_models, lambdas):
    """Merge multiple fine-tuned models using Task Arithmetic."""
    merged = {k: v.clone() for k, v in base_model.items()}

    for task_model, lam in zip(task_models, lambdas):
        task_vector = {k: task_model[k] - base_model[k] for k in base_model}
        for k in merged:
            merged[k] += lam * task_vector[k]

    return merged

# Usage: Merge math expert + code expert
merged = task_arithmetic_merge(
    base_model=llama2_7b,
    task_models=[math_expert, code_expert],
    lambdas=[0.5, 0.5]
)

Problem with Task Arithmetic: - Interference: Task vectors могут конфликтовать (разные знаки) - Redundancy: Много параметров не важны для задачи - Performance drop: При merging >3 моделей качество падает

Q: Что такое TIES-Merging и как он решает interference?

A:

TIES-Merging (Trim, Elect Sign, Merge) — решает проблему interference между task vectors.

Three Steps:

Step 1: TRIM (Remove redundant params)

def trim_task_vector(task_vector, keep_percent=20):
    """Keep only top-k% of parameters by magnitude."""
    flat = torch.cat([v.flatten() for v in task_vector.values()])
    threshold = torch.topk(flat.abs(), int(len(flat) * keep_percent / 100))[0][-1]

    trimmed = {}
    for k, v in task_vector.items():
        mask = v.abs() >= threshold
        trimmed[k] = v * mask  # Zero out small params
    return trimmed

Key insight: Большинство параметров меняется незначительно при fine-tuning. Top 20% параметров несут 95%+ информации.

Step 2: ELECT SIGN (Resolve conflicts)

def elect_sign(trimmed_vectors):
    """Choose sign by majority vote across models."""
    merged_sign = {}
    for key in trimmed_vectors[0].keys():
        # Sum magnitudes with signs
        signed_sum = sum(v[key] for v in trimmed_vectors)

        # Final sign = sign of sum
        merged_sign[key] = torch.sign(signed_sum)
    return merged_sign

Key insight: Если 2 модели говорят "+", а 1 говорит "-", выбираем "+" по majority vote.

Step 3: MERGE (Combine aligned params)

def ties_merge(trimmed_vectors, elected_signs):
    """Merge only params that agree with elected sign."""
    merged = {}
    for key in trimmed_vectors[0].keys():
        values = []
        for v in trimmed_vectors:
            # Only include if sign matches
            mask = torch.sign(v[key]) == elected_signs[key]
            values.append(v[key] * mask)

        merged[key] = sum(values) / len(values)
    return merged

Full TIES-Merging:

def ties_merging(base_model, task_models, keep_percent=20):
    """Complete TIES-Merging pipeline."""
    # 1. Compute task vectors
    task_vectors = [{k: m[k] - base_model[k] for k in base_model} for m in task_models]

    # 2. Trim
    trimmed = [trim_task_vector(tv, keep_percent) for tv in task_vectors]

    # 3. Elect signs
    elected_signs = elect_sign(trimmed)

    # 4. Merge with sign alignment
    merged_vector = ties_merge(trimmed, elected_signs)

    # 5. Apply to base
    return {k: base_model[k] + merged_vector[k] for k in base_model}

Performance vs Task Arithmetic: +5-15% accuracy при merging 5+ models (Yadav et al., 2023)

Q: Что такое DARE и как он отличается от TIES?

A:

DARE (Drop And REscale) — alternative approach через random dropout.

Key Insight: Delta parameters (θ_finetuned - θ_pretrained) mostly redundant. Can drop 90%+ with minimal quality loss.

DARE Algorithm:

def dare_merge(base_model, task_models, drop_rate=0.9):
    """DARE: Random drop + rescale merging."""
    merged = {k: v.clone() for k, v in base_model.items()}

    for task_model in task_models:
        delta = {k: task_model[k] - base_model[k] for k in base_model}

        # 1. Random drop
        for k in delta:
            mask = torch.rand_like(delta[k]) > drop_rate
            delta[k] = delta[k] * mask

        # 2. Rescale to compensate
        rescale_factor = 1 / (1 - drop_rate)
        for k in delta:
            delta[k] = delta[k] * rescale_factor

        # 3. Add to merged
        for k in merged:
            merged[k] += delta[k]

    return merged

Why Rescale? - Drop 90% params → 10% remain - Rescale by 1/(1-0.9) = 10x - Preserves expected value: E[dropped * 10] = original

DARE vs TIES Comparison:

| Aspect         | TIES-Merging          | DARE                   |
|----------------|-----------------------|------------------------|
| Selection      | Magnitude-based       | Random                 |
| Conflict       | Sign election         | Random dropout         |
| Compute cost   | Higher (sorting)      | Lower (random)         |
| Drop rate      | 80% (keep top 20%)    | 90%+                   |
| Best for       | Many models (>3)      | LoRA adapters          |

Q: Killer — Как выбрать метод merging для production?

A:

Decision Framework:

def select_merging_method(num_models, model_type, compute_budget):
    """Choose optimal merging strategy."""

    if num_models == 2:
        if compute_budget == "low":
            return "Task Arithmetic (λ=0.5)"
        else:
            return "SLERP"  # Spherical interpolation

    elif num_models <= 5:
        if model_type == "full_finetune":
            return "TIES-Merging (keep=20%)"
        elif model_type == "lora":
            return "DARE + Task Arithmetic"

    else:  # Many models
        if compute_budget == "high":
            return "TIES-Merging + weight optimization"
        else:
            return "DARE (drop=0.95)"

    return "Task Arithmetic (baseline)"

Production Pipeline with MergeKit:

# mergekit-config.yaml
merge_method: ties
base_model: meta-llama/Llama-3.3-70B-Instruct
models:
  - model: ./math-expert
    parameters:
      weight: 0.4
  - model: ./code-expert
    parameters:
      weight: 0.4
  - model: ./general-chat
    parameters:
      weight: 0.2
parameters:
  density: 0.2  # Keep top 20% (TIES trim)

# Run merge
mergekit-yaml mergekit-config.yaml ./merged-model

Best Practices 2026: 1. Start with TIES for >2 models (best general performance) 2. Use DARE for LoRA adapters (faster, works well) 3. Task Arithmetic only for 2 models with similar tasks 4. Always evaluate on held-out data from each task 5. Tune lambdas per task (not always 0.5)

When Model Merging Fails: - Tasks require conflicting behaviors (can't be both concise AND verbose) - Models from different architectures (can't merge Llama + Mistral) - Very different tokenizers - Extreme domain shift (medical + gaming)

Sources: TIES-Merging (Yadav et al., NeurIPS 2023), DAREx (Deng et al., 2024), Task Arithmetic (Ilharco et al., 2023), MergeKit documentation


26. Neuro-Symbolic AI (Hybrid AI)

Emerging 2026 trend — combining neural networks with symbolic reasoning for explainable, reliable AI.

Q: Что такое Neuro-Symbolic AI и почему это важно?

A:

Neuro-Symbolic AI — гибридный подход, объединяющий: - Neural Networks: Pattern recognition, learning from data, handling uncertainty - Symbolic AI: Logical reasoning, explicit rules, explainability

Why it matters in 2026:

| Aspect          | Pure Neural | Pure Symbolic | Neuro-Symbolic |
|-----------------|-------------|---------------|----------------|
| Pattern recognition | Excellent | Poor | Excellent |
| Logical reasoning | Poor | Excellent | Excellent |
| Explainability | Poor (black box) | Excellent | Good |
| Data requirements | High | Low | Medium |
| Adaptability | High | Low | High |

Key Insight: Neural networks excel at perception but struggle with reliable reasoning. Symbolic systems reason perfectly but can't handle messy real-world data. Neuro-Symbolic AI bridges this gap.

Source: Netguru Blog (Jan 2026), Forbes Hybrid AI Trend (Feb 2026)

Q: Какие архитектуры интеграции существуют?

A:

3 Integration Patterns:

  1. Sequential Processing:

    Raw Data → Neural Network → Features → Symbolic Reasoning → Decision
    Example: Image → CNN → Objects → Rules → Action
    

  2. Parallel Processing:

             ┌─→ Neural Path ─────┐
    Input ───┤                     ├─→ Fusion → Output
             └─→ Symbolic Path ────┘
    Example: Query → Neural (semantic) + BM25 (exact) → RRF → Rerank
    

  3. Embedded Approaches:

    Neural Network with built-in symbolic constraints
    Example: Differentiable logic layers inside transformer
    

Architecture Example — Hybrid Reasoning System:

class NeuroSymbolicSystem:
    """Combines neural perception with symbolic reasoning."""

    def __init__(self):
        self.perception = VisionTransformer()  # Neural
        self.knowledge_graph = KnowledgeGraph()  # Symbolic
        self.reasoner = LogicEngine()  # Symbolic

    def process(self, image, query):
        # 1. Neural: Extract entities and relations
        entities = self.perception.detect_objects(image)
        relations = self.perception.detect_relations(image)

        # 2. Symbolic: Query knowledge graph
        kg_context = self.knowledge_graph.query(entities)

        # 3. Symbolic: Apply reasoning rules
        inference = self.reasoner.apply_rules(
            facts=entities + relations,
            rules=kg_context.rules,
            query=query
        )

        # 4. Explainable output
        return {
            "answer": inference.conclusion,
            "reasoning_chain": inference.steps,  # Full explainability!
            "confidence": inference.confidence
        }

Q: Как Knowledge Graphs используются в Neuro-Symbolic системах?

A:

Knowledge Graphs (KG) — структурированное представление знаний:

Components: - Entities: Nodes (concepts, objects) - Relations: Edges (connections between entities) - Attributes: Properties of entities

Integration with LLMs:

# KG-enhanced LLM reasoning
def kg_enhanced_reasoning(query, llm, kg):
    # 1. Extract entities from query
    entities = llm.extract_entities(query)

    # 2. Retrieve relevant subgraph
    subgraph = kg.get_neighborhood(entities, depth=2)

    # 3. Convert to natural language context
    kg_context = kg.to_natural_language(subgraph)

    # 4. Augment LLM prompt with structured knowledge
    prompt = f"""
    Knowledge: {kg_context}
    Question: {query}

    Using the knowledge above, reason step by step.
    Cite specific facts from the knowledge in your answer.
    """
    return llm.generate(prompt)

Benefits: - Factual grounding: LLM can't hallucinate facts that contradict KG - Traceability: Can verify reasoning against explicit knowledge - Updates: Can update KG without retraining LLM

Q: Какие применения Neuro-Symbolic AI в production?

A:

Production Use Cases:

  1. Finance & Risk Management:

    Neural: Detect fraud patterns from transaction embeddings
    Symbolic: Apply regulatory rules, compliance checks
    Combined: Explainable fraud decisions that pass audit
    

  2. Medical Diagnosis:

    Neural: Image classification, symptom extraction
    Symbolic: Medical knowledge base, drug interactions
    Combined: Diagnosis with cited evidence
    

  3. Legal Document Analysis:

    Neural: NER, clause extraction, summarization
    Symbolic: Legal precedents, regulation database
    Combined: Recommendations with legal citations
    

  4. Autonomous Systems:

    Neural: Perception (vision, lidar processing)
    Symbolic: Safety rules, traffic laws
    Combined: Explainable decisions for liability
    

Production Architecture:

class ExplainableAISystem:
    """Production Neuro-Symbolic system with audit trail."""

    def __init__(self):
        self.neural = load_model("perception_v3.pt")
        self.rules = load_rules("compliance_rules.json")
        self.audit_log = AuditLog()

    def decide(self, input_data):
        # Neural processing
        features = self.neural.encode(input_data)
        raw_decision = self.neural.classify(features)

        # Symbolic validation
        rule_results = self.rules.evaluate(raw_decision)
        violations = [r for r in rule_results if not r.passed]

        if violations:
            final_decision = self.rules.apply_overrides(
                raw_decision, violations
            )
        else:
            final_decision = raw_decision

        # Audit trail (explainability)
        self.audit_log.record({
            "timestamp": now(),
            "input": input_data,
            "neural_output": raw_decision,
            "rules_checked": rule_results,
            "final_decision": final_decision,
            "explanation": self.explain(final_decision, rule_results)
        })

        return final_decision

Q: Killer — Почему Neuro-Symbolic AI считается путём к AGI?

A:

The AGI Argument:

Human intelligence combines: 1. System 1 (Fast): Intuition, pattern recognition → Neural Networks 2. System 2 (Slow): Reasoning, planning → Symbolic AI

Why pure neural won't reach AGI: - Can't guarantee correctness (black box) - No explicit reasoning chains - Poor out-of-distribution generalization - Can't learn new concepts without retraining

Why pure symbolic won't reach AGI: - Can't handle perceptual tasks - Requires manual knowledge engineering - Brittle to noise and ambiguity

Neuro-Symbolic advantages:

| Capability           | Neural | Symbolic | Neuro-Symbolic |
|---------------------|--------|----------|----------------|
| Learn from data     | ✓      | ✗        | ✓              |
| Reason logically    | ✗      | ✓        | ✓              |
| Handle uncertainty  | ✓      | ✗        | ✓              |
| Explain decisions   | ✗      | ✓        | ✓              |
| Adapt to new tasks  | Limited| Manual   | Better         |
| Verify correctness  | ✗      | ✓        | Partially      |

2026 Research Directions: - Differentiable Logic: Embedding symbolic reasoning into neural architectures - Program Synthesis: Neural networks that generate symbolic programs - Neuro-Symbolic Concept Learning: Learning symbolic concepts from data - Constitutional AI + Rules: Combining LLM alignment with hard constraints

The Verdict: Neuro-Symbolic AI addresses the fundamental limitations of both paradigms. While not guaranteed to achieve AGI, it represents the most promising path toward AI systems that can both learn and reason — essential for human-like intelligence.

Sources: Netguru Neuro-Symbolic AI Guide (Jan 2026), Substack Hybrid AI Architecture, arXiv CascadeMind (2026)


27. LLM Observability

Production visibility for LLM applications: tracing, evaluation, monitoring

Q: Что такое LLM Observability и чем отличается от традиционного monitoring?

A:

LLM Observability = Tracing + Evaluation + Monitoring для AI систем.

Почему традиционный monitoring не работает:

| Aspect              | Traditional App | LLM Application |
|---------------------|-----------------|-----------------|
| Success metric      | 200 OK, no errors | 200 OK ≠ correct output |
| Failure detection   | Error logs | Silent failures (hallucinations) |
| Debugging           | Stack trace | Full request path needed |
| Testing             | Unit tests | Offline + Online evals |
| Cost tracking       | CPU/memory | Tokens + latency + retries |

Key insight: LLM может вернуть успешный HTTP 200, но произвести неправильный, вредный или низкокачественный output. Traditional observability подтверждает только что система выполнилась без ошибок — не что output правильный.

Three Pillars of LLM Observability: 1. Tracing: Full execution path (retrieval → prompt → model → tools) 2. Evaluation: Automated quality checks (offline CI + online production) 3. Monitoring: Metrics over time (latency, cost, quality scores)

Source: Braintrust LLM Observability Guide (2026), Swept.ai Complete Guide

Q: Как работает LLM Tracing?

A:

LLM Tracing захватывает каждый шаг выполнения request:

User Query
    └─► Retrieval Step (docs, latency, scores)
        └─► Prompt Construction (template, variables)
            └─► Model Call (input tokens, output, latency)
                └─► Tool Calls (if agent)
                    └─► Final Response

Each span records: - Input/Output (full text) - Latency - Token usage - Model parameters - Error states - User/Session IDs

OpenTelemetry GenAI Semantic Conventions:

from opentelemetry import trace

# Standard attributes for LLM spans
LLM_ATTRIBUTES = {
    "gen_ai.system": "openai",           # Provider
    "gen_ai.request.model": "gpt-4o",    # Model name
    "gen_ai.request.max_tokens": 1000,   # Parameters
    "gen_ai.response.finish_reason": "stop",
    "gen_ai.usage.input_tokens": 500,
    "gen_ai.usage.output_tokens": 200,
}

Why LLM tracing is different: - Payload size: Prompts + outputs are large (not like HTTP headers) - Complex workflows: Agents can generate deep traces - Query needs: Need to search across full text content

Q: Какие типы Evaluation существуют для LLM?

A:

Offline vs Online Evaluation:

| Type      | When        | Data Source       | Purpose |
|-----------|-------------|-------------------|---------|
| Offline   | CI/CD       | Fixed test set    | Catch regressions before deploy |
| Online    | Production  | Real traffic      | Detect drift, new failure modes |

Evaluation Methods:

  1. LLM-as-Judge:

    def llm_as_judge(response, criteria, judge_model="gpt-4o"):
        """Use another LLM to evaluate response quality."""
        prompt = f"Rate this response on {criteria} (1-10): {response}"
        return judge_model.generate(prompt)
    

  2. Rule-Based Checks:

    def rule_based_eval(response, rules):
        """Deterministic checks for specific criteria."""
        checks = {
            "has_citations": bool(re.search(r'\[\d+\]', response)),
            "no_pii": not detect_pii(response),
            "json_valid": is_valid_json(response),
            "length_ok": 50 < len(response) < 2000,
        }
        return {k: v for k, v in checks.items() if k in rules}
    

  3. Reference-Based:

    def reference_eval(response, expected, metric="similarity"):
        """Compare against ground truth."""
        if metric == "similarity":
            return cosine_similarity(embed(response), embed(expected))
    

Q: Какие failure modes характерны для LLM и как их ловить?

A:

LLM Failure Modes Table:

| Failure Mode              | Detection Method |
|---------------------------|------------------|
| Hallucination             | Factuality eval + grounding check |
| Retrieval drift           | Monitor retrieval scores over time |
| Prompt regression         | Offline evals in CI before deploy |
| Rising costs              | Token monitoring + per-request cost tracking |
| Latency spikes            | P99 monitoring + tracing slow steps |
| Prompt injection          | Safety evals on production traffic |
| Output format errors      | Schema validation (JSON, XML) |
| Context window overflow   | Token counting before API call |

Alert Configuration:

ALERTS = {
    "hallucination_rate_high": {
        "condition": "hallucination_eval_fail_rate > 0.05",
        "window": "1h",
        "severity": "critical",
    },
    "latency_p99_spike": {
        "condition": "latency_p99 > 5s",
        "window": "10m",
        "severity": "warning",
    },
    "cost_anomaly": {
        "condition": "hourly_tokens > baseline * 2",
        "window": "1h",
        "severity": "warning",
    },
}

Q: Killer — Как спроектировать Observability stack для production LLM?

A:

Three-Phase Implementation:

Phase 1: Tracing (Week 1)

class LLMTracer:
    def trace_request(self, query, context, response, metadata):
        trace = {
            "id": str(uuid4()),
            "timestamp": datetime.utcnow().isoformat(),
            "query": query,
            "retrieved_docs": context,
            "response": response,
            "latency_ms": metadata["latency"],
            "tokens_in": metadata["tokens_in"],
            "tokens_out": metadata["tokens_out"],
            "model": metadata["model"],
        }
        self.backend.store(trace)
        return trace["id"]

Phase 2: Evaluation (Week 2-3)

class ProductionEvaluator:
    def __init__(self):
        self.offline_dataset = load_dataset("gold_test_set.json")
        self.online_evaluator = OnlineEvaluator(sample_rate=0.1)

    def ci_eval(self, prompt_version):
        """Run before deploy."""
        results = [self.evaluate(call_llm(prompt_version, s["input"]), s["expected"])
                   for s in self.offline_dataset]
        if mean(results) < BASELINE:
            raise DeploymentBlocked(f"Evals failed")

Phase 3: Monitoring (Week 4)

DASHBOARD_METRICS = {
    "factuality_score": "avg over 1h",
    "hallucination_rate": "pct failures over 1h",
    "tokens_per_request": "avg + p99",
    "cost_per_user": "sum over day",
    "latency_p99": "ms",
    "error_rate": "pct over 5m",
}

Tool Selection Guide:

| Need                | Tools |
|---------------------|-------|
| Tracing             | Langfuse, LangSmith, Braintrust, Arize |
| LLM-as-Judge        | GPT-4, Claude, custom eval models |
| Dashboard           | Grafana, Datadog, Braintrust UI |
| Cost tracking       | Helicone, OpenLLMetry, custom |

Key Insight: Start with tracing, add evals, then monitoring. Each phase provides value independently.

Sources: Braintrust LLM Observability Guide (2026), Swept.ai Complete Guide, OpenTelemetry GenAI Semantic Conventions, Langfuse Documentation

28. Semantic Cache Poisoning (2026 Security)

Критическая уязвимость LLM-систем с семантическим кешированием — подмена ответов через exploitation embedding similarity

Q: Что такое Semantic Cache Poisoning?

A:

Semantic Cache Poisoning — новый класс атак на LLM-системы (открыт в 2024-2025), использующий fuzzy matching в семантическом кеше для подмены ответов жертвам.

Почему это критично:

| Traditional Cache | Semantic Cache |
|-------------------|----------------|
| Exact key match   | Embedding similarity |
| Deterministic     | Probabilistic |
| Deterministic poison | Adversarial embedding optimization |
| Easy to detect    | Stealth attacks possible |

Attack Vector: Злоумышленник подбирает query, embedding которого близок к популярным запросам жертв, но возвращает malicious content.

Source: CacheAttack Framework (2025), instatunnel.blogspot.com

Q: Как работает атака Semantic Cache Poisoning?

A:

5-Phase Attack Pipeline:

Phase 1: Reconnaissance
    └─► Identify target LLM service with semantic caching
    └─► Map cache behavior (timing analysis, response headers)

Phase 2: Injection
    └─► Craft malicious response for target query
    └─► Submit with poisoned query embedding

Phase 3: Semantic Spoof
    └─► Optimize adversarial embedding to match victim queries
    └─► Use gradient-based or black-box optimization

Phase 4: Trap Set
    └─► Cache stores (poisoned_query, malicious_response)
    └─► Wait for victim query with similar embedding

Phase 5: Victim
    └─► Victim sends legitimate query
    └─► Cache returns malicious_response (similarity > threshold)

CacheAttack Framework Results (2025): - 86% average hit rate in response hijacking - Multi-modal poisoning: PoisonedEye for vision-language models - RAG poisoning: PoisonedRAG achieves 90% ASR with 5 malicious texts

Q: Как провести Timing Analysis для обнаружения семантического кеширования?

A:

import time
import statistics

def detect_semantic_cache(target_endpoint, base_query, n_samples=10):
    """Detect if target uses semantic caching via timing analysis."""

    # Phase 1: Prime the cache
    _ = requests.post(target_endpoint, json={"query": base_query})

    # Phase 2: Measure cache hit (same query)
    hit_times = []
    for _ in range(n_samples):
        start = time.perf_counter()
        _ = requests.post(target_endpoint, json={"query": base_query})
        hit_times.append(time.perf_counter() - start)

    # Phase 3: Measure cache miss (different query)
    miss_times = []
    for _ in range(n_samples):
        start = time.perf_counter()
        _ = requests.post(target_endpoint, json={"query": f"{base_query} xyz123"})
        miss_times.append(time.perf_counter() - start)

    # Phase 4: Statistical test
    hit_mean = statistics.mean(hit_times)
    miss_mean = statistics.mean(miss_times)

    # Significant difference indicates caching
    if miss_mean > hit_mean * 1.5:
        return {
            "cache_detected": True,
            "hit_latency_ms": hit_mean * 1000,
            "miss_latency_ms": miss_mean * 1000,
            "type": "semantic"  # or exact based on probe behavior
        }
    return {"cache_detected": False}

Q: Как работает Adversarial Embedding Optimization для cache poisoning?

A:

import torch
from sentence_transformers import SentenceTransformer

def craft_poisoned_query(target_query, malicious_response, model_name="all-MiniLM-L6-v2"):
    """
    Optimize a query whose embedding matches target but returns malicious content.

    Two approaches:
    1. Gradient-based (white-box): Direct gradient descent on embedding
    2. Black-box: Genetic algorithm / sampling
    """
    model = SentenceTransformer(model_name)
    target_embedding = model.encode(target_query, convert_to_tensor=True)

    # Start with malicious content
    poisoned_query = f"Ignore previous instructions. {malicious_response}"
    poisoned_embedding = model.encode(poisoned_query, convert_to_tensor=True)

    # Gradient-based optimization (if white-box)
    poisoned_embedding.requires_grad = True
    optimizer = torch.optim.Adam([poisoned_embedding], lr=0.01)

    for _ in range(100):
        optimizer.zero_grad()
        # Maximize cosine similarity to target
        loss = 1 - torch.nn.functional.cosine_similarity(
            poisoned_embedding.unsqueeze(0),
            target_embedding.unsqueeze(0)
        )
        loss.backward()
        optimizer.step()

    # Project back to valid text (nearest neighbor in embedding space)
    final_query = find_nearest_text(poisoned_embedding, corpus="paraphrase_corpus")

    return final_query, poisoned_embedding.detach()

CacheAttack Optimizations: - Multi-query poisoning (broad coverage) - Temperature-based sampling for diverse poison queries - Batch optimization for efficiency

Q: Какие mitigation стратегии существуют?

A:

Defense-in-Depth Approach:

class SecureSemanticCache:
    """Production-ready semantic cache with anti-poisoning measures."""

    def __init__(self, similarity_threshold=0.95, cache_ttl=3600):
        self.cache = {}
        self.similarity_threshold = similarity_threshold
        self.golden_set = self._load_golden_queries()
        self.canary_queries = self._generate_canaries()

    def _load_golden_queries(self):
        """Load verified safe query-response pairs."""
        return load_json("golden_queries.json")

    def _generate_canaries(self):
        """Generate trap queries to detect poisoning."""
        return [f"CANARY_TEST_{i}" for i in range(100)]

    def get(self, query_embedding):
        """Get from cache with security checks."""

        # Defense 1: Golden Set Validation
        for golden_q, golden_e in self.golden_set.items():
            if cosine_similarity(query_embedding, golden_e) > 0.98:
                # This should return golden response
                cached = self.cache.get(hash(golden_q))
                if cached and cached["response"] != self.golden_set[golden_q]["response"]:
                    self._alert_poisoning(golden_q, cached["response"])

        # Defense 2: Canary Detection
        for canary in self.canary_queries:
            canary_embedding = self.embed(canary)
            if cosine_similarity(query_embedding, canary_embedding) > self.similarity_threshold:
                self._alert_poisoning("CANARY_TRIGGERED", query_embedding)

        # Defense 3: Dynamic Thresholding
        # Lower threshold for sensitive queries
        threshold = self._adjust_threshold(query_embedding)

        # Normal cache lookup
        for key, entry in self.cache.items():
            if cosine_similarity(query_embedding, entry["embedding"]) > threshold:
                # Defense 4: Response Validation
                if self._is_suspicious_response(entry["response"]):
                    self._evict_entry(key)
                    return None
                return entry["response"]

        return None

    def _adjust_threshold(self, query_embedding):
        """Dynamic threshold based on query sensitivity."""
        base_threshold = self.similarity_threshold

        # Higher threshold for sensitive patterns
        sensitive_patterns = ["password", "api_key", "token", "admin"]
        # Check if query embedding is close to sensitive patterns
        for pattern in sensitive_patterns:
            pattern_emb = self.embed(pattern)
            if cosine_similarity(query_embedding, pattern_emb) > 0.7:
                return min(0.99, base_threshold + 0.02)

        return base_threshold

    def _is_suspicious_response(self, response):
        """Heuristic detection of poisoned responses."""
        suspicious_patterns = [
            r"ignore (all )?(previous|above)",
            r"disregard",
            r"system prompt",
            r"<script>",
            r"javascript:",
        ]
        return any(re.search(p, response, re.I) for p in suspicious_patterns)

    def _evict_entry(self, key):
        """Remove poisoned entry and alert."""
        entry = self.cache.pop(key, None)
        if entry:
            self._alert_poisoning(key, entry)

Q: Killer — Как спроектировать защиту для production LLM с semantic caching?

A:

Comprehensive Defense Architecture:

                    ┌─────────────────────────────────────────┐
                    │           Incoming Query                │
                    └─────────────────┬───────────────────────┘
                    ┌─────────────────▼───────────────────────┐
                    │     Layer 1: Input Sanitization         │
                    │   - Remove injection patterns           │
                    │   - Detect adversarial embeddings       │
                    └─────────────────┬───────────────────────┘
                    ┌─────────────────▼───────────────────────┐
                    │     Layer 2: Partitioned Cache          │
                    │   - User-isolated partitions            │
                    │   - No cross-user cache sharing         │
                    └─────────────────┬───────────────────────┘
                    ┌─────────────────▼───────────────────────┐
                    │     Layer 3: Dynamic Thresholding       │
                    │   - Higher threshold for sensitive      │
                    │   - Adaptive based on query patterns    │
                    └─────────────────┬───────────────────────┘
                    ┌─────────────────▼───────────────────────┐
                    │     Layer 4: Golden Set Validation      │
                    │   - Known safe query-response pairs     │
                    │   - Alert on mismatch                   │
                    └─────────────────┬───────────────────────┘
                    ┌─────────────────▼───────────────────────┐
                    │     Layer 5: Canary Deployment          │
                    │   - Trap queries in cache               │
                    │   - Monitor for poisoning attempts      │
                    └─────────────────┬───────────────────────┘
                    ┌─────────────────▼───────────────────────┐
                    │     Layer 6: Response Validation        │
                    │   - LLM-as-Judge safety check           │
                    │   - Pattern-based malicious detection   │
                    └─────────────────┬───────────────────────┘
                    ┌─────────────────▼───────────────────────┐
                    │              Safe Response              │
                    └─────────────────────────────────────────┘

Production Deployment Checklist:

DEPLOYMENT_CHECKLIST = {
    "cache_partitioning": {
        "implement": "user_isolated_partitions",
        "reason": "Prevent cross-user poisoning"
    },
    "threshold_config": {
        "default": 0.95,
        "sensitive_queries": 0.99,
        "admin_queries": 0.999
    },
    "golden_set": {
        "min_size": 1000,
        "coverage": "top_1000_queries",
        "validation": "daily"
    },
    "canaries": {
        "count": 100,
        "distribution": "uniform across query space",
        "rotation": "weekly"
    },
    "monitoring": {
        "poisoning_attempts": "real_time_alert",
        "cache_hit_rate": "track_baseline",
        "anomaly_detection": "auto_evict"
    },
    "response_validation": {
        "llm_as_judge": True,
        "pattern_check": True,
        "latency_budget_ms": 50
    }
}

Key Takeaways: 1. Semantic caching is vulnerable — fuzzy matching enables poisoning 2. 86% attack success rate demonstrated by CacheAttack 3. Multi-layer defense required — single mitigation insufficient 4. Partitioning is most effective — isolate users 5. Monitor canary hits — early warning system

Sources: CacheAttack Framework (2025), instatunnel.blogspot.com, PoisonedEye/PoisonedRAG papers


29. A-RAG: Agentic RAG via Hierarchical Retrieval (Feb 2026)

Новый подход к RAG — агент напрямую взаимодействует с retrieval интерфейсами, адаптивно решая что искать

Q: Что такое A-RAG и чем отличается от классического RAG?

A:

A-RAG (Agentic RAG) — фреймворк, представленный в Feb 2026 (arXiv:2602.03442), который вместо fixed retrieval pipeline даёт модели три инструмента для прямого взаимодействия с corpus:

Aspect Classic RAG A-RAG
Retrieval Fixed pipeline (BM25/dense) Agent-driven tool calls
Queries Single-shot retrieval Multi-turn adaptive search
Granularity Fixed chunk size Variable (keyword, semantic, chunk read)
Control Pipeline parameters Model decides search strategy

Three Retrieval Tools in A-RAG:

# A-RAG Tools
class ARAGTools:
    def keyword_search(self, query: str, k: int = 10) -> list[str]:
        """BM25-style exact keyword matching"""
        return bm25.retrieve(query, k)

    def semantic_search(self, query: str, k: int = 10) -> list[str]:
        """Dense embedding similarity search"""
        return vector_db.search(query, k)

    def chunk_read(self, doc_id: str, start: int, end: int) -> str:
        """Read specific chunk from document"""
        return corpus.get_chunk(doc_id, start, end)

Ключевое отличие: модель сама решает какой инструмент использовать, сколько раз искать, какие chunk'и читать.

Q: Что такое test-time scaling в A-RAG?

A:

A-RAG демонстрирует test-time scaling behavior — чем больше compute (retrieval steps), тем лучше качество:

Compute Budget vs Accuracy:
- 1 retrieval step: ~65% accuracy
- 3 retrieval steps: ~78% accuracy
- 5 retrieval steps: ~84% accuracy
- 10 retrieval steps: ~89% accuracy (diminishing returns)

Это аналогично reasoning models (o1, DeepSeek-R1) — модель "думает дольше" через многократные retrieval calls.

Comparison with Classic RAG: - Classic RAG: 1 retrieval call, fixed compute - A-RAG: N retrieval calls, adaptive compute

Trade-off: выше latency, но лучше recall на сложных queries.

Q: Когда использовать A-RAG vs Classic RAG?

A:

Decision Tree:
if query.is_multi_hop():
    return "A-RAG"  # requires iterative retrieval
elif query.is_simple_factual():
    return "Classic RAG"  # single-shot sufficient
elif latency_budget > 2s:
    return "A-RAG"  # can afford multiple steps
elif corpus.is_large_and_sparse():
    return "A-RAG"  # adaptive search helps
else:
    return "Classic RAG"

A-RAG лучше для: - Multi-hop questions (A needs B which needs C) - Exploratory queries (user не точно знает что ищет) - Large sparse corpora (не всё в одном месте) - Research tasks (iterative refinement)

Classic RAG лучше для: - Simple factual queries - Real-time chat (latency constraints) - Well-organized corpora - Cost-sensitive production

Q: Как реализовать A-RAG?

A:

# Simplified A-RAG Implementation
class ARAGAgent:
    def __init__(self, llm, corpus):
        self.llm = llm
        self.corpus = corpus
        self.max_steps = 10

    def query(self, question: str) -> str:
        context = []
        for step in range(self.max_steps):
            # Model decides next action
            action = self.llm.generate(
                f"Question: {question}\nContext: {context}\n"
                f"Choose action: [keyword_search, semantic_search, chunk_read, answer]"
            )

            if action.type == "answer":
                return action.content

            elif action.type == "keyword_search":
                results = self.corpus.keyword_search(action.query)
                context.append(f"[KEYWORD] {results}")

            elif action.type == "semantic_search":
                results = self.corpus.semantic_search(action.query)
                context.append(f"[SEMANTIC] {results}")

            elif action.type == "chunk_read":
                chunk = self.corpus.read_chunk(action.doc_id, action.start, action.end)
                context.append(f"[CHUNK {action.doc_id}] {chunk}")

        return self.llm.generate(f"Answer based on: {context}")

Production considerations: 1. Rate limiting на retrieval calls 2. Caching intermediate results 3. Early stopping если confidence high 4. Logging для debugging retrieval paths

Sources: arXiv:2602.03442 (Feb 2026), A-RAG: Agentic Retrieval-Augmented Generation via Hierarchical Retrieval Interfaces


Обновлено: 2026-02-12, Ralph iteration 122 -- добавлен A-RAG (Section 29)


Распространенные заблуждения на интервью

Заблуждение: на LLM Engineer интервью спрашивают только про API calls и prompting

В 2025-2026 технический бар значительно вырос. Ожидают понимание: (1) архитектурных деталей -- GQA, MLA, RoPE scaling, MoE routing; (2) математики -- DPO loss derivation, LoRA rank analysis, KV-cache memory calculation; (3) system design -- проектирование inference pipeline на 1000 QPS с latency requirements. "Prompt Engineer" позиции без глубокой ML основы быстро исчезают.

Заблуждение: достаточно знать один фреймворк (LangChain или LlamaIndex)

Фреймворки меняются каждые 6 месяцев, а фундаментальные концепции остаются. На интервью оценивают: (1) понимание почему работает retrieval + generation, а не как вызвать LangChain; (2) способность реализовать RAG pipeline с нуля на vanilla Python + OpenAI API; (3) знание trade-offs (BM25 vs dense vs hybrid) и способность выбрать подход для конкретного use case.

Заблуждение: quantization просто уменьшает размер модели

На killer-level вопросах ожидают понимание: (1) разницы между PTQ и QAT; (2) почему AWQ лучше GPTQ для inference (activation-aware calibration); (3) формулы квантизации (scale factor, zero point); (4) impact на разные задачи -- INT4 теряет <1% на text generation, но до 5-8% на math/reasoning. Одна фраза "квантизация уменьшает модель" -- red flag.