<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Valentin Crettaz - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Valentin Crettaz - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/pt/search-labs/author/valentin-crettaz</link>
    </image>
    <link>https://www.elastic.co/pt/search-labs/author/valentin-crettaz</link>
    <atom:link href="https://www.elastic.co/pt/search-labs/rss/author/valentin-crettaz.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[pt]]></language>
    <lastBuildDate>Mon, 28 Sep 2026 16:08:43 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Uma breve introdução à busca vetorial]]></title>
    <description><![CDATA[Este artigo é o primeiro de uma série de três que irá explorar as complexidades da busca vetorial, também conhecida como busca semântica, e como ela é implementada no Elasticsearch.]]></description>
    <content:encoded><![CDATA[<p>Este artigo é o primeiro de uma série de três que irá explorar as complexidades da busca vetorial, também conhecida como busca semântica, e como ela é implementada no Elasticsearch.</p><p>Esta primeira parte tem como objetivo fornecer uma introdução geral aos conceitos básicos de incorporação de vetores e como a busca vetorial funciona internamente.</p><p>Munido de todo o conhecimento adquirido no primeiro artigo, a <a href="https://www.elastic.co/search-labs/blog/vector-search-set-up-elasticsearch">segunda parte</a> irá guiá-lo pelos meandros de como configurar a pesquisa vetorial no Elasticsearch.</p><p>Na <a href="https://www.elastic.co/search-labs/blog/hybrid-search-elasticsearch">terceira parte</a>, aproveitaremos o que aprendemos nas duas primeiras partes, expandiremos esse conhecimento e exploraremos como criar consultas de pesquisa híbridas poderosas no Elasticsearch.</p><p>Antes de abordarmos o tema principal deste artigo, vamos voltar no tempo e revisar um pouco da história dos vetores, um conceito fundamental na busca semântica.</p><h2>Vetores não são novidade</h2><p>Tenho quase certeza de que todos concordariam que, desde o surgimento do ChatGPT em novembro de 2022, não passa um único dia sem que se ouça ou leia sobre "busca vetorial". Está por toda parte e é tão difundida que muitas vezes temos a impressão de que se trata de uma tecnologia de ponta recém-lançada, quando na verdade ela já existe há mais de seis décadas! A pesquisa sobre o assunto começou em meados da década de 1960, e os primeiros artigos científicos foram publicados em 1978 por Gerard Salton, um especialista em recuperação de informação, e seus colegas da Universidade Cornell. O trabalho de Salton sobre modelos vetoriais densos e esparsos constitui a base da tecnologia moderna de busca vetorial.</p><p>Nos últimos 20 anos, muitos <a href="https://db-engines.com/en/ranking/vector+dbms/all">SGBDs vetoriais</a> diferentes, baseados em sua pesquisa, foram criados e lançados no mercado. Isso inclui o Elasticsearch, baseado no projeto Apache Lucene, que começou <a href="https://issues.apache.org/jira/browse/LUCENE-9004">a trabalhar em busca vetorial</a> em 2019.</p><p>Os vetores estão por toda parte e são tão difundidos que é importante primeiro compreender bem a teoria subjacente e o funcionamento interno deles antes de começar a usá-los. Antes de nos aprofundarmos nisso, vamos revisar rapidamente as diferenças entre busca lexical e busca vetorial para que possamos entender melhor como elas diferem e como podem se complementar.</p><h2>Busca vetorial versus busca lexical</h2><p>Uma maneira fácil de introduzir a busca vetorial é compará-la à busca lexical mais convencional com a qual você provavelmente já está familiarizado. A busca vetorial, também conhecida como busca semântica, e a busca lexical funcionam de maneiras muito diferentes. A busca lexical é o tipo de busca que todos nós usamos há anos no Elasticsearch. Resumindo brevemente, o algoritmo não tenta compreender o significado real do que é indexado e consultado. Em vez disso, ele se esforça para encontrar correspondências <strong>lexicais</strong> entre os literais das palavras ou suas variantes (como lematização, sinônimos etc.) digitadas pelo usuário em uma consulta e todos os literais previamente indexados no banco de dados, utilizando algoritmos de similaridade como TF-IDF.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfbb8e150865a5ec8/6a17e0c725daab50f408a16e/a4f3eba19599e5330e9b0d29ecdbbeac211cdab0-1600x583.png" alt="Exemplo de busca lexical" /><p>Como podemos ver, os três documentos no canto superior esquerdo foram tokenizados e analisados. Em seguida, os termos resultantes são indexados em um índice invertido, que simplesmente mapeia os termos analisados aos IDs dos documentos que os contêm. Note que todos os termos aparecem apenas uma vez e nenhum deles é repetido em qualquer outro documento. A busca por “professor alemão legal” retornará os três documentos com pontuações variadas, embora nenhum deles realmente capture o verdadeiro significado da consulta.</p><p>Como pode ser visto na Figura 2, abaixo, a situação fica ainda mais complicada quando se trata de polissemia ou homógrafos, ou seja, palavras que são escritas da mesma forma, mas têm <strong>significados diferentes</strong> (right, palm, bat, mean, etc.). Vamos pegar a palavra "right", que pode ter três significados diferentes, e ver o que acontece.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltea0cc829ff2c8029/6a17e0c92f4a5c8107fa8811/ebb9cc1be03475bbf68269a8dcea5f08bcda0b64-1594x754.png" alt="Busca por homógrafos com pesquisa lexical" /><p>A busca por <em>“I'm not right”</em> retorna um documento que tem o significado exatamente oposto ao do primeiro resultado encontrado. Se você pesquisar exatamente os mesmos termos, mas ordená-los de forma diferente para produzir um significado diferente, por exemplo, <em>"virar à direita"</em> e <em>"virar à direita",</em> o resultado será exatamente o mesmo (ou seja, o terceiro documento "Vire à direita"). É verdade que nossas consultas são excessivamente simplificadas e não utilizam recursos mais avançados, como a correspondência de frases, mas isso ajuda a ilustrar que a busca lexical não compreende o verdadeiro significado por trás do que é indexado e do que é pesquisado. Se isso não estiver claro, não se preocupe, voltaremos a este exemplo no terceiro artigo para ver como a busca vetorial pode ajudar neste caso.</p><p>Para fazer justiça à busca lexical, quando você tem controle sobre como indexa seus dados <strong>estruturados</strong> (pense em mapeamentos, análise de texto, pipelines de ingestão, etc.) e como elabora suas consultas (pense em consultas DSL bem elaboradas, análise de termos de consulta, etc.), você pode fazer maravilhas com mecanismos de busca lexical, não há dúvida! O histórico do Elasticsearch em relação às suas capacidades de busca lexical é simplesmente incrível. O que conseguiu alcançar e o quanto popularizou e aprimorou o campo da busca lexical nos últimos anos é verdadeiramente notável.</p><p>No entanto, quando se trata de fornecer suporte para<a href="https://www.elastic.co/what-is/unstructured-data"> consultas a</a> <a href="https://www.elastic.co/what-is/unstructured-data"><strong>dados não estruturados</strong></a> (como imagens, vídeos, áudios, texto bruto, etc.) para usuários que precisam fazer perguntas em texto livre, a busca lexical deixa a desejar. Além disso, às vezes a consulta nem sequer é um texto, pode ser uma imagem, como veremos em breve. A principal razão pela qual a busca lexical é inadequada em tais situações é que os dados não estruturados não podem ser indexados nem consultados da mesma forma que os dados estruturados. Ao lidar com dados não estruturados, <strong>a semântica</strong> entra em jogo. O que significa semântica? Muito simplesmente, o significado!</p><p>Vamos pegar o exemplo simples de um mecanismo de busca de imagens (por exemplo, a Busca de Imagens do Google ou o Lens). Você arrasta e solta uma imagem, e o mecanismo de busca semântica do Google encontrará e retornará as imagens mais semelhantes àquela que você pesquisou. Na Figura 3, abaixo, podemos ver à esquerda a imagem de um pastor alemão e à direita todas as imagens semelhantes que foram recuperadas, sendo o primeiro resultado a mesma imagem que a fornecida (ou seja, a mais semelhante).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3e0a0fb3c300537a/6a17e0cbe8fbce69d13a185d/c0dff24d4379141abd1038c9c4b5577fd2dca802-1600x657.png" alt="Exemplo de busca semântica: Busca por uma imagem" /><p>Mesmo que isso pareça simples e lógico para nós, humanos, para os computadores é uma história completamente diferente. É isso que a busca vetorial possibilita e ajuda a alcançar. O poder desbloqueado pela busca vetorial é imenso, como o mundo testemunhou recentemente. Vamos agora levantar o capô e descobrir o que se esconde por baixo.</p><h2>Incorporação de vetores</h2><p>Como vimos anteriormente, com mecanismos de busca lexical, dados estruturados como texto podem ser facilmente tokenizados em termos que podem ser correspondidos no momento da busca, independentemente do significado real dos termos. Os dados não estruturados, no entanto, podem assumir diferentes formas, como grandes objetos binários (imagens, vídeos, áudios, etc.), e não são adequados para o mesmo processo de tokenização. Além disso, o objetivo principal da busca semântica é indexar os dados de forma que possam ser pesquisados com base no significado que representam. Como podemos alcançar isso? A resposta está em duas palavras: <strong>Aprendizado de Máquina</strong>! Ou, mais precisamente, Aprendizado Profundo!</p><p><strong>Aprendizado profundo</strong> é uma área específica do aprendizado de máquina que se baseia em modelos de redes neurais artificiais compostas por múltiplas camadas de processamento, capazes de extrair progressivamente o verdadeiro significado dos dados. O funcionamento desses modelos de redes neurais é fortemente inspirado no cérebro humano. A Figura 4, abaixo, mostra a aparência de uma rede neural, com suas camadas de entrada e saída, bem como múltiplas camadas ocultas:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8ca5fd8f0e61d939/6a17e0cd7f6f152a67c09a53/aeea3bab3c29e1c591a9c9082f2e73e7d3990ef1-1600x1116.png" alt="Camadas de redes neurais na busca vetorial" /><p>A verdadeira façanha das redes neurais é a capacidade de transformar um único dado não estruturado em uma sequência de valores de ponto flutuante, conhecidos como <strong>vetores de incorporação</strong> ou simplesmente <strong>incorporações</strong>. Como seres humanos, conseguimos entender muito bem o que são vetores, desde que os visualizemos em um espaço bidimensional ou tridimensional. Cada componente do vetor representa uma coordenada em um plano xy bidimensional ou em um espaço xyz tridimensional.</p><p>No entanto, os vetores de incorporação nos quais os modelos de redes neurais funcionam podem ter centenas ou até milhares de dimensões e simplesmente representar um ponto em um espaço multidimensional. Cada dimensão vetorial representa uma <strong>característica</strong> ou um atributo dos dados não estruturados. Vamos ilustrar isso com um modelo de aprendizado profundo que transforma imagens em vetores de incorporação de 2048 dimensões. Esse modelo transformaria a imagem do pastor alemão que usamos na Figura 3 no vetor de incorporação mostrado na tabela abaixo. Note que mostramos apenas os três primeiros e os três últimos elementos, mas haveria mais 2.042 colunas/dimensões na tabela.</p><p></p><p>é vermelho</p><p>é_cachorro</p><p>céu azul</p><p>…</p><p>sem_grama</p><p>pastor_alemão</p><p>é_árvore</p><p>Pastor alemão incorporações</p><p>0,0121</p><p>0,9572</p><p>0,8735</p><p>…</p><p>0,1198</p><p>0,9712</p><p>0,0512</p><p>Cada coluna representa uma dimensão do modelo e corresponde a uma característica que a rede neural subjacente procura modelar. Cada entrada fornecida ao modelo será caracterizada dependendo de quão semelhante essa entrada é a cada uma das 2048 dimensões. Assim, o valor de cada elemento no vetor de incorporação denota a <strong>similaridade</strong> dessa entrada a uma dimensão específica. Neste exemplo, podemos ver que o modelo detectou uma alta similaridade entre cães e pastores alemães, bem como a presença de céu azul.</p><p>Ao contrário da busca lexical, onde um termo pode ser correspondido ou não, com a busca vetorial podemos ter uma noção muito melhor de quão <em>semelhante</em> um conjunto de dados não estruturados é a cada uma das dimensões suportadas pelo modelo. Dessa forma, os vetores de incorporação servem como uma representação semântica fantástica de dados não estruturados.</p><h2>O molho secreto</h2><p>Agora que sabemos como os dados não estruturados são segmentados e analisados por redes neurais de aprendizado profundo em vetores de incorporação que capturam a similaridade dos dados ao longo de um grande número de dimensões, precisamos entender como funciona a correspondência desses vetores. Acontece que a resposta é bem simples. Os vetores de incorporação que estão <strong>próximos</strong> uns dos outros representam dados <strong>semanticamente semelhantes</strong> . Assim, quando consultamos um banco de dados vetorial, a entrada da pesquisa (imagem, texto, etc.) é primeiro transformada em um vetor de incorporação usando o mesmo modelo que foi usado para indexar todos os dados não estruturados, e o objetivo final é encontrar os <strong>vetores vizinhos mais próximos</strong> desse vetor de consulta. Portanto, tudo o que precisamos fazer é descobrir como medir a "distância" ou "similaridade" entre o vetor de consulta e todos os vetores existentes indexados no banco de dados; é basicamente isso.</p><h3>Distância e semelhança</h3><p>Felizmente para nós, medir a distância entre dois vetores é um problema fácil de resolver graças à aritmética vetorial. Vamos então analisar as funções de distância e similaridade mais populares que são suportadas por bancos de dados de busca vetorial modernos, como o Elasticsearch. Atenção, contém matemática!</p><h4>Distância L1</h4><p>A distância L1, também chamada de distância de Manhattan, entre dois vetores x e y é medida somando-se a diferença absoluta entre todos os seus elementos. Obviamente, quanto menor a distância d, mais próximos estarão os dois vetores. A fórmula é bastante simples, como pode ser visto abaixo:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2df2e9bc20883491/6a17e0ce033c8d006a6bb0bf/2b17bcedfbedde61117a3e7970af55bc62318c6c-312x102.png" alt="Fórmula da distância L1 na busca vetorial" /><p>Visualmente, a distância L1 pode ser ilustrada como mostrado na Figura 5, abaixo:</p><p></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb90a33e6b1cbe00b/6a17e0d0414c64eb76945096/52075441892151536ed216081817a8e852566daa-474x464.png" alt="Visualizando a distância L1 entre dois vetores" /><p>Vamos pegar dois vetores x e y, tais como x = (1, 2) e y = (4, 3), então a distância L1 de ambos os vetores seria | 1 - 4 | + | 2 - 3 | = 4.</p><h4>Distância L2</h4><p>A distância L2, também chamada de distância euclidiana, entre dois vetores x e y é medida somando-se primeiro o quadrado da diferença entre todos os seus elementos e, em seguida, extraindo-se a raiz quadrada do resultado. É basicamente o caminho mais curto entre dois pontos (também chamado de hipotenusa). De forma semelhante a L1, quanto menor a distância d, mais próximos estão os dois vetores:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltae9b63fb593ae225/6a17e0d1af47b68379cddea8/b7675aa41f4f381e954c21dacd23a51a2dde6780-384x112.png" alt="Distância L2 na busca vetorial" /><p>A distância L2 é mostrada na Figura 6 abaixo:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt32d913b46e07e79d/6a17e0d27f6f1582f7c09a57/bac99d08d6cf8a3a387a8acdc2e8f67357dad235-448x456.png" alt="Visualizando a distância L2 entre dois vetores" /><p>Vamos reutilizar os mesmos dois vetores de amostra x e y que usamos para a distância L1, e agora podemos calcular a distância L2 como . A raiz quadrada de 10 resulta em 3,16.</p><p></p><h4>Distância Linf</h4><p>A distância Linf (para L infinito), também chamada de distância de Chebyshev ou distância do tabuleiro de xadrez, entre dois vetores x e y é definida simplesmente como a maior distância entre quaisquer dois de seus elementos ou a maior distância medida ao longo de um dos eixos/dimensões. A fórmula é muito simples e está ilustrada abaixo:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt863411e15de16fa3/6a17e0d4505ac30939ad8a48/179ea6c6520a59acd97638313a2fb1b105e2ffed-436x82.png" alt="Fórmula de distância linear na busca vetorial" /><p>A representação da distância Linf é mostrada na Figura 7 abaixo:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt863ee7b51fd5fc15/6a17e0d56864a4772db686af/b75540d793cdc0645244d77dc36da9d5734ccbac-548x560.png" alt="Distância linear entre dois vetores" /><p>Novamente, tomando os mesmos dois vetores de amostra x e y, podemos calcular a distância infinita L como max ( | 1 - 4 | , | 2 - 3 | ) = max (3, 1) = 3.</p><h4>Semelhança de cosseno</h4><p>Ao contrário de L1, L2 e Linf, a similaridade de cosseno não mede a distância entre dois vetores x e y, mas sim o ângulo relativo entre eles, ou seja, se ambos apontam aproximadamente na mesma direção. Quanto maior a similaridade s, mais "próximos" estão os dois vetores. A fórmula é novamente muito simples e está apresentada abaixo:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt61d55341a6457ab7/6a17e0d7e9ea872b4ea9c4e2/931b6b90f0ee83e63a66496d06d6b4cef3affddd-304x72.png" alt="Fórmula de similaridade de cosseno na busca vetorial" /><p>Uma forma de representar a similaridade de cosseno entre dois vetores é mostrada na Figura 8 abaixo:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt50eb6399510b5380/6a17e0d83e9e45302cba139a/52092e8b5d366178e50a35f8c954ee8eaca76965-582x586.png" alt="similaridade de cosseno entre dois vetores" /><p>Além disso, como os valores do cosseno estão sempre no intervalo [-1, 1], -1 significa similaridade oposta (ou seja, um ângulo de 180° entre os dois vetores), 0 significa similaridade não relacionada (ou seja, um ângulo de 90°) e 1 significa idêntico (ou seja, um ângulo de 0°), conforme mostrado na Figura 9 abaixo:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt785e195c75a5089e/6a17e0da1d1b8355bc93e398/fd2690a845b89b69ff202bd04192893638538aec-1600x456.png" alt="O espectro de similaridade de cosseno na busca vetorial" /><p>
Mais uma vez, vamos reutilizar os mesmos vetores de amostra x e y e calcular a similaridade de cosseno usando a fórmula acima. Primeiro, podemos calcular o produto escalar de ambos os vetores como . Então, multiplicamos o comprimento (também chamado de magnitude) de ambos os vetores:  Finalmente, dividimos o produto escalar pelo comprimento multiplicado 10 / 11,18034 = 0,894427 (ou seja, um ângulo de 26°), que é bastante próximo de 1, então ambos os vetores podem ser considerados bastante semelhantes.</p><h4>similaridade do produto escalar</h4><p>Uma desvantagem da similaridade de cosseno é que ela leva em consideração apenas o ângulo entre dois vetores, mas não sua magnitude (ou seja, comprimento), o que significa que, se dois vetores apontam aproximadamente na mesma direção, mas um é muito mais longo que o outro, ambos ainda serão considerados semelhantes. A similaridade por produto escalar, também chamada de produto interno, aprimora isso ao levar em consideração tanto o ângulo quanto a magnitude dos vetores, o que proporciona uma métrica de similaridade muito mais precisa.</p><p>Duas fórmulas equivalentes são usadas para calcular a similaridade do produto escalar. A primeira é a mesma que vimos anteriormente no numerador da semelhança de cosseno:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7f1c3369f8628457/6a17e0db1d1b832a1893e39c/52e2723926ab27cd96b688e805fae15f607073c8-482x104.png" alt="Fórmula de similaridade do produto escalar na busca vetorial" /><p>A segunda fórmula simplesmente multiplica o comprimento de ambos os vetores pelo cosseno do ângulo entre eles:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt136dd2a749c2398a/6a17e0dc6df73108a80a0e1f/dc9b11fc67dd748d9f1f29b735f4726138cb7d39-452x70.png" alt="Fórmula de similaridade do produto escalar simplificada na busca vetorial" /><p>A similaridade do produto escalar é visualizada na Figura 10, abaixo:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb2c095e1c1948752/6a17e0dd6df731e30b0a0e23/1bda38cf82a1e1037f44b6e9657602c9efe1c0a6-558x574.png" alt="produto escalar: similaridade entre dois vetores" /><p>Mais uma vez, pegamos os vetores de amostra x e y e calculamos sua similaridade de produto escalar usando a primeira fórmula, como fizemos para a similaridade de cosseno anteriormente, como (1 4) + (2 3) = 10.</p><p>Usando a segunda fórmula, multiplicamos o comprimento de ambos os vetores:  e multiplicamos isso pelo cosseno do ângulo de 26° entre ambos os vetores, e obtemos 11,18034 cos(26°) = 10.</p><p>Vale ressaltar que, se todos os vetores forem <strong>normalizados</strong> primeiro (ou seja, seu comprimento for 1), a similaridade do produto escalar se torna exatamente a mesma que a similaridade do cosseno (porque |x| |y| = 1), ou seja, o cosseno do ângulo entre os dois vetores. Como veremos mais adiante, a normalização de vetores é uma boa prática a ser adotada para tornar a magnitude do vetor irrelevante, de modo que a similaridade se concentre simplesmente no ângulo. Isso também acelera o cálculo da distância no momento da indexação e da consulta, o que pode ser um grande problema ao operar com bilhões de vetores.</p><h3>Resumo rápido</h3><p>Uau, já vimos MUITA informação até agora, então vamos parar um minuto e fazer um breve resumo do que temos a dizer. Aprendemos que…</p><ul><li><p>…a busca semântica é baseada em modelos de redes neurais de aprendizado profundo que se destacam na transformação de dados não estruturados em vetores de incorporação multidimensionais.</p></li><li><p>…cada dimensão do modelo representa uma característica ou propriedade dos dados não estruturados.</p></li><li><p>…um vetor de incorporação é uma sequência de valores de similaridade (um para cada dimensão) que representam o quão semelhante a cada dimensão um determinado conjunto de dados não estruturados é.</p></li><li><p>…quanto mais “próximos” dois vetores estiverem (ou seja, quanto mais próximos forem os vizinhos), mais eles representarão conceitos semanticamente semelhantes.</p></li><li><p>…as funções de distância (L1, L2, Linf) permitem medir a proximidade entre dois vetores.</p></li><li><p>…as funções de similaridade (cosseno e produto escalar) permitem medir o quanto dois vetores estão apontando na mesma direção.</p></li></ul><p></p><p>Agora, a última peça que precisamos analisar é o próprio mecanismo de busca vetorial. Quando uma consulta é recebida, ela é primeiro vetorizada e, em seguida, o mecanismo de busca vetorial encontra os vetores vizinhos mais próximos desse vetor de consulta. A abordagem de força bruta, que consiste em medir a distância ou similaridade entre o vetor de consulta e todos os vetores no banco de dados, pode funcionar para conjuntos de dados pequenos, mas rapidamente se torna insuficiente à medida que o número de vetores aumenta. Em outras palavras, como podemos indexar milhões, bilhões ou até trilhões de vetores e encontrar os vizinhos mais próximos do vetor de consulta em um tempo razoável? É aí que precisamos usar a inteligência e descobrir maneiras ideais de indexar vetores para que possamos localizar os vizinhos mais próximos o mais rápido possível, sem comprometer muito a precisão.</p><h3>Algoritmos e técnicas de busca vetorial</h3><p>Ao longo dos anos, muitas equipes de pesquisa diferentes investiram muito esforço no desenvolvimento de algoritmos de busca vetorial muito inteligentes. Aqui, vamos apresentar brevemente os principais. Dependendo do caso de uso, alguns são mais adequados do que outros.</p><h4>Busca linear</h4><p>Já mencionamos brevemente a busca linear, ou indexação plana, quando citamos a abordagem de força bruta de comparar o vetor de consulta com todos os vetores presentes no banco de dados. Embora possa funcionar bem em conjuntos de dados pequenos, o desempenho diminui rapidamente à medida que o número de vetores e dimensões aumenta (complexidade O(n)).</p><p>Felizmente, existem abordagens mais eficientes chamadas de <strong>vizinho mais próximo aproximado</strong> (ANN, na sigla em inglês), onde as distâncias entre os vetores de incorporação são pré-computadas e vetores semelhantes são armazenados e organizados de forma a mantê-los próximos uns dos outros, por exemplo, usando clusters, árvores, hashes ou grafos. Essas abordagens são chamadas de "aproximadas" porque geralmente não garantem 100% de precisão. O objetivo final é <strong>reduzir o escopo da busca</strong> o máximo e o mais rápido possível, a fim de focar apenas nas áreas com maior probabilidade de conter vetores semelhantes, ou <strong>reduzir a dimensionalidade dos vetores</strong>.</p><h4>Árvores K-dimensionais</h4><p>Uma árvore K-dimensional, ou árvore KD, é uma generalização de uma árvore de busca binária que armazena pontos em um espaço k-dimensional e funciona dividindo continuamente o espaço de busca em árvores menores à esquerda e à direita, onde os vetores são indexados. No momento da busca, o algoritmo simplesmente precisa visitar alguns ramos da árvore ao redor do vetor de consulta (o ponto vermelho na Figura 11) para encontrar o vizinho mais próximo (o ponto verde na Figura 11). Se forem solicitados mais de k vizinhos, a área amarela será expandida até que o algoritmo encontre mais vizinhos.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt55e01707cd9fca57/6a17e0dfbe60866a90004653/e21af2d613112279089b6fa2166359233b10019d-829x860.png" alt="Algoritmo de árvore KD em busca vetorial" /><p>A maior vantagem do algoritmo da árvore KD é que ele nos permite focar rapidamente apenas em alguns ramos localizados da árvore, eliminando assim a maioria dos vetores da análise. No entanto, a eficiência desse algoritmo diminui à medida que o número de dimensões aumenta, pois é necessário visitar muito mais ramos do que em espaços de dimensões inferiores.</p><h4>Índice de arquivo invertido</h4><p>A abordagem de índice de arquivo invertido (IVF) também é um algoritmo <strong>de particionamento espacial</strong> que atribui vetores próximos uns dos outros ao seu centroide comum. No espaço bidimensional, isso é melhor visualizado com um diagrama de Voronoi, como mostrado na Figura 12:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7b7e4fe6deff5ef3/6a17e0e17b54f940eb8b381c/33ddaaa818ab2f2a5fc87982c82c2a34cb849e33-640x640.png" alt="Representação de Voronoi de um índice de arquivo invertido no espaço 2D " /><p>Podemos ver que o espaço 2D acima está dividido em 20 clusters, cada um com seu centroide representado por pontos pretos. Todos os vetores de incorporação no espaço são atribuídos ao cluster cujo centroide está mais próximo deles. No momento da busca, o algoritmo primeiro determina o cluster no qual se concentrar, encontrando o centroide mais próximo do vetor de consulta. Em seguida, ele pode simplesmente focar nessa área e nas áreas vizinhas, se necessário, para encontrar os vizinhos mais próximos.</p><p>Este algoritmo sofre do mesmo problema que as árvores KD quando usado em espaços de alta dimensionalidade. Isso é chamado de maldição da dimensionalidade e ocorre quando o volume do espaço aumenta tanto que todos os dados parecem esparsos e a quantidade de dados necessária para obter resultados mais precisos cresce exponencialmente. Quando os dados são esparsos, torna-se mais difícil para esses algoritmos de particionamento espacial organizarem os dados em clusters. Felizmente para nós, existem outros algoritmos e técnicas que atenuam esse problema, conforme detalhado abaixo.</p><h4>quantização</h4><p>A quantização é uma abordagem baseada em <strong>compressão</strong>que nos permite reduzir o tamanho total do banco de dados, diminuindo a precisão dos vetores de incorporação. Isso pode ser alcançado usando <strong>quantização escalar (SQ)</strong> , convertendo os valores vetoriais de ponto flutuante em valores inteiros. Isso não apenas reduz o tamanho do banco de dados em um fator de 8, mas também diminui o consumo de memória e acelera o cálculo da distância entre vetores no momento da busca.</p><p>Outra técnica é chamada de <strong>quantização de produto (PQ),</strong> que primeiro divide o espaço em subespaços de dimensão inferior e, em seguida, os vetores que estão próximos uns dos outros são agrupados em cada subespaço usando um algoritmo de agrupamento (semelhante ao k-means).</p><p>Note que a quantização é diferente da <strong>redução de dimensionalidade</strong>, onde o número de dimensões é reduzido, ou seja, os vetores simplesmente se tornam mais curtos.</p><h4>Mundos Pequenos Navegáveis Hierárquicos (HNSW)</h4><p>Se o nome parece complexo, não se preocupe, na verdade não é! Em resumo, o Hierarchical Navigable Small Worlds é um algoritmo baseado em grafos multicamadas muito popular e eficiente. É utilizado por diversos bancos de dados vetoriais, incluindo o Apache Lucene. Uma representação conceitual do HNSW pode ser vista na Figura 13, abaixo.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7f4f4a8e393c8d53/6a17e0e3e8fbcefa193a1861/189ef9a8bec476e379222c454644ba4c1f952085-1400x840.png" alt="Mundos Pequenos Navegáveis Hierárquicos (HNSW)" /><p>Na camada superior, podemos ver um gráfico com muito poucos vetores que possuem as ligações mais longas entre si, ou seja, um gráfico de vetores conectados com a menor similaridade. Quanto mais nos aprofundamos nas camadas mais baixas, mais vetores encontramos e mais denso o grafo se torna, com cada vez mais vetores próximos uns dos outros. Na camada mais baixa, podemos encontrar todos os vetores, sendo que os mais semelhantes estão localizados mais próximos uns dos outros.</p><p>No momento da busca, o algoritmo começa na camada superior, em um ponto de entrada arbitrário, e encontra o vetor mais próximo do vetor de consulta (indicado pelo ponto cinza). Em seguida, o algoritmo desce uma camada e repete o mesmo processo, partindo do mesmo vetor que deixou na camada anterior, e assim por diante, camada após camada, até atingir a camada mais baixa e encontrar o vizinho mais próximo do vetor de consulta.</p><h4>Hashing sensível à localidade (LSH)</h4><p>Da mesma forma que todas as outras abordagens apresentadas até agora, o hashing sensível à localidade busca reduzir drasticamente o espaço de busca para aumentar a velocidade de recuperação. Com essa técnica, os vetores de incorporação são transformados em valores de hash, preservando as informações de similaridade, de modo que o espaço de busca se torna, em última análise, uma tabela hash simples que pode ser consultada em vez de um grafo ou árvore que precisa ser percorrido. A principal vantagem dos métodos baseados em hash é que vetores contendo um número arbitrário (grande) de dimensões podem ser mapeados para hashes de tamanho fixo, o que acelera enormemente o tempo de recuperação sem sacrificar muita precisão.</p><p>Existem muitas maneiras diferentes de realizar o hash de dados em geral e de incorporar vetores em particular, mas este artigo não se aprofundará nos detalhes de cada uma delas. Os métodos convencionais de hashing geralmente produzem hashes muito diferentes para dados que parecem muito semelhantes. Como os vetores de incorporação são compostos de valores de ponto flutuante, vamos pegar dois valores de ponto flutuante de exemplo que são considerados muito próximos um do outro na aritmética vetorial (por exemplo, 0,73 e 0,74) e executá-los através de algumas funções de hash comuns. Analisando os resultados abaixo, fica bastante óbvio que as funções de hash comuns não preservam a similaridade entre as entradas.</p><p>Função de hash</p><p>0,73</p><p>0,74</p><p>MD5</p><p>1342129d04cd2924dd06cead4cf0a3ca</p><p>0aec1b15371bd979cfa66b0a50ebecc5</p><p>SHA1</p><p>49d2c3e0e44bff838e1db571a121be5ea874e8d9</p><p>a534e76482ade9d9fe4bff3035a7f31f2f363d77</p><p>SHA256</p><p>99d03fc3771fe6848d675339fc49eeb1cb8d99a12e6358173336b99a2ec530ea</p><p>5ecbc825ba5c16856edfdaf0abc5c6c41d0d8a9c508e34188239521dc7645663</p><p>Enquanto os métodos de hashing convencionais tentam <em>minimizar as colisões de hashing</em> entre dados semelhantes, o principal objetivo do hashing sensível à localidade é fazer exatamente o oposto, ou seja, <em>maximizar as colisões de hashing</em> para que dados semelhantes caiam no mesmo bucket com alta probabilidade. Dessa forma, vetores de incorporação que estejam próximos uns dos outros em um espaço multidimensional serão agrupados em um valor de tamanho fixo, pertencendo ao mesmo grupo. Como o LSH permite que esses vetores hash mantenham sua proximidade, essa técnica é muito útil para agrupamento de dados e buscas por vizinhos mais próximos.</p><p>Todo o trabalho pesado ocorre no momento da indexação, quando os hashes precisam ser calculados, enquanto no momento da busca precisamos apenas aplicar o hash ao vetor de consulta para localizar o bucket que contém os vetores de incorporação mais próximos. Uma vez encontrado o bucket candidato, geralmente ocorre uma segunda rodada para identificar os vetores vizinhos mais próximos do vetor de consulta.</p><h2>Vamos concluir</h2><p>Para introduzir a busca vetorial, tivemos que abordar bastante conteúdo neste artigo. Após comparar as diferenças entre a busca lexical e a busca vetorial, aprendemos como os modelos de redes neurais de aprendizado profundo conseguem capturar a semântica de dados não estruturados e transcodificar seu significado em vetores de incorporação de alta dimensão, uma sequência de números de ponto flutuante que representa a similaridade dos dados ao longo de cada uma das dimensões do modelo. Vale ressaltar também que a busca vetorial e a busca lexical não são técnicas de recuperação de informação concorrentes, mas sim complementares (como veremos na terceira parte desta série, quando nos aprofundaremos na busca híbrida).</p><p>Em seguida, introduzimos um elemento fundamental da busca vetorial, ou seja, as funções de distância (e similaridade) que nos permitem medir a proximidade de dois vetores e avaliar a similaridade dos conceitos que eles representam.</p><p>Por fim, analisamos diferentes variações dos algoritmos e técnicas de busca vetorial mais populares, que podem ser baseados em árvores, grafos, clusters ou hashes, cujo objetivo é restringir rapidamente a uma área específica do espaço multidimensional para encontrar os vizinhos mais próximos sem ter que percorrer todo o espaço, como faria uma busca linear por força bruta.</p><p>Se você gostou do que leu, não deixe de conferir as outras partes desta série:</p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/vector-search-set-up-elasticsearch">Parte 2: Como configurar a pesquisa vetorial no Elasticsearch</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/hybrid-search-elasticsearch">Parte 3: Busca Híbrida usando o Elasticsearch</a></p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/introduction-to-vector-search</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/introduction-to-vector-search</guid>
    <category><![CDATA[Banco de dados vetorial]]></category>
    <dc:creator><![CDATA[Valentin Crettaz]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt70da374b8dc0c490/6a17e0e46864a473aab686b3/63eea8ea95b49e7241e539f65bf5aa3bb8823fff-1200x628.png" length="0" type="image/png"/>
    <pubDate>Thu, 06 Feb 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Medidas e pontuação de similaridade vetorial]]></title>
    <description><![CDATA[Explore as medidas de similaridade vetorial e a pontuação no Elasticsearch, incluindo distância L1 e L2, similaridade de cosseno, similaridade de produto escalar e similaridade de produto interno máximo.]]></description>
    <content:encoded><![CDATA[<p>Quando surge a necessidade de pesquisar texto livre e Ctrl+F / Cmd+F não são mais suficientes, usar um mecanismo de busca lexical geralmente é a próxima escolha lógica que vem à mente. Os mecanismos de busca lexical são excelentes em analisar e tokenizar o texto a ser pesquisado em termos que podem ser correspondidos no momento da pesquisa, mas geralmente falham quando se trata de entender e dar sentido ao verdadeiro significado do texto que está sendo indexado e pesquisado.</p><p>É exatamente aí que os mecanismos de busca de vetores brilham. Eles podem indexar o mesmo texto de forma que ele possa ser pesquisado com base no significado que ele representa e em suas relações com outros conceitos que tenham significado semelhante ou relacionado.</p><p>Neste blog, abordaremos brevemente como os vetores são um ótimo conceito matemático para transmitir o significado do texto. Em seguida, nos aprofundaremos nas diferentes técnicas de similaridade suportadas pelo Elasticsearch quando se trata de pesquisar vetores vizinhos, ou seja, pesquisar vetores com significado semelhante, e como pontuá-los.</p><h2>O que são embeddings vetoriais?</h2><p>Este artigo não se aprofunda nas complexidades das incorporações de vetores. Se você quiser explorar mais esse tópico ou precisar de uma introdução antes de continuar, recomendamos conferir o <a href="https://www.elastic.co/pt/what-is/vector-embedding">guia a seguir</a>.</p><p>Em poucas palavras, os embeddings vetoriais são obtidos por meio de um processo de aprendizado de máquina (por exemplo, redes neurais de aprendizado profundo) que transformam qualquer tipo de dado de entrada não estruturado (por exemplo, texto bruto, imagem, vídeo, som, etc.) em dados numéricos que carregam seu significado e relacionamentos. Diferentes tipos de dados não estruturados exigem diferentes tipos de modelos de aprendizado de máquina que foram treinados para "entender" cada tipo de dado.</p><p>Cada vetor localiza um dado específico como um ponto em um espaço multidimensional e essa localização representa um conjunto de características que o modelo usa para caracterizar os dados. O número de dimensões depende do modelo de aprendizado de máquina, mas geralmente varia de algumas centenas a alguns milhares. Por exemplo, <a href="https://platform.openai.com/docs/guides/embeddings">os modelos OpenAI Embeddings</a> possuem 1536 dimensões, enquanto <a href="https://docs.cohere.com/reference/embed">os modelos Cohere Embeddings</a> podem variar de 382 a 4096 dimensões. O tipo de campo dense_vector do Elasticsearch suporta até 4.096 dimensões na versão mais recente.</p><p>O verdadeiro feito das incorporações vetoriais é que os pontos de dados que compartilham significados semelhantes ficam próximos no espaço. Outro aspecto interessante é que as incorporações vetoriais também ajudam a capturar relacionamentos entre pontos de dados.</p><h2>Como comparamos vetores?</h2><p>Sabendo que dados não estruturados são fatiados e divididos por modelos de aprendizado de máquina em incorporações vetoriais que capturam a similaridade dos dados ao longo de um grande número de dimensões, agora precisamos entender como funciona a correspondência desses vetores. Acontece que a resposta é bem simples.</p><p>Incorporações de vetores que estão <strong>próximas</strong> umas das outras representam partes de dados <strong>semanticamente semelhantes</strong> . Então, quando consultamos um banco de dados vetorial, a entrada da pesquisa (imagem, texto, etc.) é primeiro transformada em embeddings vetoriais usando o mesmo modelo de aprendizado de máquina que foi usado para indexar todos os dados não estruturados, e o objetivo final é encontrar os <strong>vetores vizinhos mais próximos</strong> daquele vetor de consulta. Portanto, tudo o que precisamos fazer é descobrir como medir a "distância" ou "similaridade" entre o vetor de consulta e todos os vetores existentes indexados no banco de dados - é simples assim.</p><h2>Distância, similaridade e pontuação</h2><p>Felizmente para nós, medir a distância ou similaridade entre dois vetores é um problema fácil de resolver graças à aritmética vetorial. Então, vamos dar uma olhada nas funções de distância e similaridade mais populares suportadas pelo Elasticsearch. Atenção, matemática à frente!</p><p>Antes de começarmos, vamos dar uma olhada rápida na pontuação. Na verdade, o Lucene só permite que as pontuações sejam positivas. Todas as funções de distância e similaridade que apresentaremos em breve fornecem uma medida de quão próximos ou similares dois vetores são, mas esses números brutos raramente são adequados para serem usados como pontuação, pois podem ser negativos. Por esse motivo, a pontuação final precisa ser derivada do valor de distância ou similaridade de uma forma que garanta que a pontuação será positiva e uma pontuação maior corresponde a uma classificação mais alta (ou seja, para vetores mais próximos).</p><h3>Distância L1</h3><p>A distância L1, também chamada de distância de Manhattan, de dois vetores  e  é medida pela soma da diferença absoluta em pares de todos os seus elementos. Obviamente, quanto menor a distância , mais próximos os dois vetores estarão. A fórmula da distância L1 (1) é bastante simples, como pode ser visto abaixo:</p><p>Visualmente, a distância L1 pode ser ilustrada conforme mostrado na imagem abaixo (em vermelho):</p><p>O cálculo da distância L1 dos dois vetores a seguir  e  resultaria em </p><p><strong>Importante:</strong> Vale ressaltar que a função de distância L1 só é suportada para <a href="https://www.elastic.co/pt/guide/en/elasticsearch/reference/current/query-dsl-script-score-query.html#vector-functions-l1">pesquisa vetorial exata</a> (também conhecida como pesquisa de força bruta) usando a consulta DSL <code>script_score</code> , mas não para <a href="https://www.elastic.co/pt/guide/en/elasticsearch/reference/8.11/dense-vector.html#dense-vector-params">pesquisa kNN aproximada</a> usando a<a href="https://www.elastic.co/pt/guide/en/elasticsearch/reference/8.11/knn-search.html#approximate-knn"> opção de pesquisa</a> <a href="https://www.elastic.co/pt/guide/en/elasticsearch/reference/8.11/knn-search.html#approximate-knn"><code>knn</code></a>ou<a href="https://www.elastic.co/pt/guide/en/elasticsearch/reference/current/query-dsl-knn-query.html"> a consulta DSL</a> <a href="https://www.elastic.co/pt/guide/en/elasticsearch/reference/current/query-dsl-knn-query.html"><code>knn</code></a> .</p><h3>Distância L2</h3><p>A distância L2, também chamada de distância euclidiana, de dois vetores  e  é medida primeiro somando o quadrado da diferença de pares de todos os seus elementos e depois tirando a raiz quadrada do resultado. É basicamente o caminho mais curto entre dois pontos. Similarmente a L1, quanto menor a distância , mais próximos os dois vetores estão:</p><p>A distância L2 é mostrada em vermelho na imagem abaixo:</p><p>Vamos reutilizar os mesmos dois vetores de amostra  e  que usamos para a distância  , e agora podemos calcular a distância  como .</p><p>Em termos de pontuação, quanto menor a distância entre dois vetores, mais próximos (ou seja, mais semelhantes) eles são. Então, para derivar uma pontuação, precisamos inverter a medida de distância, de modo que a menor distância produza a maior pontuação. A maneira como a pontuação é calculada ao usar a distância L2 é mostrada na fórmula (3) abaixo:</p><p>Reutilizando os vetores de amostra do exemplo anterior, sua pontuação seria . Dois vetores muito próximos um do outro tenderão a uma pontuação de 1, enquanto a pontuação de dois vetores muito distantes um do outro tenderá a 0.</p><p>Concluindo as funções de distância L1 e L2, uma boa analogia para compará-las é pensar em A e B como dois edifícios em Manhattan, Nova York. Um táxi indo de A para B teria que dirigir pelo caminho L1 (ruas e avenidas), enquanto um pássaro provavelmente usaria o caminho L2 (linha reta).</p><h3>Similaridade de cosseno</h3><p>Ao contrário de L1 e L2, a similaridade do cosseno não mede a distância entre dois vetores  e , mas sim seu ângulo relativo, ou seja, se ambos estão apontando aproximadamente na mesma direção. Quanto maior a similaridade , menor o ângulo  entre os dois vetores e, portanto, mais "próximos" eles são e mais "semelhantes" são seus significados transmitidos.</p><p>Para ilustrar isso, vamos pensar em duas pessoas em uma área selvagem olhando em direções diferentes. Na figura abaixo, a pessoa de azul olha na direção simbolizada pelo vetor  e a pessoa de vermelho na direção do vetor . Quanto mais eles direcionarem sua visão na mesma direção (ou seja, quanto mais próximos seus vetores estiverem), mais seu campo de visão simbolizado pelas áreas azul e vermelha se sobreporá. O quanto seus campos de visão se sobrepõem é a similaridade de seus cossenos. Entretanto, observe que a pessoa B parece mais distante do que a pessoa A (ou seja, o vetor  é maior). A pessoa B pode estar olhando para uma montanha distante no horizonte, enquanto a pessoa A pode estar olhando para uma árvore próxima. Para similaridade de cosseno, isso não desempenha nenhum papel, pois é apenas uma questão de ângulo.</p><p>Agora vamos calcular essa similaridade de cosseno. A fórmula (4) é bastante simples, onde o numerador consiste no produto escalar de ambos os vetores e o denominador contém o produto de sua magnitude (ou seja, seu comprimento):</p><p>A similaridade do cosseno entre  e  é mostrada na imagem abaixo como uma medida do ângulo entre eles (em vermelho):</p><p>Vamos fazer um rápido desvio para explicar o que esses valores de similaridade de cosseno significam concretamente. Como pode ser visto na imagem abaixo representando a função cosseno, os valores sempre oscilam no intervalo  .</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc0e4eb98ebb64cf3/6a17da287b54f983818b3783/e31145284b8c27d0bd9e3d2831f811388134fd83-1188x272.png" alt="cos-função" /><p>Lembre-se de que, para que dois vetores sejam considerados semelhantes, seu ângulo deve ser o mais agudo possível, idealmente próximo de um ângulo  , o que se resumiria a uma semelhança perfeita de . Em outras palavras, quando os vetores são...</p><ol><li><p>...<strong>próximos</strong> um do outro, o cosseno do seu ângulo se aproxima  (ou seja, próximo de )</p></li></ol><ol><li><p>...<strong>não relacionados</strong>, o cosseno do seu ângulo se aproxima  (ou seja, próximo de )</p></li></ol><ol><li><p>...<strong>oposto</strong>, o cosseno do seu ângulo se aproxima  (ou seja, próximo de )</p></li></ol><p>Agora que sabemos como calcular a similaridade do cosseno entre dois vetores e temos uma boa ideia de como interpretar o valor resultante, podemos reutilizar os mesmos vetores de amostra  e  e calcular sua similaridade do cosseno usando a fórmula (4) que vimos anteriormente.</p><p>Obtemos uma similaridade de cosseno de , que é mais próxima de  do que de , o que significa que os dois vetores são <strong>um tanto similares</strong>, ou seja, não são perfeitamente similares, mas também não são completamente independentes e certamente não têm significados opostos.</p><p>Para derivar uma pontuação positiva de qualquer valor de similaridade de cosseno, precisamos usar a seguinte fórmula (5), que transforma os valores de similaridade de cosseno que oscilam dentro do intervalo  em pontuações no intervalo  :</p><p>A pontuação para os vetores de amostra  e  seria: .</p><h3>Similaridade do produto escalar</h3><p>Uma desvantagem da similaridade de cosseno é que ela leva em conta apenas o ângulo entre dois vetores, mas não sua magnitude, o que significa que se dois vetores apontam aproximadamente na mesma direção, mas um é muito maior que o outro, ambos ainda serão considerados semelhantes. A similaridade do produto escalar, também chamada de similaridade escalar ou de produto interno, melhora isso ao levar em conta tanto o ângulo quanto a magnitude dos vetores, o que fornece uma métrica de similaridade mais precisa. Para tornar a magnitude dos vetores irrelevante, a similaridade do produto escalar exige que os vetores sejam normalizados primeiro, de modo que, em última análise, estamos apenas comparando vetores de comprimento unitário 1.</p><p>Vamos tentar ilustrar isso novamente com as mesmas duas pessoas de antes, mas, desta vez, as colocamos no meio de uma sala circular, de modo que seu alcance de visão seja exatamente o mesmo (ou seja, o raio da sala). De forma semelhante à similaridade do cosseno, quanto mais eles se voltam na mesma direção (ou seja, quanto mais próximos seus vetores ficam), mais seus campos de visão se sobrepõem. Entretanto, ao contrário da similaridade de cosseno, ambos os vetores têm o mesmo comprimento e ambas as áreas têm a mesma superfície, o que significa que as duas pessoas olham exatamente para a mesma imagem localizada à mesma distância. O quão bem essas duas áreas se sobrepõem denota sua similaridade de produto escalar.</p><p>Antes de introduzir a fórmula de similaridade do produto escalar, vamos ver rapidamente como um vetor pode ser normalizado. É bem simples e pode ser feito em duas etapas triviais:</p><ol><li><p>calcular a magnitude do vetor</p></li><li><p>divida cada componente pela magnitude obtida em 1.</p></li></ol><p>Como exemplo, vamos pegar o vetor . Podemos calcular sua magnitude  como vimos anteriormente ao revisar a similaridade do cosseno, ou seja, . Então, dividindo cada componente do vetor por sua magnitude, obtemos o seguinte vetor normalizado :</p><p>Passar pelo mesmo processo para o segundo vetor  produziria o seguinte vetor normalizado :</p><p>Para derivar a fórmula de similaridade do produto escalar, podemos calcular a similaridade do cosseno entre nossos vetores normalizados  e  usando a fórmula (4), conforme mostrado abaixo:</p><p>E como a magnitude de ambos os vetores normalizados é agora , a fórmula de similaridade do produto escalar (6) simplesmente se torna... você adivinhou, um produto escalar de ambos os vetores normalizados:</p><p>Na imagem abaixo, mostramos os vetores normalizados  e  e podemos ilustrar sua similaridade de produto escalar como a projeção de um vetor sobre o outro (em vermelho).</p><p>Usando nossa nova fórmula (6), podemos calcular a similaridade do produto escalar de nossos dois vetores normalizados, o que, sem surpresa, produz exatamente o mesmo valor de similaridade que o do cosseno:</p><p>Ao aproveitar a similaridade do produto escalar, a pontuação é calculada de forma diferente dependendo se os vetores contêm valores flutuantes ou de bytes. No primeiro caso, a pontuação é calculada da mesma forma que para a similaridade do cosseno usando a fórmula (7) abaixo:</p><p>Entretanto, quando o vetor é composto de valores de bytes, a pontuação é calculada de forma um pouco diferente, conforme mostrado na fórmula (8) abaixo, onde  é o número de dimensões do vetor:</p><p>Além disso, uma restrição para produzir pontuações precisas é que todos os vetores, incluindo o vetor de consulta, devem ter o mesmo comprimento, mas não necessariamente 1.</p><h3>Similaridade máxima do produto interno</h3><p>Desde a versão 8.11, há uma nova função de similaridade que é menos restrita do que a similaridade do produto escalar, pois os vetores não precisam ser normalizados. O principal motivo para isso é explicado detalhadamente no <a href="https://www.elastic.co/pt/search-labs/blog/lucene-bringing-maximum-inner-product-to-lucene">artigo a seguir</a>, mas, para resumir muito brevemente, certos conjuntos de dados não são muito bem adaptados para ter seus vetores normalizados (por exemplo, <a href="https://www.elastic.co/pt/search-labs/blog/elasticsearch-cohere-embeddings-support">incorporações Cohere</a>) e isso pode causar problemas de relevância.</p><p>A fórmula para calcular a similaridade máxima do produto interno é exatamente a mesma que a do produto escalar (6). O que muda é a maneira como a pontuação é calculada, escalando a similaridade máxima do produto interno usando uma função por partes cuja fórmula depende se a similaridade é positiva ou negativa, conforme mostrado na fórmula (9) abaixo:</p><p>O que essa função por partes faz é dimensionar todos os valores negativos de similaridade do produto interno máximo no intervalo  e todos os valores positivos no intervalo  .</p><h2>Resumindo</h2><p>Foi uma jornada e tanto, matematicamente falando, mas aqui estão algumas lições que você pode achar úteis.</p><p>A função de similaridade que você pode usar depende, em última análise, se seus embeddings vetoriais são normalizados ou não. Se seus vetores já estiverem normalizados ou se seu conjunto de dados for independente da normalização vetorial (ou seja, a relevância não será afetada), você pode prosseguir e normalizar seus vetores e usar a similaridade do produto escalar, pois é muito mais rápido de calcular do que o cosseno, pois não há necessidade de calcular o comprimento de cada vetor. Ao comparar milhões de vetores, esses cálculos podem somar bastante.</p><p>Se seus vetores não estiverem normalizados, você tem duas opções:</p><ol><li><p>use similaridade de cosseno se normalizar seus vetores não for uma opção</p></li><li><p>use a nova similaridade máxima do produto interno se quiser que a magnitude dos seus vetores contribua para a pontuação porque eles carregam significado (por exemplo, incorporações Cohere)</p></li></ol><p>Neste ponto, calcular a distância ou similaridade entre incorporações vetoriais e como derivar suas pontuações deve fazer sentido para você. Esperamos que você tenha achado este artigo útil.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/vector-similarity-measures-and-scoring</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/vector-similarity-measures-and-scoring</guid>
    <category><![CDATA[Banco de dados vetorial]]></category>
    <dc:creator><![CDATA[Valentin Crettaz]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte5a3e9d39849d3ed/6a17da31a2929960a3d02b3f/4d9e89678798b9de68357b5cc06dbbd8b9c6e5e8-1440x823.webp" length="0" type="image/webp"/>
    <pubDate>Mon, 13 May 2024 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>