Carregando
0x30Lição 4 de 11

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.

24 min Questionário com 6 perguntas 2 exercícios de código
Ao final desta lição, você saberá
  • 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 XP

Busque 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.

Política de reembolsoPrazo de devoluçãoTaxa de reposiçãoEnsaio longo sobre reembolsoPrazos de entregaRastrear uma encomendaTrabalhe conoscoEndereços dos escritórios
  1. Ensaio longo sobre reembolso cos 1,00
  2. Política de reembolso cos 1,00
  3. Prazo de devolução cos 0,98
  4. Taxa de reposição cos 0,93
  5. Prazos de entrega cos 0,30
  6. Rastrear uma encomenda cos -0,03
  7. Endereços dos escritórios cos -0,86
  8. 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.

cosine.py
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))
Saída
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.

Exercício 1

Chunks mais próximos pela similaridade de cosseno

+25 XP

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
main.py
Carregando editor…

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.

Exercício 2
+25 XP

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
main.py
Carregando editor…

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…