Решения

RAG на GPU: индексирование, retrieval и latency‑бюджет

Задача страницы. Дать практический рецепт построения RAG‑системы (Retrieval‑Augmented Generation) на облачных GPU: от пайплайна подготовки данных и эмбеддингов до выбора индекса, rerank’а и бюджета задержек на прод‑инференсе.

TL;DR

  • RAG = ингест (chunk→embed) → поиск кандидатов → переранжирование → сбор контекста → ответ LLM.
  • На GPU ускоряются два узких места: эмбеддинги и векторный поиск (FAISS‑GPU / cuVS).
  • Держите latency‑бюджет: T_total ≈ T_embed_q + T_search + T_rerank + T_LLM. Для онлайн‑чата целитесь в p95 ≤ 1–1.5 с.
  • Экономьте VRAM/цену за 1M через INT8/INT4 эмбеддинги/модель, умеренный контекст и стриминг токенов.

Связанные страницы‑«детализация»:
→ Векторы/индексы: /solutions/rag/vector-db/
→ Оценка качества: /solutions/rag/evaluation/
→ Эмбеддинги на GPU: /solutions/embeddings/
→ Инференс и стоимость: /solutions/llm-inference/, /solutions/llm-inference/costs/
→ Стриминг/наблюдаемость/безопасность: /solutions/llm-inference/streaming/, /solutions/llm-inference/observability/, /solutions/llm-inference/guardrails/

Когда RAG лучше дообучения

  • Частые обновления знаний. Дешевле переиндексировать документы, чем регулярно дообучать LLM.
  • Много доменов/тенантов. Раздельные индексы/коллекции, единая модель ответа.
  • Требуется цитируемость. RAG возвращает ссылки/цитаты, повышая доверие и управляемость.

Когда не стоит: крайне «структурные» задачи с короткими контекстами и верифицируемой логикой — рассмотрите компактную модель без retrieval или лёгкий классификатор.

Архитектура RAG (канонический пайплайн)

Ингест → Очистка/Разметка → Chunking → Embeddings → Векторный индекс → (опц.) Метаданные/БМ25

Запрос → Embedding запроса → Поиск top‑K → (опц.) Rerank → Сбор контекста → Подсказка → LLM → Ответ+Цитаты

Роли GPU:

  • Ингест (офлайн): быстрый расчёт эмбеддингов батчами.
  • Онлайн: эмбеддинг запроса + GPU‑поиск + (опционально) rerank.
  • LLM‑ответ: выбранный стек (vLLM/TGI/TensorRT‑LLM/SGLang/llama.cpp).

Подготовка данных и чанкование

Нормализация: PDF/HTML/Docx → чистый текст + блоки разметки (заголовки, списки, таблицы).
Chunking:

  • Размер (токены): 256–512 для чата/QA; 768–1024 для аналитики; overlap 10–20%.
  • Стратегии: по абзацам/заголовкам; «умный» сплит по пунктуации; для кода — по логическим блокам.
  • Метаданные: title, section, source_url/id, lang, timestamp, tags.
  • Dedup: хеши шинглов/абзацев, чтобы не плодить близнецы.

Пример чанкера (упрощённо):

def chunk(text, max_tok=512, overlap=64, tokenize=lambda s: s.split()):

    toks = tokenize(text)

    i = 0

    while i < len(toks):

        yield » «.join(toks[i:i+max_tok])

        i += max_tok — overlap

Подробнее про эмбеддинги и батч‑планирование: /solutions/embeddings/.

Эмбеддинги на GPU

Модель эмбеддингов выбирайте под языки/домены; важны: dim, latency, цена.
Параметры батча: балансируйте VRAM/throughput; цель — saturate Tensor Cores, избегая OOM.
Хранение: fp16 (2 байта × dim) или INT8‑квант для экономии памяти индекса (см. /solutions/llm-inference/quantization/).

Оценка памяти эмбеддингов:

Mem_vectors ≈ N_docs × dim × bytes_per_elem

Пример: 2 млн чанков × 768 × 2 байта ≈ ~2.95 ГБ (без оверхеда индекса).

Индексы и поиск (GPU)

Выбор индекса зависит от N и бюджета задержек (детально: /solutions/rag/vector-db/):

  • FLAT (точный): максимум качества, дороже по задержкам на больших N.
  • IVF‑Flat/IVF‑PQ: компромисс качество/скорость/память (centroids + PQ‑кванты).
  • HNSW: быстрый small‑to‑mid, больше памяти.
  • Гибрид (BM25 + вектор): смешанный candidate set.

Latency‑ориентиры (приближённо, порядок величин на одной GPU):

  • T_search FLAT: O(N) скан; IVF/HNSW: O(log N)/O(√N) с константами.
  • Offline‑ингест: IVF‑тренировка (к‑средних), PQ‑кодификация — тоже хорошо параллелится на GPU.

Rerank: когда и как

Зачем: повысить точность top‑K, особенно на длинных/шумных документах.
Где считать:

  • На GPU — если SLA жёсткий и трафик высокий.
  • На CPU — если K небольшой и задержки терпимы.

Практика: выдавайте topK_retrieve (например, 50–100), затем rerank до k’ (8–12). Для суперстрогой p95 часто хватает без rerank, но повышайте качество chunk‑контекста (заголовки, подсветка).

Сбор контекста и подсказка для LLM

Цели: компактность, цитируемость, устойчивость к «инъекциям».

  • Формируйте структурированный контекст: блоки [Источник|Заголовок|Сниппет|Score].
  • Ограничивайте общий context budget (например, ≤ 1–2 K токенов для short‑пула).
  • Сортируйте по релевантности, удаляйте дубликаты/пересечения.
  • В подсказке явно требуйте ссылки на источники и «не выдумывать» вне них.

Latency‑бюджет (как уложиться в SLA)

Обозначим:
T_embed_q — эмбеддинг запроса; T_search — поиск; T_rerank — переранжирование; T_LLM — генерация (prefill + decode).

Бюджет:

T_total ≈ T_embed_q + T_search + T_rerank + T_LLM

T_LLM  ≈ (L_in / P) + (L_out / (D / B)) + overhead

Где L_in — системный промпт + контекст, L_out — целевая длина ответа; P/D/B — как в /solutions/llm-inference/costs/.

Ориентиры для онлайн‑чата (p95):

  • T_embed_q ≤ 20–40 мс, T_search ≤ 50–150 мс, T_rerank ≤ 80–200 мс, T_LLM ≤ 600–900 мс.
  • Для «аналитики» допускается больше (2–3 с), но обязательно — стриминг (см. /solutions/llm-inference/streaming/).

Стоимость и кэширование

Ключевые драйверы цены: эмбеддинг запроса + генерация LLM.
Снижайте:

  • Кэш результатов по нормализованным запросам (n‑gram сигнатуры, канонизация).
  • Кэш префикса подсказки (в vLLM) и обрезка контекста по важности.
  • Квантизация: INT8/INT4 для эмбеддингов/LLM, FP8 на H100 (см. /solutions/llm-inference/quantization/).
  • Лимиты длины и раздельные пулы short/long (см. /solutions/llm-inference/multi-model/).
  • Цена за 1M токенов → формулы в /solutions/llm-inference/costs/.

Безопасность и качество

  • Guardrails: PII‑санитайзинг входа/выхода, фильтры категорий, защита от prompt‑injection (см. /solutions/llm-inference/guardrails/).
  • Оценка качества: offline‑метрики (Recall@K/MRR), A/B на проде, ручная разметка edge‑кейсов — см. /solutions/rag/evaluation/.
  • Наблюдаемость: TTFT/TBT/TTLT, hit‑rate кэшей, распределение L_in/L_out, ошибки — см. /solutions/llm-inference/observability/, /solutions/monitoring-logging/.

Паттерны эксплуатации

  • Мульти‑коллекции/тенанты: изоляция индексов, отдельные лимиты, кванты, бюджеты.
  • Инкрементальные обновления: log‑таблица изменений → периодический re‑embed + reindex.
  • Гибридный поиск: BM25‑кандидаты + векторный rerank — особенно для длинных документов/кода.
  • Мультиязычность: детект языка → выбор соответствующего эмбеддинга/коллекции.
  • Док‑контекст в несколько шагов: multi‑hop (retrieve → answer → follow‑up retrieve) — отделяйте в long‑пуле.

Мини‑пример пайплайна (псевдокод)

				
					def answer(query: str, k=50, k_rerank=10, out_tokens=200):
    # 1) Эмбеддинг запроса (GPU)
    q_vec = embed_query(query)               # T_embed_q

    # 2) Поиск кандидатов (GPU индекс)
    cands = vecdb.search(q_vec, top_k=k)     # T_search  → [(doc_id, score)]

    # 3) (Опц.) Rerank (GPU/CPU)
    reranked = rerank(query, cands)[:k_rerank]  # T_rerank

    # 4) Сбор контекста (дедуп/обрезка)
    ctx = build_context(reranked, budget_tokens=1200)

    # 5) Подсказка и генерирование (стриминг)
    prompt = make_prompt(query, ctx)
    return llm_generate(prompt, max_new_tokens=out_tokens, stream=True)

				
			

Конфигурации под разные масштабы

Small (≤ 100 тыс. чанков)

  • Индекс: FLAT/HNSW, rerank включён.
  • Эмбеддинги/поиск/LLM — одна или две GPU.

Medium (10⁵–10⁶)

  • Индекс: IVF‑Flat или IVF‑PQ (k‑means на GPU), rerank по top‑50→10.
  • Отдельные пулы short/long, кэширование запросов.

Large (≥ 10⁶–10⁷)

  • Шардинг по коллекциям/тенантам; префильтры по метаданным.
  • Индекс IVF‑PQ + гибрид с BM25; периодические ребилды ночами.
  • Горизонталь по поиску и отдельный пул LLM.

Детали по индексам и параметрам тренировки — в /solutions/rag/vector-db/.

Как запускать это в cloudcompute.ru

  • Шаблон “RAG‑Stack” в /solutions/templates/:
    – сервис инжеста (chunk→embed→index) с батч‑GPU;
    – онлайн‑поиск (GPU), опциональный rerank;
    – LLM‑сервис (vLLM/TGI/TensorRT‑LLM/…);
    – кэш запросов, стриминг, метрики/трейсы/алерты.
  • Экономика и SLA: /solutions/llm-inference/costs/, /solutions/llm-inference/observability/, /solutions/llm-inference/streaming/.

Чек‑лист перед продом

  • Выбран размер чанков/overlap и схема метаданных.
  • Замерен throughput эмбеддингов (батчи/VRAM), выбран индекс (IVF/HNSW/…); подтверждён объем памяти.
  • Протестированы латентности T_embed_q/T_search/T_rerank/T_LLM на пилоте (p50/p95).
  • Настроены пулы short/long, стриминг, лимиты max context/max_tokens.
  • Включены guardrails (PII/injection), кэширование запросов и префиксов.
  • Настроены метрики/логирование/трейсинг; определены SLO и алерты.
  • Оценка качества: Recall@K, MRR, A/B — см. /solutions/rag/evaluation/.