~/tools / Embeddings e busca (RAG) / Embedding Similarity Calculator
Embedding Similarity Calculator — Compare vetores de embeddings do Ollama /api/embed: cosseno, produto escalar, distância
Cole a resposta do /api/embed do Ollama ou de um endpoint /v1/embeddings compatível com a OpenAI e compare os vetores: similaridade de cosseno, produto escalar e distância euclidiana, classificados em relação ao vetor que você escolher, além de uma matriz de similaridade. Ela também mostra as dimensões e o comprimento de cada vetor, para você ver se os vetores estão normalizados e se vieram do mesmo modelo. Nada sai do seu navegador.
O exemplo usa vetores inventados, de comprimento unitário e com 4 dimensões, para que dê para lê-los. Embeddings reais têm centenas ou milhares de dimensões.
Lido como uma resposta do Ollama /api/embed: 4 vetores com 4 dimensões. Todos os vetores têm comprimento 1, então a similaridade de cosseno e o produto escalar são iguais.
Classificação por similaridade de cosseno
Comparado com #0 How do I keep a model loaded in Ollama?. Quanto maior, mais similar.
| Posição | Texto | Cosseno | Produto escalar | Distância |
|---|---|---|---|---|
| 1 | #1 keep_alive controls how long the model stays in memory | 0.9962 | 0.9962 | 0.0876 |
| 2 | #2 Protect Ollama with nginx and a password | 0.4037 | 0.4037 | 1.0921 |
| 3 | #3 Tomorrow's weather forecast | 0.0100 | 0.0100 | 1.4071 |
Matriz de similaridade de cosseno
Cada célula compara o vetor da linha com o vetor da coluna.
| #0 | #1 | #2 | #3 | |
|---|---|---|---|---|
| #0 | 1.000 | 0.996 | 0.404 | 0.010 |
| #1 | 0.996 | 1.000 | 0.475 | -0.005 |
| #2 | 0.404 | 0.475 | 1.000 | -0.377 |
| #3 | 0.010 | -0.005 | -0.377 | 1.000 |
Vetores
| Texto | Dimensões | Comprimento (norma L2) | Comprimento unitário |
|---|---|---|---|
| #0 How do I keep a model loaded in Ollama? | 4 | 1.000000 | Sim |
| #1 keep_alive controls how long the model stays in memory | 4 | 1.000000 | Sim |
| #2 Protect Ollama with nginx and a password | 4 | 1.000001 | Sim |
| #3 Tomorrow's weather forecast | 4 | 1.000000 | Sim |
Com base na documentação de embeddings e na referência da API do Ollama, conferidas em 2026-11-04. Ollama: Embeddings / Ollama API: Generate embeddings
Tudo é calculado no seu navegador. Nada é enviado para lugar nenhum.
Um modelo de embeddings transforma um texto em uma lista de números, um vetor. A documentação do Ollama descreve o uso desses vetores para busca semântica com a similaridade de cosseno e para RAG. Antes de escrever o código da busca, vale olhar os números: a pergunta realmente fica mais próxima do trecho que a responde? Esta ferramenta lê o JSON que o Ollama devolve de /api/embed ({"embeddings": [[…], …]}), o formato compatível com a OpenAI de /v1/embeddings ({"data": [{"embedding": […]}]}) ou um array simples de vetores. Ela classifica todos os vetores em relação ao que você escolher pela similaridade de cosseno, e mostra também o produto escalar e a distância euclidiana. A documentação do Ollama diz que /api/embed devolve vetores normalizados em L2 (de comprimento unitário); para esses vetores, a similaridade de cosseno e o produto escalar são o mesmo número, e a ferramenta mostra o comprimento de cada vetor para você confirmar. A documentação também diz para usar o mesmo modelo de embeddings para indexar e para consultar. Vetores com números diferentes de dimensões não podem ser comparados de jeito nenhum, e a ferramenta para com um erro quando os encontra. Os cálculos foram conferidos com valores calculados separadamente em Python.
A lógica principal desta ferramenta é de código aberto, sob a licença MIT. github.com/seigo5555/toolkitbox-lib/src/embedding-similarity.ts
Casos de uso
- Criar, em uma única requisição /api/embed, o embedding de uma pergunta e de alguns trechos candidatos e ver qual trecho fica em primeiro antes de montar uma busca
- Comparar dois modelos de embeddings nas mesmas frases, um modelo de cada vez, para ver qual separa com mais clareza o texto relacionado do não relacionado
- Verificar se os vetores guardados têm comprimento unitário e as dimensões esperadas antes de escolher uma métrica de distância para o seu banco de dados vetorial
Como usar
- Envie os textos ao seu modelo em uma única requisição, por exemplo curl http://localhost:11434/api/embed -d '{"model": "embeddinggemma", "input": ["question", "passage 1", "passage 2"]}', e cole a resposta JSON inteira.
- Opcionalmente, escreva um rótulo por linha, na mesma ordem da entrada, para que os resultados mostrem os textos em vez de números.
- Escolha com qual vetor comparar (por padrão #0, a primeira entrada). A tabela classifica os demais pela similaridade de cosseno; a matriz mostra todos os pares quando há 10 vetores ou menos.
FAQ
Qual similaridade devo usar?
A página de embeddings do Ollama diz para usar a similaridade de cosseno na maioria dos casos de busca semântica. A similaridade de cosseno compara a direção de dois vetores e ignora o comprimento deles; 1 significa a mesma direção. A ferramenta também mostra o produto escalar e a distância euclidiana, porque os bancos de dados vetoriais costumam permitir escolher entre eles.
Por que a similaridade de cosseno e o produto escalar são iguais?
Porque os vetores têm comprimento 1. A documentação do Ollama diz que /api/embed devolve vetores normalizados em L2, de comprimento unitário, e para vetores de comprimento unitário a similaridade de cosseno é igual ao produto escalar. A ferramenta mostra o comprimento de cada vetor e informa se todos têm comprimento unitário (dentro de 0.001).
A ferramenta diz que as dimensões não coincidem. O que isso significa?
Dois vetores só podem ser comparados quando têm a mesma quantidade de números. O comprimento depende do modelo, que a documentação coloca tipicamente entre 384 e 1024 dimensões, e a requisição /api/embed também aceita um campo dimensions. Comprimentos diferentes geralmente significam que os vetores vieram de modelos ou configurações diferentes. A documentação diz para usar o mesmo modelo de embeddings para indexar e para consultar.
Posso colar uma resposta com embeddings em base64?
Não. A ferramenta lê apenas números. Se você chamar o endpoint /v1/embeddings compatível com a OpenAI, peça os embeddings como números de ponto flutuante (floats), não como base64.
Uma similaridade de 0.8 é boa?
Não existe um limite fixo. Os valores dependem do modelo e dos seus textos, então compare as pontuações de trechos relacionados e não relacionados do mesmo modelo em vez de julgar um número isolado.
Meus dados são enviados para algum lugar?
Não. Os cálculos rodam no seu navegador. A ferramenta nunca chama o Ollama nem qualquer outro servidor; a requisição ao seu modelo é você mesmo quem envia.
Artigos relacionados
- Embeddings com o Ollama: o básico para busca e RAGCrie embeddings com o /api/embed do Ollama: os modelos e seus tamanhos, truncate e dimensions, vetores de comprimento unitário e similaridade de cosseno, segundo a documentação oficial.
- Guarde e pesquise embeddings do Ollama no PostgreSQL com o pgvectorGuarde embeddings do Ollama no PostgreSQL com o pgvector, pesquise-os com HNSW ou IVFFlat e passe os resultados para o /api/chat para que a resposta cite suas fontes.