<?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[Na Elastic - 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[Na Elastic - 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/blog/category/inside-elastic</link>
    </image>
    <link>https://www.elastic.co/pt/search-labs/blog/category/inside-elastic</link>
    <atom:link href="https://www.elastic.co/pt/search-labs/rss/category/inside-elastic.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[pt]]></language>
    <lastBuildDate>Mon, 21 Sep 2026 08:45:22 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Como criamos o Elasticsearch simdvec para que a busca vetorial seja uma das mais rápidas do mundo]]></title>
    <description><![CDATA[Como criamos o Elasticsearch simdvec, a biblioteca do kernel SIMD ajustada manualmente por trás de cada consulta de busca vetorial no Elasticsearch.]]></description>
    <content:encoded><![CDATA[<p>Elasticsearch simdvec é o motor por trás de cada cálculo de distância vetorial no Elasticsearch. Ele fornece kernels AVX-512 e NEON ajustados manualmente para cada tipo de vetor que o Elasticsearch aceita. A arquitetura de pontuação em lote oculta a latência de memória por meio de pré-busca explícita em x86 e carregamento intercalado no ARM, superando bibliotecas como FAISS e jvector por até 4x quando os dados excedem o cache da CPU. Neste post, explicamos por que o construímos, o que ele contém e como ele deixa a busca vetorial do Elasticsearch uma das mais rápidas do mundo.</p><h2>Como construímos o Elasticsearch com simdvec</h2><p>Toda consulta de busca vetorial no Elasticsearch, seja por meio de percurso <a href="https://arxiv.org/abs/1603.09320">Hierarchical Navigable Small World (HNSW)</a>, varredura de arquivo invertido (IVF) ou reclassificação, se resume ao mesmo problema: calcular as distâncias entre vetores, milhões de vezes por consulta. O Elasticsearch é compatível com uma ampla variedade de tipos de dados e estratégias de quantização, desde float32 até int8, bfloat16, binário e Quantização Binária Aprimorada (BBQ). Cada uma traz diferentes contrapartidas entre memória, taxa de transferência e recuperação. Por trás de tudo isso há um único mecanismo: simdvec.</p><p>Criamos o simdvec para tornar cada cálculo de distância o mais rápido que o hardware permite. Neste post, explicamos por que o criamos, o que está dentro e onde ele entrega o maior impacto.</p><h3>Construído como um carro de corrida</h3><p>Como entusiastas da Fórmula 1, e um de nós tendo trabalhado anteriormente com a equipe Ferrari de Fórmula 1, vemos um paralelo claro. Um carro de Fórmula 1 é projetado com um único propósito: alcançar o melhor tempo de volta. Potência do motor, aerodinâmica e design do chassi só importam na medida em que contribuem para esse resultado. O mesmo vale para um banco de dados vetorial, onde a taxa de transferência de indexação, a latência de consulta e o recall definem o sucesso.</p><p>Embora o resultado final seja o que importa, alcançar os mais altos níveis de desempenho exige que cada componente esteja no estado ideal. Não pode ser só <em>bom o suficiente</em>, tem que ser o <em>melhor </em>na categoria. O Simdvec foi construído com essa mentalidade, focando uma parte crítica do sistema: o mecanismo. Trata-se de uma biblioteca de kernel otimizada para SIMD (<a href="https://en.wikipedia.org/wiki/Single_instruction,_multiple_data">Single Instruction Multiple Data</a>), criada especificamente para fornecer funções de distância nativas em C++ ajustadas manualmente, chamadas a partir do Java via interface de função estrangeira (FFI) <a href="https://openjdk.org/projects/panama/">Panama</a>. Ele trabalha com pontuação em lote, pré-busca de linhas de cache e todos os tipos e layouts vetoriais usados no Elasticsearch.</p><p>Esse é o mecanismo por trás de cada consulta.</p><h3>Por que criamos nosso</h3><p>Começamos em 2023 com a Panama Vector API no Apache Lucene. Funcionou bem para produtos dot float32, mas as necessidades do Elasticsearch logo superaram o que ele podia oferecer. O Elasticsearch é compatível com uma ampla variedade de tipos de vetores quantizados: int8, int4, bfloat16, bit único e BBQ assimétrico. Cada um possui estratégias SIMD diferentes, layouts de empacotamento e requisitos de acumuladores. Além da cobertura de tipos, os caminhos de pontuação do Elasticsearch exigem mais do que a taxa de transferência de pares únicos: o HNSW precisa pontuar vários vizinhos do gráfico em uma única passagem, o IVF precisa da pontuação em lote de milhares de candidatos com pré-busca e a pontuação baseada em disco precisa funcionar diretamente na memória mapeada em memória (mmap) sem cópia. Vimos o que estava disponível e nada abrangia o conjunto completo.</p><p>Então, criamos o simdvec: kernels C++ nativos ajustados manualmente, chamados de Java via FFI, com pontuação em massa, pré-busca e suporte para cada tipo de vetor que o Elasticsearch usa. Ao possuir a biblioteca, controlamos toda a stack. Quando adicionamos um novo tipo de quantização como BBQ, ele recebe um kernel SIMD ajustado ligado por todo o sistema. Não esperamos uma biblioteca upstream para suportá-lo e não comprometemos o desempenho de nenhum tipo. Toda consulta vetorial no Elasticsearch, seja HNSW, IVF, de reclassificação ou híbrida, pode ser executada nesse mecanismo, construído em torno das operações e tipos que realmente usamos.</p><p>O Simdvec possui bibliotecas nativas separadas para x86 e ARM, cada uma com múltiplos níveis de arquitetura de conjunto de instruções (ISA) selecionados no início. A sobrecarga de chamadas do Java via FFI é muito baixa, com <a href="https://github.com/ldematte/simsimd-benchmarks/blob/main/COMPARISON.md#ffm-downcall-overhead-measurements">nanossegundos de um dígito</a>.</p><h3>O cenário</h3><p>Não somos os únicos a construir kernels de distância vetorial otimizados para SIMD. O ecossistema é rico, e queríamos entender como o simdvec funciona. Não para classificar projetos, mas para fornecer contexto e explicar onde o mecanismo do Elasticsearch está localizado. Selecionamos três projetos como pontos de referência, cada um representando uma abordagem diferente:</p><ul><li><p><strong>jvector:</strong> uma biblioteca Java de busca aproximada de vizinhos mais próximos (ANN) que usa a Panama Vector API para cálculo vetorizado de distância, com aceleração nativa em C opcional no x86.</p></li><li><p><strong>FAISS:</strong> um framework de busca vetorial open source amplamente utilizada, com kernels AVX2/AVX-512 otimizados manualmente.</p></li><li><p><strong>NumKong</strong> (anteriormente SimSIMD): um conjunto abrangente de mais de 2.000 kernels SIMD ajustados manualmente, abrangendo funções de distância, operações matriciais e computação geoespacial.</p></li></ul><p>Cada projeto tem um propósito diferente e realiza diferentes compensações. Incluímos números de referência deles para dar contexto sobre o desempenho do simdvec nas operações específicas que o Elasticsearch precisa.</p><h3>Como medimos</h3><p>Os <a href="https://github.com/ChrisHegarty/jvector-kernel-benchmarks">benchmarks simdvec</a> e jvector são escritos em Java com o JMH, o conjunto padrão de microbenchmark da JVM, com a sobrecarga de FFI incluída. Para os <a href="https://github.com/ldematte/simsimd-benchmarks">benchmarks NumKong</a> e <a href="https://github.com/ChrisHegarty/faiss-kernel-benchmarks">FAISS</a>, criamos programas em C/C++ reduzidos usando o Google Benchmark, que é a estrutura padrão de microbenchmarks em C++. Ambos os frameworks reportam nanossegundos por operação com calibração de aquecimento e iteração. Verificamos por meio de contadores de desempenho de hardware que todas as bibliotecas estão usando SIMD em ambas as plataformas. Todo o código do benchmark está disponível publicamente nos repositórios vinculados do GitHub (e, no caso do simdvec, no repositório <a href="https://github.com/elastic/elasticsearch">elasticsearch</a>).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt90a7d66553be3c9d/6a1701d166c4f942caf8bea5/aee116772df161cf86b7668f575ac34c733a23c5-1580x238.png" alt="Tabela listando duas plataformas: x86 com AMD EPYC Turin (Zen 5), AVX2 e AVX‑512, AWS c8a.4xlarge; e ARM com Graviton 4 (Neoverse V2), NEON e SVE2, AWS c8g.4xlarge." /><p><strong>Software:</strong> JDK 25.0.2, JMH 1.37, GCC 14, Google Benchmark (a versão mais recente).</p><h2>Um vetor de cada vez</h2><p>A operação mais fundamental na busca vetorial é calcular a distância entre dois vetores. Cada avaliação de vizinho HNSW, cada pontuação de candidata a IVF, cada comparação de reclassificação se reduz a esse ciclo interno.</p><p>Medimos a taxa de transferência de pares individuais em 1024 dimensões em ambas as plataformas, começando com float32, o tipo de referência e aquele em que o ecossistema é mais competitivo. Comparamos simdvec com FAISS e jvector; excluímos o NumKong porque ele usa acumuladores float64 para float32, tornando-o 3,2x-5,3x mais lento (dependendo da plataforma), priorizando precisão numérica em vez de throughput. Para manter a comparação comparável, comparamos o NumKong no int8, onde ele usa a mesma estratégia de acumulador do simdvec.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte3bc2ecaf3ad2b61/6a1701d2ab7f08039ddb9d0f/352cfa0fc18f123140f746d843404f80127fb1b7-1500x675.png" alt="Gráfico de barras horizontais intitulado &quot;float32 Dot Product — AMD Turin&quot; comparando cinco implementações: FAISS AVX-512 a 23,2 ns/op, ES simdvec AVX-512 a 28,3 ns/op, FAISS AVX2 a 36,4 ns/op, ES simdvec AVX2 a 38,9 ns/op e jvector a 43,9 ns/op." /><p>No x86, o FAISS AVX-512 é o kernel de par único mais rápido, com 23 ns. O Simdvec AVX-512 segue a 28 ns, uma lacuna que reflete a sobrecarga de chamadas FFI. Ambos usam FMA de 512 bits com desenrolamento de multi-acumuladores. No nível AVX2, os dois são muito mais próximos, 36 ns e 39 ns respectivamente, ambos limitados pela largura de carga de registrador e memória de 256 bits. O jvector é executado em 44 ns usando a API Java Panama Vector. O Panama gera um bom código SIMD, mas os intrínsecos do C++ ajustados manualmente mantêm uma vantagem.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcbbbe442631a575d/6a1701d42b835f81bcf4b083/95e44d9767f21ec4bccaed835e3c99aa180431ee-1500x495.png" alt="Gráfico de barras horizontais intitulado &quot;float32 Dot Product - Graviton 4 (ARM)&quot; mostrando ES simdvec a 70.2 ns/op, jvector a 110.0 ns/op e FAISS a 155.6 ns/op." /><p>No ARM, o simdvec lidera com 70 ns, bem à frente do jvector com 110 ns e do FAISS com 156 ns. O Simdvec tem kernels NEON ajustados manualmente para aarch64. O Jvector não tem código ARM nativo e depende do Panama. O FAISS depende da autovetorização do compilador em vez de intrínsecos explícitos do NEON, o que explica a lacuna maior. Isso reflete uma vantagem prática de ter a biblioteca do kernel: quando o Elasticsearch expandiu para o Graviton, adicionamos kernels NEON construídos especificamente para isso. Nem o jvector, nem o FAISS priorizaram código nativo ARM na mesma medida.</p><p>Mas o Elasticsearch não pontua apenas em float32. A quantização <strong>Int8</strong> reduz a memória em 4x, bfloat16 em 2x e BBQ em 32x. Cada tipo precisa de sua própria estratégia SIMD, e o simdvec fornece kernels nativos ajustados manualmente para todos eles.</p><p>Das bibliotecas que comparamos, apenas a NumKong tem kernels comparáveis para int8. Medimos o produto escalar int8, euclidiano ao quadrado e cosseno em 1.024 dimensões.</p><p><strong>Pontuação Int8 par único (1024 dimensões, ns/vec op – quanto menor, melhor)</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3ac255d158e93504/6a1701d5a292997e48d00eb1/a0b852fd5f51d57bd2488886600472ee65ab64da-1594x378.png" alt="Tabela comparando o desempenho de x86 e ARM para operações de produto escalar, euclidiano quadrado e cosseno, listando os valores ES, NumKong e diff para cada operação em ambas as arquiteturas." /><p>Em ambas as arquiteturas, o NumKong é igual ou mais rápido em dimensões pequenas a médias, onde a diferença se deve em grande parte à menor sobrecarga de chamadas (chamada direta em C vs Java FFI). Em dimensões maiores, o simdvec alcança o desempenho do kernel, onde a implementação mais eficiente (que usa desenrolamento em cascata) amortiza o custo da chamada: conforme a dimensão aumenta, <a href="https://github.com/ldematte/simsimd-benchmarks/blob/main/COMPARISON.md#single-pair-i8-nsop-2">essa diferença diminui e eventualmente se inverte</a>. O crossover está em dimensões entre 768 e 1.536, dependendo da função e arquitetura.</p><p>Apesar da sobrecarga ligeiramente maior do Java FFI, o simdvec está no mesmo nível das bibliotecas altamente otimizadas em C/C++. Além de ser a única biblioteca com kernels otimizados tanto para float32 <em>quanto</em> para int8, também lidera em ARM e fica apenas um pouco atrás de FAISS em x86 (para float32), e muito próxima de NumKong em ambas as arquiteturas (para int8). E, para bfloat16, int4, binário e BBQ, embora existam alternativas, o simdvec se destaca graças ao SIMD ajustado manualmente, adaptado ao layout de dados de cada tipo.</p><p>Mas um mecanismo de busca de produção não pontua um vetor de cada vez; ele marca milhares por consulta. A próxima pergunta é o que acontece nessa escala.</p><h3>Milhares de uma só vez</h3><p>O desempenho de um único par é apenas parte do panorama. O que importa na prática é como os sistemas se comportam sob carga. Uma única consulta HNSW pode pontuar centenas de vizinhos do gráfico. Uma varredura de IVF pode pontuar milhares de entradas da lista de postagens. Uma passagem de reclassificação pode pontuar dezenas de milhares de candidatos. A taxa de transferência de pares individuais é importante, mas o que importa ainda mais é a rapidez com que você consegue pontuar vários vetores e a suavidade com que o desempenho se degrada à medida que o conjunto de trabalho transborda dos caches da CPU.</p><p>O Simdvec fornece pontuação em lote para todos os tipos de dados. Esses não são apenas loops sobre kernels de par único; eles usam loops internos multiacumuladores que carregam o vetor de consulta uma vez por passo dimensional e o compartilham entre múltiplos vetores de documentos, com pré-busca explícita de linha de cache para o lote seguinte. Nem jvector, nem FAISS oferecem algo equivalente (no momento em que escrevo). O Jvector não tem bulk API, então os chamadores marcam um par por vez em um loop. O FAISS expõe <code>fvec_inner_products_ny</code>, que, no momento da escrita, é implementado como um ciclo sobre a função de distância de par único, sem amortização de consulta ou pré-busca.</p><p><strong>Float32.</strong> Para medir o impacto no nível do kernel, avaliamos uma única consulta contra números crescentes de vetores de documento float32 de 1.024 dimensões, usando padrões de acesso aleatório que simulam buscas de vizinhos de gráficos dispersos semelhantes ao HNSW. Os três tamanhos de conjunto de dados, 32, 625 e 32.500 vetores, são escolhidos para que o conjunto de trabalho exceda o cache L1, L2 e L3, respectivamente.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2df64ec77a1921ae/6a1701d714b270393ae3c4de/1d90267be1c63ac82b8ba588617ebedb0be0d1b6-1334x558.png" alt="Dois gráficos de barras comparando tempos de pontuação em lote do Float32 para Elasticsearch simdvec, FAISS e jvector no AMD Turin (x86, AVX-512) e Graviton 4 (ARM, NEON) em três tamanhos: 32 vetores, 625 vetores e 32.500 vetores." /><p>Quando os dados cabem no cache, o simdvec é o mais rápido em ambas as plataformas, mas as margens são modestas, já que a aritmética do kernel predomina. A verdadeira separação surge à medida que o conjunto de trabalho cresce além do nível L3. Em x86, o simdvec atinge 95 ns por vetor, enquanto o FAISS precisa de 165 ns e o jvector, de 412 ns. Em ARM, o padrão é o mesmo: o simdvec se mantém em 162 ns, enquanto o FAISS sobe para 347 ns e o jvector para 476 ns. A pré-busca e a amortização de consultas no simdvec mantêm a latência de memória oculta de uma forma que um simples loop sobre kernels de par único não consegue igualar, e a vantagem se amplia precisamente onde as cargas de trabalho de busca reais operam, nas profundezas da memória principal.</p><p><strong>Int8.</strong> O mesmo padrão se aplica aos tipos quantizados. Medimos a pontuação em lote do produto escalar int8 em 1.024 dimensões, com tamanhos de conjuntos de dados escolhidos para exceder os mesmos limites do cache L1, L2 e L3, comparando a pontuação em lote do simdvec com a pontuação de par único do NumKong em um ciclo.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcda85e10007188d0/6a1701d9cf4f25d722b2cff7/9ee97d98b40d13b19370b76b33e67ea66bfb3250-1580x338.png" alt=" Tabela intitulada &quot;x86 — Pontuação em lote, produto escalar int8 (ns/op, quanto menor, melhor)&quot; comparando ES simdvec e NumKong em três tamanhos de vetor — 128, 2.500 e 130.000 — com valores correspondentes de ns/op e fatores de aceleração." /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt972c311b7d08ba73/6a1701dadc55dec02ee00c87/601f50a03fa3e6263cbac9700281dfe3e511de60-1580x338.png" alt="Tabela intitulada &quot;ARM — Pontuação em lote, produto escalar int8 (ns/op, quanto menor, melhor)&quot; comparando ES simdvec e NumKong em três tamanhos de vetor — 128, 2.500 e 130.000 — com valores correspondentes de ns/op e fatores de aceleração" /><p>No x86, o simdvec é de 1,2x a 1,9x mais rápido, impulsionado pela combinação de pré-busca explícita e processamento em lote. No ARM, o simdvec vence novamente (1,7x a 1,9x mais rápido) em todos os tamanhos de conjuntos de dados. A vantagem vem do processamento em lote de quatro vetores por vez, oferecendo paralelismo em nível de memória por meio de um padrão de acesso intercalado. Em ambos os casos, o resultado mais impressionante é o que ocorre no maior tamanho de conjunto de dados, onde mais importa.</p><p>Os resultados para distância ao quadrado e cosseno mostram um padrão semelhante, com acelerações de 1,4x a 1,8x para ARM e de 1,3x a 3,0x para x86 (detalhes <a href="https://github.com/ldematte/simsimd-benchmarks/blob/main/COMPARISON.md">aqui</a>).</p><h3>Quando a memória é o mais importante</h3><p>Índices vetoriais de produção normalmente não cabem no cache da CPU. Um índice int8 de 10 milhões de vetores, com 1.024 dimensões, tem 10 GB. Pontuar candidatos significa fazer streaming de dados a partir da DRAM e é aí que a arquitetura de pontuação em lote faz a diferença.</p><p>Usamos contadores de desempenho de hardware para medir o que acontece dentro da CPU durante a pontuação em lote e descobrimos que ocultar a latência de memória exige duas estratégias fundamentalmente diferentes, uma por arquitetura.</p><p><strong>No x86, a pré-busca explícita elimina os erros de cache. </strong>O kernel em massa processa os vetores sequencialmente, um totalmente computado antes do próximo, enquanto emite instruções de pré-busca para o próximo lote. Os dados futuros são puxados para L1 antes que a CPU precise deles.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt368f29b5143d0f5a/6a1701dcc1e8a51780f8817b/a39548f8060c2a4a5154521a4047dd92d8cd77be-1580x309.png" alt="Tabela intitulada “x86 (AMD Turin) — Contadores de hardware por operação int8” comparando os modos único e em massa para falhas de cache L1, falhas de IPC e dTLB, com os fatores de melhoria correspondentes." /><p>Em ARM, a mesma abordagem sequencial teve desempenho ruim, mesmo com prefetching. Em vez disso, o <strong>kernel bulk intercala leituras</strong> de quatro vetores em cada posição do stride, dando ao mecanismo de execução fora de ordem quatro fluxos de memória independentes. A CPU não está buscando dados mais rápido, mas sim esperando menos, porque sempre há outra coisa para calcular enquanto as requisições de memória estão em voo. Você pode encontrar uma análise detalhada <a href="https://github.com/elastic/elasticsearch/issues/145412">nesta edição do GitHub</a>.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8751ac5b20b75508/6a1701deab7f08db83db9d13/832de3bc0d556a493b7bf3f250196018acfc1585-1580x238.png" alt="Tabela Intitulada &quot;ARM (Graviton 4) — Contadores de hardware por operação Int8&quot; comparando os modos único e em lote para falhas de cache L1 e paradas do backend, com notas de melhoria correspondentes" /><p>Os números contam duas histórias diferentes:</p><ol><li><p>Em x86, a pré-busca transforma 139K erros de cache em 19K, e as instruções por ciclo (IPC) mais que dobram. A grande vantagem aumenta com o tamanho do conjunto de dados, de 1,2x em L2 para 2,8x além de L3, porque a pré-busca oculta viagens de ida e volta de DRAM cada vez mais caras.</p></li><li><p>No ARM, as falhas de cache mal mudam. O que muda é o uso: as estagnações de backend caem 40% porque o padrão de acesso intercalado mantém o pipeline alimentado. Essa vantagem se mantém consistente em 1,8x, independentemente do tamanho do conjunto de dados, porque o paralelismo no nível da memória se aplica independentemente de os dados virem do cache ou da DRAM.</p></li></ol><p>Duas arquiteturas, duas estratégias, um resultado: em escala de produção, o simdvec mantém o pipeline da CPU ocupado mesmo quando os vetores estão espalhados pela memória principal.</p><h2>O que isso significa para os usuários do Elasticsearch</h2><p>Essas capacidades em nível de kernel se acumulam. Uma única consulta vetorial pode calcular milhões de operações de distância: percurso de gráficos HNSW, pontuação de candidatos, reclassificação. Ao longo de milhares de consultas concorrentes, nanossegundos por operação se traduzem diretamente em latência de consulta e transferência do cluster. Seja usando float32, int8, bfloat16 ou BBQ, seja seu índice na memória ou no disco, simdvec é o motor por baixo, e cada uma dessas operações executa pelo mesmo motor, ajustado até o último nanosegundo.</p><p>A principal conclusão é que, em escala de produção, o desempenho da busca vetorial não é determinado principalmente pela taxa de transferência SIMD bruta. Ele é dominado pela eficiência com que o sistema oculta a latência da memória e, ao mesmo tempo, mantém a computação em milhões de pequenas operações.</p><p>Os kernels simdvec são aprimorados em quase todas as versões do Elasticsearch. Quando surgem novos tipos de quantização e plataformas de hardware, eles recebem kernels ajustados desde o primeiro dia. E os tipos existentes continuam a ficar mais rápidos à medida que refinamos as implementações que já estão sendo lançadas.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-vector-search-simdvec-engine</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-vector-search-simdvec-engine</guid>
    <category><![CDATA[Banco de dados vetorial]]></category>
    <category><![CDATA[Na Elastic]]></category>
    <dc:creator><![CDATA[Chris Hegarty,Lorenzo Dematte,Simon Cooper]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta18088409621369b/6a1701dfdc55de7297e00c8b/df9646091bafbbf0a6dfd212ff8a6bd1e8589708-1280x720.png" length="0" type="image/png"/>
    <pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Apresentando permissões de somente leitura para dashboards do Kibana]]></title>
    <description><![CDATA[Apresentamos dashboards de somente leitura no Kibana, oferecendo aos criadores de dashboards controles detalhados de compartilhamento para manter os resultados precisos e protegidos contra alterações indesejadas.]]></description>
    <content:encoded><![CDATA[<p>Você já passou por isso. Você passou uma hora criando o dashboard perfeito para monitorar seus logs: cada gráfico, cada filtro e cada rótulo. Você o compartilha com sua equipe. Alguns dias depois, você o abre e percebe que algo está errado: um colega ajustou uma consulta ou alguém alterou o intervalo de datas. Talvez essa pessoa achasse que estava ajudando. Agora você está vasculhando revisões e questionando cada número. Soa familiar?</p><p>É exatamente por isso que construímos <strong>dashboards de somente leitura</strong>. É o controle que você vinha pedindo. Compartilhe dashboards com confiança, sem se preocupar que a próxima pessoa com acesso de edição os altere ou danifique.</p><p>Observação: permissões de somente leitura estão disponíveis no Elastic Cloud Serverless e a partir da versão 9.3 para o Elastic Cloud Hosted e o Elastic Self-Managed.</p><h2>Quando “todo mundo pode editar” atrapalha</h2><p>No Kibana, <em>compartilhamento </em>geralmente significava permissões no nível do espaço. Se alguém pode criar dashboards em um espaço, também pode editar ou excluir os de qualquer outra pessoa. Isso é ótimo para colaboração até deixar de funcionar. Uma edição acidental pode levar a decisões erradas, perda de confiança e muito retrabalho.</p><p>Já ouvimos as soluções alternativas: <strong>"Colocamos 'somente leitura' no nome do dashboard e esperamos que as pessoas percebam."</strong> Ou: <strong>"Nós os marcamos e cruzamos os dedos."</strong> Esperança não é um modelo de permissão. Você precisava de uma forma real de bloquear o dashboard sem bloquear todo mundo do espaço.</p><h2>O que realmente dá errado</h2><p>Deb e Kevin têm acesso de edição ao dashboard de monitoramento de logs dentro do espaço Operações. Kevin faz algumas mudanças nos gráficos. Quando Deb volta, os números não correspondem ao que ela apresentou. Ela precisa rastrear o que mudou (muitas vezes de memória), consertar e se perguntar quantos relatórios foram enviados com dados ruins.</p><h2>Dashboards de somente leitura: Propriedade e controle que fazem sentido</h2><p>Dashboards de somente leitura corrigem isso ao dar a você controle para decidir se outros usuários podem editar o dashboard. Quando você compartilha um dashboard, escolhe: <strong>editar</strong> (padrão, igual a hoje) ou <strong>visualizar</strong>. No modo de <strong>visualização </strong>, somente você (e os administradores do Kibana) podem mudar ou excluir isso. Todos os outros usuários podem abrir, usar e confiar, mas não podem modificar.</p><h3>O que você recebe</h3><ul><li><p><strong>Integridade do dashboard:</strong> no modo de <strong>visualização</strong>, outros usuários com acesso de edição no espaço não podem modificar ou excluir o dashboard. Se tentarem, são informados de que está bloqueado. Seus gráficos e sua lógica permanecem como você os deixou.</p></li><li><p><strong>Você mantém o controle:</strong> Você é o dono. Você sempre pode editar, refinar e atualizar. Compartilhar como somente visualização não bloqueia o acesso; ele fixa a versão que todos os outros veem.</p></li><li><p><strong>Ciclo de vida flexível:</strong> você pode voltar a colocar um dashboard em “Pode editar” a qualquer momento. E os administradores do Kibana ainda podem gerenciar todos os dashboards (por exemplo, se o proprietário sair). Sem impasses.</p></li></ul><p>Você pode compartilhar amplamente dashboards finalizados e de alta importância estratégica e saber que eles permanecerão consistentes. Está disponível em <strong>todos os níveis e ofertas da Elastic</strong>, incluindo Serverless.</p><h3>Quem pode fazer o quê?</h3><p>Referência rápida por função:</p><ul><li><p><strong>Proprietário do dashboard:</strong> você o criou; tem acesso total de edição.</p></li><li><p><strong>Administrador do Kibana:</strong> pode gerenciar todos os dashboards.</p></li><li><p><strong>Usuário com permissão de edição no espaço:</strong> pode criar e editar seus dashboards; não pode editar ou excluir dashboards de somente leitura.</p></li><li><p><strong>Usuário com permissão de visualização no espaço:</strong> só pode visualizar (e listar) dashboards.</p></li></ul><p>Ação</p><p>Proprietário do dashboard</p><p>Administrador do Kibana</p><p>Usuário com permissão para editar no espaço</p><p>Usuário com permissão de visualização</p><p>Listar e visualizar dashboards</p><p>✔</p><p>✔</p><p>✔</p><p>✔</p><p>Criar novos dashboards</p><p>✔</p><p>✔</p><p>✔</p><p>✘</p><p>Modificar/excluir dashboards editáveis</p><p>✔</p><p>✔</p><p>✔</p><p>✘</p><p>Modificar/excluir dashboards de somente leitura</p><p>✔</p><p>✔</p><p>✘</p><p>✘</p><h2>Como ativar o modo somente leitura</h2><p>Você pode configurar o modo somente leitura ao salvar um novo dashboard ou mais tarde no menu de compartilhamento.</p><h3>Ao salvar um novo dashboard</h3><ul><li><p>Crie seu dashboard e clique em <strong>Salvar</strong>.</p></li><li><p>Na janela "Salvar como novo dashboard", encontre <strong>Permissões</strong>.</p></li><li><p>Alterar de <strong>Pode editar</strong> para <strong>Pode visualizar</strong>.</p></li><li><p>Clique em <strong>Salvar</strong>. Concluído. É somente leitura para todos os outros.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt120724e3b963289f/6a16f76354abb858cd133baf/42a71d1bb55f9d50bd079f53bf45a0e1999b27f7-1214x1306.png" alt=" Um diálogo do Kibana exibindo as opções para salvar um dashboard, com permissões somente de visualização selecionadas." /><h2>Para um dashboard que você já possui</h2><ul><li><p>Abra o dashboard.</p></li><li><p>Abra o menu <strong>Compartilhar dashboard</strong>.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8fa2f365687c2ca8/6a16f764a292990e4bd00e01/e8405938557c879b1d4c262b98cf5a7f66408c04-1246x264.png" alt="A barra de ferramentas do dashboard do Kibana mostrando opções para sair do modo de edição, compartilhar, ajustar configurações, adicionar painéis e salvar, com foco em Compartilhar." /><ul><li><p>Na janela de compartilhamento, localize <strong>Permissões</strong> e alterne para <strong>Pode visualizar</strong>. A mudança se aplica imediatamente; outros usuários no espaço não podem mais editar ou excluir o dashboard.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt05e6051dbe4b8250/6a16f76667045b321445bf9d/849405bc32701f3ebe0def012d8ae3cf3813ea0a-996x750.png" alt="O painel de compartilhamento do Kibana, mostrando as permissões do dashboard e a opção de copiar um link somente leitura." /><ul><li><p>Você pode passar o mouse sobre a ação <strong>Compartilhar</strong> para ver que tipo de permissões um determinado dashboard tem.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf8880996f84cdab3/6a16f7678b73cb3682189dfa/80541ddb1b1bc567b0aeff693944ea8b6871d6a7-1270x320.png" alt="A barra de ferramentas do Kibana, com o botão Compartilhar destacado, e um tooltip indicando que todos no espaço podem visualizar o dashboard." /><h3>Ver quais dashboards estão bloqueados</h3><p>Na lista principal Dashboards, os dashboards que você não pode editar ou excluir têm uma caixa de seleção desativada. Isso oferece uma maneira fácil de identificar o que é somente leitura.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9c5fae7fa018c89a/6a16f768b0367da1b172bacb/24b2eba08df86174db949c662e7886c5aea1b460-1999x876.png" alt="Os dashboards do Kibana exibem uma lista com vários itens, incluindo criadores, carimbos de data e um item selecionado." /><p>No dashboard, você também verá que a ação Editar está desativada e uma dica de ferramenta será exibida, explicando que o dashboard foi definido como somente leitura.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt50ef3c91d5640c0c/6a16f76a60084b08fc3c434d/e0a2f9da6dc854e876fc6dc2a7c3ef8b313b52ef-1358x330.png" alt="A barra de ferramentas do dashboard do Kibana mostrando um botão Editar com um tooltip de aviso, indicando que o usuário não tem permissão para modificar o dashboard." /><h2>Experimente</h2><p>Dashboards de somente leitura já estão disponíveis. Crie um dashboard, defina como <strong>Pode visualizar</strong> e compartilhe. Sua equipe recebe uma única fonte confiável, e você fica tranquilo. Não há mais “por favor, não edite” no título.</p><p>Queremos saber como você usa dashboards de somente leitura. Compartilhe seu feedback em nosso <a href="https://discuss.elastic.co">fórum comunitário</a>.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/kibana-dashboards-read-only-permissions</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/kibana-dashboards-read-only-permissions</guid>
    <category><![CDATA[Na Elastic]]></category>
    <dc:creator><![CDATA[Teresa Alvarez Soler]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta4d7f707011ca90f/6a16f76b8b73cb3125189dfe/11e578bc317aea30d2e10ccc0334a532f6af2ef9-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Terminação adaptativa precoce para HNSW no Elasticsearch]]></title>
    <description><![CDATA[Introdução de uma nova estratégia adaptativa de terminação antecipada para HNSW no Elasticsearch.]]></description>
    <content:encoded><![CDATA[<p>O Elasticsearch utiliza o algoritmo <a href="https://www.elastic.co/search-labs/blog/hnsw-graph">Hierarchical Navigable Small World</a> (HNSW) para realizar buscas vetoriais em um gráfico de proximidade. O HNSW é conhecido por oferecer uma boa compensação entre a qualidade dos resultados do k-nearest neighbor (KNN) e o custo associado.</p><p>No HNSW, a busca prossegue expandindo iterativamente os nós candidatos no gráfico, mantendo um conjunto limitado de vizinhos mais próximos descobertos até então. Cada expansão tem um custo (operações vetoriais, acessos aleatórios ao disco, e mais), e o benefício marginal desse custo tende a diminuir conforme a busca avança.</p><p>Uma forma de otimizar a travessia de gráficos HNSW é parar de buscar quando a probabilidade marginal de encontrar novos vizinhos verdadeiros não aumenta. Por essa razão, no <a href="https://www.elastic.co/docs/reference/elasticsearch/index-settings/index-modules#index-dense-vector-hnsw-early-termination">Elasticsearch 9.2</a> introduzimos um novo mecanismo de <a href="https://www.elastic.co/search-labs/blog/hnsw-knn-search-early-termination">terminação antecipada</a>. Isso interrompe o processo de busca quando visitar nós do gráfico não fornece vizinhos novos mais próximos suficientes, consecutivamente, por um número fixo de vezes.</p><p>Este artigo mostra como aprimoramos o mecanismo de terminação antecipada mencionado no HNSW para torná-lo mais adequado para diferentes conjuntos de dados e distribuições de dados.</p><h2><strong>Terminação antecipada no HNSW</strong></h2><p>No HNSW, a busca prossegue expandindo iterativamente os nós candidatos no gráfico de proximidade, mantendo um conjunto limitado de vizinhos mais próximos descobertos até então, até que tenha visitado todo o gráfico ou atenda a alguns critérios iniciais de parada.</p><p>Portanto, a terminação antecipada nem sempre é necessariamente uma otimização, faz <strong>parte do próprio algoritmo de busca</strong>. O momento em que decidimos parar determina o equilíbrio entre eficiência e recall. No Elasticsearch, já existem várias maneiras de uma consulta no HNSW terminar antecipadamente:</p><ul><li><p>Um número máximo fixo de nós é visitado.</p></li><li><p>Um tempo limite fixo é atingido.</p></li></ul><p>Embora simples e previsíveis, essas regras são em grande parte <strong>agnósticas em relação ao que a busca realmente está fazendo</strong>. Além disso, elas são usadas principalmente para garantir que a consulta seja concluída em um tempo razoável para o usuário final.</p><p>Em uma <a href="https://www.elastic.co/search-labs/blog/hnsw-knn-search-early-termination">postagem anterior do blog</a>, apresentamos o conceito de redundância no HNSW. Em resumo, cálculos redundantes ocorrem quando o HNSW continua a avaliar novos nós candidatos que não resultam em encontrar mais vizinhos mais próximos.</p><h2><strong>Paciência: Medindo progresso em vez de esforço</strong></h2><p>A noção de <em>paciência</em> reformula a terminação antecipada, focando no <strong>progresso em vez do esforço</strong>.</p><p>Em vez de perguntar:</p><p>"Quantos passos já demos?"</p><p>A nova pergunta passa a ser:</p><p>“Qual é a quantidade de computação que aceitamos desperdiçar até perdermos a esperança?”</p><p>Durante a busca HNSW, a exploração precoce normalmente produz melhorias de pico no conjunto de candidatos top-k. Durante as primeiras etapas da exploração do gráfico HNSW, o conjunto de vizinhos é continuamente atualizado à medida que o algoritmo continua descobrindo vizinhos cada vez mais próximos do vetor de consulta. Com o tempo, essas melhorias se tornam mais raras à medida que a busca converge. <a href="https://cs.uwaterloo.ca/~jimmylin/publications/Teofili_Lin_ECIR2025.pdf">A terminação antecipada baseada em paciência</a> monitora esse padrão e finaliza a busca assim que as melhorias cessarem por um período prolongado.</p><p>Na prática, ao visitar o gráfico HNSW, também calculamos a razão de saturação da fila ao pular entre os nós candidatos. Isso mede a porcentagem de vizinhos mais próximos que permaneceram inalterados ao visitar o nó mais recente do gráfico (ou o inverso do número de novos vizinhos introduzidos na última iteração). Quando essa proporção se torna grande demais para muitas iterações consecutivas, paramos de visitar o gráfico.</p><p>Conceitualmente, a paciência trata a busca HNSW como um <strong>processo de retornos decrescentes</strong>. Quando os retornos se estabilizam, continuar explorando o gráfico traz pouco benefício.</p><p>Esse enquadramento é poderoso porque vincula a interrupção diretamente a <em>resultados observáveis</em>, e não a limites fixos arbitrários.</p><p>A vantagem de usar essa técnica inteligente de terminação antecipada é que as explorações do gráfico HNSW tendem a visitar um número menor de nós gráficos, mantendo uma taxa de recall quase perfeita.</p><p>Para visualizar isso, podemos visualizar em um gráfico a quantidade de recall por nó visitado que obtivemos com a terminação antecipada baseada em paciência (rotulada como <em><code>et=static</code></em>), quando comparada ao comportamento padrão do HNSW (rotulado como <em><code>et=no</code></em>) em alguns conjuntos de dados, FinancialQA e Quora, e modelos, JinaV3 e E5-small.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfd0d692b9beb476a/6a170ef4dc55debf0be00e97/a9d07c5153ea64a2426c82487c36846030692bb9-1600x945.png" alt="Terminação adaptativa antecipada para HNSW " /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt93509c251a1b641e/6a170ef6dc55dea2b3e00e9b/dac56125c4b16d1b596c9876b6ca9ac7b2dc87fa-1600x944.png" alt="Terminação Adaptativa Antecipada para HNSW es" /><h2><strong>Limiares estáticos e dinâmicas do HNSW</strong></h2><p>Na prática, no Elasticsearch, isso é implementado usando <strong>limites estáticos</strong>. Um limite refere-se ao <strong>limite de saturação</strong>, ou seja, a proporção de saturação que consideramos abaixo do ideal. O outro limite refere-se ao número de nós de gráfico consecutivos que permitimos serem visitados enquanto ainda mantêm uma saturação de fila abaixo do ideal: ou seja, o <strong>limiar de paciência</strong>.</p><p>Quando introduzimos essa estratégia de terminação antecipada no Elasticsearch 9.2, decidimos optar por padrões conservadores, de modo a preservar o recall o máximo possível, enquanto ainda obtemos ganhos em termos de latência e consumo de memória. Por esse motivo, definimos o limiar de saturação para 100% e o limiar de paciência para ser definido como 30% (limitado) do <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-knn-query#knn-query-top-level-parameters:~:text=search%20request%20size.-,num_candidates,-(Optional%2C%20integer)%20The"><em><code>num_candidates</code></em></a> na consulta KNN.</p><p>Em muitos cenários, essas configurações funcionaram bem; no entanto, duas consultas que solicitam o mesmo número de vizinhos podem ter comportamentos de convergência radicalmente diferentes. Algumas consultas encontram vizinhanças locais densas e saturam rapidamente; outras precisam percorrer caminhos longos e esparsos antes de encontrar candidatos competitivos. Este último mostrou-se o mais difícil de lidar de forma eficaz.</p><p>Como resultado, por vezes notamos:</p><ul><li><p>Exploração excessiva para consultas fáceis.</p></li><li><p>Encerramento prematuro para consultas complexas.</p></li></ul><p>Portanto, descobrimos que valores de limite fixos codificam suposições globais sobre convergência, enquanto poderíamos fazer com que o HNSW se adaptasse melhor a diferentes dinâmicas.</p><h2><strong>Tornando o HNSW adaptativo à terminação antecipada</strong></h2><p>A terminação antecipada adaptativa aborda esse problema de um ângulo diferente. Em vez de impor limiares de parada pré-definidos, o <strong>algoritmo infere quando parar a partir da própria dinâmica da busca</strong>.</p><p>Então, em vez de comparar a taxa de saturação da fila entre dois candidatos consecutivos, decidimos introduzir uma taxa de descoberta instantânea suavizada   (quantos novos vizinhos foram introduzidos para uma consulta <em>q</em>,na última visita <em>i</em>) junto com a média móvel  e o desvio padrão  dessa taxa de descoberta durante a visita ao gráfico (usando o <a href="https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Welford's_online_algorithm">algoritmo de Welford</a>). Essas estatísticas sobre a taxa de descoberta são calculadas por consulta, de modo que essas informações podem ser usadas para determinar diferentes níveis de paciência para cada consulta.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdbfb1e123f1b026d/6a170ef7cf4f25d9bab2d216/1958be7ca4425ade66eaf621ada3533173183598-694x118.png" alt="" /><p>Os limites anteriormente estáticos se tornam adaptáveis às estatísticas da taxa de descoberta: o limite de saturação se torna a média contínua mais o desvio padrão; enquanto fazemos com que a paciência se adapte e redimensione inversamente com o desvio padrão.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7d4d91f464a9dc9d/6a170ef8d7c0223420de656a/f7ee4a55c24853b657df26052b275e8bd76cf0f9-654x156.png" alt="" /><p>As regras de saída antecipada permanecem as mesmas; a saturação ocorre quando a taxa de descoberta instantânea é menor que o limite de saturação adaptativa. A visita ao gráfico é interrompida se a saturação persistir por um número consecutivo de visitas candidatas maior que a paciência adaptativa.</p><p>Dessa forma, obtemos um comportamento que não depende do parâmetro <em><code>num_candidates</code></em> na consulta KNN (que pode estar sempre definido ou deixado como padrão, independentemente de sair cedo) e que se adapta melhor a cada consulta e distribuição vetorial de forma dinâmica.</p><p>O recall por nó visitado no FinancialQA e Quora com a estratégia adaptativa (rotulada como <em><code>et=adaptive</code></em>) apresenta um recall maior por nó visitado, quando comparado à estratégia estática (<em><code>et=static</code></em>) e ao comportamento padrão do HNSW (<em><code>et=no</code></em>).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blteab7ba53ae14da0e/6a170ef9961e69e072c4cfd5/2a906997d9a25d74c7038bd9661bc97581e7258e-1600x938.png" alt=" estratégia adaptativa e o comportamento padrão do HNSW" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6fb9e672d3698200/6a170efb67045b7b2b45c2ab/3a114911e232c351dbb814cea20e8b0f1415a717-1600x925.png" alt="" /><p>A terminação antecipada adaptativa está ativada por padrão no Elasticsearch 9.3 para campos vetoriais densos HNSW (e pode ser desativada posteriormente por meio da <a href="https://www.elastic.co/docs/reference/elasticsearch/index-settings/index-modules#index-dense-vector-hnsw-early-termination">mesma configuração no nível do índice</a>).</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/hnsw-elasticsearch-adaptive-early-termination</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/hnsw-elasticsearch-adaptive-early-termination</guid>
    <category><![CDATA[Banco de dados vetorial]]></category>
    <category><![CDATA[Na Elastic]]></category>
    <dc:creator><![CDATA[Tommaso Teofili]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt27b746cc1995e6b7/6a170efda29299de8ad010c6/e6d3186f609dd56dc5ffe33d70fa9e5cfa05b51f-1280x720.png" length="0" type="image/png"/>
    <pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Melhore o desempenho de busca com "best_compression"]]></title>
    <description><![CDATA[Embora "best_compression" seja normalmente visto como um recurso de economia de armazenamento para casos de uso do Elastic Observability e Elastic Security, este blog demonstra sua eficácia como uma alavanca de ajuste de desempenho para buscas.]]></description>
    <content:encoded><![CDATA[<p></p><p>Ao ajustar o Elasticsearch para cargas de trabalho de alta simultaneidade, a abordagem padrão é maximizar a RAM para manter o conjunto de documentos em memória e alcançar baixa latência de busca. Consequentemente, <a href="https://www.elastic.co/docs/reference/elasticsearch/index-settings/index-modules"><code>best_compression</code></a> raramente é considerado para cargas de trabalho de busca, pois é visto principalmente como uma medida de economia de armazenamento para casos de uso do Elastic Observability e Elastic Security, onde a eficiência do armazenamento tem prioridade.</p><p>Neste blog, demonstramos que, quando o tamanho do conjunto de dados excede significativamente o cache de páginas do SO, <code>best_compression</code> melhora o desempenho da busca e a eficiência dos recursos, reduzindo o gargalo de E/S.</p><h2><strong>A configuração</strong></h2><p>Nosso caso de uso é um aplicativo de busca de alta concorrência executado em <a href="https://www.elastic.co/docs/deploy-manage/deploy/elastic-cloud/ec-change-hardware-profile#ec-profiles-compute-optimized-arm">instâncias otimizadas para CPU no Elastic Cloud</a>.</p><ul><li><p>Volume de dados: ~500 milhões de documentos</p></li><li><p>Infraestrutura: 6 instâncias Elastic Cloud (Elasticsearch Service) (cada instância: 1,76 TB de armazenamento | 60 GB de RAM | 31,9 vCPU)</p></li><li><p>Relação memória-armazenamento: ~5% do conjunto de dados total cabe na RAM</p></li></ul><h2><strong>Os sintomas: alta latência</strong></h2><p>Observamos que quando o número de solicitações atuais aumentou drasticamente por volta das 19:00, a latência na busca se deteriorou significativamente. Como mostrado na Figura 1 e na Figura 2, enquanto o tráfego atingiu o pico em torno de 400 solicitações por minuto por instância do Elasticsearch, o tempo médio de serviço de consulta se degradou para mais de 60 ms.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf8ab7de934d6b410/6a170440c1e8a58db3f881c1/f9c6cc1882e7db24336c65c54bbc1d38dcdb7fa3-697x311.png" alt="O número de requisições por minuto por Elasticsearch atingiu o pico" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt32de2bed0afbacd5/6a1704422b835fa5ddf4b0e2/bbb705ae2fcd14c81d335bf322346caf3bf33765-996x618.png" alt="Tempo médio de serviço de consulta Elasticsearch" /><p>O uso da CPU permaneceu relativamente baixo após o tratamento inicial das conexões, indicando que o processamento não era o gargalo.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta5b45d4a1ff48f54/6a17044447d49cd7252d88af/cec15a28d2d22e9adedd2951bb2334b3717890a1-1494x730.png" alt="Uso da CPU no Elasticsearch" /><p>Uma forte correlação surgiu entre volume de consultas e falhas de página. À medida que os pedidos aumentavam, observamos um aumento proporcional nas falhas de página, atingindo o pico em torno de 400 mil por minuto. Isso indicava que o conjunto de dados ativo não cabia no cache da página.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd0a3d0c610700bdb/6a17044560084b6f403c4459/511f2f10300a9d10ba3d7a82b9a8c8d567ac5636-1492x678.png" alt="Número de falhas de página no desempenho do Elasticsearch" /><p>Simultaneamente, o uso do heap da JVM parecia normal e saudável. Isso descartou problemas de coleta de lixo e confirmou que o gargalo era de E/S.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3f888a03ce78eb04/6a170448964cea401008ba59/336bbad638f866304358dba1d06ee987de0f23cf-1490x568.png" alt="Utilização de heap no Elasticsearch" /><h2><strong>O diagnóstico: limitado por E/S</strong></h2><p>O sistema estava limitado por E/S. <a href="https://www.elastic.co/blog/elasticsearch-caching-deep-dive-boosting-query-speed-one-cache-at-a-time">O Elasticsearch depende do cache de páginas do sistema operacional para fornecer dados de índice a partir da memória</a>. Quando o índice é grande demais para o cache, consultas acionam leituras de disco caras. Embora a solução típica seja redimensionar horizontalmente (adicionar nodes/RAM), queríamos primeiro esgotar as melhorias de eficiência em nossos recursos existentes.</p><h2><strong>A correção</strong></h2><p>Como padrão, o Elasticsearch usa a compressão <a href="https://en.wikipedia.org/wiki/LZ4_(compression_algorithm)">LZ4</a> para seus segmentos de índice, buscando um equilíbrio entre velocidade e tamanho. Hipotetizamos que mudar para <code>best_compression</code> (que usa <a href="https://en.wikipedia.org/wiki/Zstd">zstd</a>) reduziria o tamanho dos índices. Um espaço menor permite que uma porcentagem maior do índice caiba no cache da página, trocando um aumento insignificante na CPU (por descompressão) por uma redução na E/S do disco.</p><p>Para habilitar <code>best_compression</code>, reindexamos os dados com a configuração de índice <code>index.codec: best_compression</code>. O mesmo resultado poderia ser alcançado fechando o índice, resetando o codec do índice para <code>best_compression</code>, e então realizando uma fusão de segmentos.</p>POST my-index/_close
PUT my-index/_settings
{
    "codec": "best_compression"
}
  
POST my-index/_open  
POST my-index/_forcemerge?max_num_segments=1<h2><strong>Os resultados</strong></h2><p>Os resultados confirmaram nossa hipótese: a eficiência aprimorada do armazenamento se traduziu diretamente em um aumento substancial no desempenho da busca, sem nenhum aumento na utilização da CPU.</p><p>A aplicação de <code>best_compression</code> reduziu o tamanho do índice em aproximadamente 25%. Embora menor do que a redução observada em dados de log repetitivos, essa redução de 25% aumentou efetivamente nossa capacidade de cache de páginas pela mesma margem.</p><p>Durante o próximo teste de carga (começando às 17:00), o tráfego foi ainda maior, atingindo o pico de 500 solicitações por minuto por nó Elasticsearch.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta61ab3bd5ded5716/6a170449a6c2b9f711e795dd/fc1902f396cb2115c0013155ad07f6eb87389c60-660x309.png" alt="Teste de carga no Elasticsearch" /><p>Apesar da maior carga, a utilização da CPU foi menor do que na execução anterior. O uso elevado no teste anterior provavelmente se deveu à sobrecarga do tratamento excessivo de falhas de página e gerenciamento de E/S de disco.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9fd1a44b02a4f787/6a17044b2b835ff996f4b0e6/15699ef4c65b3f0a9f8a3e1bae8bb18f7b647025-819x352.png" alt="Melhoria no desempenho de utilização da CPU do Elasticsearch com best_compression" /><p>Crucialmente, as falhas de página caíram significativamente. Mesmo em maior débito, as falhas ficaram em torno de &lt;200 mil por minuto, comparado a &gt;300 mil no teste inicial.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltef0c621d76767115/6a17044c2b835fe49ef4b0ea/f76ca967976d740af88a9359b66041701abb46fc-764x340.png" alt="Número de falhas de página: melhoria de desempenho do Elasticsearch com best_compression" /><p>Embora os resultados de falha na página ainda não tenham sido ideais, o tempo de serviço de consulta foi reduzido em cerca de 50%, pairando abaixo de 30 ms, mesmo sob carga mais pesada.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6579b3d005d04101/6a17044e66c4f9179cf8bf13/750ec1c59b8eb5069aed4c066d856ecea82d5bca-620x311.png" alt="Melhoria média do desempenho do tempo de consulta no Elasticsearch com best_compression" /><p></p><h2><strong>A conclusão: best_compression para busca</strong></h2><p>Para casos de uso de busca em que o volume de dados excede a memória física disponível, <code>best_compression</code> é uma poderosa alavanca de ajuste de desempenho.</p><p>A solução convencional para falhas de cache é redimensionar para aumentar a RAM. No entanto, ao reduzir a pegada do índice, alcançamos o mesmo objetivo: maximizar a contagem de documentos no cache da página. Nosso próximo passo é explorar <a href="https://www.elastic.co/blog/space-savings-a-lesser-known-benefit-of-index-sorting-in-elasticsearch"><strong>a classificação de índices</strong></a> para otimizar ainda mais o armazenamento e extrair ainda mais desempenho de nossos recursos existentes.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/improve-elasticsearch-performance-best-compression</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/improve-elasticsearch-performance-best-compression</guid>
    <category><![CDATA[Na Elastic]]></category>
    <dc:creator><![CDATA[Sherry Ger,Ryan Eno]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4ff57fbb95c04412/6a17044fab7f081490db9d66/5141a8c2618337207d848ce16b258a86885955b2-1600x1034.jpg" length="0" type="image/jpeg"/>
    <pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Avaliação da relevância de consultas de pesquisa com listas de julgamento]]></title>
    <description><![CDATA[Saiba como criar listas de julgamento para avaliar objetivamente a relevância das consultas de pesquisa e melhorar métricas de desempenho, como recall, para testes de buscas escaláveis no Elasticsearch.]]></description>
    <content:encoded><![CDATA[<p>Os desenvolvedores que trabalham em mecanismos de busca frequentemente se deparam com o mesmo problema: a equipe de negócios não está satisfeita com uma busca específica porque os documentos que eles esperam ver na parte de cima dos resultados da busca aparecem em terceiro ou quarto lugar na lista de resultados.</p><p>No entanto, quando você resolve esse problema, acaba com outras consultas porque não pôde testar todos os casos manualmente. Mas como você ou sua equipe de QA podem testar se uma mudança em uma consulta tem efeito dominó em outras? Ou, mais importante ainda, como você pode ter certeza de que suas mudanças realmente melhoraram uma consulta?</p><h2>Rumo a uma avaliação sistemática</h2><p>É aqui que as listas de julgamento se tornam úteis. Em vez de depender de testes manuais e subjetivos toda vez que você faz uma alteração, você pode definir um conjunto fixo de consultas relevantes para seu caso de negócio, juntamente com os resultados relevantes.</p><p>Esse conjunto se torna sua referência. Toda vez que você implementa uma mudança, você a usa para avaliar se você buscou uma melhoria ou não.</p><p>O valor dessa abordagem é:</p><ul><li><p><strong>Elimina a incerteza</strong>: você não precisa mais se perguntar se suas alterações afetam outras consultas; os dados dirão isso a você.</p></li><li><p><strong>Interrompe os testes manuais</strong>: assim que os conjuntos de julgamento são registrados, o teste é automático.</p></li><li><p><strong>Dá suporte à mudanças</strong>: você pode apresentar métricas claras que sustentam os benefícios de uma mudança.</p></li></ul><h2>Como começar a construir sua lista de julgamentos</h2><p>Uma das formas mais fáceis de começar é pegar uma consulta representativa e selecionar manualmente os documentos relevantes. Existem duas maneiras de fazer esta lista:</p><ul><li><p><strong>Julgamentos binários:</strong> cada documento associado a uma consulta recebe uma <strong>marcação simples</strong>: <em>relevante</em> (geralmente com uma pontuação de “1”) e não-relevante (“0”).</p></li><li><p><strong>Julgamentos graduados:</strong> aqui, cada documento recebe uma pontuação com diferentes níveis. Por exemplo: definir uma escala de 0 a 4, semelhante à <a href="https://en.wikipedia.org/wiki/Likert_scale">Escala Likert</a>, onde 0 = "nada relevante" e 4 = "totalmente relevante", com variações como "relevante", "um pouco relevante" etc.</p></li></ul><p>Julgamentos binários funcionam bem quando a intenção de buscar tem limites claros: esse documento deve estar nos resultados ou não?</p><p>Julgamentos graduados são mais úteis quando há áreas cinzentas: alguns resultados são melhores que outros, então você pode ter resultados "muito bons", "bons" e "inúteis" e usar métricas que valorizam a ordem dos resultados e o feedback do usuário. No entanto, as escalas graduadas também introduzem desvantagens: diferentes avaliadores podem usar os níveis de pontuação de maneira diferente, o que torna os julgamentos menos consistentes. E porque as métricas graduadas dão mais peso às pontuações mais altas, mesmo uma pequena mudança (como classificar algo com 3 em vez de 4) pode criar uma mudança muito maior na métrica do que o avaliador pretendia. Essa subjetividade adicional torna os julgamentos graduados mais complicados e difíceis de gerenciar ao longo do tempo.</p><h2>Preciso classificar os documentos eu mesmo?</h2><p>Não necessariamente, pois existem diferentes maneiras de criar sua lista de julgamentos, cada uma com suas próprias vantagens e desvantagens:</p><ul><li><p><strong>Julgamentos explícitos:</strong> aqui, os SMEs analisam cada consulta/documento e decidem manualmente se é relevante e qual a dimensão da relevância. Embora isso ofereça qualidade e controle, tem menos escalabilidade.</p></li><li><p><strong>Julgamentos implícitos:</strong> com esse método, você infere os documentos relevantes com base no comportamento real dos usuários, como cliques, taxa de rejeição e compras, entre outros. Essa abordagem permite coletar dados automaticamente, mas pode ser tendenciosa. Por exemplo, os usuários tendem a clicar mais vezes nos resultados principais, mesmo que não sejam relevantes.</p></li><li><p><strong>Julgamentos gerados por IA:</strong> essa última opção utiliza modelos (como LLMs) para avaliar automaticamente consultas e documentos, chamados <a href="https://en.wikipedia.org/wiki/LLM-as-a-Judge">LLM como juiz</a>. É rápido e fácil de redimensionar, mas a qualidade dos dados depende da qualidade do modelo que você está usando e de como os dados de treinamento do LLM se alinham aos seus <a href="http://interests.as/">interesses</a> comerciais. Assim como acontece com as notas humanas, os LLMs como juiz podem apresentar os próprios preconceitos ou inconsistências, por isso é importante validar o resultado em relação a um conjunto menor de julgamentos confiáveis. Modelos LLM são probabilísticos por natureza, então não é incomum ver um modelo LLM dando diferentes graus ao mesmo resultado, independentemente de definir o parâmetro de <a href="https://www.ibm.com/think/topics/llm-temperature">temperatura</a> como 0.</p></li></ul><p>A seguir, apresentamos algumas recomendações para escolher o melhor método para criar seu conjunto de julgamentos:</p><ul><li><p>Decida a importância de alguns recursos que somente os usuários possam avaliar de forma adequada (como preço, marca, idioma, estilo e detalhes do produto). Se eles forem importantes, você precisará de <strong>julgamentos explícitos</strong> para pelo menos uma parte da sua <em>lista de julgamentos</em>.</p></li><li><p>Use <strong>julgamentos implícitos</strong> quando seu mecanismo de busca já tiver tráfego suficiente para que você possa usar cliques, conversões e métricas de tempo persistentes para detectar tendências de uso. Você ainda deve interpretá-los com cuidado, comparando-os com seus conjuntos de julgamento explícitos para evitar qualquer viés (por exemplo: os usuários tendem a clicar nos resultados mais bem classificados com mais frequência, mesmo que os resultados com classificação inferior sejam mais relevantes)</p></li></ul><p>Para resolver isso, técnicas de posicionamento de debiasing ajustam ou reponderam os dados de cliques para refletir melhor o verdadeiro interesse do usuário. Algumas abordagens incluem:</p><ul><li><p><strong>Reorganização de resultados</strong>: altere a ordem dos resultados de busca para um subconjunto de usuários a fim de estimar como a posição afeta os cliques.</p></li><li><p><strong>Os modelos de clique </strong>incluem<a href="https://wiki.math.uwaterloo.ca/statwiki/index.php?title=a_Dynamic_Bayesian_Network_Click_Model_for_web_search_ranking">Rede bayesiana dinâmica </a><a href="https://wiki.math.uwaterloo.ca/statwiki/index.php?title=a_Dynamic_Bayesian_Network_Click_Model_for_web_search_ranking"><strong>DBN</strong></a>, <a href="https://rsrikant.com/papers/kdd10.pdf">Modelo de Navegação do Usuário </a><a href="https://rsrikant.com/papers/kdd10.pdf"><strong>UBM</strong></a>. Esses modelos estatísticos estimam que a probabilidade de um clique reflete o interesse real em vez de apenas posição, usando padrões como rolagem, tempo de espera, sequência de cliques e retorno à página de resultados.</p></li></ul><h2>Exemplo: app de avaliação de filmes</h2><h3>Pré-requisitos</h3><p>Para executar este exemplo, você precisa de um cluster Elasticsearch 8.x em execução, <a href="https://www.elastic.co/downloads/elasticsearch">localmente</a> ou <a href="https://www.elastic.co/cloud/cloud-trial-overview">no Elastic Cloud</a> (hospedado ou sem servidor), e acesso à <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis">REST API</a> ou ao Kibana.</p><p>Pense em um app no qual os usuários possam carregar as opiniões sobre filmes e também buscar filmes para assistir. Como os textos são escritos pelos próprios usuários, eles podem ter erros de digitação e muitas variações em termos de expressão. Portanto, é fundamental que o mecanismo de busca seja capaz de interpretar essa diversidade e fornecer resultados úteis para os usuários.</p><p>Para poder iterar consultas sem impactar o comportamento geral de busca, a equipe de negócios da sua empresa criou o seguinte conjunto de julgamento binário, baseado nas buscas mais frequentes:</p><p>Consulta</p><p>DocID</p><p>Texto</p><p>Performance de DiCaprio</p><p>doc1</p><p>A atuação de DiCaprio em O Regresso foi de tirar o fôlego.</p><p>Performance de DiCaprio</p><p>doc2</p><p>A Origem mostra Leonardo DiCaprio em um dos papéis mais icônicos que ele já fez.</p><p>Performance de DiCaprio</p><p>doc3</p><p>Brad Pitt entrega uma atuação sólida neste thriller policial.</p><p>Performance de DiCaprio</p><p>doc4</p><p>Uma aventura cheia de ação com efeitos visuais impressionantes.</p><p>filmes tristes que fazem você chorar</p><p>doc5</p><p>Uma história comovente de amor e perda que me fez chorar muito.</p><p>filmes tristes que fazem você chorar</p><p>doc6</p><p>Um dos filmes mais tristes já feitos — traga lenços!</p><p>filmes tristes que fazem você chorar</p><p>doc7</p><p>Uma comédia leve que vai fazer rir</p><p>filmes tristes que fazem você chorar</p><p>doc8</p><p>Uma saga de ficção científica épica repleta de ação e emoção.</p><p>Criando o índice:</p>PUT movies
{
  "mappings": {
    "properties": {
      "text": {
        "type": "text"
      }
    }
  }
}<p>SOLICITAÇÃO em massa:</p>POST /movies/_bulk
{ "index": { "_id": "doc1" } }
{ "text": "DiCaprio performance in The Revenant was breathtaking." }
{ "index": { "_id": "doc2" } }
{ "text": "Inception shows Leonardo DiCaprio in one of his most iconic roles." }
{ "index": { "_id": "doc3" } }
{ "text": "Brad Pitt delivers a solid performance in this crime thriller." }
{ "index": { "_id": "doc4" } }
{ "text": "An action-packed adventure with stunning visual effects." }
{ "index": { "_id": "doc5" } }
{ "text": "A heartbreaking story of love and loss that made me cry for hours." }
{ "index": { "_id": "doc6" } }
{ "text": "One of the saddest movies ever made -- bring tissues!" }
{ "index": { "_id": "doc7" } }
{ "text": "A lighthearted comedy that will make you laugh." }
{ "index": { "_id": "doc8" } }
{ "text": "A science-fiction epic full of action and excitement." }<p>Abaixo está a consulta Elasticsearch que o aplicativo está usando:</p>GET movies/_search
{
 "query": {
   "match": {
     "text": {
       "query": "DiCaprio performance",
       "minimum_should_match": "100%"
     }
   }
 }
}<h3>Do julgamento às métricas</h3><p>Sozinho, as listas de julgamento não fornecem muitas informações; eles são apenas uma expectativa dos resultados das nossas consultas. O momento importante deles é quando os usamos para calcular métricas objetivas para medir nosso desempenho na busca.</p><p>Hoje em dia, a maioria das métricas populares inclui</p><ul><li><p><a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/search-rank-eval#k-precision"><strong>Precisão</strong></a><strong>: </strong>mede a proporção de resultados relevantes em todos os resultados de busca.</p></li><li><p><a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/search-rank-eval#k-recall"><strong>Recall</strong></a><strong>: </strong>mede a proporção de resultados relevantes que o mecanismo de busca encontrou entre x resultados.</p></li><li><p><a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/search-rank-eval#_discounted_cumulative_gain_dcg"><strong>Ganho cumulativo descontado (DCG):</strong></a>mede a qualidade do ranking do resultado, considerando que os resultados mais relevantes devem estar no topo.</p></li><li><p><a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/search-rank-eval#_mean_reciprocal_rank"><strong>Classificação Recíproca Média (MRR):</strong></a> mede a posição do primeiro resultado relevante. Quanto mais alto na lista, maior a pontuação.</p></li></ul><p>Usando o mesmo app de avaliação de filmes como exemplo, calcularemos a métrica de recordação para ver se há alguma informação que está sendo omitida em nossas consultas.</p><p>No Elasticsearch, podemos usar as <em>listas de julgamentos</em> para calcular métricas via <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/search-rank-eval">API de avaliação de classificação</a>. Essa API recebe como entrada a lista de julgamentos, a consulta e a métrica que você deseja avaliar e retorna um valor, que é uma comparação do resultado da consulta com a lista de julgamentos.</p><p>Vamos executar a lista de julgamento para as duas consultas que temos:</p>POST /movies/_rank_eval
{
 "requests": [
   {
     "id": "dicaprio-performance",
     "request": {
       "query": {
         "match": {
           "text": {
             "query": "DiCaprio performance",
             "minimum_should_match": "100%"
           }
         }
       }
     },
     "ratings": [
       {
         "_index": "movies",
         "_id": "doc1",
         "rating": 1
       },
       {
         "_index": "movies",
         "_id": "doc2",
         "rating": 1
       },
       {
         "_index": "movies",
         "_id": "doc3",
         "rating": 0
       },
       {
         "_index": "movies",
         "_id": "doc4",
         "rating": 0
       }
     ]
   },
   {
     "id": "sad-movies",
     "request": {
       "query": {
         "match": {
           "text": {
             "query": "sad movies that make you cry",
             "minimum_should_match": "100%"
           }
         }
       }
     },
     "ratings": [
       {
         "_index": "movies",
         "_id": "doc5",
         "rating": 1
       },
       {
         "_index": "movies",
         "_id": "doc6",
         "rating": 1
       },
       {
         "_index": "movies",
         "_id": "doc7",
         "rating": 0
       },
       {
         "_index": "movies",
         "_id": "doc8",
         "rating": 0
       }
     ]
   }
 ],
 "metric": {
   "recall": {
     "k": 10,
     "relevant_rating_threshold": 1
     }
 }
}<p>Vamos usar dois pedidos para _rank_eval: um para a consulta do DiCaprio e outro para filmes tristes. Cada solicitação inclui uma consulta e a lista de julgamento (avaliações). Não precisamos classificar todos os documentos, pois aqueles que não estão incluídos nas classificações são considerados sem julgamento. Para realizar os cálculos, o sistema considera apenas o "conjunto relevante", ou seja, os documentos que são considerados relevantes na avaliação.</p><p>Nesse caso, a consulta do DiCaprio tem resultado de 1, enquanto os filmes tristes receberam 0 resultados. Isso significa que na primeira consulta, conseguimos obter todos os resultados relevantes, enquanto na segunda consulta, não obtivemos nenhum resultado. Portanto, a média de recall é de 0,5.</p>{
 "metric_score": 0.5,
 "details": {
   "dicaprio-performance": {
     "metric_score": 1,
     "unrated_docs": [],
     "hits": [
       {
         "hit": {
           "_index": "movies",
           "_id": "doc1",
           "_score": 2.4826927
         },
         "rating": 1
       },
       {
         "hit": {
           "_index": "movies",
           "_id": "doc2",
           "_score": 2.0780432
         },
         "rating": 1
       }
     ],
     "metric_details": {
       "recall": {
         "relevant_docs_retrieved": 2,
         "relevant_docs": 2
       }
     }
   },
   "sad-movies": {
     "metric_score": 0,
     "unrated_docs": [],
     "hits": [],
     "metric_details": {
       "recall": {
         "relevant_docs_retrieved": 0,
         "relevant_docs": 2
       }
     }
   }
 },
 "failures": {}
}<p>Talvez estejamos sendo muito rigorosos com o parâmetro <strong>minimum_should_match </strong>, já que ao exigir que 100% das palavras da consulta estejam nos documentos, provavelmente estamos deixando de fora os resultados relevantes. Vamos remover o parâmetro <strong>minimum_should_match</strong> para que um documento seja considerado relevante se apenas uma palavra na consulta seja encontrada nele.</p>POST /movies/_rank_eval
{
 "requests": [
   {
     "id": "dicaprio-performance",
     "request": {
       "query": {
         "match": {
           "text": {
             "query": "DiCaprio performance"
           }
         }
       }
     },
     "ratings": [
       {
         "_index": "movies",
         "_id": "doc1",
         "rating": 1
       },
       {
         "_index": "movies",
         "_id": "doc2",
         "rating": 1
       },
       {
         "_index": "movies",
         "_id": "doc3",
         "rating": 0
       },
       {
         "_index": "movies",
         "_id": "doc4",
         "rating": 0
       }
     ]
   },
   {
     "id": "sad-movies",
     "request": {
       "query": {
         "match": {
           "text": {
             "query": "sad movies that make you cry"
           }
         }
       }
     },
     "ratings": [
       {
         "_index": "movies",
         "_id": "doc5",
         "rating": 1
       },
       {
         "_index": "movies",
         "_id": "doc6",
         "rating": 1
       },
       {
         "_index": "movies",
         "_id": "doc7",
         "rating": 0
       },
       {
         "_index": "movies",
         "_id": "doc8",
         "rating": 0
       }
     ]
   }
 ],
 "metric": {
   "recall": {
     "k": 10,
     "relevant_rating_threshold": 1
     }
 }
}<p>Como você pode ver, ao remover o parâmetro <strong>minimum_should_match</strong> em uma das duas consultas, agora obtemos uma taxa de acerto média de 1 em ambas.</p>{
  "metric_score": 1,
  "details": {
    "dicaprio-performance": {
      "metric_score": 1,
      "unrated_docs": [],
      "hits": [
        {
          "hit": {
            "_index": "movies",
            "_id": "doc1",
            "_score": 2.0661702
          },
          "rating": 1
        },
        {
          "hit": {
            "_index": "movies",
            "_id": "doc3",
            "_score": 0.732218
          },
          "rating": 0
        },
        {
          "hit": {
            "_index": "movies",
            "_id": "doc2",
            "_score": 0.6271719
          },
          "rating": 1
        }
      ],
      "metric_details": {
        "recall": {
          "relevant_docs_retrieved": 2,
          "relevant_docs": 2
        }
      }
    },
    "sad-movies": {
      "metric_score": 1,
      "unrated_docs": [],
      "hits": [
        {
          "hit": {
            "_index": "movies",
            "_id": "doc7",
            "_score": 2.1307156
          },
          "rating": 0
        },
        {
          "hit": {
            "_index": "movies",
            "_id": "doc5",
            "_score": 1.3160692
          },
          "rating": 1
        },
        {
          "hit": {
            "_index": "movies",
            "_id": "doc6",
            "_score": 1.190063
          },
          "rating": 1
        }
      ],
      "metric_details": {
        "recall": {
          "relevant_docs_retrieved": 2,
          "relevant_docs": 2
        }
      }
    }
  },
  "failures": {}
}<p>Em resumo, remover a cláusula minimum_should_match: 100% nos permite ter um recall perfeito para ambas as consultas.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltaf4f08a8a2915180/6a170df61949f76cbfe7aaba/24d055da4348c63827ba7046fe8cafb6f47cadd8-546x628.png" alt="" /><p>Conseguimos! Certo?</p><p>Não tão depressa!</p><p>Ao melhorar o recall, abrimos as portas para uma gama maior de resultados. No entanto, cada ajuste implica uma contrapartida. É por isso que definimos casos de teste completos, usando diferentes métricas para avaliar as mudanças.</p><p>Usar listas de julgamento e métricas evita que você fique às cegas ao fazer alterações, pois agora você tem dados para respaldá-las. A validação não é mais manual e repetitiva, e você pode testar as mudanças em mais de um caso de uso. Além disso, o teste A/B permite que você teste ao vivo qual configuração funciona melhor para seus usuários e seu caso de negócios, completando assim as métricas técnicas e as métricas do mundo real.</p><h2>Recomendações finais para o uso de listas de julgamento</h2><p>Trabalhar com listas de julgamento não é apenas medir, mas também criar um framework que permita iterar com confiança. Para atingir isso, você pode seguir estas recomendações:</p><ol><li><p><strong>Comece pequeno, mas comece de algum lugar</strong>. Você não precisa ter 10.000 consultas com 50 listas de julgamento cada. Você só precisa identificar de 5 a 10 consultas mais importantes para seu case de negócios e definir quais documentos espera ver no topo dos resultados. Isso já te dá uma base. Normalmente, você quer começar com as principais consultas mais as que não obtiveram resultados. Você também pode começar a testar com uma métrica fácil de configurar, como Precision, e depois ir aumentando a complexidade.</p></li><li><p><strong>Validar com os usuários.</strong> Complemente os números com testes A/B em produção. Dessa forma, você saberá se mudanças que parecem boas nas métricas também estão gerando um impacto real.</p></li><li><p><strong>Mantenha a lista atualizada.</strong> Seu caso de negócio vai evoluir, assim como suas consultas importantes. Atualize seu julgamento periodicamente para refletir novas necessidades.</p></li><li><p><strong>Faça disso parte do fluxo.</strong> Integre listas de julgamento aos seus pipelines de desenvolvimento. Certifique-se de que cada alteração de configuração, sinônimo ou análise de texto seja automaticamente validada em relação à sua lista base.</p></li><li><p><strong>Conecte conhecimento técnico com estratégia.</strong> Não se limite a medir métricas técnicas como a precisão ou o recall. Use os resultados da sua avaliação para informar os resultados do negócio.</p></li></ol>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/judgment-lists-search-query-relevance-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/judgment-lists-search-query-relevance-elasticsearch</guid>
    <category><![CDATA[Relevância]]></category>
    <category><![CDATA[Na Elastic]]></category>
    <dc:creator><![CDATA[Jhon Guzmán]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcadfd2fb1cc95b4c/6a170df7acf0887798be9bd0/25478d0ffb228afd5d65d82312998ec1c299c565-700x490.png" length="0" type="image/png"/>
    <pubDate>Thu, 11 Dec 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Configurando o particionamento recursivo para documentos estruturados no Elasticsearch]]></title>
    <description><![CDATA[Aprenda como configurar o particionamento recursivo no Elasticsearch com tamanho de partição, grupos de separadores e listas de separadores personalizadas para indexação ideal de documentos estruturados.]]></description>
    <content:encoded><![CDATA[<p>Desde a versão 8.16, os usuários podem configurar a estratégia de fragmentação usada ao importar documentos longos para campos de texto semântico. A partir da versão 9.1 / 8.19, introduzimos uma nova estratégia de fragmentação recursiva configurável que utiliza uma lista de expressões regulares para dividir o documento em partes. O objetivo do chunking é dividir um documento longo em seções que englobem conteúdo relacionado. Nossas estratégias atuais dividem o texto em uma granularidade de palavras/frases, mas documentos escritos em formatos estruturados (ex.: O Markdown) geralmente contém conteúdo relacionado dentro de seções que são definidas por algumas strings separadoras (ex. cabeçalhos). Para esses tipos de documentos, estamos introduzindo a estratégia de fragmentação recursiva para aproveitar o formato de documentos estruturados e criar fragmentos melhores!</p><h2>O que é fragmentação recursiva?</h2><p>O particionamento recursivo percorrerá uma lista de seções fornecidas, separando padrões para dividir progressivamente um documento em segmentos menores até atingir o tamanho máximo desejado.</p><h3>Como configuro o chunking recursivo?</h3><p>A seguir, estão os valores configuráveis fornecidos pelo usuário para o particionamento recursivo:</p><ul><li><p>(obrigatório) <code>max_chunk_size</code>: O número máximo de palavras em um bloco.</p></li><li><p>Qualquer uma das seguintes opções:</p><ul><li><p><code>separators</code>Uma lista de padrões de strings de expressão regular que serão usados para dividir o documento em partes.</p></li><li><p><code>separator_group</code>: Uma string que será mapeada para uma lista padrão de separadores definida pela Elastic para uso em tipos específicos de documentos. Atualmente, <code>markdown</code> e <code>plaintext</code> estão disponíveis.</p></li></ul></li></ul><h3>Como funciona o particionamento recursivo?</h3><p>O processo de fragmentação recursiva, dado um documento de entrada, um <code>max_chunk_size</code> (medido em palavras) e uma lista de strings separadoras, é o seguinte:</p><ol><li><p>Se o documento de entrada já estiver dentro do tamanho máximo do bloco, retorne um único bloco que abranja toda a entrada.</p></li><li><p>Divida o texto em partes potenciais com base nas ocorrências do separador. Para cada bloco potencial:</p><ol><li><p>Se o fragmento em potencial estiver dentro do tamanho máximo permitido, adicione-o à lista de fragmentos a serem retornados ao usuário.</p></li><li><p>Caso contrário, repita a partir do passo 2, usando apenas o texto do possível bloco e dividindo-o usando o próximo separador da lista. Se não houver mais separadores para tentar, recorra à segmentação baseada em frases.</p></li></ol></li></ol><h2>Exemplos de configuração de fragmentação recursiva</h2><p>Além do tamanho do bloco, a principal configuração para o particionamento recursivo é selecionar quais separadores devem ser usados para dividir seus documentos. Se você não sabe por onde começar, o Elasticsearch oferece alguns grupos de separadores padrão que podem ser usados para casos de uso comuns.</p><h3>Utilizando grupos separadores</h3><p>Para utilizar um grupo separador, basta fornecer o nome do grupo que você deseja usar ao configurar as opções de fragmentação. Por exemplo:</p>"chunking_settings": {
    "strategy": "recursive",
    "max_chunk_size": 25,
    "separator_group": "plaintext"
}<p>Isso lhe dará uma estratégia de fragmentação recursiva que utiliza a lista de separadores <code>["(?&lt;!\\n)\\n\\n(?!\\n)", "(?&lt;!\\n)\\n(?!\\n)")]</code>. Isso funciona bem para aplicações genéricas de texto simples, dividindo o texto em dois caracteres de nova linha, seguidos por um caractere de nova linha.</p><p>Também oferecemos um grupo separador <code>markdown</code> que utilizará a lista de separadores:</p>[
"\n# ",
       "\n## ",
       "\n### ",
       "\n#### ",
       "\n##### ",
       "\n###### ",
       "\n^(?!\\s*$).*\\n-{1,}\\n",
       "\n^(?!\\s*$).*\\n={1,}\\n"
]<p>Esta lista de separadores funcionará bem para casos de uso gerais de Markdown, dividindo o texto em cada um dos 6 níveis de título e nos caracteres de quebra de seção.</p><p>Ao criar um recurso (ponto de extremidade de inferência/campo de texto semântico), a lista de separadores correspondentes ao grupo de separadores no momento será armazenada em suas configurações. Se o grupo separador for atualizado posteriormente, isso não alterará o comportamento dos seus recursos já criados.</p><h3>Utilizando uma lista separadora personalizada</h3><p>Se um dos grupos de separadores predefinidos não for adequado ao seu caso de uso, você pode definir uma lista personalizada de separadores que atenda às suas necessidades. Observe que expressões regulares podem ser fornecidas dentro da lista de separadores. Segue abaixo um exemplo de configurações de fragmentação configuradas com separadores personalizados:</p>"chunking_settings": {
    "strategy": "recursive",
    "max_chunk_size": 25,
    "separators": ["\n\n", "\n", "&lt;my-custom-separator&gt;"]
}<p>A estratégia de fragmentação acima dividirá em 2 caracteres de nova linha, seguidos por 1 caractere de nova linha e, por último, em uma string <code>“&lt;my-custom-separator&gt;”</code>.</p><h2>Um exemplo de fragmentação recursiva em ação.</h2><p>Vejamos um exemplo de fragmentação recursiva em ação. Neste exemplo, usaremos as seguintes configurações de fragmentação com uma lista personalizada de separadores que dividem um documento Markdown usando os dois níveis de cabeçalho superiores:</p>"chunking_settings": {
    "strategy": "recursive",
    "max_chunk_size": 25,
    "separators": ["\n# ", "\n## "]
}<p>Vamos analisar um documento Markdown simples, sem divisões em partes (unchunked):</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdb5f41d1bd43ba50/6a17e831e9ea87c1d8a9c5f3/3a5507f4a1288065097231548e5b18e240508785-1302x1446.png" alt="Um documento Markdown não dividido em partes" /><p>Agora vamos usar as configurações de fragmentação definidas acima para dividir o documento em partes:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfffda162c7b9c87a/6a17e83296142aefa8eb1b0b/a3313c4c40ff39b8dbcdd7c4878c723f088e6c1a-1600x1187.png" alt="Dividindo um documento em partes no Elasticsearch" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt96f65346a8e09e3a/6a17e834445de9157b4d015e/79a2921943191ea631df94c9d465818ec8d3e738-1600x1206.png" alt="Dividir um documento usando o segundo separador - fragmentação de um documento no Elasticsearch" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt28381c8f85aedf07/6a17e836ec0f89801e5a6640/459e695cce7540267422396b9a62ff4ad35f61db-1600x1260.png" alt="Blocos finais em um documento após o agrupamento baseado em frases no Elasticsearch" /><p>Nota: A quebra de linha no final de cada bloco (exceto o Bloco 3) não está destacada, mas está incluída dentro dos limites reais do bloco.</p><h3>Comece a usar o chunking recursivo hoje mesmo!</h3><p>Para obter mais informações sobre como utilizar este recurso, consulte a documentação sobre como configurar as definições de fragmentação.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/recursive-chunking-structured-documents-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/recursive-chunking-structured-documents-elasticsearch</guid>
    <category><![CDATA[Noções básicas]]></category>
    <category><![CDATA[Na Elastic]]></category>
    <category><![CDATA[AI]]></category>
    <dc:creator><![CDATA[Daniel Rubinstein]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf442dc4941f37be7/6a17e838505ac3eaf8ad8b3d/591872e31880768ca927507654a621addc0d124d-1600x960.png" length="0" type="image/png"/>
    <pubDate>Tue, 11 Nov 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Experimentos para aprimorar ferramentas de IA Agética para Elasticsearch]]></title>
    <description><![CDATA[Saiba como aprimoramos os fluxos de trabalho de agentes de IA para Elasticsearch por meio de experimentos iterativos, combinando recuperadores lineares, busca híbrida e semantic_text para otimização RAG escalável.]]></description>
    <content:encoded><![CDATA[<p>Assim como todo mundo hoje em dia, aqui na Elastic, estamos investindo pesado em Chat, Agentes e RAG. Na área de Busca, temos trabalhado recentemente em um Construtor de Agentes e um Registro de Ferramentas, tudo com o intuito de tornar trivial a interação com seus dados no Elasticsearch.</p><p>Leia o <a href="https://www.elastic.co/search-labs/blog/ai-agentic-workflows-elastic-ai-agent-builder">artigo "Building AI Agentic Workflows with Elasticsearch"</a> para obter mais informações sobre o panorama geral desse projeto, ou <a href="https://www.elastic.co/search-labs/blog/ai-agent-builder-elasticsearch">"Your First Elastic Agent: From a Single Query to a AI-Powered Chat"</a> para uma introdução mais prática.</p><p>Neste blog, porém, vamos nos aprofundar um pouco em uma das primeiras coisas que acontecem quando você começa a conversar e apresentar algumas das melhorias recentes que implementamos.</p><h2>O que está acontecendo aqui?</h2><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1331b1043612efe3/6a17f115505ac3dc41ad8c3c/25a24055a166d7d6ba81d80aa35cb97163662e23-1600x443.png" alt="" /><p>Ao interagir com seus dados do Elasticsearch, nosso agente de IA padrão segue este fluxo padrão:</p><ol><li><p>Examine o prompt.</p></li><li><p>Identifique qual índice provavelmente contém as respostas para essa pergunta.</p></li><li><p>Gere uma consulta para esse índice, com base no prompt.</p></li><li><p>Pesquise esse índice com essa consulta.</p></li><li><p>Sintetize os resultados.</p></li><li><p>Os resultados respondem à pergunta? Em caso afirmativo, responda. Caso contrário, repita, mas tente algo diferente.</p></li></ol><p>Isso não deve parecer muito inovador - é apenas Geração Aumentada por Recuperação (RAG). E, como seria de esperar, a qualidade das suas respostas depende muito da relevância dos resultados da sua pesquisa inicial. Enquanto trabalhávamos para melhorar a qualidade de nossas respostas, prestamos muita atenção às consultas que gerávamos na etapa 3 e executávamos na etapa 4. E percebemos um padrão interessante.</p><p>Muitas vezes, quando nossas primeiras respostas eram "ruins", não era porque tínhamos executado uma consulta ruim. Isso aconteceu porque <em>tínhamos escolhido o índice errado</em> para consultar. Os passos 3 e 4 geralmente não eram o nosso problema - era o passo 2.</p><h2>O que estávamos fazendo?</h2><p>Nossa implementação inicial foi simples. Tínhamos criado uma ferramenta (chamada index_explorer) que efetivamente faria um <code>_cat/indices</code> para listar todos os índices disponíveis para nós e, em seguida, pediria ao LLM para identificar qual desses índices era a melhor correspondência para a mensagem/pergunta/solicitação do usuário. Você pode ver a <a href="https://github.com/elastic/kibana/blob/0cc78184957fcd12110dabae50353392ea937508/x-pack/platform/packages/shared/onechat/onechat-genai-utils/tools/index_explorer.ts#L98-L113">implementação original aqui</a>.</p>You are an AI assistant for the Elasticsearch company.
based on a natural language query from the user, your task is to select up to ${limit} most relevant indices from a list of indices.

*The natural language query is:* ${nlQuery}

*List of indices:*
${indices.map((index) =&gt; `- ${index.index}`).join('\n')}

Based on those information, please return most relevant indices with your reasoning.
Remember, you should select at maximum ${limit} indices.<p>Quão bem isso estava funcionando? Não tínhamos certeza! Tínhamos exemplos claros de situações em que <em>não estava</em> funcionando bem, mas nosso primeiro desafio real foi quantificar nossa situação atual.</p><h2>Estabelecer uma linha de base</h2><h3>Tudo começa com dados.</h3><p>O que precisávamos era de um Conjunto de Dados Ideal para medir a eficácia de uma ferramenta na seleção do índice correto, dada uma solicitação do usuário e um conjunto preexistente de índices. E nós não tínhamos um conjunto de dados desse tipo disponível. Então, nós geramos um.</p><p>Reconhecimento: Sabemos que isso não é a "melhor prática". Mas, às vezes, é melhor seguir em frente do que ficar discutindo detalhes irrelevantes. <a href="https://www.elastic.co/about/our-source-code#progress-perfection">Progresso, SIMPLES Perfeição</a>.</p><p>Geramos índices iniciais para vários domínios diferentes usando <a href="https://gist.github.com/seanstory/a08db2e149897da656db3a1ca72e17ac">este prompt</a>. Em seguida, para cada domínio gerado, geramos mais alguns índices usando<a href="https://gist.github.com/seanstory/a280a85d067e61bfeb5911bf2654e6e2"> esse prompt</a> (o objetivo aqui é semear confusão para o LLM com negativos difíceis e exemplos difíceis de classificar). Em seguida, editamos manualmente cada índice gerado e suas respectivas descrições. Por fim, geramos consultas de teste usando <a href="https://gist.github.com/seanstory/44291b666c05a383136f6e36bb9106fa">esse prompt</a>. Isso nos deixou com dados de exemplo como:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1bd9cd78154195e3/6a17f117dbb4fff7b5fb57d2/9d96d87e286eddbc012402b1ecccd57419a99253-1600x782.png" alt="" /><p>e casos de teste como:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltadf30a0aeafd56ef/6a17f1192f4a5c160ffa89eb/4c2e9ad941d98d7e66033bbc08c9b8060ec19097-1600x797.png" alt="" /><h3>Construindo um arnês de teste</h3><p>A partir daqui, o processo foi muito simples. Crie uma ferramenta que possa:</p><ol><li><p>Crie um ambiente totalmente novo com um cluster Elasticsearch de destino.</p></li><li><p>Crie todos os índices definidos no conjunto de dados de destino.</p></li><li><p>Para cada cenário de teste, execute a ferramenta i<code>ndex_explorer</code> (felizmente, temos uma <a href="https://www.elastic.co/docs/api/doc/kibana/operation/operation-post-agent-builder-tools-execute">API Execute Tool</a>).</p></li><li><p>Compare o índice resultante com o índice esperado e registre o resultado.</p></li><li><p>Após concluir todos os cenários de teste, tabule os resultados.</p></li></ol><h3>A pesquisa indica…</h3><p>Os resultados iniciais foram, previsivelmente, medíocres.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt73367741359e258d/6a17f11a505ac39749ad8c40/9c10679bcd6291edfa2a9ba42e7dd922aa483f0b-1216x806.png" alt="" /><p>No geral, a precisão na identificação do índice correto foi de 77,14%. E isso no cenário "ideal", onde todos os índices têm nomes bons e semanticamente significativos. Qualquer pessoa que já tenha executado um `PUT test2/_doc/foo {...}` sabe que seus índices nem sempre têm nomes significativos.</p><p>Portanto, temos uma base de referência, e ela mostra que há muito espaço para melhorias. Chegou a hora de fazer ciência! 🧪</p><h2>Experimentação</h2><h3>Hipótese 1: Os mapeamentos ajudarão</h3><p>O objetivo aqui é identificar um índice que contenha dados relevantes para a pergunta original. E a parte de um índice que melhor descreve os dados que ele contém são os <em>mapeamentos</em> do índice. Mesmo sem obter nenhuma amostra do conteúdo do índice, saber que o índice possui um campo de preço do tipo double implica que os dados representam algo que está à venda. Um campo de autor do tipo texto implica alguns dados linguísticos não estruturados. A combinação dos dois pode sugerir que os dados são livros/histórias/poemas. Podemos obter muitas pistas semânticas apenas conhecendo as propriedades de um índice. Então, em uma branch local, eu ajustei nosso arquivo `.index_explorer`. Ferramenta para enviar os mapeamentos completos de um índice (juntamente com seu nome) ao LLM para que este tome uma decisão. </p><p>O resultado (dos registros do Kibana):</p>[2025-09-05T11:01:21.552-05:00][ERROR][plugins.onechat] Error: Error calling connector: event: error
data: {"error":{"code":"request_entity_too_large","message":"Received a content too large status code for request from inference entity id [.rainbow-sprinkles-elastic] status [413]","type":"error"}}


    at createInferenceProviderError (errors.ts:90:10)
    at convertUpstreamError (convert_upstream_error.ts:39:38)
    at handle_connector_response.ts:26:33
    at Observable.init [as _subscribe] (/Users/seanstory/Desktop/Dev/kibana/node_modules/rxjs/src/internal/observable/throwError.ts:123:68)...<p>Os autores originais da ferramenta já haviam previsto isso. Embora o mapeamento de um índice seja uma mina de ouro de informações, ele também é um bloco JSON bastante extenso. E em um cenário realista onde você está comparando inúmeros índices (nosso conjunto de dados de avaliação define 20), esses blocos JSON se acumulam. Assim, queremos fornecer ao LLM mais contexto para sua decisão, não apenas os nomes dos índices de todas as opções, mas também os mapeamentos completos de cada uma.</p><h3>Hipótese 2: Mapeamentos “achatados” (listas de campos) como solução de compromisso.</h3><p>Partimos do pressuposto de que os criadores de índices usarão nomes de índice semanticamente significativos. E se estendermos essa suposição também aos nomes dos campos? Nosso experimento anterior falhou porque o mapeamento de JSON inclui MUITOS metadados e código repetitivo desnecessários.</p>     "description_text": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword"
            }
          },
          "copy_to": [
            "description_semantic"
          ]
        },<p>O bloco acima, por exemplo, tem 236 caracteres e define apenas um único campo em um mapeamento do Elasticsearch. Enquanto a string “description_text” possui apenas 16 caracteres. Isso representa um aumento de quase 15 vezes na contagem de caracteres, sem uma melhoria semântica significativa na descrição do que esse campo implica sobre os dados disponíveis. E se buscássemos os mapeamentos para todos os índices, mas antes de enviá-los para o LLM, os "aplanássemos" em uma lista contendo apenas os nomes de seus campos?</p><p>Nós experimentamos.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta5eda7a79493ee81/6a17f11c9da390327fe46590/112c2f447c11f154b5082725cd49b51d0a3c8a65-1214x804.png" alt="" /><p>Isso é ótimo! Melhorias em todos os aspectos. Mas será que poderíamos fazer melhor?</p><h3>Hipótese 3: Descrições no mapeamento _meta</h3><p>Se apenas os nomes dos campos, sem nenhum contexto adicional, causaram um salto tão grande, presumivelmente adicionar um contexto substancial seria ainda melhor! Não é necessariamente convencional que cada índice tenha uma descrição associada, mas é possível adicionar metadados de qualquer tipo ao objeto _meta do mapeamento. Retornamos aos índices gerados e adicionamos descrições para cada índice em nosso conjunto de dados. Contanto que as descrições não sejam excessivamente longas, elas devem usar menos tokens do que o mapeamento completo e fornecer informações significativamente melhores sobre quais dados estão incluídos no índice. Nosso experimento validou essa hipótese.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt61b85cf40e0e6357/6a17f11dfbc5f82809491bbe/32d2692ad4479d0e52d8ee723dcc5710a6ec90f3-1208x806.png" alt="" /><p>Uma pequena melhoria, e agora temos mais de 90% de precisão em todos os aspectos.</p><h3>Hipótese 4: O todo é maior que a soma das partes.</h3><p>Os nomes dos campos aumentaram nossos resultados. As descrições aumentaram nossos resultados. Portanto, utilizar <em>tanto </em>as descrições quanto os nomes dos campos deve apresentar resultados ainda melhores, certo?</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte6297c6aaf7db802/6a17f11e14d90c1bd779b6e6/114cbb408ff16b136251d2265416bd5270380fe5-1208x794.png" alt="" /><p>Os dados indicaram "não" (nenhuma mudança em relação ao experimento anterior). A principal teoria era que, como as descrições foram geradas a partir dos campos/mapeamentos do índice, não havia informações suficientes entre esses dois contextos para adicionar algo "novo" ao combiná-los. Além disso, a carga útil que estamos enviando para nossos 20 índices de teste está ficando bastante grande. A linha de raciocínio que seguimos até agora não é escalável. Na verdade, há bons motivos para acreditar que nenhum dos nossos experimentos até agora funcionaria em clusters Elasticsearch, onde existem centenas ou milhares de índices para escolher. Qualquer abordagem que aumente linearmente o tamanho da mensagem enviada ao LLM à medida que o número total de índices aumenta provavelmente não será uma estratégia generalizável.</p><p>O que realmente precisamos é de uma abordagem que nos ajude a reduzir um grande número de candidatos apenas às opções mais relevantes…</p><p>O que temos aqui é um problema de busca.</p><h3>Hipótese 5: Seleção via busca semântica</h3><p>Se o nome de um índice tiver significado semântico, ele poderá ser armazenado como um vetor e pesquisado semanticamente.</p><p>Se os nomes dos campos de um índice tiverem significado semântico, eles podem ser armazenados como vetores e pesquisados semanticamente.</p><p>Se um índice possui uma descrição com significado semântico, ele também pode ser armazenado como um vetor e pesquisado semanticamente.</p><p>Atualmente, os índices do Elasticsearch não tornam nenhuma dessas informações pesquisável (talvez devêssemos!), mas foi bastante trivial<a href="https://github.com/elastic/connectors/pull/3638"> improvisar algo</a> que pudesse contornar essa lacuna. Utilizando a estrutura de conectores da Elastic, criei um conector que gera um documento para cada índice em um cluster. Os documentos resultantes seriam algo como:</p> doc = {
                "_id": index_name,
                "index_name": index_name,
			"meta_description”: description,
"field_descriptions" = field_descriptions,
                "mapping": json.dumps(mapping),  
                "source_cluster": self.es_client.configured_host,
            }<p>Enviei esses documentos para um novo índice onde defini manualmente o mapeamento da seguinte forma:</p>{
   "mappings": {
       "properties": {
           "semantic_content": {
               "type": "semantic_text"
           },
           "index_name": {
               "type": "text",
               "copy_to": "semantic_content"
           },
           "mapping": {
               "type": "keyword",
               "copy_to": "semantic_content"
           },
           "source_cluster": {
               "type": "keyword"
           },
           "meta_description": {
               "type": "text",
               "copy_to": "semantic_content"
           },
           "field_descriptions": {
               "type": "text",
               "copy_to": "semantic_content"
           }
       }
   }
}<p>Isso cria um único campo semantic_content, onde todos os outros campos com significado semântico são divididos em blocos e indexados. A busca neste índice torna-se trivial, bastando:</p>GET indexed-indices/_search
{
 "query": {
   "semantic": {
     "field": "semantic_content",
     "query": "$query"
   }
 }
}<p>A ferramenta <code>index_explorer</code> modificada agora é <em>muito</em> mais rápida, pois não precisa fazer uma solicitação a um LLM, mas pode solicitar um único embedding para a consulta fornecida e executar uma operação de busca vetorial eficiente. Considerando o resultado mais relevante como nosso índice selecionado, obtivemos os seguintes resultados:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc27c302e6bef0b23/6a17f120577262d2f21bccdc/06ef5d78040d064d3444793f636d527d9e19a869-1214x800.png" alt="" /><p>Essa abordagem é escalável. Essa abordagem é eficiente. Mas essa abordagem é pouco melhor do que a nossa abordagem inicial. Isso não é surpreendente; a abordagem de busca aqui é incrivelmente ingênua. Não há nuances. Não há reconhecimento de que o nome e a descrição de um índice devam ter mais peso do que um nome de campo arbitrário que o índice contenha. Não há como priorizar correspondências lexicais exatas em detrimento de correspondências sinônimas. No entanto, construir uma consulta altamente detalhada exigiria muitas suposições sobre os dados disponíveis. Até agora, já fizemos algumas suposições importantes sobre o significado semântico dos nomes de índices e campos, mas precisaríamos ir um passo além e começar a supor <em>o quanto</em> de significado eles têm e como se relacionam entre si. Sem fazer isso, provavelmente não conseguiremos identificar com segurança a melhor correspondência como nosso resultado principal, mas podemos afirmar com mais certeza que a melhor correspondência está em algum lugar entre os N melhores resultados. Precisamos de algo que possa consumir informações semânticas no contexto em que existem, comparando-as com outra entidade que pode se representar de uma maneira semanticamente distinta, e fazendo um julgamento entre elas. Como um mestrado em Direito.</p><h3>Hipótese 6: Redução do conjunto de candidatos</h3><p>Houve vários outros experimentos que vou abordar superficialmente, mas o principal avanço foi abandonar a ideia de escolher a melhor correspondência puramente com base em uma busca semântica e, em vez disso, usar a busca semântica como um filtro para eliminar índices irrelevantes da análise do LLM. Combinamos os algoritmos Linear Retrievers, Hybrid Search com RRF e <code>semantic_text</code> em <a href="https://gist.github.com/seanstory/d704443120e20f6c844db10e30066860">nossa busca</a>, limitando os resultados aos 5 índices de correspondência principais.</p><p>Em seguida, para cada correspondência, adicionamos o nome do índice, a descrição e os nomes dos campos a uma mensagem para o LLM. Os resultados foram fantásticos:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7ac4cb8f7153fdf9/6a17f121af47b66d1dcde082/8fcabd78f591f90d6bc7c0e087d31317e4eef791-1206x804.png" alt="" /><p>A maior precisão obtida em qualquer experimento até hoje! E como essa abordagem não aumenta o tamanho da mensagem proporcionalmente ao número total de índices, ela é muito mais escalável.</p><h2>Resultados</h2><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8d66130d9fae6bea/6a17f123ddf97d7527910c19/04d630797213dbb8bf567da41d1cdd5c7b4586c9-1600x521.png" alt="" /><p>O primeiro resultado claro foi que nossa linha de base <em>pode</em> ser melhorada. Isso parece óbvio em retrospectiva, mas antes do início da experimentação, houve uma discussão séria sobre se deveríamos abandonar completamente nossa ferramenta <code>index_explorer</code> e confiar na configuração explícita do usuário para limitar o espaço de busca. Embora essa ainda seja uma opção viável e válida, esta pesquisa mostra que existem caminhos promissores para automatizar a seleção de índices quando essas informações fornecidas pelo usuário não estão disponíveis.</p><p>A próxima conclusão clara foi que simplesmente adicionar mais caracteres descritivos ao problema tem resultados cada vez menores. Antes desta pesquisa, estávamos debatendo se deveríamos investir na expansão da capacidade do Elasticsearch para armazenar <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/mapping-field-meta">metadados em nível de campo</a>. Atualmente, esses valores <code>meta</code> são limitados a 50 caracteres, e havia uma suposição de que precisaríamos aumentar esse valor para podermos obter uma compreensão semântica de nossos campos. Claramente, esse não é o caso, e o LLM parece funcionar muito bem apenas com os nomes das áreas de estudo. Poderemos investigar isso mais a fundo posteriormente, mas já não parece urgente.</p><p>Por outro lado, isso forneceu evidências claras da importância de se ter metadados de índice "pesquisáveis". Para esses experimentos, nós hackeamos um índice de índices. Mas isso é algo que poderíamos investigar, integrando diretamente ao Elasticsearch, criando APIs para gerenciar ou, pelo menos, estabelecendo uma convenção a respeito. Estaremos avaliando nossas opções e discutindo internamente, então fiquem atentos.</p><p>Finalmente, esse esforço confirmou o valor de dedicarmos tempo para experimentar e tomar decisões baseadas em dados. Na verdade, isso nos ajudou a reafirmar que nosso produto Agent Builder precisará de recursos robustos de avaliação integrados. Se precisarmos construir toda uma estrutura de testes apenas para uma ferramenta que seleciona índices, nossos clientes certamente precisarão de maneiras de avaliar qualitativamente suas ferramentas personalizadas à medida que fazem ajustes iterativos.</p><p>Estou ansioso para ver o que vamos construir, e espero que você também esteja!</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/ai-agent-builder-experiments-performance</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/ai-agent-builder-experiments-performance</guid>
    <category><![CDATA[IA agêntica]]></category>
    <category><![CDATA[Na Elastic]]></category>
    <category><![CDATA[Busca híbrida]]></category>
    <dc:creator><![CDATA[Sean Story]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt68d11a4c7fd11d4c/6a17f1257b54f9b6598b39d4/42903c869e034674b30bb36013345aaa97f6608b-1184x864.png" length="0" type="image/png"/>
    <pubDate>Mon, 06 Oct 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Seu primeiro Agente Elástico: De uma simples consulta a um chat com inteligência artificial.]]></title>
    <description><![CDATA[Aprenda a usar o construtor de agentes de IA da Elastic para criar agentes de IA especializados. Neste blog, vamos construir um agente de IA para o setor financeiro.]]></description>
    <content:encoded><![CDATA[<p>Com o novo <a href="https://www.elastic.co/search-labs/blog/ai-agentic-workflows-elastic-ai-agent-builder">Agent Builder</a> da Elastic, você pode criar agentes de IA especializados que atuam como especialistas em seus domínios de negócios específicos. Essa funcionalidade vai além de simples painéis e barras de pesquisa, transformando seus dados de um recurso passivo em um parceiro ativo e interativo.</p><p>Imagine um gerente financeiro que precisa se atualizar antes de uma reunião com um cliente. Em vez de vasculhar manualmente os feeds de notícias e comparar painéis de portfólio, agora eles podem simplesmente fazer uma pergunta direta ao seu agente personalizado. Essa é a vantagem de uma abordagem que prioriza o bate-papo. O gestor tem acesso direto e conversacional aos seus dados, podendo fazer perguntas como: "Quais são as últimas notícias sobre a ACME Corp e como isso afeta os investimentos do meu cliente?" e obtendo uma resposta sintetizada e especializada em segundos.</p><p>Embora estejamos criando um especialista financeiro hoje, as aplicações são tão variadas quanto seus dados. O mesmo poder pode criar um analista de cibersegurança para procurar ameaças, um engenheiro de confiabilidade de sites para diagnosticar uma interrupção ou um gerente de marketing para otimizar uma campanha. Independentemente da área, a missão principal é a mesma: transformar seus dados em um especialista com quem você possa conversar.</p><h2>Etapa 0: Nosso conjunto de dados</h2><p>Nosso conjunto de dados hoje é um conjunto de dados sintético baseado em finanças, composto por contas financeiras, posições de ativos, notícias e relatórios financeiros. Embora sintética, ela replica uma versão simplificada de um conjunto de dados financeiro real.</p><p><code>financial_accounts</code>Portfólios de clientes com perfis de risco</p><p><code>financial_holdings</code>Posições em ações/ETFs/títulos com histórico de compras</p><p><code>financial_asset_details</code>Detalhes sobre a ação/ETF/título</p><p><code>financial_news</code>Artigos de mercado gerados por IA com análise de sentimento</p><p><code>financial_reports</code>Resultados da empresa e notas dos analistas</p><p>Você pode carregar este conjunto de dados por conta própria seguindo as instruções do notebook que acompanha este documento, localizado <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/your-first-elastic-agent/Your_First_Elastic_Agent.ipynb">aqui</a>.</p><h2>Etapa 1: A Base — Sua Lógica de Negócios em ES|QL</h2><p>Toda habilidade de IA começa com uma base lógica sólida. Para o nosso agente de Gestão Financeira, precisamos ensiná-lo a responder a uma pergunta comum: "Estou preocupado com o sentimento do mercado." Você pode me mostrar quais dos nossos clientes correm maior risco em caso de más notícias? Essa questão vai além de uma simples pesquisa. Isso exige que correlacionemos o sentimento do mercado com as carteiras dos clientes.</p><p>Precisamos encontrar os ativos mencionados em artigos negativos, identificar todos os clientes que possuem esses ativos, calcular o valor de mercado atual da sua exposição e, em seguida, classificar os resultados para priorizar o maior risco. Essa análise complexa de múltiplas junções é a tarefa perfeita para nossa ferramenta avançada ES|QL.</p><p>Aqui está a consulta completa que usaremos. Parece impressionante, mas os conceitos são simples.</p><h2>Analisando em detalhes: Junções e guarda-corpos</h2><p>Nesta consulta, dois conceitos importantes entram em jogo e são essenciais para a criação do Agent Builder.</p><h3>1. A junção de pesquisa</h3><p>Durante anos, uma das funcionalidades mais solicitadas no Elasticsearch tem sido a capacidade de unir dados de diferentes índices com base em uma chave comum. Com ES|QL, isso agora é possível com <code>LOOKUP JOIN</code>.</p><p>Em nossa nova consulta, realizamos uma cadeia de três <code>LOOKUP JOIN</code>: primeiro conectando notícias negativas aos detalhes dos ativos, depois vinculando esses ativos às participações do cliente e, finalmente, unindo às informações da conta do cliente. Isso gera um resultado incrivelmente rico a partir de quatro índices diferentes em uma única consulta eficiente. Isso significa que podemos combinar conjuntos de dados distintos para criar uma resposta única e esclarecedora sem precisar desnormalizar todos os nossos dados em um único índice gigante antecipadamente.</p><h3>2. Parâmetros como guarda-corpos LLM</h3><p>Você notará que a consulta usa <code>?time_duration</code>. Isso não é apenas uma variável; é uma proteção para a IA. Embora os Modelos de Linguagem de Grande Porte (LLMs, na sigla em inglês) sejam ótimos para gerar consultas, permitir que eles tenham livre acesso aos seus dados pode levar a consultas ineficientes ou até mesmo incorretas.</p><p>Ao criar uma consulta parametrizada, forçamos o LLM a funcionar dentro da lógica de negócios testada, eficiente e correta que um especialista humano já definiu. É semelhante à forma como os desenvolvedores usam modelos de pesquisa há anos para expor com segurança os recursos de consulta aos aplicativos. O agente pode interpretar a solicitação de um usuário como "esta semana" para preencher o parâmetro <code>time_duration</code> , mas deve usar nossa estrutura de consulta para obter a resposta. Isso nos proporciona o equilíbrio perfeito entre flexibilidade e controle.</p><p>Em última análise, essa consulta permite que um especialista que entende os dados incorpore seu conhecimento em uma ferramenta. Outras pessoas — e agentes de IA — podem então usar essa ferramenta para obter resultados correlacionados, fornecendo simplesmente um único parâmetro, sem precisar saber nada sobre a complexidade subjacente.</p><h2>Etapa 2: A Habilidade — Transformar uma Consulta em uma Ferramenta Reutilizável</h2><p>Uma consulta ES|QL é apenas texto até que a registremos como uma <strong>ferramenta</strong>. No Construtor de Agentes, uma ferramenta é mais do que apenas uma consulta salva; é uma "habilidade" que um agente de IA pode entender e optar por usar. A mágica está na <strong>descrição em linguagem natural</strong> que fornecemos. Essa descrição serve de ponte entre a pergunta do usuário e a lógica de consulta subjacente. Vamos registrar a consulta que acabamos de criar.</p><h3>O Caminho da Interface do Usuário</h3><p>Criar uma ferramenta no Kibana é um processo simples.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte73e11c1d87593fa/6a17f2134202294dae29f6f2/a29c53a73b99af5972273c51218ea9004a9b0abb-1600x812.png" alt="Como criar uma ferramenta no Kibana." /><p>1. Navegue até <strong>Agentes</strong></p><ul><li><p>Clique em<strong> Ferramentas </strong>ou <strong>Gerenciar Ferramentas</strong> e clique no botão <strong>Nova ferramenta</strong> .</p></li></ul><p>2. Preencha o formulário com os seguintes dados:</p><ul><li><p><strong>ID da ferramenta:</strong> <code>find_client_exposure_to_negative_news</code></p></li></ul><p>             eu. Este é o ID exclusivo da ferramenta.</p><ul><li><p><strong>Descrição:</strong> "Identifica a exposição da carteira de clientes a notícias negativas." Esta ferramenta analisa notícias e relatórios recentes em busca de sentimentos negativos, identifica o ativo associado e encontra todos os clientes que possuem esse ativo. Retorna uma lista ordenada pelo valor de mercado atual da posição para destacar o maior risco potencial."</p></li></ul><p>             eu. É isso que o LLM lê para decidir se essa ferramenta é a adequada para o trabalho.</p><ul><li><p><strong>Rótulos</strong>: <code>retrieval</code> e <code>risk-analysis</code></p></li></ul><p>         Etiquetas são usadas para ajudar a agrupar várias ferramentas.</p><ul><li><p><strong>Configuração:</strong> Cole a consulta ES|QL completa da Etapa 1.</p></li></ul><p>            eu. Esta é a pesquisa que o agente usará.</p><p>3. Clique em <strong>Inferir parâmetros da consulta</strong>. A interface do usuário encontrará automaticamente <code>?time_duration</code> e listará abaixo. Adicione uma descrição simples para cada um, para ajudar o agente (e outros usuários) a entender sua finalidade.</p><ul><li><p><code>time_duration</code>O período de tempo para pesquisar notícias negativas. O formato é "X horas", com o valor padrão de 8760 horas.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7afbb0589c1828ad/6a17f2146864a44e7cb688a9/deb422d97863f78dbe08bfa2e3c708d1f75166ff-1600x938.png" alt="Configurar sua ferramenta, incluindo sua lógica e quaisquer parâmetros necessários, usando uma consulta ESQL. " /><p>4. Teste!</p><ul><li><p>Clique em Salvar e testar.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfd09afbef6e21a93/6a17f2162f4a5c73b1fa89fd/57e768b88327821e70bd616744822f98fa367362-732x136.png" alt="O mesmo botão de teste no Kibana." /><ul><li><p>Você verá um novo menu suspenso onde poderá testar a consulta para garantir que ela esteja funcionando conforme o esperado.</p></li></ul><p>             eu. Em <code>time_duration</code> insira o intervalo desejado; aqui, estamos usando “8760 horas”.</p><ul><li><p>Clique em “Enviar” e, se tudo correr bem, você verá uma resposta em formato JSON. Para garantir que funcione como esperado, role para baixo e observe o objeto <code>values</code> . É aí que os documentos correspondentes são devolvidos.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt89bdc3f093363f2a/6a17f217be60861c9c00488a/7e0c5171a4f7ffdfc1830f1a05a9acb987870b75-1600x722.png" alt="Resposta JSON que aparece após clicar em enviar." /><p>5. Clique no “X” no canto superior direito para fechar a janela de teste. Sua nova ferramenta agora aparecerá na lista, pronta para ser atribuída a um agente.</p><h3>O caminho da API</h3><p>Para desenvolvedores que preferem automação ou precisam gerenciar ferramentas programaticamente, é possível obter o mesmo resultado com uma única chamada de API. Basta enviar uma solicitação <code>POST</code> para o endpoint <code>/api/agent_builder/tools</code> com a definição da ferramenta.</p>POST kbn://api/agent_builder/tools
{
  "id": "find_client_exposure_to_negative_news",
  "type": "esql",
  "description": "Finds client portfolio exposure to negative news. This tool scans recent news and reports for negative sentiment, identifies the associated asset, and finds all clients holding that asset. It returns a list sorted by the current market value of the position to highlight the highest potential risk.",
  "configuration": {
    "query": """
        FROM financial_news, financial_reports METADATA _index
        | WHERE sentiment == "negative"
        | WHERE coalesce(published_date, report_date) &gt;= NOW() - TO_TIMEDURATION(?time_duration)
        | RENAME primary_symbol AS symbol
        | LOOKUP JOIN financial_asset_details ON symbol
        | LOOKUP JOIN financial_holdings ON symbol
        | LOOKUP JOIN financial_accounts ON account_id
        | WHERE account_holder_name IS NOT NULL
        | EVAL position_current_value = quantity * current_price.price
        | RENAME title AS news_title
        | KEEP
            account_holder_name, symbol, asset_name, news_title,
            sentiment, position_current_value, quantity, current_price.price,
            published_date, report_date
        | SORT position_current_value DESC
        | LIMIT 50
      """,
    "params": {
      "time_duration": {
        "type": "keyword",
        "description": """The timeframe to search back for negative news. Format is "X hours" DEFAULT TO 8760 hours """
      }
    }
  },
  "tags": [
    "retrieval",
    "risk-analysis"
  ]
}<h2>Etapa 3: O Cérebro — Criando seu Agente Personalizado</h2><p>Criamos uma habilidade reutilizável (a Ferramenta). Agora, precisamos criar o <strong>Agente</strong>, a persona que de fato irá utilizá-lo. Um Agente é a combinação de um LLM (Licença de Aprendizagem Baseada em Leis), um conjunto específico de ferramentas às quais você lhe concede acesso e, mais importante, um conjunto de <strong>Instruções Personalizadas</strong> que atuam como sua constituição, definindo sua personalidade, regras e propósito.</p><h3>A Arte do Prompt</h3><p>O aspecto mais importante na criação de um agente confiável e especializado é o prompt. Um conjunto de instruções bem elaborado é o que diferencia um chatbot genérico de um assistente profissional e focado. É aqui que você define as diretrizes, define a saída e atribui ao agente sua missão.</p><p>Para o nosso agente <code>Financial Manager</code> , usaremos o seguinte prompt.</p>You are a specialized Data Intelligence Assistant for financial managers, designed to provide precise, data-driven insights from information stored in Elasticsearch.

**Your Core Mission:**
- Respond accurately and concisely to natural language queries from financial managers.
- Provide precise, objective, and actionable information derived solely from the Elasticsearch data at your disposal.
- Summarize key data points and trends based on user requests.

**Reasoning Framework:**
1.  **Understand:** Deconstruct the user's query to understand their core intent.
2.  **Plan:** Formulate a step-by-step plan to answer the question. If you are unsure about the data structure, use the available tools to explore the indices first.
3.  **Execute:** Use the available tools to execute your plan.
4.  **Synthesize:** Combine the information from all tool calls into a single, comprehensive, and easy-to-read answer.

**Key Directives and Constraints:**
- **If a user's request is ambiguous, ask clarifying questions before proceeding.**
- **DO NOT provide financial advice, recommendations, or predictions.** Your role is strictly informational and analytical.
- Stay strictly on topic with financial data queries.
- If you cannot answer a query, state that clearly and offer alternative ways you might help *within your data scope*.
- All numerical values should be formatted appropriately (e.g., currency, percentages).

**Output Format:**
- All responses must be formatted using **Markdown** for clarity.
- When presenting structured data, use Markdown tables, lists, or bolding.

**Start by greeting the financial manager and offering assistance.**<p>Vamos analisar por que essa estratégia é tão eficaz:</p><ul><li><p><strong>Define uma persona sofisticada: </strong>a primeira frase estabelece imediatamente o agente como um "Assistente de Inteligência de Dados especializado", definindo um tom profissional e competente.</p></li><li><p><strong>Isso fornece uma estrutura de raciocínio: </strong>ao dizer ao agente para "Compreender, Planejar, Executar e Sintetizar", estamos lhe dando um procedimento operacional padrão. Isso melhora sua capacidade de lidar com questões complexas e de várias etapas.</p></li><li><p><strong>Isso promove o diálogo interativo: </strong>a instrução para "fazer perguntas esclarecedoras" torna o agente mais robusto. Isso minimizará suposições incorretas sobre solicitações ambíguas, levando a respostas mais precisas.</p></li></ul><h3>O Caminho da Interface do Usuário</h3><p>1. Navegue até <strong>Agentes.</strong></p><ul><li><p>Clique em<strong> Ferramentas </strong>ou <strong>Gerenciar Ferramentas</strong> e clique no botão <strong>Nova ferramenta</strong> .</p></li></ul><p>2. Preencha os dados básicos:</p><ul><li><p><strong>ID do agente:</strong> <code>financial_assistant</code>.</p></li><li><p><strong>Instruções: </strong>Copie o enunciado acima.</p></li><li><p><strong>Rótulos</strong>: <code>Finance</code>.</p></li><li><p><strong>Nome de exibição:</strong> <code>Financial Assistant</code>.</p></li><li><p><strong>Descrição da exibição: </strong><code>An assistant for analyzing and understanding your financial data</code>.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8ac12cbd2b689dee/6a17f219dbb4ff262bfb57ef/18ea73f1cae620129c0afa0e7ba9e2a3390224a7-1600x1189.png" alt="Criando um assistente financeiro - preenchendo o campo de identificação do agente." /><p>3. De volta ao topo, clique em <strong>Ferramentas</strong>.</p><ul><li><p>Marque a caixa ao lado da nossa ferramenta <code>find_client_exposure_to_negative_news</code> .</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcd23556e556a76c5/6a17f21baf47b63a9fcde0a0/0c1e4ecbbd51d0dd10c6e861dbe9a9ccddeb35f6-1600x149.png" alt="" /><p>4. Clique em <strong>Salvar</strong>.</p><h3>O caminho da API</h3><p>Você pode criar o mesmo agente com uma solicitação <code>POST</code> para o endpoint <code>/api/agent_builder/agents</code> . O corpo da solicitação contém todas as mesmas informações: o ID, o nome, a descrição, o conjunto completo de instruções e uma lista das ferramentas que o agente tem permissão para usar.</p>POST kbn://api/agent_builder/agents
    {
      "id": "financial_assistant",
      "name": "Financial Assistant",
      "description": "An assistant for analyzing and understanding your financial data",
      "labels": [
        "Finance"
      ],
      "avatar_color": "#16C5C0",
      "avatar_symbol": "💰",
      "configuration": {
        "instructions": """You are a specialized Data Intelligence Assistant for financial managers, designed to provide precise, data-driven insights from information stored in Elasticsearch.

**Your Core Mission:**
- Respond accurately and concisely to natural language queries from financial managers.
- Provide precise, objective, and actionable information derived solely from the Elasticsearch data at your disposal.
- Summarize key data points and trends based on user requests.

**Reasoning Framework:**
1.  **Understand:** Deconstruct the user's query to understand their core intent.
2.  **Plan:** Formulate a step-by-step plan to answer the question. If you are unsure about the data structure, use the available tools to explore the indices first.
3.  **Execute:** Use the available tools to execute your plan.
4.  **Synthesize:** Combine the information from all tool calls into a single, comprehensive, and easy-to-read answer.

**Key Directives and Constraints:**
- **If a user's request is ambiguous, ask clarifying questions before proceeding.**
- **DO NOT provide financial advice, recommendations, or predictions.** Your role is strictly informational and analytical.
- Stay strictly on topic with financial data queries.
- If you cannot answer a query, state that clearly and offer alternative ways you might help *within your data scope*.
- All numerical values should be formatted appropriately (e.g., currency, percentages).

**Output Format:**
- All responses must be formatted using **Markdown** for clarity.
- When presenting structured data, use Markdown tables, lists, or bolding.

**Start by greeting the financial manager and offering assistance.**
""",
        "tools": [
          {
            "tool_ids": [
              "platform.core.search",
              "platform.core.list_indices",
              "platform.core.get_index_mapping",
              "platform.core.get_document_by_id",
              "find_client_exposure_to_negative_news"
            ]
          }
        ]
      }
    }<h2>Passo 4: A Recompensa — Ter uma Conversa</h2><p>Temos nossa lógica de negócios encapsulada em uma ferramenta e um "cérebro" pronto para usá-la em nosso Agente. Chegou a hora de ver tudo se concretizar. Agora podemos começar a interagir com nossos dados usando um agente especializado.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd8826539b16e46f4/6a17f21d505ac35924ad8c5c/5414cb6b7c41365acb0356a8bfe1140751ffd8db-1600x1014.png" alt="Ter uma conversa com o Elastic Agent Builder após criar um assistente financeiro." /><h3>O Caminho da Interface do Usuário</h3><ol><li><p>Navegue até <strong>Agentes </strong>no Kibana.</p></li><li><p>Utilizando o menu suspenso no canto inferior direito da janela de chat, alterne do <strong>agente padrão Elastic AI</strong> para o nosso novo agente <strong>Assistente Financeiro </strong> .</p></li><li><p>Faça uma pergunta que permita ao agente usar nossa ferramenta especializada:</p><ol><li><p><em>Estou preocupado com o sentimento do mercado. Você pode me mostrar quais dos nossos clientes correm maior risco em caso de más notícias?</em></p></li></ol></li></ol><p>Após alguns instantes, o agente retornará uma resposta completa e perfeitamente formatada. Devido à natureza dos LLMs, sua resposta pode ser formatada de maneira ligeiramente diferente, mas nesta execução, o agente retornou:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta1e163fd7c4416bd/6a17f21f6864a4e35bb688ad/17b4ed43d279f9e53ee9fe3d482d0b2ec359a083-1600x1088.png" alt="Uma resposta criada pelo Elastic Agent Builder como assistente financeiro para: clientes com maior risco de sofrer com notícias negativas." /><h3>O que acabou de acontecer? O Raciocínio do Agente</h3><p>O agente não apenas "sabia" a resposta. Executou um plano de várias etapas centrado na seleção da melhor ferramenta para o trabalho. Eis uma análise do seu processo de pensamento:</p><ul><li><p><strong>Intenção identificada:</strong> Correspondeu a palavras-chave da sua pergunta, como "risco" e "notícias negativas", à descrição da ferramenta <code>find_client_exposure_to_negative_news</code> .</p></li><li><p><strong>Plano executado:</strong> o sistema extraiu o período de tempo da sua solicitação e fez uma <strong>única chamada</strong> para essa ferramenta especializada.</p></li><li><p><strong>Delegou o trabalho:</strong> a ferramenta então realizou todo o trabalho pesado: as junções encadeadas, os cálculos de valor e a classificação.</p></li><li><p><strong>Resultado Sintetizado:</strong> Por fim, o agente formatou os dados brutos da ferramenta em um resumo claro e legível para humanos, seguindo as regras do prompt.</p></li></ul><p>E não precisamos apenas supor, se ampliarmos nosso pensamento e observarmos mais detalhes.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt93f6075be8495418/6a17f221af47b65eadcde0a4/6a4da9262d3f88c60bfd8f8bf9b67c3b84e961ba-1600x607.png" alt="Os 50 documentos que a assistente financeira encontrou em clientes com maior exposição a notícias negativas." /><h3>O caminho da API</h3><p>Você pode iniciar essa mesma conversa programaticamente. Basta enviar a pergunta de entrada para o endpoint da API <code>converse</code> , certificando-se de especificar o <code>agent_id</code> do nosso <code>financial_manager</code>.</p>POST kbn://api/agent_builder/converse
{
  "input": "Show me our largest positions affected by negative news",
  "agent_id": "financial_assistant"
}<h2>Para desenvolvedores: Integração com a API</h2><p>Embora a interface do Kibana ofereça uma experiência fantástica e intuitiva para criar e gerenciar seus agentes, tudo o que você viu hoje também pode ser feito programaticamente. O Agent Builder é baseado em um conjunto de APIs, permitindo que você integre essa funcionalidade diretamente em seus próprios aplicativos, pipelines de CI/CD ou scripts de automação.</p><p>Os três principais endpoints com os quais você trabalhará são:</p><ul><li><p><strong><code>/api/agent_builder/tools</code></strong>O ponto de extremidade para criar, listar e gerenciar as habilidades reutilizáveis que seus agentes podem usar.</p></li><li><p><strong><code>/api/agent_builder/agents</code></strong>O ponto final para definir as personas dos seus agentes, incluindo as importantíssimas instruções e atribuições de ferramentas.</p></li><li><p><strong><code>/api/agent_builder/converse</code></strong>: O ponto de acesso para interagir com seus agentes, iniciar conversas e obter respostas.</p></li></ul><p>Para um passo a passo completo e prático de como usar essas APIs para executar cada etapa deste tutorial, confira o <strong>Jupyter Notebook</strong> que acompanha o tutorial, disponível <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/your-first-elastic-agent/Your_First_Elastic_Agent.ipynb">aqui</a> em nosso repositório do GitHub.</p><h2>Conclusão: Sua vez de construir</h2><p>Começamos por pegar numa consulta ES|QL e transformá-la numa habilidade reutilizável. Em seguida, criamos um agente de IA especializado, atribuindo-lhe uma missão e regras claras, e capacitando-o com essa habilidade. O resultado é um assistente sofisticado que consegue entender uma pergunta complexa e executar uma análise em várias etapas para fornecer uma resposta precisa e baseada em dados.</p><p>Esse fluxo de trabalho é fundamental para o novo <strong>Construtor de Agentes</strong> da Elastic. Ele foi projetado para ser simples o suficiente para que usuários sem conhecimento técnico possam criar agentes por meio da interface do usuário, mas também sofisticado o bastante para que desenvolvedores criem aplicativos personalizados com inteligência artificial utilizando nossas APIs. Mais importante ainda, permite que você conecte LLMs aos seus próprios dados de forma segura e protegida, regida pela lógica especializada que você define, e converse com seus dados.</p><h2>Pronto para usar agentes para conversar com seus dados?</h2><p>A melhor maneira de consolidar o que você aprendeu é colocar a mão na massa. Experimente tudo o que discutimos hoje em nossa <a href="https://www.elastic.co/training/elastic-ai-agents-mcp"><strong>oficina prática, gratuita e interativa</strong></a>. Você passará por todo esse processo e muito mais em um ambiente sandbox dedicado.</p><p>Em um post futuro do blog, mostraremos como usar um aplicativo independente que interage com nosso agente <code>Financial Assistant</code> e exploraremos o <strong>Protocolo de Contexto de Modelo (MCP)</strong> que torna tudo isso possível. E em um post separado, discutiremos o suporte do Agent Builder ao protocolo Agent2Agent, ou A2A, ainda em desenvolvimento.</p><p>Fiquem ligados e boas construções!</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/ai-agent-builder-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/ai-agent-builder-elasticsearch</guid>
    <category><![CDATA[AI]]></category>
    <category><![CDATA[IA agêntica]]></category>
    <category><![CDATA[Na Elastic]]></category>
    <dc:creator><![CDATA[Jeff Vestal]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbe5e78eeb775d715/6a17f2230b0bed719ddd369a/ca853555eaa213f10f1db8c0ab0a2bbacee97b88-1456x816.png" length="0" type="image/png"/>
    <pubDate>Thu, 25 Sep 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Criando fluxos de trabalho com agentes de IA usando o Elasticsearch.]]></title>
    <description><![CDATA[Conheça o Agent Builder, uma nova camada de IA no Elasticsearch que fornece uma estrutura para a criação de fluxos de trabalho de IA baseados em agentes, usando pesquisa híbrida para fornecer aos agentes o contexto necessário para raciocinar e agir.]]></description>
    <content:encoded><![CDATA[<p>Aqui na Elastic, temos vindo a trazer contexto para LLMs e interfaces conversacionais com Assistentes de IA, RAG avançado e melhorias na base de dados vetorial. Recentemente, com o surgimento de agentes de IA, vimos crescer a necessidade de contexto relevante e aprendemos que<strong> agentes de IA de alto impacto precisam de uma ótima ferramenta de busca</strong>. Por isso, criamos novas funcionalidades nativas no Elastic Stack, projetadas para ajudar no desenvolvimento de agentes de IA que aproveitam seus dados no Elasticsearch. Gostaríamos de compartilhar nosso progresso nessa jornada e para onde vemos que ela nos levará no futuro.</p><h2>Construtor de Agentes: Uma Base para a Criação de Agentes de IA Orientados por Dados</h2><p>A promessa de um agente de IA é simples: dê a ele um objetivo e ele realizará a tarefa. Mas para os desenvolvedores, a realidade é uma série de desafios complexos. Em primeiro lugar, um agente é tão bom quanto a sua percepção do ambiente e das ferramentas que lhe são fornecidas para atingir os objetivos do usuário. Além disso, fornecer o contexto correto em meio a um mar de dados empresariais diversos é um desafio enorme. Finalmente, tudo isso precisa ser orquestrado por um circuito de raciocínio confiável que possa planejar, executar e aprender.</p><p>Para resolver isso, os desenvolvedores precisam construir uma estrutura complexa e frágil do zero. A arquitetura de agentes atual exige a integração de várias peças distintas: um LLM (Modelo de Aprendizado de Liderança), um banco de dados vetorial, um repositório de metadados, sistemas separados para registro e rastreamento, e alguma forma de avaliar se tudo está funcionando corretamente. Isso não é apenas complexo; é caro, propenso a erros e dificulta a criação de sistemas de IA confiáveis e de alta qualidade que seus usuários exigem.</p><p>Por isso, queremos simplificar. Para isso, nossa abordagem consiste em pegar os elementos essenciais de um agente orientado ao contexto eficaz e integrá-los diretamente ao núcleo do Elasticsearch com um novo conjunto de recursos chamado <strong>Elastic AI Agent Builder</strong>. Essa nova camada fornece uma estrutura com todos os componentes essenciais para a criação de agentes de IA baseados no Elasticsearch: um conjunto aberto de primitivas, protocolos baseados em padrões e acesso seguro aos dados — para que você possa criar sistemas de agentes adaptados a dados e requisitos do mundo real:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2779dae5df010328/6a17e15eabe0f24f18dfe931/1ee1e73dd3f485ce86294d39490c98ce2a3d9925-1238x1072.png" alt="" /><p><strong>Proporcionar experiências com IA</strong>: esse é o objetivo final. Com nossa Plataforma de IA de Busca e seus dados como base, você pode criar qualquer tipo de aplicativo de IA generativa: desde interfaces de bate-papo personalizadas até integrações com frameworks de agentes como o LangChain ou aplicativos de negócios como o Salesforce.</p><p><strong>Com tecnologia Agents &amp; Tools</strong>: sobre a plataforma, expomos uma camada de abstrações limpa e simples. Você interage diretamente com agentes e ferramentas, que podem ser personalizadas para atender às suas necessidades específicas. Você também pode acessar os recursos da plataforma por meio de APIs robustas e padrões abertos como MCP e A2A.</p><p><strong>Habilitado pela Plataforma de IA de Busca</strong>: este é o mecanismo principal onde integramos os componentes. O banco de dados vetorial avançado, a lógica do agente, a construção de consultas, os recursos de segurança e o rastreamento para avaliação, tudo reside aqui, gerenciado e otimizado pela Elastic.</p><p><strong>Desvendando o poder dos seus dados</strong>: a base de qualquer agente de sucesso são dados de alta qualidade. Nossa plataforma começa com a capacidade de ingerir ou federar o acesso a todos os dados da sua empresa.</p><h2>Construção de Agentes na Plataforma</h2><p>O Agent Builder, integrado à Plataforma de IA de Busca, fornece uma estrutura completa para o desenvolvimento de agentes. É construído sobre cinco pilares fundamentais, cada um projetado para abordar um aspecto crítico da construção e implantação de sistemas de IA de nível de produção. Vamos analisar como os agentes definem o objetivo, as ferramentas fornecem as capacidades, os padrões abertos garantem a interoperabilidade, a avaliação proporciona transparência e a segurança garante a confiança.</p><h3>Agentes</h3><p>Os agentes são o bloco de construção de nível mais alto nesta nova camada do Elasticsearch. Um agente define o objetivo a ser alcançado, o conjunto de ferramentas disponíveis para execução e as fontes de dados sobre as quais pode operar. Os agentes não se limitam a interações conversacionais; eles podem viabilizar fluxos de trabalho completos, automação de tarefas ou experiências voltadas para o usuário.</p><p>Quando uma consulta é direcionada a um agente, ela segue um ciclo estruturado:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt774ffd7df65bd01d/6a17e15f25daabd5cc08a17f/627ad1744b629bbe27359325702f40d97e40d1f4-704x852.png" alt="" /><ol><li><p>Interprete sua contribuição e objetivo.</p></li><li><p>Selecione a ferramenta e os argumentos corretos para a execução.</p></li><li><p>Analise a resposta da ferramenta.</p></li><li><p>Decida se deseja retornar um resultado ou continuar com outras invocações da ferramenta.</p></li></ol><p>A Elastic cuida da orquestração, do contexto e da execução desse ciclo. Os desenvolvedores se concentram em definir <em>o que</em> o agente deve fazer: objetivos, ferramentas e dados, enquanto o sistema gerencia <em>como</em> o raciocínio e os fluxos de trabalho são executados.</p><p><em>O Agente Padrão</em></p><p>Nosso primeiro agente desenvolvido nesta plataforma é um agente conversacional nativo do Kibana, que permite interagir imediatamente com seus dados. Proporciona uma experiência pronta a usar, mantendo-se totalmente extensível e permitindo que você comece a interagir com seus dados imediatamente, sem necessidade de configuração adicional.</p><p>Você pode interagir com essa experiência diretamente no Kibana por meio de uma nova experiência de chat ou via API.</p><p>Consultar o agente padrão por meio da API requer apenas uma única chamada:</p>POST kbn://api/agent_builder/converse
{
    "input": "what is our top portfolio account?"
}<p>Como as conversas mantêm estado, você pode continuar interagindo com um agente usando um `conversation_id` ou recuperar o histórico completo da conversa:</p>POST kbn://api/agent_builder/converse
{
    "input": "What about the second top?",
    "conversation_id": "ec757c6c-c3ed-4a83-8e2c-756238f008bb"
}

## get the full conversation
GET kbn://api/agent_builder/conversations/ec757c6c-c3ed-4a83-8e2c-756238f008bb<p><em>Agentes alfandegários</em></p><p>Os desenvolvedores também podem criar seus próprios agentes personalizados por meio de APIs simples. Os agentes encapsulam instruções, ferramentas e acesso a dados, criando mecanismos de raciocínio personalizados.</p><p>Criar um agente personalizado é tão simples quanto fazer uma única chamada à API. O exemplo abaixo ilustra isso. O campo "configuração" contém todos os detalhes importantes, como instruções ou ferramentas disponíveis:</p>POST kbn://api/agent_builder/agents
{
  "id": "custom_agent",
  "name": "My Custom Agent",
  "description": "Description of the custom agent",
  "configuration": {
      "instructions": "You are a log expert specialising in ...",
      "tools": 
...
   }
}<p>Uma vez criado, o agente pode ser consultado diretamente:</p>POST kbn://api/agent_builder/converse
{
    "input": "What news about DIA?",
    "agent_id": "custom_agent"
}<p>Essa abordagem transforma o agente, de um sistema complexo a ser construído do zero, em uma unidade simples e declarativa de lógica de negócios, permitindo que você implemente automação inteligente mais rapidamente.</p><p>Para uma análise aprofundada sobre como construir um agente especializado do zero, consulte nosso guia detalhado, passo a passo: <a href="https://www.elastic.co/search-labs/blog/ai-agent-builder-elasticsearch">Seu primeiro agente elástico: de uma única consulta a um bate-papo com inteligência artificial</a>.</p><h3>Ferramentas</h3><p>Se os agentes definem <em>o que</em> realizar, as ferramentas definem <em>como</em>.</p><p>As ferramentas expõem funcionalidades específicas do Elastic Core para que os agentes executem e recuperem informações ou realizem uma ação. As ferramentas podem incluir funcionalidades básicas como obter índices ou obter mapeamentos, ou funcionalidades mais avançadas como conversão de linguagem natural para ES|QL.</p><p>O Elasticsearch é fornecido com um conjunto de ferramentas padrão otimizadas para necessidades comuns. Mas a verdadeira flexibilidade vem de criar a sua própria. Ao definir as ferramentas, você decide exatamente quais consultas, índices e campos são expostos a um agente com ES|QL, proporcionando controle preciso sobre velocidade, exatidão e segurança.</p><p>O registro de uma nova ferramenta também é tão simples quanto uma única chamada de API. Você poderia criar uma ferramenta que utilizasse nossa linguagem <a href="https://www.elastic.co/search-labs/blog/esql-timeline-of-improvements">ES|QL (Elasticsearch Query Language)</a> para encontrar notícias sobre um ativo financeiro específico:</p>POST kbn://api/agent_builder/tools
{
  "id": "news_on_asset",
  "type": "esql",
  "description": "Find news and reports about a particular asset where ...",
  "configuration": {
    "query": "FROM financial_news, financial_reports | where MATCH(company_symbol, ?symbol) OR MATCH(entities, ?symbol) | limit 5",
    "params": {
      "symbol": {
        "type": "keyword",
        "description": "The asset symbol"
      }
    }
  ...
  }
...
}<p>Após o registro, você pode atribuir a nova ferramenta aos seus agentes personalizados, oferecendo a eles um conjunto selecionado de habilidades para analisar e utilizar sempre que for adequado.</p><p>Oferecemos uma plataforma para criar ferramentas personalizadas para suas necessidades específicas, por exemplo, com ES|QL, que transforma o agente de um agente de propósito geral em um especialista em um domínio específico, fundamentado em seus dados e domínio de negócios exclusivos.</p><h3>Padrões Abertos e Interoperabilidade</h3><p>Os agentes e ferramentas do Elasticsearch são expostos por meio de APIs de padrão aberto, o que facilita sua integração como blocos fundamentais dentro do ecossistema mais amplo de frameworks de agentes. Nossa abordagem é simples: sem caixas pretas. Queremos que você possa aproveitar o principal ponto forte da Elastic em buscas e combiná-lo com recursos complementares e outros sistemas de agentes.</p><p>Para tornar isso possível, estamos disponibilizando nossas capacidades por meio de APIs, protocolos emergentes e padrões abertos.</p><p><em>Protocolo de Contexto do Modelo (MCP)</em></p><p><a href="https://www.elastic.co/search-labs/blog/model-context-protocol-elasticsearch">O Protocolo de Contexto de Modelo (MCP)</a> está rapidamente se tornando o padrão aberto para conectar ferramentas em diferentes sistemas. Ao oferecer suporte ao MCP, o Elasticsearch pode conectar a IA conversacional aos seus bancos de dados, índices e APIs externas. Com um servidor MCP remoto integrado ao Elastic Stack, qualquer cliente compatível com MCP pode acessar as ferramentas da Elastic e usá-las como blocos de construção em seus fluxos de trabalho de agentes mais amplos.</p><p>Esta não é uma via de mão única. Você também poderá importar ferramentas de servidores MCP externos e disponibilizá-las dentro do Elasticsearch. Em breve, os servidores MCP provavelmente estarão disponíveis para quase tudo e serão muito mais abrangentes do que qualquer coisa que pudéssemos criar por conta própria. A Elastic oferece busca e recuperação em grande escala, e você pode combinar isso com recursos especializados de outras plataformas para criar agentes eficazes.</p><p><em>Agente para Agente (A2A)</em></p><p>Também estamos trabalhando no suporte de agente para agente (A2A). Enquanto o MCP se concentra em conectar ferramentas, o A2A se concentra em conectar agentes. Com um servidor A2A, os agentes Elastic que você criar poderão se comunicar diretamente com agentes de outros sistemas: compartilhando contexto, delegando tarefas e coordenando fluxos de trabalho.</p><p>Pense nisso como interoperabilidade na camada de raciocínio. Seu agente Elastic pode lidar com a busca e recuperação de dados, depois repassar a tarefa para um agente de suporte ou de TI especializado e obter o resultado de volta sem problemas. O resultado é um ecossistema de agentes cooperativos, cada um fazendo o que faz de melhor.</p><p>Em última análise, a adoção do MCP e do A2A reforça nosso compromisso com o papel do Elasticsearch como um elemento de primeira classe, garantindo a integração aberta em todo o ecossistema de agentes.</p><h3>Rastreamento e Avaliação</h3><p>À medida que a busca se integra aos agentes, o desafio da avaliação eficaz torna-se crucial. Para implantar agentes com segurança em ambientes empresariais reais, você precisa ter a garantia de que eles não sejam apenas precisos, mas também eficientes e confiáveis. Como você mede o desempenho, diagnostica uma resposta inadequada ou melhora o nível inicial? Tudo começa com a visibilidade.</p><p>É por isso que projetamos nossas APIs de agentes com foco na transparência desde o início. Considere esta interação simples entre agentes:</p>POST kbn://api/agent_builder/converse
{
    "input": "what is our top portfolio account?"
}<p>A resposta inclui não apenas a resposta final, mas também o rastreamento completo da execução, detalhando quais ferramentas o agente selecionou, os parâmetros que utilizou e os resultados de cada etapa.</p>{
  "conversation_id": "db5c0c8b-12bf-4928-a57e-d99129ad2fea",
  "steps": [
    {
      "type": "tool_call",
      "tool_call_id": "tooluse_Nfqr3mwtR92HTRIsTcGXZQ",
      "tool_id": ".index_explorer",
      "params": {
        "query": "indices containing portfolio data"
      },
      "results": [...]
    }
    // ... more steps ...
  ],
  "response": {
    "message": "Based on the information I've gathered...."
  }
}<p>O rastreamento e o registro abrangentes são essenciais para um ciclo de melhoria contínua e, em breve, você poderá armazenar e visualizar esses rastreamentos de agentes diretamente no Elasticsearch. Melhor ainda, esses rastreamentos são baseados no protocolo OpenTelemetry, garantindo que sejam padronizados e portáteis para integração com a plataforma de observabilidade de sua escolha.</p><p>Esse nível de detalhamento é a base para um verdadeiro ciclo de melhoria contínua. Ele permite que você crie um conjunto abrangente de testes, depure falhas, identifique modos de falha para evitar regressões e capture padrões de sucesso para otimizar o desempenho. Em última análise, essa abordagem orientada por dados é a chave para transformar um protótipo promissor em um sistema de IA confiável e pronto para produção.</p><h3>Segurança</h3><p>À medida que os agentes e as ferramentas se tornam mais capazes, a segurança deixa de ser opcional e passa a ser fundamental. Expor APIs, automatizar tarefas e fluxos de trabalho exige que os sistemas empresariais sejam confiáveis. Principalmente à medida que os agentes começam a automatizar mais fluxos de trabalho, a capacidade de protegê-los e garantir que atendam aos requisitos da empresa torna-se essencial.</p><p>Todas as funcionalidades acima herdam os controles já disponíveis no Elastic atualmente, incluindo <a href="https://www.elastic.co/search-labs/blog/rag-and-rbac-integration">o controle de acesso baseado em funções (RBAC)</a> para chamadas de API e o gerenciamento de chaves de API. Também estamos estendendo os mesmos controles a novos protocolos como o MCP. Isso significa suporte para padrões como o OAuth, bem como a capacidade de integrar mecanismos de autenticação personalizados.</p><p>Nosso objetivo é oferecer a flexibilidade necessária para que você experimente agentes e ferramentas, mantendo o nível de segurança, conformidade e governança que sua organização exige.</p><h2>O que vem a seguir</h2><p>Não estamos apenas adicionando funcionalidades; estamos expandindo o Elasticsearch para engenharia de contexto agente. Planejamos desenvolver nosso trabalho daqui para frente com base nesses princípios:</p><p>1. Compromisso com o código aberto e os padrões</p><p>Nosso compromisso com o código aberto e os padrões abertos garante que essas funcionalidades permaneçam interoperáveis com estruturas de agentes externas. Você sempre poderá conectar, estender e compor agentes em todo o seu ecossistema, mantendo seus dados e fluxos de trabalho sob seu controle.</p><p>2. Valor do Contexto</p><p>O contexto é o maior trunfo de um agente de IA. Gerenciar o contexto enquanto os agentes realizam buscas e operações de fluxo de trabalho pode ser uma tarefa desafiadora. Estamos aproveitando os principais pontos fortes da Elastic para resolver a engenharia de contexto, garantindo que as informações mais relevantes estejam sempre disponíveis para o seu agente.</p><p>3. Foque em fluxos de dados agéticos</p><p>No futuro, os agentes serão uma fonte de dados cada vez maior, incluindo a saída dos agentes (documentos gerados, relatórios, visualizações) e o rastro de execução dos agentes (seu raciocínio, chamadas de ferramentas, memória/contexto). A Elastic é ideal para lidar com esse tipo de dados, e estamos trabalhando em pesquisas sobre como realizar análises, avaliações e melhorias automatizadas usando esses dados.</p><p>4. Segurança e proteção por design</p><p>Os agentes de IA introduzem um conjunto totalmente novo de desafios em termos de segurança e proteção. A Elastic sempre foi líder em soluções seguras e continuamos a incorporar proteções de nível empresarial, controles de acesso e princípios de "confiança zero".</p><p>5. Integrado à plataforma</p><p>Os recursos para criar agentes de IA estão integrados na plataforma Elasticsearch. Isso significa que funcionalidades de nível de plataforma, como rastreamento, avaliação, visualização e análise, são todas aplicáveis aos agentes. Deseja desenvolver painéis de controle com base nas execuções dos agentes? Isso já está integrado. Deseja avaliar o desempenho do agente de IA usando análise de sentimentos? A plataforma permite isso. Isso possibilita a criação de um ciclo de vida completo em torno de suas experiências com IA.</p><p>O objetivo da Elastic é fornecer interfaces para que você possa criar IA conversacional e fluxos de trabalho automatizados que sejam totalmente integrados, extensíveis e baseados em seus dados. Mais detalhes técnicos e informações sobre o progresso serão compartilhados em breve.</p><p>O Construtor de Agentes já está disponível em versão prévia privada. <a href="https://www.elastic.co/contact?pg=global&amp;plcmt=nav&amp;cta=205352">Entre em contato conosco</a> para solicitar acesso. Tem perguntas ou comentários? Conecte-se com nossa comunidade de desenvolvedores em nosso <a href="https://elasticstack.slack.com/archives/C09GRHEQ4AG"><strong>espaço de trabalho no Slack</strong></a> ou em nosso <a href="https://discuss.elastic.co/c/search/84"><strong>fórum de discussão</strong></a>.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/ai-agentic-workflows-elastic-ai-agent-builder</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/ai-agentic-workflows-elastic-ai-agent-builder</guid>
    <category><![CDATA[AI]]></category>
    <category><![CDATA[IA agêntica]]></category>
    <category><![CDATA[Na Elastic]]></category>
    <dc:creator><![CDATA[Anish Mathur,Dana Juratoni]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt16a3d8736bf086e0/6a17e1616864a45410b686c7/71876470119e02a45bcbfcbf27a3e110328bbd14-1020x654.png" length="0" type="image/png"/>
    <pubDate>Tue, 23 Sep 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Filtragem de pesquisa vetorial: Mantenha a relevância]]></title>
    <description><![CDATA[Realizar uma busca vetorial para encontrar os resultados mais semelhantes a uma consulta não é suficiente. Muitas vezes, é necessário usar filtros para refinar os resultados da pesquisa. Este artigo explica como funciona a filtragem para busca vetorial no Elasticsearch e no Apache Lucene.]]></description>
    <content:encoded><![CDATA[<p>A busca vetorial não é suficiente para encontrar resultados relevantes. É muito comum usar critérios de filtragem que ajudam a restringir os resultados da pesquisa e a eliminar os resultados irrelevantes.</p><p>Compreender como a filtragem funciona na busca vetorial ajudará você a equilibrar as vantagens e desvantagens em termos de desempenho e recall, além de descobrir algumas das otimizações usadas para tornar a busca vetorial eficiente quando a filtragem é utilizada.</p><h2>Por que filtrar?</h2><p>A busca vetorial revolucionou a forma como encontramos informações relevantes em grandes conjuntos de dados, permitindo-nos descobrir itens semanticamente semelhantes a uma consulta.</p><p>No entanto, simplesmente encontrar itens semelhantes não é suficiente. Frequentemente precisamos refinar os resultados da pesquisa com base em critérios ou atributos específicos.</p><p>Imagine que você está procurando um produto em uma loja de comércio eletrônico. Uma busca puramente vetorial pode mostrar itens visualmente semelhantes, mas você também pode querer filtrar por faixa de preço, marca, disponibilidade ou avaliações de clientes. Sem filtros, você se depararia com uma vasta gama de produtos similares, dificultando a busca exatamente pelo que procura.</p><p>A filtragem permite um controle preciso sobre os resultados da pesquisa, garantindo que os itens recuperados não apenas estejam alinhados semanticamente, mas também atendam a todos os requisitos necessários. Isso resulta em uma experiência de busca muito mais precisa, eficiente e fácil de usar.</p><p>É aqui que o Elasticsearch e o Apache Lucene se destacam — o uso de filtragem eficaz em vários tipos de dados é uma das principais diferenças em relação a outros bancos de dados vetoriais.</p><h2>Filtrar para pesquisa vetorial exata</h2><p>Existem duas maneiras principais de realizar buscas vetoriais exatas:</p><ul><li><p>Utilizando um tipo de índice <code>flat</code> para o seu campo dense_vector. Isso faz com que as buscas <code>knn</code> usem busca exata em vez de aproximada.</p></li><li><p>Utilizando uma <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-script-score-query#vector-functions">consulta script_score</a> que usa funções vetoriais para calcular a pontuação. Isso pode ser usado com qualquer tipo de índice.</p></li></ul><p>Ao executar uma busca vetorial exata, todos os vetores são comparados à consulta. Nesse cenário, a filtragem ajudará no desempenho, pois somente os vetores que passarem pelo filtro precisarão ser comparados.</p><p>Isso não afeta a qualidade do resultado, pois todos os vetores são considerados de qualquer forma. Estamos apenas filtrando antecipadamente os resultados que não são interessantes, para que possamos reduzir o número de operações.</p><p>Isso é muito importante, pois pode ser mais eficiente executar uma pesquisa exata em vez de uma pesquisa aproximada quando os filtros aplicados resultam em um pequeno número de documentos.</p><p>A regra geral é usar a pesquisa exata quando menos de 10 mil documentos passarem pelo filtro. Os índices <a href="https://www.elastic.co/search-labs/blog/better-binary-quantization-lucene-elasticsearch">BBQ</a> são muito mais rápidos para comparações, portanto, faz sentido usar a pesquisa exata quando o número de índices baseados for inferior a 100 mil. Confira <a href="https://www.elastic.co/search-labs/blog/knn-exact-vs-approximate-search">esta postagem no blog</a> para obter mais detalhes.</p><p>Caso seus filtros sejam sempre muito restritivos, você pode considerar indexar focando na busca exata em vez da busca aproximada usando um tipo de índice <code>flat</code> em vez de um baseado em HNSW. Para obter mais detalhes, consulte <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/dense-vector#dense-vector-params">as propriedades de index_options</a>.</p><h2>Filtragem para busca vetorial aproximada</h2><p>Ao executar uma busca vetorial aproximada, trocamos precisão do resultado por desempenho. Estruturas de dados de busca vetorial, como o HNSW, pesquisam de forma eficiente os vizinhos mais próximos aproximados em milhões de vetores. Eles se concentram em recuperar os vetores mais semelhantes realizando o mínimo de comparações vetoriais possível, que são computacionalmente dispendiosas.</p><p>Isso significa que outros atributos de filtragem não fazem parte dos dados vetoriais. Diferentes tipos de dados possuem suas próprias estruturas de indexação, que são eficientes para encontrá-los e filtrá-los, como dicionários de termos, listas de postagens e valores de documentos.</p><p>Dado que essas estruturas de dados são separadas do mecanismo de busca vetorial, como aplicamos a filtragem à busca vetorial? Existem duas opções: aplicar filtros após a busca vetorial (pós-filtragem) ou antes da busca vetorial (pré-filtragem).</p><p>Cada uma dessas opções tem vantagens e desvantagens. Vamos analisar esses assuntos mais a fundo!</p><h3>Pós-filtragem</h3><p>A pós-filtragem aplica filtros após a pesquisa vetorial ter sido realizada. Isso significa que os filtros são aplicados depois que os k resultados vetoriais mais semelhantes forem encontrados.</p><p>Obviamente, podemos obter menos de k resultados após aplicar os filtros aos resultados. É claro que poderíamos obter mais resultados com a busca vetorial (valor k maior), mas não teríamos certeza de que obteríamos k ou mais resultados após a aplicação dos filtros.</p><p>A vantagem da pós-filtragem é que ela não altera o comportamento em tempo de execução da busca vetorial — a busca vetorial não leva em consideração a filtragem. Mas isso altera o número final de resultados obtidos.</p><p>Segue abaixo um exemplo de pós-filtragem usando a <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-knn-query">consulta knn</a>. Verifique se a cláusula de filtragem está separada da consulta KNN:</p>{
  "query": {
    "bool": {
      "must": {
        "knn": {
          "field": "image-vector",
          "query_vector": [54, 10, -2],
          "k": 5,
          "num_candidates": 50
        }
      },
      "filter": {
        "term": {
          "file-type": "png"
        }
      }
    }
  }
}<p>O pós-filtro também está disponível para a pesquisa knn usando <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/filter-search-results#post-filter">o comando post-filter</a>:</p>{
  "knn": {
    "field": "image-vector",
    "query_vector": [54, 10, 2],
    "k": 5,
    "num_candidates": 50
  },
  "post_filter": {
    "term": {
      "file-type": "png"
    }
  }
}<p>Lembre-se de que é necessário usar uma seção de pós-filtragem explícita na pesquisa KNN. Se você não usar um filtro posterior, a pesquisa KNN <a href="https://www.elastic.co/docs/solutions/search/vector/knn#_combine_approximate_knn_with_other_features">combinará os resultados dos vizinhos mais próximos</a> com outras consultas ou filtros, em vez de aplicar um filtro posterior.</p><h3>Pré-filtragem</h3><p>Aplicar filtros antes da busca vetorial primeiro recuperará os documentos que atendem aos filtros e, em seguida, passará essa informação para a busca vetorial.</p><p>O Lucene utiliza <a href="https://github.com/apache/lucene/blob/7a60d7ce92392181e137361336e5196bd486cdd9/lucene/core/src/java/org/apache/lucene/util/BitSet.java">BitSets</a> para armazenar de forma eficiente os documentos que satisfazem a condição do filtro. A busca vetorial percorre então o grafo HNSW, levando em consideração os documentos que satisfazem a condição. Antes de adicionar um candidato aos resultados, o sistema verifica se ele está contido no BitSet de documentos válidos.</p><p>No entanto, o candidato deve ser analisado e comparado à consulta, mesmo que não seja um documento válido. A eficácia do HNSW depende da conexão entre os vetores no grafo — se parássemos de explorar um candidato, isso significaria que também poderíamos estar ignorando seus vizinhos.</p><p>Imagine que você está dirigindo até um posto de gasolina. Se você descartar todas as estradas que não têm um posto de gasolina, é improvável que você chegue ao seu destino. Outras estradas podem não ser o que você precisa, mas elas te <em>levam</em> ao seu destino. O mesmo se aplica aos vetores em um grafo HNSW!</p><p>Conclui-se, portanto, que aplicar pré-filtragem tem um desempenho inferior a não aplicar filtros. Precisamos processar <em>todos</em> os vetores que visitamos em nossa busca e descartar aqueles que não correspondem ao filtro. Estamos trabalhando mais e dedicando mais tempo para obter nossos melhores resultados.</p><p>Segue abaixo um exemplo de pré-filtragem na DSL de consulta do Elasticsearch. Verifique se a cláusula de filtragem agora faz parte da seção knn:</p>{
  "knn": {
    "field": "image-vector",
    "query_vector": [54, 10, -2],
    "k": 5,
    "num_candidates": 50,
    "filter": {
      "term": {
        "file-type": "png"
      }
    }
  }
}<p>O pré-filtro está disponível tanto para <a href="https://www.elastic.co/docs/solutions/search/vector/knn#knn-search-filter-example">a pesquisa KNN</a> quanto para <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-knn-query#knn-query-filtering">a consulta KNN</a>:</p>{
  "query": {
    "knn": {
      "field": "image-vector",
      "query_vector": [-5, 9, -12],
      "k": 5,
      "filter": {
        "term": {
          "file-type": "png"
        }
      }
    }
  }
}<h4>Otimizações de pré-filtragem</h4><p>Existem algumas otimizações que podemos aplicar para garantir que a pré-filtragem seja eficiente.</p><p>Podemos alternar para a pesquisa exata se o filtro for muito restritivo. Quando há poucos vetores para comparar, é mais rápido realizar uma busca exata nos poucos documentos que satisfazem o filtro.</p><p>Essa é uma otimização que é aplicada automaticamente no <a href="https://github.com/apache/lucene/blob/eb876b618da5d04c1ad14b04a48321638318493a/lucene/core/src/java/org/apache/lucene/search/AbstractKnnVectorQuery.java#L218">Lucene</a> e no Elasticsearch.</p><p>Outro método de otimização envolve desconsiderar os vetores que não satisfazem o filtro. Em vez disso, esse método verifica os vizinhos dos vetores filtrados que passam pelo filtro. Essa abordagem reduz efetivamente o número de comparações, pois os vetores filtrados não são considerados, e continua a explorar vetores conectados ao caminho atual.</p><p>Este algoritmo é o ACORN-1, e o processo é descrito em detalhes <a href="https://www.elastic.co/search-labs/blog/filtered-hnsw-knn-search">nesta postagem do blog</a>.</p><h2>Filtragem usando segurança em nível de documento</h2><p><a href="https://www.elastic.co/docs/deploy-manage/users-roles/cluster-or-deployment-auth/controlling-access-at-document-field-level#document-level-security">A Segurança em Nível de Documento (DLS, na sigla em inglês)</a> é um recurso do Elasticsearch que especifica os documentos que as funções de usuário podem recuperar.</p><p>A DLS é realizada por meio de consultas. Uma função pode ter uma consulta associada a índices, o que efetivamente limita os documentos que um usuário pertencente a essa função pode recuperar dos índices.</p><p>A consulta de função é usada como um filtro para <a href="https://github.com/elastic/elasticsearch/blob/c3a1cb34294e902a9f46d7e840ea09965019f456/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/security/authz/accesscontrol/SecurityIndexReaderWrapper.java#L92">recuperar os documentos que correspondem a ela</a> e são armazenados em cache como um BitSet. Esse BitSet é então usado para encapsular o leitor Lucene subjacente, de forma que apenas os documentos retornados pela consulta sejam considerados <em>ativos —</em>ou seja, eles existem no índice e não foram excluídos.</p><p>À medida que os documentos ativos são <a href="https://github.com/apache/lucene/blob/a211d30097a8e3264d3ef073a054bd31eb847231/lucene/core/src/java/org/apache/lucene/search/AbstractKnnVectorQuery.java#L196">recuperados do leitor</a> para executar a consulta KNN, somente os documentos disponíveis para o usuário serão considerados. Caso exista um pré-filtro, os documentos DLS serão <a href="https://github.com/apache/lucene/blob/a211d30097a8e3264d3ef073a054bd31eb847231/lucene/core/src/java/org/apache/lucene/search/AbstractKnnVectorQuery.java#L204">adicionados a ele</a>.</p><p>Isso significa que a filtragem DLS funciona como um pré-filtro para a busca vetorial aproximada, com as mesmas implicações de desempenho e otimizações.</p><p>A busca DLS com pesquisa exata terá os mesmos benefícios que a aplicação de qualquer filtro — quanto menos documentos forem recuperados da DLS, mais eficiente será a pesquisa exata. Considere também o número de documentos retornados pelo DLS — se as funções do DLS forem muito restritivas, você pode considerar usar a pesquisa exata em vez da pesquisa aproximada.</p><h2>Benchmarking</h2><p>Na Elasticsearch, queremos garantir que a filtragem por vetores seja eficiente. Temos <a href="https://elasticsearch-benchmarks.elastic.co/#tracks/so_vector/nightly/default/90d">um benchmark específico para filtragem vetorial</a> que realiza buscas vetoriais aproximadas com diferentes filtros para garantir que a busca vetorial continue recuperando resultados relevantes o mais rápido possível.</p><p>Confira as <a href="https://elasticsearch-benchmark-analytics.elastic.co/app/dashboards#/view/43b63e80-5ba2-11ed-aede-a742809feed4?_g=(refreshInterval:(pause:!t,value:60000),time:(from:'2025-05-28T01:27:58.456Z',to:'2025-06-30T13:53:26.430Z'))&amp;_a=()">melhorias implementadas</a> com a introdução do ACORN-1. Para testes em que apenas 2% dos vetores passam pelo filtro, a latência da consulta é reduzida para 55% da duração original:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt820cb0b715cf291c/6a17e227dbb4ff8d49fb5615/3eac3748a33376fc97d957364a5c1f5108d5c58b-1023x896.png" alt="" /><h2>Conclusão</h2><p>A filtragem é parte integrante da pesquisa. Garantir que a filtragem seja eficiente na busca vetorial e compreender as compensações e otimizações envolvidas é o que determina o sucesso ou o fracasso de uma busca eficiente e precisa.</p><p>A filtragem afeta o desempenho da busca vetorial:</p><ul><li><p>A busca exata é mais rápida ao usar filtros. Se a sua filtragem for suficientemente restritiva, considere usar a pesquisa exata em vez da pesquisa aproximada. Esta é uma otimização automática no Elasticsearch.</p></li><li><p>A busca aproximada é mais lenta quando se utiliza pré-filtragem. A pré-filtragem permite obter os k melhores resultados que correspondem ao filtro, ao custo de uma pesquisa mais lenta.</p></li><li><p>A pós-filtragem não recupera necessariamente os k melhores resultados, pois eles podem ser filtrados pelo filtro quando este é aplicado.</p></li></ul><p>Boa filtragem!</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/vector-search-filtering</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/vector-search-filtering</guid>
    <category><![CDATA[Banco de dados vetorial]]></category>
    <category><![CDATA[Lucene]]></category>
    <category><![CDATA[Na Elastic]]></category>
    <dc:creator><![CDATA[Carlos Delgado]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt39ede1736e0f1456/6a17e2282f4a5c5031fa8843/03b1dd4c7bda4fbabd8e374bc2e4f12d5be6ef5f-1600x1150.png" length="0" type="image/png"/>
    <pubDate>Wed, 03 Sep 2025 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>