O que é Embeddings?
Embeddings é um fundamento de engenharia de IA para quem trabalha com LLMs. Texto virando vetor: o que a similaridade captura e onde ela engana.
Uma central de ajuda tinha uma busca por palavra-chave. Um cliente digitou: não consigo entrar na minha conta. Zero resultados.
O artigo certo se chamava: como redefinir sua senha. Nenhuma palavra em comum. O mesmo assunto.
Então o time trocou a busca para embeddings, e aquela pergunta passou a achar o artigo certo. Duas semanas depois, um bug novo. Quem buscava cancelar assinatura recebia, em primeiro lugar: como assinar o plano anual.
Assunto parecido, intenção oposta. Esses dois casos mostram exatamente o que os embeddings captam, e onde eles enganam. E no fim desta aula, você vai saber quando confiar neles, e quando usar outra coisa.
Um embedding é uma lista de números, um vetor, que representa o significado de um texto. Um modelo de embedding foi treinado para que textos com significado parecido virem vetores próximos uns dos outros.
Imagine um mapa enorme. Cada texto ganha um ponto nele. Redefinir senha e não consigo entrar na conta caem na mesma rua. Prazo de entrega por região cai num bairro completamente diferente.
Você começa com dois textos. A pergunta de um cliente e um artigo de ajuda, por exemplo.
O mesmo modelo de embedding processa os dois.
Cada texto vira um vetor, com centenas ou milhares de dimensões.
Um cálculo simples, normalmente a similaridade de cosseno, compara os dois vetores.
E o resultado diz o quão próximos estão os significados. Os significados, não as palavras.
Uma regra que muita gente aprende do jeito difícil. A pergunta e os documentos precisam passar pelo mesmo modelo. Cada modelo desenha um mapa diferente. Comparar um vetor de um modelo com vetores de outro é como comparar um endereço com o mapa de outro planeta. Então, se trocar o modelo de embedding, reconstrua o índice inteiro.
Então, o que a similaridade capta bem? Sinônimos e paráfrases. Entrar na minha conta fica perto de fazer login, e de redefinir senha.
Idiomas diferentes, se o modelo for multilíngue. Reembolso fica perto de refund.
E o assunto geral. Textos sobre o mesmo tema se agrupam.
No atendimento brasileiro, isso aparece o tempo todo. Pix não caiu e transferência não creditada quase não têm palavras em comum. Elas falam da mesma dor. O embedding pega isso. A busca por palavra-chave sozinha, não.
Agora, onde ele engana. Negação e intenção. Cancelar assinatura e assinar um plano dividem o assunto, e o vetor vê o assunto primeiro.
Números e códigos. Pedido 4521 e pedido 4512 ficam quase idênticos. O vetor vê: isso é um número de pedido. Para identificadores, CNPJ e códigos de rastreio, filtre no banco de dados. Não por similaridade.
Termos raros do seu domínio. Siglas internas e nomes de produto podem ser desconhecidos para o modelo.
E textos longos demais. Um documento de vinte páginas vira um único vetor, e o significado de cada trecho se dilui. Por isso os documentos são divididos em pedaços antes de virar embedding.
Esse último é a armadilha clássica de quem está começando. O time transforma uma política de quarenta páginas num vetor só. Uma pergunta sobre prazo de troca de eletrônicos acerta um bolo que mistura férias, reembolso, devolução e código de ética. A similaridade pode até ser alta. Mas o trecho útil não está isolado. A divisão em pedaços existe para que cada vetor represente um assunto.
Uma pergunta para você. De volta à central de ajuda. Um cliente busca cancelar assinatura, e o primeiro resultado é como assinar o plano anual. O índice está quebrado? Qual é a leitura certa desse ranking?
O índice está bem. O embedding fez o trabalho dele. Agrupou o assunto assinatura. A intenção é que saiu invertida. Para desempatar, você precisa de um sinal além da similaridade. Palavra-chave, um filtro, reranking ou um classificador.
E trocar por um modelo melhor em português também não resolve. O mesmo acontece em inglês, com cancel e subscribe. O modelo pode mexer um pouco na ordem. O limite de intenção continua.
Então, onde os embeddings aparecem na prática? Busca semântica. Compare a pergunta com pedaços de documentos e pegue os mais próximos.
Busca para geração, o RAG. Use essa busca para escolher o que entra no contexto do modelo. É a próxima aula.
Agrupamento. Junte tickets ou feedbacks parecidos, sem rotular nada antes.
Roteamento barato. Compare a mensagem com exemplos de cada rota. Mas cuidado com empate. Uma mensagem como fui cobrado duas vezes pelo pedido 4521 fica bem entre cobrança e pedidos. Abaixo de um limite, mande para um classificador ou para uma pessoa, em vez de forçar o primeiro lugar.
E cache semântico. Reaproveite a resposta de uma pergunta muito parecida com uma já respondida. Ele herda a mesma armadilha. Como cancelo fica perto de como assino. Com um limite frouxo, o cache entrega a resposta errada. Então trate o limite como parte do contrato, e teste com casos de intenção oposta.
Na página tem um experimento que roda no seu notebook, sem chave de API, com um modelo multilíngue pequeno e aberto. Você compara uma pergunta com quatro artigos de ajuda e imprime as notas.
Comece com não consigo entrar na minha conta, e veja redefinir senha sair em primeiro.
Depois troque a pergunta para quero cancelar minha assinatura, e veja onde cai o artigo do plano anual. Por fim, teste pedido 4521 contra pedido 4512. Os números vão mostrar, sozinhos, tudo o que esta aula explicou.
E um aviso. As notas que você vê são deste modelo. Não copie o limite de outra pessoa da internet como se fosse sagrado. Meça os seus próprios pares. Os que devem casar, e os que não podem casar.
Então, o que muda nos seus desenhos? Busca só com embedding raramente basta. Combinar com busca por palavra-chave é um padrão chamado hybrid search. Lembra do Pix não caiu? Só com embedding, o artigo certo ficava em quinto. Ligar a palavra-chave levou ele para primeiro, porque Pix é um termo raro e valioso que o seu domínio precisa acertar.
Reordenar os primeiros resultados com um modelo se chama reranking.
O jeito de cortar os documentos em pedaços muda a qualidade da busca tanto quanto o modelo.
E identificadores, datas e valores ganham filtro exato no banco. Tire o número do pedido da pergunta, filtre por ele, e use similaridade só no texto livre que sobra.
Então, a ideia para levar. Embeddings colocam o significado num mapa, e por isso acham o artigo de senha sem nenhuma palavra em comum. Mas um mapa mostra proximidade, não direção. Cancelar e assinar são vizinhos, e dois números de pedido parecem gêmeos. Use significado onde significado importa, e filtro exato no resto.
Na próxima aula, a gente coloca os embeddings para trabalhar no padrão que ancora o modelo nos seus próprios documentos: o RAG. Até lá.
Embeddings
Embeddings é um fundamento de engenharia de IA para quem trabalha com LLMs. Texto virando vetor: o que a similaridade captura e onde ela engana.
A busca da central de ajuda era por palavra-chave. O cliente digitava “não consigo entrar na minha conta” e recebia zero resultados, porque o artigo certo se chamava “Como redefinir sua senha”. Nenhuma palavra em comum, mesmo assunto.
O time trocou a busca por embeddings. A pergunta passou a achar o artigo certo. Duas semanas depois, chegou outro bug: quem buscava “cancelar assinatura” recebia, em primeiro lugar, o artigo “Como assinar o plano anual”. Parecido no assunto, oposto na intenção.
Os dois casos mostram o que embeddings capturam e onde eles enganam.
Um embedding é uma lista de números (um vetor) que representa o sentido de um texto. Um modelo de embedding foi treinado para que textos com sentido parecido virem vetores próximos.
flowchart LR
T1(["1. Texto A"]):::io --> E(["2. Modelo de embedding"]):::llm
T2(["1. Texto B"]):::io --> E
E --> V1["3. Vetor A"]:::tool
E --> V2["3. Vetor B"]:::tool
V1 --> S{"4. Similaridade"}
V2 --> S
S --> R(["5. Quão parecidos são"]):::io
O modelo de pergunta e o modelo de documento têm que ser o mesmo, ou um par treinado para trabalhar junto. Misturar um embedding de um provedor com outro de um segundo provedor produz números que não significam proximidade. Se você troca o modelo, reconstrói o índice inteiro.
No Brasil isso aparece o tempo todo no atendimento. “Pix não caiu” e “transferência não creditada” quase não compartilham palavras e falam da mesma dor. Embedding pega esse caso. Palavra-chave sozinha não pega.
CNPJ, número de NF-e e código de rastreio são o caso extremo dos números. A diferença entre dois CNPJs está em poucos dígitos; o vetor enxerga “é um CNPJ” e os acha parecidos. Filtro no banco, não similaridade.
A armadilha de quem começa é embeddar o PDF inteiro da política como um vetor só. A pergunta “qual o prazo de troca de eletrônicos?” bate num blob que mistura férias, reembolso, troca e código de ética. O número de similaridade até pode ser alto. O trecho útil não está isolado.
| Uso | Como |
|---|---|
| Busca semântica | Compara a pergunta com os pedaços de documento e pega os mais próximos |
| RAG | Usa a busca semântica para escolher o que entra no contexto do modelo |
| Agrupamento | Junta tickets ou feedbacks parecidos sem rótulo prévio |
| Roteamento barato | Compara a mensagem com exemplos de cada rota |
| Cache semântico | Reaproveita a resposta de uma pergunta muito parecida com outra já respondida |
Cache semântico herda a mesma armadilha. “Como eu cancelo?” perto de “Como eu assino?” pode devolver a resposta errada se o limiar de similaridade for frouxo. Trate o limiar como parte do contrato, e meça com casos de intenção oposta.
Este experimento roda local, sem chave de API, com um modelo aberto e multilíngue: pip install sentence-transformers.
from sentence_transformers import SentenceTransformer, util
model = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
query = "não consigo entrar na minha conta"
docs = [
"Como redefinir sua senha",
"Como cancelar sua assinatura",
"Como assinar o plano anual",
"Prazo de entrega por região",
]
scores = util.cos_sim(model.encode(query), model.encode(docs))[0]
for doc, score in sorted(zip(docs, scores), key=lambda x: -x[1]):
print(f"{score:.2f} {doc}")
Depois troque a pergunta por “quero cancelar minha assinatura” e veja onde “Como assinar o plano anual” aparece. Por fim, teste “pedido 4521” contra “pedido 4512”. Os números vão mostrar sozinhos o que este texto explicou.
Os valores de cosseno que você vir são deste modelo, neste hardware. Não copie o 0,73 de alguém na internet como limiar sagrado. Meça os seus pares: os que devem coincidir e os que não devem.
Responda as 6 perguntas para concluir a aula. Só assistir não conclui: a checagem é o que conta para a trilha e para o certificado.
Embeddings é um fundamento de engenharia de IA para quem trabalha com LLMs. Texto virando vetor: o que a similaridade captura e onde ela engana.