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%'
WHERE title LIKE '%contrato%'
- ✗Procura palavra exata
- ✗"acordo" não encontra "contrato"
- ✗Semanter significado
🔢
Busca Vetorial
Similaridade semânticaSELECT id, chunk,
1 - (embedding <=> ?) AS similarity
FROM articles
1 - (embedding <=> ?) AS similarity
FROM articles
- ✓Procura por significado
- ✓"acordo" encontra "contrato"
- ✓Geometria no espaço vetorial
📊 Métricas de Retrieval
| Métrica | Descrição | Uso |
|---|---|---|
| Cosine Similarity | Ângulo entre vetores (-1 a 1) | Recomendado para texto |
| Euclidean Distance | Distância reta entre vetores | Quando magnitude importa |
| Dot Product | Produto escalar | Com 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();
}
}