Da busca vetorial às poderosas REST APIs, o Elasticsearch oferece aos desenvolvedores o kit de ferramentas de busca mais abrangente. Mergulhe em notebooks de exemplo no GitHub para experimentar algo novo. Você também pode iniciar seu teste gratuito ou executar o Elasticsearch localmente hoje mesmo.
O uso de embeddings para melhorar a relevância e a precisão da recuperação de informações cresceu significativamente ao longo dos anos. Ferramentas como o Elasticsearch evoluíram para dar suporte a esse tipo de dados por meio de tipos de campos especializados, como vetores densos, vetores esparsos e texto semântico. No entanto, para obter bons resultados, é essencial entender como mapear corretamente os embeddings para os tipos de campo disponíveis no Elasticsearch: semantic_text, dense_vector e sparse_vector.
Neste artigo, discutiremos esses tipos de campos, quando usar cada um deles e como eles se relacionam com as estratégias de geração e uso de embeddings, tanto durante a indexação quanto na consulta.
Tipo de vetor denso
O tipo de campo dense_vector no Elasticsearch é usado para armazenar vetores densos, que são representações numéricas de dados como texto, imagens e áudio, onde quase todas as dimensões são relevantes. Esses vetores são gerados usando modelos de incorporação fornecidos por plataformas como OpenAI, Cohere ou Hugging Face, e são projetados para capturar o significado semântico geral dos dados, mesmo quando eles não compartilham termos exatos com outros documentos.
No Elasticsearch, vetores densos podem ter até 4096 dimensões, dependendo do modelo utilizado. Por exemplo, o modelo all-MiniLM-L6-v2 gera vetores com 384 dimensões, enquanto o text-embedding-ada-002 da OpenAI produz vetores com 1536 dimensões.
O campo dense_vector é geralmente adotado como o tipo padrão para armazenar esse tipo de incorporação quando é necessário maior controle, como usar vetores pré-gerados, aplicar funções de similaridade personalizadas ou integrar com modelos externos.
Quando e por que usar o tipo dense_vector?
Vetores densos são excelentes para capturar a similaridade semântica entre frases, parágrafos ou documentos inteiros. Funcionam muito bem quando o objetivo é comparar o significado geral dos textos, mesmo que não compartilhem os mesmos termos.
O campo vetorial denso é ideal quando você já possui um pipeline externo de geração de embeddings usando modelos fornecidos por plataformas como OpenAI, Cohere ou Hugging Face e deseja apenas armazenar e consultar esses vetores manualmente. Este tipo de campo oferece alta compatibilidade com modelos de incorporação e total flexibilidade na geração e consulta, permitindo controlar como os vetores são produzidos, indexados e usados durante a busca.
Além disso, oferece suporte a diferentes formas de busca semântica, com consultas como k-NN ou script_score para casos em que seja necessário ajustar a lógica de classificação. Essas possibilidades tornam o vetor denso ideal para aplicações como RAG (Retrieval-Augmented Generation), sistemas de recomendação e buscas personalizadas baseadas em similaridade.
Finalmente, o campo permite personalizar a lógica de relevância, usando funções como cosineSimilarity, dotProduct ou l2norm para adaptar a classificação de acordo com as necessidades do seu caso de uso.
Vetores densos continuam sendo a melhor opção para quem precisa de flexibilidade, personalização e compatibilidade com casos de uso avançados, como os mencionados acima.
Como usar a consulta para o tipo vetor denso?
As pesquisas em campos definidos como dense_vector usam a consulta dos k vizinhos mais próximos. Esta consulta é responsável por encontrar documentos cujo vetor denso seja o mais próximo do vetor de consulta. Abaixo, segue um exemplo de como aplicar uma consulta k-NN a um campo vetorial denso:
Além da consulta k-NN, caso haja necessidade de personalizar a pontuação do documento, também é possível usar a consulta script_score, combinando-a com funções de comparação vetorial, como cossenosimilaridade, produto escalar ou norma l2, para calcular a relevância de forma mais controlada. Veja o exemplo:
Se você quiser se aprofundar no assunto, recomendo explorar o artigo Como configurar a pesquisa vetorial no Elasticsearch.
Tipo de vetor esparso
O tipo de campo sparse_vector é usado para armazenar vetores esparsos, que são representações numéricas onde a maioria dos valores é zero e apenas alguns termos têm pesos significativos. Esse tipo de vetor é comum em modelos baseados em termos, como o SPLADE ou o ELSER (Elastic Learned Sparse EncodeR).
Quando e por que usar vetores esparsos?
Vetores esparsos são ideais quando você precisa de uma busca mais precisa em termos lexicais, sem sacrificar a inteligência semântica. Eles representam o texto como pares de token/valor, destacando apenas os termos mais relevantes com pesos associados, o que proporciona clareza, controle e eficiência.
Esse tipo de campo é especialmente útil quando você gera vetores com base em termos, como nos modelos ELSER ou SPLADE, que atribuem pesos diferentes a cada token com base em sua importância relativa no texto.
Para as ocasiões em que você deseja controlar a influência de palavras específicas na consulta, os tipos de vetores esparsos permitem ajustar manualmente o peso dos termos para otimizar a classificação dos resultados.
Entre os principais benefícios estão a transparência na busca, já que é possível entender claramente por que um documento foi considerado relevante, e a eficiência de armazenamento, pois apenas os tokens com valor diferente de zero são salvos, ao contrário dos vetores densos que armazenam todas as dimensões.
Além disso, vetores esparsos são o complemento ideal em estratégias de busca híbridas, podendo inclusive ser combinados com vetores densos para unir precisão lexical à compreensão semântica.
Como usar a consulta para o tipo vetor esparso?
A consulta sparse_vector permite pesquisar documentos com base em um vetor de consulta no formato token/valor. Veja um exemplo da consulta abaixo:
Se preferir usar um modelo treinado, é possível utilizar um endpoint de inferência que transforma automaticamente o texto da consulta em um vetor esparso:
Para explorar este tópico mais a fundo, sugiro a leitura de Understanding sparse vector embeddings with trained ML models.
Tipo de texto semântico
O tipo de campo semantic_text é a maneira mais simples e direta de usar a pesquisa semântica no Elasticsearch. Ele lida automaticamente com a geração de embeddings, tanto no momento da indexação quanto no momento da consulta, por meio de um endpoint de inferência. Isso significa que você não precisa se preocupar em gerar ou armazenar vetores manualmente.
Quando e por que usar texto semântico?
O campo semantic_text é ideal para quem quer começar com o mínimo de esforço técnico e sem ter que lidar com vetores manualmente. Este campo automatiza etapas como a geração de incorporações e o mapeamento de busca vetorial, tornando a configuração mais rápida e conveniente.
Você deve considerar usar semantic_text quando valoriza simplicidade e abstração, pois isso elimina a complexidade de configurar manualmente mapeamentos, geração de incorporações e pipelines de ingestão. Basta selecionar o modelo de inferência e o Elasticsearch cuida do resto.
As principais vantagens incluem a geração automática de embeddings, realizada durante a indexação e a consulta, e o mapeamento pronto para uso, que já vem pré-configurado para suportar o modelo de inferência selecionado.
Além disso, o campo oferece suporte nativo para a divisão automática de textos longos (fragmentação de texto), permitindo que textos extensos sejam divididos em trechos menores, cada um com seu próprio embedding, o que melhora a precisão da busca. Isso aumenta consideravelmente a produtividade, especialmente para equipes que desejam entregar valor rapidamente sem se preocupar com a engenharia subjacente da busca semântica.
No entanto, embora semantic_text proporcione velocidade e simplicidade, esta abordagem tem algumas limitações. Permite a utilização de modelos padrão de mercado, desde que estejam disponíveis como endpoints de inferência no Elasticsearch. Mas não suporta incorporações geradas externamente, como é possível com o campo dense_vector .
Se você precisar de mais controle sobre como os vetores são gerados, quiser usar seus próprios embeddings ou precisar combinar vários campos para estratégias avançadas, os campos dense_vector e sparse_vector fornecem a flexibilidade necessária para cenários mais personalizados ou específicos do domínio.
Como usar a consulta para o tipo de texto semântico
Antes de semantic_text, era necessário usar uma consulta diferente dependendo do tipo de incorporação (densa ou esparsa). Uma consulta sparse_vector foi usada para campos esparsos, enquanto campos dense_vector exigiram consultas KNN.
Com o tipo de texto semântico, a busca é realizada utilizando a consulta semântica, que gera automaticamente o vetor de consulta e o compara com os embeddings dos documentos indexados. O tipo semantic_text permite definir um ponto de extremidade de inferência para incorporar a consulta, mas se nenhum for especificado, o mesmo ponto de extremidade usado durante a indexação será aplicado à consulta.
Para saber mais, sugiro a leitura do artigo Elasticsearch new semantic_text mapping: Simplifying semantic search.
Conclusão
Ao escolher como mapear embeddings no Elasticsearch, é essencial entender como você deseja gerar os vetores e qual o nível de controle necessário sobre eles. Se você busca simplicidade, o campo de texto semântico permite buscas semânticas automáticas e escaláveis, tornando-o ideal para muitos casos de uso iniciais. Quando é necessário maior controle, desempenho mais preciso ou integração com modelos personalizados, os campos vetoriais densos e esparsos oferecem a flexibilidade necessária.
O tipo de campo ideal depende do seu caso de uso, da infraestrutura disponível e do nível de maturidade da sua pilha de aprendizado de máquina. Mais importante ainda, a Elastic oferece as ferramentas para construir sistemas de busca modernos e altamente adaptáveis.
Referências
- Tipo de campo de texto semântico
- Tipo de campo vetorial esparso
- Tipo de campo vetorial denso
- Consulta semântica
- Consulta de vetor esparso
- pesquisa kNN
- Novo mapeamento semantic_text do Elasticsearch: Simplificando a busca semântica
- Compreendendo incorporações vetoriais esparsas com modelos de aprendizado de máquina treinados




