Represente o significado para a recuperação
Transforme texto em vetores, busque por similaridade e veja como os índices vetoriais trocam precisão por velocidade.
- Explicar embeddings e a similaridade de cosseno
- Encontrar os chunks mais próximos de um vetor de consulta
- Explicar os índices de vizinhos mais próximos aproximados e o trade-off deles com o recall
Um modelo de embedding transforma um trecho de texto num vetor - uma lista de algumas centenas a alguns milhares de números - de modo que textos com significado parecido fiquem próximos. “Como recebo o meu dinheiro de volta?” e “política de reembolso” não têm nenhuma palavra em comum, mas os vetores deles apontam quase na mesma direção.
A busca semântica gera o embedding de cada chunk uma vez (na indexação), gera o da pergunta na hora da consulta e devolve os chunks cujos vetores são mais parecidos - em geral pela similaridade de cosseno, o cosseno do ângulo entre dois vetores (1 = mesma direção, 0 = sem relação).
Experimente
Até 15 XPBusque num espaço de embeddings minúsculo
Escolha uma consulta e veja os chunks mais próximos dela. Compare as métricas em “dinheiro de volta”: o cosseno só olha a direção, então “Ensaio longo sobre reembolso” (mesma direção, vetor mais curto) fica bem colocado; a distância euclidiana prefere o que estiver fisicamente mais perto.
- Ensaio longo sobre reembolso cos 1,00
- Política de reembolso cos 1,00
- Prazo de devolução cos 0,98
- Taxa de reposição cos 0,93
- Prazos de entrega cos 0,30
- Rastrear uma encomenda cos -0,03
- Endereços dos escritórios cos -0,86
- Trabalhe conosco cos -0,99
O triângulo âmbar é a consulta. O cosseno compara a direção a partir do centro; a distância euclidiana compara a posição. Embeddings reais têm centenas de dimensões e costumam ser normalizados para que as duas medidas concordem.
1import math
2def cosine(first, second):
3 dot = sum(a * b for a, b in zip(first, second))
4 return dot / (math.hypot(*first) * math.hypot(*second))
5print(round(cosine([1, 2], [2, 4]), 3))
6print(round(cosine([1, 0], [0, 1]), 3))1.0 0.0
Índices vetoriais
Comparar a consulta com todos os vetores (“força bruta”) é exato, mas lento para milhões de chunks. Os índices de vizinhos mais próximos aproximados (ANN, de approximate nearest neighbor) aceleram isso buscando só nas regiões promissoras:
- O IVF agrupa os vetores em torno de centroides e busca só nos poucos clusters mais próximos (
nprobe). - O HNSW constrói um grafo de vizinhos em camadas e o percorre de forma gulosa em direção à consulta.
Eles trocam um pouco de recall por muita velocidade: de vez em quando, o verdadeiro vizinho mais próximo está num cluster que você não sondou. Aumentar o nprobe (ou o ef_search do HNSW) recupera recall ao custo de velocidade.
Principais conclusões
Os embeddings colocam significados parecidos perto uns dos outros; a similaridade de cosseno compara direções.
Gere o embedding dos chunks uma vez, na indexação, e o da consulta na hora da busca - com o mesmo modelo.
Índices ANN (IVF, HNSW) trocam um pouco de recall por grandes ganhos de velocidade.
Quiz da aula
6 perguntas · aprovação com 5 acertos · até 50 XP
Ao passar, você conclui a aula e mantém sua sequência. As perguntas erradas voltarão em sessões de revisão.
Pratique: escreva código em Python
Escreva código Python no editor e execute os testes com exemplos. O Python roda localmente no navegador usando WebAssembly.
Chunks mais próximos pela similaridade de cosseno
A primeira linha é um vetor de consulta (números separados por espaços); a segunda é k. Cada linha seguinte é id v1 v2 .... Imprima os k chunks mais parecidos como id similarity (3 casas decimais), do mais parecido para o menos.
- Dinheiro de volta
O Python é executado em um ambiente isolado no navegador, com limite de 60 segundos. O runtime é carregado pelo CDN do Pyodide; seu código permanece neste navegador.
Busca aproximada com clusters
Linhas da entrada: nprobe N, query x y e depois linhas centroid NAME x y e vector ID x y. Atribua cada vetor ao centroide mais próximo (euclidiano). Busque só nos nprobe centroides mais próximos da consulta e encontre o vetor mais próximo entre eles.
Imprima probed: NAMES (do mais próximo para o mais distante), approximate best: ID, exact best: ID (buscando em todos os vetores) e hit se forem iguais; caso contrário, miss.
- Uma sondagem erra
- Duas sondagens acertam
O Python é executado em um ambiente isolado no navegador, com limite de 60 segundos. O runtime é carregado pelo CDN do Pyodide; seu código permanece neste navegador.
Dúvidas sobre esta lição
Travou em algum ponto? Pergunte. Descobriu algo? Compartilhe. Explicar também é uma ótima forma de aprender.
Carregando publicações…