Оптимизация 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-индекс