Olá! Bem-vindo de volta ao nosso segundo módulo sobre os princípios da Retrieval-Augmented Generation (RAG).
Na lição anterior, estabelecemos que o RAG é a estrutura essencial que permite a um LLM acessar conhecimento externo e atualizado, funcionando como um "exame com consulta". Vimos que o primeiro passo crucial nesse processo é a Recuperação (Retrieval). Mas como um sistema de computador pode "ler" uma tarefa do Jira e "entender" que precisa encontrar um documento sobre "regras de faturamento" no Google Drive, em vez de um sobre "políticas de férias"? A simples correspondência de palavras-chave é frágil e ineficaz.
É aqui que entra o tópico da nossa lição de hoje. Para realizar uma busca verdadeiramente inteligente e baseada no significado — uma busca semântica — precisamos de uma maneira de traduzir a linguagem humana em um formato que as máquinas possam compreender e comparar matematicamente.
O objetivo desta lição é descrever como o texto é convertido em embeddings de vetores numéricos para busca semântica. Ao final, você entenderá o que são embeddings, por que são a espinha dorsal da busca semântica e como são gerados.
1. Traduzindo Significado em Números
O desafio fundamental é que os algoritmos de machine learning e, por extensão, os computadores, operam com números, não com palavras. Precisamos de um método para converter texto, como "Implementar autenticação de dois fatores", em uma representação numérica que capture sua essência ou semântica.
Essa representação é chamada de embedding. Um text embedding é um vetor (uma lista) de números de ponto flutuante que representa uma palavra, uma frase ou um documento inteiro em um espaço matemático de alta dimensão.
A propriedade mais importante desses vetores é que eles são projetados para que textos com significados semelhantes tenham vetores que estão "próximos" um do outro nesse espaço. Por exemplo, os vetores para "criar um novo usuário" e "registrar um cliente" estarão muito mais próximos um do outro do que do vetor para "calcular o frete".
Para uma introdução ao conceito, assista à primeira parte do vídeo a seguir.
O vídeo 'What are Word Embeddings?' do canal IBM Technology explica de forma concisa por que precisamos converter palavras em números e o que significa capturar 'relações semânticas'.
Assista ao trecho inicial, de 00:00 a 00:48. Concentre-se em entender dois pontos-chave: por que os algoritmos de ML precisam de números e como os embeddings posicionam palavras com significados semelhantes próximas umas das outras no espaço vetorial.
Dada sua formação em engenharia de teleinformática, você pode traçar um paralelo com a análise de sinais. Assim como uma Transformada de Fourier converte um sinal do domínio do tempo para o domínio da frequência para facilitar a análise de suas componentes, um modelo de embedding converte o texto do "domínio das palavras" para o "domínio vetorial" para permitir a análise matemática de seu significado.
2. A Evolução da Representação Textual
A ideia de converter texto em vetores não é nova, mas os métodos evoluíram drasticamente. Compreender essa evolução ajuda a valorizar o poder das técnicas modernas usadas no RAG.
-
Abordagens Iniciais (Bag of Words & TF-IDF): Os primeiros métodos, como Bag of Words, simplesmente contavam a frequência de cada palavra em um texto. Uma versão aprimorada, TF-IDF (Term Frequency-Inverse Document Frequency), ponderava essas contagens para dar mais importância a palavras raras e informativas. No entanto, essas técnicas têm uma falha fatal: elas não capturam o significado. As frases "Rei menos homem mais mulher" e "Rainha" seriam completamente distintas para esses sistemas. Além disso, geravam vetores muito grandes e esparsos (a maioria dos valores era zero).
-
Embeddings Preditivos (Word2Vec, GloVe): Em 2013, modelos como Word2Vec (do Google) revolucionaram a área. A ideia era treinar uma rede neural para prever uma palavra com base em seu contexto (ou vice-versa). Ao fazer isso, o modelo aprendia representações vetoriais (embeddings) densas e de menor dimensão, onde as relações semânticas eram preservadas. Foi com esses modelos que a famosa equação vetorial
vetor('Rei') - vetor('Homem') + vetor('Mulher') ≈ vetor('Rainha')se tornou possível. -
Embeddings Contextuais (Transformers): A mais recente e poderosa evolução veio com a arquitetura Transformer (a base dos LLMs modernos como GPT e BERT). Diferentemente do Word2Vec, que atribui um único vetor a cada palavra, os modelos baseados em Transformer geram embeddings contextuais. Isso significa que o vetor para a palavra "banco" será diferente nas frases "sentei no banco da praça" e "fui ao banco depositar dinheiro". Essa capacidade de entender o contexto é o que torna os embeddings modernos tão poderosos para a busca semântica.
O artigo a seguir detalha essa evolução, oferecendo uma visão histórica e técnica valiosa.
Text Embeddings: Comprehensive Guide
O artigo 'Text Embeddings: Comprehensive Guide' do Towards Data Science fornece uma excelente visão geral da evolução das representações de texto, desde o Bag of Words até os Transformers.
Leia a seção 'Evolution of Embeddings'. Não é necessário se aprofundar nos trechos de código, mas concentre-se em entender as limitações de cada abordagem (Bag of Words, TF-IDF) e os avanços conceituais introduzidos pelo Word2Vec e, finalmente, pelos Transformers e Sentence-BERT.
3. Gerando Embeddings para Buscas Semânticas
Hoje, para sistemas de RAG, usamos modelos baseados em Transformer, como os da família BERT ou os modelos de embedding oferecidos por APIs como OpenAI e Hugging Face. O processo geral é o seguinte:
- Tokenização: O texto de entrada é dividido em unidades menores chamadas tokens (que podem ser palavras, partes de palavras ou caracteres).
- Passagem pelo Modelo: Esses tokens são alimentados em um modelo de embedding pré-treinado. O modelo processa os tokens e suas relações contextuais.
- Pooling: O modelo Transformer gera um vetor de embedding para cada token de entrada. Para obter um único vetor que represente a frase ou documento inteiro, aplicamos uma técnica de pooling. As duas mais comuns são:
- CLS Token: Usar o embedding do token especial
[CLS](Classification), que é projetado para agregar o significado de toda a sequência. - Mean Pooling: Calcular a média dos vetores de embedding de todos os tokens na sequência (desconsiderando tokens de preenchimento, ou padding).
- CLS Token: Usar o embedding do token especial
O vídeo a seguir ilustra muito bem este processo, mostrando a passagem de sentenças por um encoder e a etapa de pooling.
Text embeddings & semantic search
O vídeo 'Text embeddings & semantic search' do canal Hugging Face mostra de forma prática como um modelo encoder gera embeddings e a necessidade de usar pooling para obter um único vetor por sentença.
Assista aos trechos de 00:05 a 00:42 e de 01:12 a 02:07. Preste atenção em como as sentenças são convertidas em vetores e, principalmente, como as técnicas de pooling (CLS e mean pooling) são usadas para consolidar os embeddings de múltiplos tokens em um único vetor representativo da sentença.
O diagrama abaixo ilustra o fluxo completo da busca semântica, que é o coração da etapa de Recuperação no RAG.

4. Medindo a Proximidade: A Geometria do Significado
Uma vez que temos os vetores, como determinamos que "criar um novo usuário" está "próximo" de "registrar um cliente"? Fazemos isso medindo a distância ou a similaridade entre seus vetores no espaço n-dimensional.
Existem várias métricas, mas a mais comum para tarefas de Processamento de Linguagem Natural (PLN) é a Similaridade de Cosseno (Cosine Similarity).
Em vez de medir a distância euclidiana (a "régua" entre os pontos finais dos vetores), a similaridade de cosseno mede o ângulo entre eles.
- Se dois vetores apontam na mesma direção, o ângulo entre eles é 0°, e o cosseno é 1. Isso indica máxima similaridade.
- Se são ortogonais (apontam em direções não relacionadas), o ângulo é 90°, e o cosseno é 0.
- Se apontam em direções opostas, o ângulo é 180°, e o cosseno é -1.
A fórmula para a similaridade de cosseno entre dois vetores A e B é:
Onde é o produto escalar dos vetores, e e são suas magnitudes (norma L2).
A principal vantagem da similaridade de cosseno é que ela é normalizada pela magnitude dos vetores, focando puramente na direção. Isso é útil porque o comprimento de um texto não deve, necessariamente, afetar seu significado central.
Text Embeddings: Comprehensive Guide
Para aprofundar nas métricas de distância, o artigo 'Text Embeddings: Comprehensive Guide' que vimos anteriormente também tem uma excelente seção sobre o assunto.
Leia a seção 'Distance between vectors'. Concentre-se na explicação sobre a 'Cosine similarity' e no tópico 'What metric to use?', que justifica por que a similaridade de cosseno é frequentemente a métrica de escolha para tarefas de NLP.

Conclusão
Nesta lição, desvendamos o mecanismo que alimenta a etapa de "Recuperação" do RAG. Vimos que a busca semântica, essencial para que seu agente entenda as tarefas, é viabilizada pela conversão de texto em representações numéricas chamadas embeddings.
Principais Pontos:
- Embeddings são vetores numéricos que representam o significado semântico de um texto em um espaço multidimensional.
- Eles são necessários porque os algoritmos de computador operam com números e precisam de uma forma de comparar o significado do texto matematicamente.
- Os embeddings contextuais, gerados por modelos baseados em Transformer, são o estado da arte, pois o vetor de uma palavra muda de acordo com a frase em que ela está inserida.
- A Similaridade de Cosseno é a métrica mais comum para medir a "proximidade" de significado entre dois embeddings, calculando o ângulo entre seus vetores.
Na Próxima Lição:
Agora que sabemos como criar e comparar esses vetores, surge uma questão prática: onde e como armazenamos milhões (ou bilhões) desses vetores para que a busca por similaridade seja executada em milissegundos? Simplesmente iterar sobre todos os vetores e calcular a similaridade de cosseno a cada consulta seria computacionalmente inviável. A solução está nos vector stores (ou bancos de dados vetoriais), que serão o foco da nossa próxima lição: "Explicar a função de um vector store na indexação, armazenamento e recuperação de embeddings".