Capítulo 5

Retrieval

Busca semântica: como encontrar chunks relevantes no espaço vetorial usando similaridade geométrica.

🔍 Busca Vetorial vs LIKE

🔤

Busca Tradicional (LIKE)

关键词匹配
SELECT * FROM articles
WHERE title LIKE '%contrato%'
  • Procura palavra exata
  • "acordo" não encontra "contrato"
  • Semanter significado
🔢

Busca Vetorial

Similaridade semântica
SELECT id, chunk,
1 - (embedding <=> ?) AS similarity
FROM articles
  • Procura por significado
  • "acordo" encontra "contrato"
  • Geometria no espaço vetorial

📊 Métricas de Retrieval

MétricaDescriçãoUso
Cosine SimilarityÂngulo entre vetores (-1 a 1)Recomendado para texto
Euclidean DistanceDistância reta entre vetoresQuando magnitude importa
Dot ProductProduto escalarCom normalização

Recomendado: Cosine Similarity para texto. O operador <=> no PostgreSQL usa cosine similarity por padrão com pgvector.

💻 RetrievalService — Laravel

app/Services/RetrievalService.php
<?php
class RetrievalService
{
    public function search(string $query, int $limit = 5): Collection
    {
        // 1. Gerar embedding da query
        $queryEmbedding = $this->embeddingService->generate($query);

        // 2. Busca vetorial
        $results = DB::select("
            SELECT id, chunk,
                   1 - (embedding <=> ?) AS similarity
            FROM articles
            WHERE embedding <=> ? < 0.5  -- limiar
            ORDER BY embedding <=> ?
            LIMIT ?
        ", [
            json_encode($queryEmbedding),
            json_encode($queryEmbedding),
            json_encode($queryEmbedding),
            $limit,
        ]);

        // 3. Re-rank com score
        return collect($results)
            ->sortByDesc("string">'similarity')
            ->values();
    }
}