Урок 11

Оптимизация RAG

RAG может быть медленным и дорогим. Разберём оптимизацию.

Chunking

Длинные документы разбиваются на части:

$chunks = Str::of($content)->chunk(1000);

foreach ($chunks as $chunk) {
    $embedding = Str::of($chunk)->toEmbeddings();
    DocumentChunk::create(['content' => $chunk, 'embedding' => $embedding]);
}

Оптимальный размер — 500–1000 токенов.

Кеширование embeddings

// config/ai.php
'caching' => [
    'embeddings' => ['cache' => true],
],

Не генерирует embedding дважды для одного текста.

Очереди

Embedding в фоне:

ProcessDocument::dispatch($document);

Не блокирует HTTP.

Порог схожести

SimilaritySearch::usingModel(Document::class, 'embedding')
    ->minSimilarity(0.6),

Выше порог — меньше документов, быстрее ответ.

Лимит результатов

SimilaritySearch::usingModel(Document::class, 'embedding')
    ->limit(5),

Меньше документов — меньше токенов.

Reranking

После поиска — переранжировать, оставить топ-5.

Индексы

$table->vector('embedding', dimensions: 1536)->index();

HNSW-индекс ускоряет поиск.

pgvector

Только PostgreSQL с pgvector. Laravel Cloud включает его.

Итоги

  • Chunking 500–1000 токенов
  • Кеш embeddings
  • Queue для генерации
  • Порог схожести
  • Лимит результатов
  • Reranking
  • HNSW-индекс