<?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[Pesquisa de aprendizado de máquina - 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[Pesquisa de aprendizado de máquina - 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/ml-research</link>
    </image>
    <link>https://www.elastic.co/pt/search-labs/blog/category/ml-research</link>
    <atom:link href="https://www.elastic.co/pt/search-labs/rss/category/ml-research.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[pt]]></language>
    <lastBuildDate>Mon, 28 Sep 2026 15:08:06 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Clustering não supervisionado de documentos com Elasticsearch + embeddings Jina]]></title>
    <description><![CDATA[Uma abordagem prática e reproduzível para clustering não supervisionado de documentos com Elasticsearch e embeddings Jina.]]></description>
    <content:encoded><![CDATA[<p>A busca vetorial começa com uma consulta, mas e se você não tiver o que consultar?</p><p>As organizações acumulam grandes coleções de documentos, como chamados de suporte, processos judiciais, notícias, artigos de pesquisa, e precisam entender o que eles contêm antes de poderem fazer as perguntas certas. Sem rótulos nem dados de treinamento, revisar manualmente milhares de documentos é impraticável. A busca tradicional não ajuda quando você não sabe o que procurar.</p><p>Esta publicação tem uma abordagem nativa do Elasticsearch para clustering de documentos não supervisionados e rastreamento de histórias temporais que lida com esse problema de descoberta. Ao final, você poderá acompanhar arcos narrativos como este ao longo de vários dias:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta8c243e0c5773440/6a17093fa6c2b98c86e7968c/100a60a7fb85da8ab3813fd071a82c93f2c3f318-1300x650.png" alt="Cadeias temporais de histórias que fluem ao longo de fevereiro de 2025, cada caminho colorido representa uma história que persiste ao longo dos dias, com a largura do link indicando a força de sobreposição do kNN" /><p><strong>O que você vai descobrir:</strong></p><ul><li><p>Por que <strong>embeddings de clustering</strong> (e não embeddings de recuperação) são importantes quando se deseja descobrir tópicos sem uma consulta?</p></li><li><p>Como a classificação de centroides sondada por densidade agrupa documentos por tópico usando Elasticsearch k-nearest neighbor (kNN) e processamento em lote <code>msearch</code>.</p></li><li><p>Como <a href="https://www.elastic.co/docs/reference/aggregations/search-aggregations-bucket-significanttext-aggregation"><code>significant_text</code></a> pode automaticamente rotular clusters para que os temas sejam legíveis sem precisar treinar um modelo?</p></li><li><p>Como as cadeias temporais de histórias conectam clusters diários para mostrar como os temas evoluem dia após dia.</p></li></ul><p>O pipeline utiliza ~8.500 artigos de fevereiro de 2025 da BBC News e do The Guardian como um corpus de teste. As notícias são convenientes porque apresentam um comportamento temporal claro, mas esse padrão se aplica a qualquer situação em que a descoberta de documentos seja importante: revisão jurídica, monitoramento de conformidade, síntese de pesquisas, triagem de suporte ao cliente.</p><p><strong>Stack:</strong></p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/jina-embeddings-v5-text"><strong>Jina v5</strong></a> <strong>clustering embeddings:</strong> adaptadores LoRA (Low-Rank Adaptation) específicos para tarefas no agrupamento de tópicos. <a href="https://www.elastic.co/blog/elastic-jina-ai">Jina ingressou na Elastic</a> e os modelos estão disponíveis nativamente por meio do <a href="https://www.elastic.co/docs/explore-analyze/elastic-inference/eis">Elastic Inference Service (EIS).</a></p></li><li><p><strong>Elasticsearch:</strong> <a href="https://www.elastic.co/docs/solutions/search/vector/knn">kNN</a> escalável, rotulagem <code>significant_text</code> e armazenamento de vetores.</p></li><li><p><a href="https://www.elastic.co/search-labs/blog/diskbbq-elasticsearch-introduction"><strong>DiskBBQ:</strong></a> um formato de índice vetorial baseado em disco que combina <a href="https://www.elastic.co/docs/reference/elasticsearch/index-settings/bbq">quantização binária aprimorada (BBQ)</a> com particionamento hierárquico k-means para aceleração aproximada de vizinhos mais próximos (ANN). Essa partição de índice é interna à busca vetorial e separada do algoritmo de clustering baseado em densidade usado nesta postagem. <code>bbq_disk</code> armazena vetores quantizados em disco e mantém apenas metadados de partição no heap, reduzindo os requisitos de recursos, em comparação com <code>bbq_hnsw</code>, mantendo alta recuperação.</p></li><li><p><strong>Clustering global + vinculação temporal diária:</strong> descoberta e evolução da narrativa.</p></li></ul><p><strong>O que você precisará:</strong></p><ul><li><p>Uma implementação do Elasticsearch (Elastic Cloud, Elasticsearch Serverless ou Elastic Self-Managed 8.18+/9.0+): <code>bbq_disk</code> requer a versão 8.18 ou posterior. A seção opcional do diversificador retriever exige 9.3+ ou serverless.</p></li><li><p>Uma <a href="https://jina.ai/embeddings/">chave de API Jina</a>: o nível gratuito inclui 10 milhões de tokens, o que cobre o pipeline principal de clusterização (aproximadamente 4,25 milhões de tokens). A comparação opcional entre recuperação e clustering usa uma segunda passagem de incorporação.</p></li><li><p>Uma <a href="https://bonobo.capi.gutools.co.uk/register/developer">chave de API do Guardian</a> (gratuita).</p></li></ul><h2>Configuração</h2><p>Instale os pacotes necessários:</p>pip install elasticsearch pandas numpy plotly umap-learn python-dotenv pydantic-settings datasets requests<p>Opcional (somente se você executar ferramentas de scraping deste repositório):</p>pip install beautifulsoup4<p>Depois, configure chaves de API em um arquivo <code>.env</code> na raiz do projeto:</p>ELASTIC_CLOUD_ID=your-cloud-id        # or ELASTIC_HOST=https://...
ELASTIC_API_KEY=your-api-key
JINA_API_KEY=your-jina-key
GUARDIAN_API_KEY=your-guardian-key<p>Este notebook chama <code>load_dotenv(override=True)</code>, portanto os valores locais <code>.env</code> têm precedência.</p>Connected to Elasticsearch<h2>Parte 1: clustering de descoberta – Por que fazer clustering de embeddings?</h2><p>A maioria das buscas vetoriais utiliza <strong>embeddings de recuperação</strong> treinados para associar uma <em>consulta</em> a <em>documentos</em> relevantes. Isso é perfeito para buscas, mas não para descobertas. Quando você quer descobrir quais tópicos existem em um corpus sem qualquer consulta, precisa de embeddings que agrupem documentos semelhantes.</p><p>O Jina v5 resolve isso com <strong>adaptadores Low-Rank Adaptation (LoRA) específicos para cada tarefa</strong>. O LoRa adiciona pequenas atualizações de baixa classificação às camadas internas específicas, mantendo a maioria dos pesos do modelo base congelados, de modo que o comportamento do modelo se adapta a uma tarefa específica sem a necessidade de um novo treinamento completo. O mesmo modelo base produz embeddings diferentes dependendo do parâmetro <code>task</code>:</p><p>Tarefa</p><p>Preparado para</p><p>Caso de uso</p><p>retrieval.passage</p><p>Correspondência entre consulta e documento</p><p>Busca, retrieval augmented generation (RAG)</p><p>clustering</p><p>Agrupamento de tópicos (otimizado para clusters compactos)</p><p>Descoberta, categorização</p><p>O adaptador de clustering é treinado para <em>aproximar</em> documentos sobre o mesmo tópico no espaço de incorporação e <em>distanciar</em> documentos sobre tópicos diferentes. A comparação visual abaixo torna a diferença concreta.</p><h3>Recuperação vs. clustering: uma comparação visual</h3><p>Para ver a diferença, uma amostra de documentos recebe embedding de ambos os tipos de tarefa. O clustering é realizado no espaço de incorporação original de 1024 dimensões; a aproximação e projeção uniforme de variedades (UMAP) é usada apenas para projetar essas incorporações em 2D para visualização. A UMAP preserva a estrutura local de vizinhança, tornando-a útil para comparar a separação de clusters.</p><p>Abaixo, o mesmo exemplo de 480 documentos é incorporado com ambos os tipos de tarefas e projetado para 2D com UMAP. Procure grupos de cores mais fechados e separados no painel de clustering.</p>    Full dataset: 8,495 articles
    Sources: guardian: 5749, bbc: 2746
    Date range: 2025-02-01 to 2025-02-28


    Sample: 480 docs across 8 sections
    section
    Film              60
    World news        60
    Australia news    60
    Opinion           60
    Football          60
    US news           60
    Sport             60
    Business          60


    Clustering embeddings: 480
    Retrieval embeddings:  480


    UMAP projection complete<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4b3733dccad212b6/6a1709407d8d67aaeb70e6a4/9bcf7a744900560c1c6c63a2dc3af2f9bfd33e11-1100x500.png" alt="Comparação da UMAP entre embeddings de recuperação e clustering" /><p><em>Os embeddings de recuperação (à esquerda) espalham amplamente os tópicos; os embeddings de clustering (à direita) produzem grupos mais coesos e separados a partir dos mesmos documentos.</em></p><p>Os embeddings de clustering produzem grupos mais compactos e visualmente distintos. Os embeddings de recuperação distribuem os tópicos de maneira mais uniforme, ideais para busca (similaridade refinada); mas, para descoberta, o que importa são os clusters temáticos compactos.</p><p>É por isso que o <code>task="clustering"</code> é usado no restante deste guia.</p><h3>Carregando o conjunto de dados</h3><p>O corpus combina duas fontes de notícias para fevereiro de 2025:</p><ul><li><p><strong>BBC News</strong> através do conjunto de dados <a href="https://huggingface.co/datasets/RealTimeData/bbc_news_alltime">RealTimeData/bbc_news_alltime</a> HuggingFace.</p></li><li><p><strong>The Guardian</strong> através da <a href="https://open-platform.theguardian.com/">API da Guardian Open Platform</a>.</p></li></ul><p>Ter múltiplas fontes ajuda a validar se o clustering encontra <em>tópicos</em> em vez de <em>estilos específicos de cada fonte</em>.</p>    Total articles:  8,495
    
    Source breakdown:
    source
    guardian    5749
    bbc         2746
    
    Date range: 2025-02-01 → 2025-02-28
    Days covered: 28
    
    Sample article:
      Source:  guardian
      Title:   Carbon monoxide poisoning ruled out in death of Gene Hackman and wife, police sa
      Section: Film
      Text:    Authorities have ruled out that Gene Hackman and his wife, Betsy Arakawa, died from carbon monoxide poisoning earlier this week in their home in Santa Fe, New Mexico. The Santa Fe county sheriff, Adan...<h3>Embedding com a tarefa de clustering</h3><p>A API Jina v5 é chamada com <code>task="clustering"</code> para todos os documentos. Os embeddings são armazenados em cache no disco, portanto, as execuções subsequentes ignoram a API completamente.</p><p>A chamada da API é direta. O parâmetro <code>task</code> é a principal diferença em relação ao uso típico de embeddings:</p>payload = {
    "model": "jina-embeddings-v5-text-small",
    "input": texts,
    "task": "clustering",  # ← This selects the clustering LoRA adapter
}<p>O tempo abaixo reflete uma taxa de acerto do cache. A primeira execução contra a API demora mais, dependendo do tamanho do corpus.</p>    Embeddings ready: 8,495 vectors of dimension 1024
    Time: 0.6s<h3>Indexação em um único índice do Elasticsearch</h3><p>Para clustering de descoberta, o mês inteiro é dedicado a um índice (<code>docs-clustering-all</code>). A partição diária vem depois para a ligação temporal da história.</p><p>O mapeamento do índice usa <a href="https://www.elastic.co/docs/reference/elasticsearch/index-settings/bbq"><code>bbq_disk</code></a> para o campo vetorial:</p>{
  "embedding": {
    "type": "dense_vector",
    "dims": 1024,
    "index": true,
    "similarity": "cosine",
    "index_options": {
      "type": "bbq_disk"        // hierarchical k-means partitioning for ANN index lookup; separate from this post's clustering algorithm
    }
  }
}<p>Um vetor float32 de dimensão 1024 tem 4 KB. <a href="https://www.elastic.co/search-labs/blog/diskbbq-elasticsearch-introduction"><code>bbq_disk</code></a> utiliza k-means hierárquicos para particionar vetores em pequenos clusters, quantificá-los de forma binária e armazenar os vetores de precisão total no disco para repontuação. Apenas os metadados de partição permanecem no heap, então os requisitos de memória permanecem baixos mesmo para corpora grandes. Para cargas de trabalho que podem suportar mais heap, <a href="https://www.elastic.co/docs/reference/elasticsearch/index-settings/bbq"><code>bbq_hnsw</code></a> constrói um gráfico Hierarchical Navigable Small World (HNSW) para consultas mais rápidas com mais custo de recursos.</p><p>O tipo de campo <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/dense-vector"><code>dense_vector</code></a> suporta múltiplas estratégias de quantização: <code>bbq_disk</code> e <code>bbq_hnsw</code> são os melhores ajustes para embeddings de alta dimensão como os vetores de dimensão 1024 usados aqui.</p>    Indexed 8,495 documents into docs-clustering-all
    Time: 57.5s<h3>Clusteringo: classificação de centroides baseada em densidade</h3><p>Algoritmos de clustering tradicionais, como o HDBSCAN, pressupõem que você possa manter a matriz vetorial completa de N×d na memória e executar atualizações de passagem completa repetidas. Para 8.495 documentos em 1024 dimensões, isso é administrável (aproximadamente 35 MB), mas a abordagem não é escalável para milhões de documentos sem infraestrutura adicional.</p><p>Este algoritmo é conceitualmente semelhante à inicialização do KMeans++ com atribuição de Voronoi e um nível de ruído, mas utiliza a <a href="https://www.elastic.co/docs/solutions/search/vector/knn">busca kNN</a> do Elasticsearch como primitiva de computação, mantendo quase todo o trabalho no lado do servidor:</p><ol><li><p><strong>Amostra de 5% de documentos</strong> como sondas de densidade (amostra aleatória, mínimo de 50).</p></li><li><p><strong>Densidade da sonda por meio de lote</strong> <a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-msearch"><strong><code>msearch</code></strong></a> <strong>kNN</strong>. Cada sonda dispara uma consulta kNN e registra a semelhança média dos vizinhos. Alta similaridade média = região densa do espaço de embedding. <a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-msearch"><code>msearch</code></a> envia várias solicitações de pesquisa em uma única chamada HTTP, o que é fundamental aqui: a sondagem de densidade gera centenas de consultas kNN e processá-las em lote evita a sobrecarga por solicitação.</p></li><li><p><strong>Selecione sementes de alta densidade com diversificação</strong>: os candidatos acima da densidade média são classificados por densidade decrescente e aceitos avidamente somente quando a semelhança de cosseno com cada semente existente estiver abaixo de um limite de separação. Este é o único processamento do lado do cliente (~0,01s para 8k documentos).</p></li><li><p><strong>Classificar todos os documentos em relação aos centroides via</strong> <strong><code>msearch</code></strong> <strong>kNN</strong>: cada semente atua como um centroide; uma pesquisa kNN recupera documentos próximos acima de um limite de similaridade. Cada documento é atribuído ao centroide que o retornou com a maior pontuação. Pequenos clusters são dissolvidos em ruído.</p></li></ol><p>O Elasticsearch cuida do trabalho pesado: <code>msearch</code> para sondas de densidade, <code>msearch</code> para classificação e <code>significant_text</code> para rotulagem. Para esse corpus (8.495 documentos), a amostra de sonda de densidade de 5% executa consultas de sonda de 425 kNN, que <code>msearch</code> agrupam lotes em nove chamadas HTTP (no tamanho de lote 50), evitando a sobrecarga de uma solicitação por sonda. Combinado com <code>bbq_disk</code> busca ANN, isso mantém a etapa de clustering rápida e escalável. As consultas kNN usam um valor mínimo de <a href="https://www.elastic.co/docs/deploy-manage/production-guidance/optimize-performance/approximate-knn-search"><code>num_candidates</code></a> para velocidade durante a passagem de clustering; consultas de busca em produção devem usar valores de <code>num_candidates</code> mais altos para melhorar a recordação, mas isso custa latência.</p><p>Clusters têm tamanhos naturais determinados pela densidade do espaço de embedding ao redor de cada centroide, não por um limite de <code>k</code> rígido. Regiões temáticas densas produzem clusters maiores; tópicos de nicho produzem agrupamentos menores.</p><h4>Por que escolher KMeans ou HDBSCAN?</h4><p>O algoritmo KMeans pressupõe clusters esféricos e requer a matriz completa N×d na memória. Para corpora que cabem na memória, <a href="https://scikit-learn.org/stable/modules/generated/sklearn.cluster.HDBSCAN.html">HDBSCAN</a> é uma excelente alternativa. Ele lida com formatos de cluster arbitrários e possui semântica de densidade bem compreendida.</p><p>A abordagem de centroide sondado por densidade mira em um nicho diferente: corpora onde você quer armazenamento, recuperação e clustering em um único sistema, ou onde a escala torna as operações matriciais do lado do cliente impraticáveis. Ele usa o Elasticsearch kNN como primitiva de computação, lida com tamanhos arbitrários de cluster e mantém quase toda a computação no lado do servidor.</p>    Clustered global index in 31.6s
      Total clusters: 82
      Total noise:    2420 (28.5%)
      Density probes: 425 kNN queries via 9 _msearch HTTP calls<h4>Entendendo a taxa de ruído</h4><p>A taxa de ruído de ~28% é intencional, não uma falha. Documentos que não cabem em nenhum cluster denso na <code>similarity_threshold</code> configurada ficam sem atribuição, em vez de serem forçados a uma correspondência ruim. Isso funciona como um filtro de qualidade: colunas de opinião, artigos curtos e reportagens isoladas naturalmente resistem ao clustering porque falta a densidade temática que define um grupo coerente.</p><p>O limiar é ajustável: reduzir <code>similarity_threshold</code> produz clusters mais abrangentes (mais documentos atribuídos, mas clusters menos coesos), enquanto aumentá-lo torna os clusters mais compactos e aumenta a fração de ruído. Para este corpus de conteúdo de notícias misto, ~30% de ruído é um ponto de operação razoável. Implantações em produção devem ajustar o limiar com base em critérios de qualidade específicos do domínio.</p><h3>Rótulos automáticos com significant_text</h3><p>Agora, cada cluster precisa de um rótulo de fácil compreensão. A agregação <code>significant_text</code> do Elasticsearch encontra termos que aparecem com frequência incomum em um conjunto em primeiro plano (o cluster) em comparação com um conjunto em segundo plano (o corpus completo).</p><p>Nos bastidores, ele usa uma heurística estatística (pontuação JLH por padrão) que equilibra mudanças de frequência absolutas e relativas, sem machine learning, sem chamadas de grandes modelo de linguagem (LLM). Um cluster sobre política do Reino Unido pode apresentar termos como <code>starmer</code>, <code>labour</code>, <code>downing</code> porque esses termos são desproporcionalmente comuns nesse cluster em comparação ao conjunto geral de notícias.</p><p>Para essa passagem global, os rótulos são calculados diretamente contra <code>docs-clustering-all</code>, então tanto o plano de frente quanto o plano de fundo são extraídos do mês inteiro. Na parte 2, a rotulagem utiliza o padrão de indexação diário (<code>docs-clustering-*</code>), um caractere curinga que permite que consultas abranjam todos os índices correspondentes simultaneamente, para dar <code>significant_text</code> um plano de fundo mais amplo e melhor contraste.</p><p>Um formato de consulta mínimo tem a seguinte aparência:</p>{
  "size": 0,
  "query": { "term": { "cluster_id": "72" } },
  "aggs": {
    "label_terms": {
      "significant_text": {
        "field": "text",
        "size": 5,
        "filter_duplicate_text": true
      }
    }
  }
}<p><code>significant_text</code> serve também como um filtro de qualidade: clusters que não produzem termos significativos não possuem vocabulário distintivo. São agrupamentos incoerentes que devem ser dissolvidos e reduzidos a ruído, em vez de receberem um rótulo enganoso.</p><p>Uma etapa de limpeza determinística e leve remove termos de rótulos irrelevantes (tokens numéricos, palavras genéricas) e recorre a um título representativo quando necessário. Isso mantém os rótulos nativos do Elasticsearch enquanto melhora a legibilidade.</p>    Sample cluster labels:
      cluster   3  (200 docs)  arsenal | mikel | villa
      cluster   1  (198 docs)  volodymyr | ukrainian | kyiv
      cluster   0  (196 docs)  hostages | hamas | israeli
      cluster   4  (187 docs)  scrum | rugby | borthwick
      cluster  52  (185 docs)  fossil | renewable | renewables
      cluster  10  (156 docs)  labour | gwynne | mps
      cluster  40  (151 docs)  novel | novels | literary
      cluster  11  (149 docs)  mewis | sarina | wiegman
      cluster  44  (143 docs)  flooding | rainfall | rain
      cluster  13  (131 docs)  doge | musk | elon
      cluster  12  (128 docs)  murder | insp | knockholt
      cluster   5  (124 docs)  putin | backstop | starmer


    Reassigned 35 docs from incoherent clusters to noise
    Total docs: 8,495
    Clustered:  6,040 (71.1%)
    Noise:      2,455 (28.9%)<h3>Visualizando os clusters</h3><p>As visualizações abaixo mostram o que a análise de clustering global descobriu: uma análise por data de documentos agrupados versus documentos de ruído, uma projeção UMAP para o mês inteiro e um gráfico de composição de fontes confirmando que os agrupamentos refletem tópicos em vez de fontes.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4ed087d8b6dac2a0/6a17094260084b44543c4501/99099f5adaa945ae4097c50b0d7151c7dd28872e-1000x400.png" alt="Distribuição diária de documentos agrupados versus documentos com ruído" /><p>Distribuição diária de documentos agrupados versus ruídos ao longo de fevereiro de 2025.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf5ca320bc91131ab/6a17094366c4f95828f8bfbf/477c6c7177942955a942f85f5c881da50e517915-1100x700.png" alt="Projeção UMAP para o mês inteiro com todos os documentos" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5f554a6bc2bc367b/6a170945a929cfa7a1ae0947/4f4302556c8974c416842452cf33bca06e90b966-1100x700.png" alt="Projeção UMAP mostrando apenas documentos agrupados" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8e40c26f89ce5523/6a17094747d49c147d2d8974/327f96a79e382ef30614cb0570aa7fccd822b8f8-1100x700.png" alt="[Projeção UMAP destacando um único cluster]" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf1dd2c19ae628f1d/6a1709481949f7a630e7a9a3/acfb1524a10e24d6ff2412e7c3ec0f2b3ac75193-900x600.png" alt="Mistura de fontes por cluster mostrando agrupamento baseado em tópicos" /><p>Cada ilha colorida no UMAP representa um cluster: um grupo de artigos sobre o mesmo tema descobertos puramente por similaridade de incorporação. Os pontos de ruído cinza são artigos que não se encaixavam perfeitamente em nenhum cluster (artigos curtos, artigos de opinião ou histórias isoladas).</p><p>O gráfico de detalhamento da fonte confirma que os clusters contêm artigos de <strong>ambos</strong> BBC News e The Guardian. O clustering está encontrando <em>tópicos</em>, não <em>fontes</em>, exatamente o que a descoberta não supervisionada deve produzir.</p><h3>Explorando a amplitude do cluster com o diversificador</h3><p>O algoritmo kNN simples retorna os documentos mais semelhantes ao centroide de um cluster (o núcleo denso). Mas clusters reais abrangem subtópicos. O <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrievers/diversify-retriever"><strong>recuperador de diversificação</strong></a> usa a relevância marginal máxima (MMR) para destacar documentos que são relevantes para o centroide, mas também <em>diferentes entre si</em>.</p><p>O parâmetro chave é <strong>λ (lambda):</strong></p><ul><li><p>λ = 1,0 → relevância pura (o mesmo que kNN simples).</p></li><li><p>λ = 0,0 → diversidade pura (resultados de distribuição máxima).</p></li><li><p>λ = 0,5 → equilibrado: relevante para o tópico, mas abordando diferentes perspectivas.</p></li></ul><p>Uma forma mínima de solicitação de recuperador é assim:</p>{
  "size": 8,
  "retriever": {
    "diversify": {
      "type": "mmr",
      "field": "embedding",
      "lambda": 0.5,
      "query_vector": "&lt;cluster-centroid-vector&gt;",
      "retriever": {
        "knn": {
          "field": "embedding",
          "query_vector": "&lt;cluster-centroid-vector&gt;",
          "k": 50,
          "num_candidates": 100
        }
      }
    }
  }
}<p>Os parâmetros <code>type</code>, <code>field</code>, e <code>query_vector</code> são necessários no nível de diversificação: <code>field</code> informa à MMR qual campo dense_vector usar para similaridade entre resultados, e <code>query_vector</code> fornece o ponto de referência para a pontuação de relevância.</p><p>Isso permite que você responda: "O que esse cluster cobre de fato?" em vez de apenas "Qual é o ponto central?"</p>    Exploring cluster 52 (185 docs)
    Label: fossil | renewable | renewables
    Centroid computed (dim=1024)


    ========================================================================
    Plain kNN (closest to centroid)
    ========================================================================
      1. [0.9738] Green campaigners fear ministers are poised to award billions of pounds in fresh subsidies to Drax power station, despite strong concerns...
      2. [0.9710] Thirteen more oil and gas licences could be cancelled as ministers decide new guidance for fossil fuel extraction after a landmark court...
      3. [0.9699] Experts have accused the fossil fuel industry of seeking special treatment after lobbyists argued greenhouse gas emissions from oilfields...
      4. [0.9681] Burning wood is a terrible way of producing electricity . Chopping down trees destroys habitats for wildlife, and growing new trees cannot...
      5. [0.9649] Keir Starmer will do huge damage to the global fight against climate change if he gives in to political pressure and allows the development...
      6. [0.9641] Labour will next week be confronted with stark policy choices that threaten to expose the fault lines between the Treasury and the...
      7. [0.9638] The Drax power station near Selby in north Yorkshire burns imported wood pellets  The government has agreed a new funding arrangement with...
      8. [0.9581] If you care about the world we are handing on to future generations, the news on Thursday morning was dramatic. This January was the...
    
    ========================================================================
    Diversify retriever (MMR, lambda=0.5)
    ========================================================================
      1. [0.9738] Green campaigners fear ministers are poised to award billions of pounds in fresh subsidies to Drax power station, despite strong concerns...
      2. [0.9434] Oil and gas interests have waged a coordinated campaign to kill pro-electrification policies that ban gas connections in new buildings ,...
      3. [0.9303] It was interesting to read that new licences for oil and gas production in the North Sea are being delayed by legal action ( Thirteen more...
      4. [0.9139] The US energy secretary, Chris Wright, has said he “would love to see Australia get in the game of supplying uranium and maybe going down...
      5. [0.9077] Rachel Reeves was facing criticism on Saturday night as it was confirmed that a report she cited as evidence that a third ­runway at...
      6. [0.8996] When Margaret Thatcher opened the Hadley Centre for Climate Change in 1990 journalists suggested she was attempting to appear to be doing...
      7. [0.8993] The vast majority of governments are likely to miss a looming deadline to file vital plans that will determine whether or not the world has...
      8. [0.8987] European imports of seaborne gas shipments fell by a fifth last year to their lowest level since the pandemic, according to a new report,...
    
    Overlap: 1/8 documents appear in both result sets
    
    Avg pairwise similarity (lower = more diverse):
      Plain kNN:          0.9057
      Diversify retriever: 0.6965<p>Os resultados simples kNN se agrupam em torno de um ângulo do tema: os documentos mais semelhantes ao centroide e entre si. O recurso de recuperação de diversidade revela diferentes facetas do mesmo cluster: subtópicos, fontes diversas e perspectivas variadas.</p><p>A métrica de diversidade confirma isso quantitativamente: a similaridade média entre pares é menor para os resultados do recuperador diversificado, o que significa que os documentos retornados abrangem um espectro mais amplo.</p><p>Isso é útil para você:</p><ul><li><p><strong>Entender o que um cluster cobre</strong>, não apenas o centro, mas também as bordas.</p></li><li><p><strong>Geração de resumos</strong>. Documentos representativos diversos oferecem um material melhor para um LLM.</p></li><li><p><strong>Encontrar exemplos representativos</strong> para análise humana ou rotulagem posterior.</p></li><li><p><strong>Verificações de qualidade</strong>. Se os resultados diversos parecerem incoerentes, o cluster pode precisar ser dividido.</p></li></ul><h2>Parte 2: Cadeias de histórias temporais</h2><h3>Acompanhando histórias ao longo dos dias</h3><p>A parte 1 fez o clustering de todo o mês global para descoberta de tópicos. Para o fluxo temporal, a mesma classificação de centroides sondados por densidade é executada independentemente por dia em <strong>índices diários</strong>, e depois os clusters são vinculados ao longo de dias consecutivos. Observe que os clusters diários são independentes dos clusters globais da parte 1; cada dia produz as próprias atribuições de agrupamento e rótulos ajustados ao conteúdo daquele dia.</p><h4><strong>A abordagem de vinculação: amostragem e consulta</strong></h4><p>Para cada cluster no dia A:</p><ol><li><p>Você pode ver uma amostra de alguns documentos representativos.</p></li><li><p>Executar kNN contra o índice do dia B.</p></li><li><p>Conte quantos acessos caem em cada cluster B do dia.</p></li><li><p>Se a fração de acerto ultrapassar um limite (fração de kNN ≥ 0,4), registre um link.</p></li></ol><p>Isso é rápido (apenas alguns documentos por cluster são consultados, nem todos) e usa o kNN nativo do Elasticsearch, sem necessidade de ferramentas externas.</p>Preparing daily indices for temporal linkage...


Indexed 8,495 docs into 28 daily indices


Temporal links found: 808 in 145.4s

Strongest links:
  2025.02.01 'league | arsenal | premier' -&gt; 2025.02.02 'league | season | striker'  (100%)
  2025.02.03 'league | striker | loan' -&gt; 2025.02.04 'league | striker | season'  (100%)
  2025.02.03 'score | operator | gedling' -&gt; 2025.02.04 'league | striker | season'  (100%)
  2025.02.12 'playoff | leg | bayern' -&gt; 2025.02.13 'league | players | injury'  (100%)
  2025.02.14 'league | injury | football' -&gt; 2025.02.15 'league | premier | football'  (100%)
  2025.02.18 'russia | ukraine | talks' -&gt; 2025.02.19 'saudi | russia | arabia'  (100%)
  2025.02.18 'football | league | bayern' -&gt; 2025.02.19 'league | manchester | players'  (100%)
  2025.02.21 'league | premier | manchester' -&gt; 2025.02.22 'game | players | defeat'  (100%)
  2025.02.21 'rugby | calcutta | brilliant' -&gt; 2025.02.22 'game | players | defeat'  (100%)
  2025.02.26 'metals | kyiv | ukrainian' -&gt; 2025.02.27 'ukraine | russia | talks'  (100%)<p>Uma fração de kNN de 100% significa que todos os documentos mostrados do cluster de origem foram atribuídos ao mesmo cluster de destino, o vínculo mais forte possível entre os dias. A maioria dos links acima está relacionada ao futebol, o que faz sentido: a cobertura da Premier League é feita diariamente com alta consistência de tópicos.</p><p>O link <code>score | operator | gedling</code> → <code>league | striker | season</code> é um exemplo de um cluster de futebol local de nicho (Gedling é um clube fora da liga) sendo absorvido pelo cluster mais amplo da Premier League no dia seguinte, um efeito natural do clustering diário em diferentes granularidades.</p><h3>Criar cadeias de histórias</h3><p>Uma cadeia de histórias é uma sequência de clusters ligados ao longo de dias consecutivos.</p><p>Ligações pareadas individuais indicam que o cluster "política do Reino Unido" de segunda-feira está conectado ao de terça-feira. As cadeias revelam o arco completo: uma história que começa na segunda-feira, evolui durante a semana e encerra na sexta-feira.</p><p>As cadeias são construídas de forma ávida a partir de links com uma fração kNN ≥ 0,4, o que significa que pelo menos 40% dos documentos mostrados do cluster de origem chegaram a um único cluster de destino. A partir do cluster mais antigo, o algoritmo sempre segue o link de saída mais forte.
</p>    Strong links (kNN fraction &gt;= 0.4): 244
    Story chains spanning 3+ days: 18
      Chain 1: 'ukrainian | kyiv | eastern' (19 days: Feb 3 → Feb 21)
      Chain 2: 'playing | opposition' (19 days: Feb 10 → Feb 28)
      Chain 3: 'tadhg | maro | cadan' (10 days: Feb 1 → Feb 10)
      Chain 4: 'invade | china | putin' (8 days: Feb 21 → Feb 28)
      Chain 5: 'elected | labour | leader' (7 days: Feb 12 → Feb 18)
      Chain 6: 'film | swift | awards' (6 days: Feb 2 → Feb 7)
      Chain 7: 'amendment | termination | reporting' (6 days: Feb 12 → Feb 17)
      Chain 8: 'officers | scene | police' (5 days: Feb 1 → Feb 5)<p>A rede mais longa acompanha a cobertura Ucrânia–Rússia por 19 dias consecutivos, o que não surpreende dada a intensidade geopolítica em fevereiro de 2025. O segundo mais longo acompanha o futebol da Premier League ao longo de 19 dias do mês. Cadeias mais curtas captam a temporada de premiações (filme/prêmios, seis dias), o rúgbi Six Nations (10 dias) e a cobertura da liderança política do Reino Unido (sete dias). Cada cadeia representa um arco narrativo que o algoritmo descobriu ao incorporar similaridade entre índices diários.</p><h3>Sankey: Visualizando o fluxo da história</h3><p>Um diagrama de Sankey é uma visualização de fluxo onde a largura da ligação representa a força da conexão. Aqui, cada faixa vertical representa um dia, cada nó é um cluster diário (dimensionado pela contagem de documentos), e cada caminho colorido traça uma cadeia de histórias ao longo do tempo. A largura do link codifica a força de sobreposição kNN: links mais espessos indicam que mais documentos mostrados caíram no cluster alvo. As cores são consistentes por cadeia, então um único caminho colorido da esquerda para a direita representa o progresso de uma história.</p><p>Por exemplo, a cadeia Ucrânia-Rússia (visível como um dos caminhos mais longos) flui continuamente desde o início de fevereiro até a terceira semana, com elos consistentemente espessos indicando forte continuidade temática ao longo dos dias.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta8c243e0c5773440/6a17093fa6c2b98c86e7968c/100a60a7fb85da8ab3813fd071a82c93f2c3f318-1300x650.png" alt="Sequências temporais de histórias ao longo do mês de fevereiro de 2025" /><p><em>Cadeias temporais de histórias que fluem ao longo de fevereiro de 2025. Cada caminho colorido representa uma história que persiste ao longo dos dias; com a largura indicando a força de sobreposição do kNN.</em></p><h2>O que essa abordagem oferece</h2><p>Esta análise abordou um pipeline completo de clustering de documentos não supervisionado construído no Elasticsearch:</p><ol><li><p><strong>Embeddings de clustering</strong>: os adaptadores específicos de tarefa do Jina v5 produzem embeddings otimizadas para agrupamento de tópicos, e não apenas para correspondência de consulta-documento.</p></li><li><p><strong>Clustering de descoberta global</strong>: clustering o mês inteiro em um único índice maximiza a descoberta de tópicos ao longo dos dias.</p></li><li><p><strong>Classificação de centroides com base na densidade</strong>: amostra 5%, sondar a densidade via <code>msearch</code> kNN, selecionar sementes diversas de alta densidade, classificar todos os documentos em relação aos centroides. O Elasticsearch cuida do processamento pesado; apenas a seleção de sementes executa do lado do cliente (~0,01s).</p></li><li><p><a href="https://www.elastic.co/docs/reference/aggregations/search-aggregations-bucket-significanttext-aggregation"><strong><code>significant_text</code></strong></a> <strong>rotulagem</strong>: o teste de significância produz rótulos de cluster significativos sem qualquer modelo de ML ou anotação manual. Clusters que não produzem termos significativos são incoerentes e são rebaixados a ruído, uma porta de qualidade integrada.</p></li><li><p><strong>Vinculação temporal de histórias</strong>: índices diários e kNN de índice cruzado entre amostra e consulta rastreiam como as histórias evoluem ao longo do tempo.</p></li></ol><p><strong>Principais conclusões:</strong></p><ul><li><p>O tipo de tarefa de incorporação importa: embeddings de clustering produzem grupos tópicos mensuravelmente mais compactos.</p></li><li><p>O Elasticsearch pode atuar tanto como camada de armazenamento <em>quanto</em> como motor de clustering por meio da <a href="https://www.elastic.co/docs/solutions/search/vector/knn">busca kNN</a>.</p></li><li><p>A classificação de centroides baseada em densidade mantém quase toda a computação no lado do servidor e produz clusters com tamanhos naturais determinados pela densidade do espaço de incorporação.</p></li><li><p><code>significant_text</code> é rápido, compreensível e eficaz tanto para autorrotulagem quanto para controle de qualidade.</p></li></ul><p><strong>Quando essa abordagem é útil:</strong></p><ul><li><p>Você tem texto com carimbo de data e hora e quer descobrir tópicos sem dados de treinamento rotulados.</p></li><li><p>Você precisa de uma plataforma para armazenamento, busca vetorial, rotulagem e ligação temporal.</p></li></ul><p><strong>Extensões para explorar:</strong></p><ul><li><p>Clustering por múltiplos períodos (semanal, pacotes mensais).</p></li><li><p>Ingestão em tempo real com atribuição incremental de cluster.</p></li><li><p>Resumos de cluster gerados pelo LLM usando os termos significant_text como sementes.</p></li><li><p>Em escala maior, centroides KMeans mostrados podem servir como sementes de aquecimento para clustering baseado em densidade, reduzindo o custo da fase da sonda.</p></li></ul><h2>Experimente você mesmo</h2><p>Troque seu próprio corpus de documentos com carimbo de data; qualquer coleção de texto com datas funciona com esse pipeline. O notebook completo e o código de suporte estão disponíveis no <a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/unsupervised-document-clustering-elasticsearch-jina-embeddings">repositório complementar</a>.</p><ul><li><p><a href="https://cloud.elastic.co/registration?onboarding_token=vectorsearch&amp;cta=cloud-registration&amp;tech=trial&amp;plcmt=article%20content&amp;pg=search-labs"><strong>Inicie uma avaliação gratuita do Elastic Cloud</strong></a>: instale um cluster gerenciado com suporte <code>bbq_disk</code> em questão de minutos.</p></li><li><p><a href="https://www.elastic.co/elasticsearch/serverless"><strong>Experimente o Elasticsearch Serverless</strong></a>: sem gerenciamento de cluster, escala automática e com suporte.</p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/unsupervised-document-clustering-elasticsearch-jina-embeddings</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/unsupervised-document-clustering-elasticsearch-jina-embeddings</guid>
    <category><![CDATA[Banco de dados vetorial]]></category>
    <category><![CDATA[Pesquisa de aprendizado de máquina]]></category>
    <category><![CDATA[Jina AI]]></category>
    <dc:creator><![CDATA[Matthew Adams]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4bd7dd10a7cd6dc8/6a17094a14b270581de3c5b6/662c00694c3e0c2fb2128098bdb6813df9e86a72-1280x720.png" length="0" type="image/png"/>
    <pubDate>Fri, 10 Apr 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Automatização da análise de logs no Streams com ML]]></title>
    <description><![CDATA[Descubra como uma abordagem híbrida de ML alcançou 94% de precisão na análise de logs e 91% na partição de logs por meio de experimentos de automação com impressão digital de formato de log no Streams.]]></description>
    <content:encoded><![CDATA[<p>Nas pilhas modernas de observabilidade, a ingestão de logs não estruturados de diversos provedores de dados em plataformas como o Elasticsearch continua sendo um desafio. A dependência de regras de análise sintática criadas manualmente gera fluxos de trabalho frágeis, onde até mesmo pequenas atualizações no código upstream levam a falhas de análise e dados não indexados. Esta fragilidade é agravada pelo desafio da escalabilidade: em ambientes dinâmicos de microsserviços, a adição contínua de novos serviços transforma a manutenção manual de regras em um pesadelo operacional.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte8f5bd0e4986b04c/6a170e6acdacbf612e7d2a9e/9108ec303339dd091faa3c363c7cf5c228155f49-3840x2160.png" alt="" /><p>Nosso objetivo era fazer a transição para uma abordagem automatizada e adaptativa capaz de lidar com a análise de logs (extração de campos) e o particionamento de logs (identificação da fonte). Nossa hipótese é que os grandes modelos de linguagem (LLMs), com a compreensão inerente da sintaxe do código e dos padrões semânticos, poderiam automatizar essas tarefas com o mínimo de intervenção humana.</p><p>Temos o prazer de anunciar que esse recurso já está disponível no <a href="http://elastic.co/elasticsearch/streams"><u>Streams</u></a>!</p><h2>Descrição do conjunto de dados</h2><p>Escolhemos uma coleção de logs do <a href="https://github.com/logpai/loghub"><strong>Loghub</strong></a>para fins de PoC. Para nossa investigação, selecionamos amostras representativas das seguintes áreas-chave:</p><ul><li><p>Sistemas distribuídos: utilizamos os conjuntos de dados HDFS (Hadoop Distributed File System) e Spark. Esses contêm uma mistura de informações, mensagens de debug e erros típicos das plataformas de big data.</p></li><li><p>Servidores e aplicações web: logs dos servidores web Apache e do OpenSSH forneceram uma fonte valiosa de acesso, erro e eventos relevantes para a segurança. Esses são fundamentais para monitorar o tráfego web e detectar ameaças potenciais.</p></li><li><p>Sistemas operacionais: incluímos logs do Linux e do Windows. Esses conjuntos de dados representam os eventos comuns e semiestruturados em nível de sistema que as equipes de operações enfrentam diariamente.</p></li><li><p>Sistemas móveis: para garantir que nosso modelo pudesse lidar com logs de ambientes móveis, incluímos o conjunto de dados Android. Esses logs costumam ser extensos e captam uma ampla gama de atividades em nível de aplicação e sistema em dispositivos móveis.</p></li><li><p>Supercomputadores: para testar o desempenho em ambientes de computação de alto desempenho (HPC), incorporamos o conjunto de dados BGL (Blue Gene/L), que apresenta logs altamente estruturados com terminologia específica de domínio.</p></li></ul><p>Uma das principais vantagens da coleção Loghub é que os logs são, em grande parte, não higienizados e não rotulados, espelhando um ambiente de produção real e ruidoso com arquitetura de microsserviços.</p><p>Exemplos de logs:</p>[Sun Dec 04 20:34:21 2005] [notice] jk2_init() Found child 2008 in scoreboard slot 6
[Sun Dec 04 20:34:25 2005] [notice] workerEnv.init() ok /etc/httpd/conf/workers2.properties
[Mon Dec 05 11:06:51 2005] [notice] workerEnv.init() ok /etc/httpd/conf/workers2.properties
17/06/09 20:10:58 INFO output.FileOutputCommitter: Saved output of task 'attempt_201706092018_0024_m_000083_1138' to hdfs://10.10.34.11:9000/pjhe/test/1/_temporary/0/task_201706092018_0024_m_000083
17/06/09 20:10:58 INFO mapred.SparkHadoopMapRedUtil: attempt_201706092018_0024_m_000083_1138: Committed<p>Além disso, criamos um cluster Kubernetes com uma configuração típica de aplicação web + banco de dados para minerar logs extras no domínio mais comum.</p><p>Exemplo de campos de log comuns: carimbo de tempo, nível de log (INFO, AVISO, ERRO), origem, mensagem.</p><h2>Análise de logs com poucos exemplos usando um LLM</h2><p>Nosso primeiro conjunto de experimentos concentrou-se em uma questão fundamental: <strong>Um LLM pode identificar áreas-chave de forma confiável e gerar regras consistentes de análise para extraí-las?</strong></p><p>Solicitamos a um modelo que analisasse amostras de registros brutos e gerasse regras de análise sintática de log nos formatos de expressão regular (regex) e <a href="https://www.elastic.co/docs/explore-analyze/scripting/grok">Grok</a>. Nossos resultados mostraram que essa abordagem tem muito potencial, mas também apresenta desafios significativos de implementação.</p><h3>Alto nível de confiança e consciência contextual</h3><p>Os resultados iniciais foram promissores. O LLM demonstrou uma forte habilidade de gerar regras de análise sintática que correspondiam aos exemplos de poucos disparos fornecidos com alta confiança. Além da simples correspondência de padrões, o modelo demonstrou capacidade de compreensão de logs, pois ele conseguiu identificar e nomear corretamente a fonte do log (por exemplo, aplicativo de monitoramento de saúde, aplicativo web Nginx, banco de dados MongoDB).</p><h3>O dilema "Cachinhos Dourados" das amostras de entrada</h3><p>Nossos experimentos logo revelaram uma falta significativa de robustez devido à extrema<strong> sensibilidade à amostra de entrada.</strong> O desempenho do modelo varia muito com base nos exemplos específicos de logs incluídos no prompt. Observamos um problema de similaridade de log, onde a amostra de logs precisa incluir <em>logs diversos: </em></p><ul><li><p>Homogeneidade excessiva (sobreajuste)<strong>:</strong> se os logs de entrada forem muito semelhantes, o LLM tende a <strong>superespecificar</strong>. Ele trata dados de variáveis, como nomes específicos de classes Java em um rastreio de pilha, como partes estáticas do template. Isso resulta em regras frágeis que cobrem uma proporção minúscula de logs e extraem campos inutilizáveis.</p></li><li><p>Muito heterogêneo (confusão): por outro lado, se a amostra contiver uma variação significativa de formatação, ou pior, "registros de lixo" como barras de progresso, tabelas de memória ou arte ASCII, o modelo terá dificuldades para encontrar um denominador comum. Geralmente, ele recorre à geração de expressões regulares complexas e quebradas ou à generalização lenta de toda a linha em um único campo blob de mensagem.</p></li></ul><h3>A restrição da janela de contexto</h3><p>Também encontramos um gargalo na janela de contexto. Quando os registros de entrada eram longos, heterogêneos ou ricos em campos extraíveis, a saída do modelo geralmente se deteriorava, tornando-se "confusa" ou muito longa para caber na janela de contexto de saída. Naturalmente, a fragmentação ajuda nesse caso. Ao dividir os logs usando delimitadores baseados em caracteres e em entidades, podemos ajudar o modelo a se concentrar na extração dos campos principais sem ser sobrecarregado por ruídos.</p><h3>A lacuna de consistência e padronização</h3><p>Mesmo quando o modelo gerou regras com sucesso, notamos pequenas inconsistências:</p><ul><li><p>Variações de nomenclatura de serviço: o modelo propõe diferentes nomes para a mesma entidade (por exemplo, rotulando a fonte como "Spark", "Apache Spark" e "Spark Log Analytics" em diferentes execuções).</p></li><li><p>Variações na nomenclatura dos campos: os nomes dos campos não tinham padronização (por exemplo, <code>id</code> X <code>service.id</code> X <code>device.id</code>). Normalizamos os nomes usando uma <a href="https://www.elastic.co/docs/reference/ecs/ecs-field-reference">nomenclatura de campo padronizada do Elastic</a>.</p></li><li><p>Variância de resolução: a resolução da extração de campo variava dependendo de o quão semelhantes eram os logs de entrada entre si.</p></li></ul><h2>Formato de log impressão digital</h2><p>Para enfrentar o desafio da similaridade de log, apresentamos uma heurística de alto desempenho: <strong>impressão digital de formato de log (LFF)</strong>.</p><p>Em vez de inserir logs brutos e ruidosos diretamente em um LLM, primeiro aplicamos uma transformação determinística para revelar a estrutura subjacente de cada mensagem. Essa etapa de pré-processamento abstrai os dados das variáveis, gerando uma "impressão digital" simplificada que nos permite agrupar logs relacionados.</p><p>A lógica de mapeamento é simples para garantir velocidade e consistência:</p><ol><li><p>Abstração de dígitos: qualquer sequência de dígitos (0-9) é substituída por um único "0".</p></li><li><p>Abstração de texto: qualquer sequência de caracteres alfabéticos com espaço em branco é substituída por um único "a".</p></li><li><p>Normalização de espaço em branco: todas as sequências de espaço em branco (espaços, tabulações, novas linhas) são reduzidos a um único espaço.</p></li><li><p>Preservação de símbolos: pontuação e caracteres especiais (por exemplo, :, [, ], /) são preservados, pois normalmente são os indicadores mais fortes da estrutura log.</p></li></ol><p>Apresentamos a abordagem de mapeamento de log. Os padrões básicos de mapeamento incluem os seguintes:</p><ul><li><p>Dígitos de 0 a 9 de qualquer comprimento -&gt; até "0".</p></li><li><p>Texto (caracteres alfabéticos com espaços) de qualquer comprimento -&gt; para "a".</p></li><li><p>Espaços em branco, abas e novas linhas -&gt; para um único espaço.</p></li></ul><p>Vamos ver um exemplo de como esse mapeamento nos permite transformar os logs.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf91eebab0ad79ccd/6a170e6c67045ba94f45c29c/78fa2887486eb9417804354ee3bf2a4fdb0f6383-846x252.png" alt="" /><p>Como resultado, obtemos as seguintes máscaras de log:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt438d74dcb921578b/6a170e6d1949f74aa0e7aae3/ec439a3d3a25002498b97defcff733ea5ebc6b55-826x94.png" alt="" /><p>Observe as impressões digitais dos dois primeiros logs. Apesar dos diferentes carimbos de data e hora, classes de origem e conteúdo da mensagem, os prefixos (<code>0/0/0 0:0:0 a a.a:</code>) são idênticos. Esse alinhamento estrutural nos permite colocar automaticamente esses logs em buckets no mesmo cluster.</p><p>O terceiro log, no entanto, produz uma impressão digital completamente divergente (<code>0-0-0...</code>). Isso nos permite separá-lo algoritmicamente do primeiro grupo <em>antes</em> mesmo de invocarmos um LLM.</p><h2>Parte bônus: Implementação instantânea com ES|QL</h2><p>É tão simples quanto passar essa consulta no Discover.</p><p><strong>Detalhamento da consulta:</strong></p><p><strong>DE</strong> loghub: direcionado para nosso índice contendo os dados de registro bruto.</p><p>Padrão <strong>EVAL</strong> = ...: a lógica de mapeamento do núcleo. Encadeamos funções REPLACE para realizar a abstração (por exemplo, dígitos para '0', texto para 'a', etc.) e salvamos o resultado em um campo "padrão".</p><p><strong>STATS </strong>[column1 =] expression1, …<strong> POR </strong>SUBSTRING(pattern, 0, 15):</p><p>Esta é uma etapa de clustering. Agrupamos logs que compartilham os primeiros 15 caracteres de seu padrão e criamos campos agregados, como contagem total de log por grupo, lista de fontes de dados de log, prefixo do padrão, 3 exemplos de log</p><p><strong>SORT</strong> total_count DESC | <strong>LIMITE</strong> 100: destaca os 100 padrões de log mais frequentes</p><p>Os resultados das consultas no LogHub estão exibidos abaixo:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfa3960cf94ccf331/6a170e6fdc55decfa3e00e7c/b119498f124376c41d242a099bf9081fd6536be8-1600x394.png" alt="Resultados da consulta de análise de logs no LogHub." /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2dbcde2a22e06367/6a170e71961e693a18c4cfb6/4dcfc0a5b7fa753497cc5def5ea3cd54449c0481-1600x719.png" alt="" /><p>Como demonstrado na visualização, essa abordagem "livre de LLM" particiona logs com alta precisão. Ela agrupou com sucesso 10 das 16 fontes de dados (com base nos rótulos do LogHub) (&gt;90%) e alcançou clustering majoritário em 13 das 16 fontes (&gt;60%), tudo isso sem necessidade de limpeza adicional, pré-processamento nem ajuste fino.</p><p>A impressão digital do formato de Log oferece uma alternativa pragmática e de alto impacto, além de ser um complemento para soluções sofisticadas de ML, como <a href="https://www.elastic.co/docs/reference/aggregations/search-aggregations-bucket-categorize-text-aggregation">a análise de padrões de log</a>. Ele fornece insights imediatos sobre relacionamentos de logs e gerencia efetivamente grandes clusters de logs.</p><ul><li><p>Versatilidade como primitiva </p></li></ul><p>Graças à implementação do <a href="https://www.elastic.co/blog/getting-started-elasticsearch-query-language">ES|QL</a>, o LFF funciona tanto como uma ferramenta independente para diagnósticos/visualizações de dados rápidos, quanto como um componente essencial em pipelines de análise de logs para casos de uso de alto volume. </p><ul><li><p>Flexibilidade</p></li></ul><p>O LFF é fácil de personalizar e estender para captar padrões específicos, ou seja, números hexadecimais e endereços IP.</p><ul><li><p>Estabilidade determinística</p></li></ul><p>Ao contrário dos algoritmos de clustering baseados em ML, a lógica LFF é direta e determinística. Novos logs recebidos não afetam retroativamente os clusters de logs existentes.</p><ul><li><p>Desempenho e memória</p></li></ul><p>Requer memória mínima, sem treinamento nem GPU, tornando-o ideal para ambientes de alta taxa em tempo real.</p><h2>Combinando a impressão digital do formato de log com um LLM</h2><p>Para validar a arquitetura híbrida proposta, cada experimento continha um subconjunto aleatório de 20% dos registros de cada fonte de dados. Essa restrição simula um ambiente de produção real onde os logs são processados em lotes, em vez de um despejo histórico monolítico.</p><p>O objetivo era demonstrar que o LFF atua como uma camada de compressão eficaz. Nosso objetivo era provar que regras de análise de alta cobertura poderiam ser geradas a partir de amostras pequenas e selecionadas e generalizadas com sucesso para todo o conjunto de dados.</p><h2>Pipeline de execução</h2><p>Implementamos um pipeline de múltiplas etapas que filtra, agrupa e aplica amostragem estratificada aos dados antes que cheguem ao LLM.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt26635762891b3a41/6a170e73509168eea4e1bb91/b3f46ea471760b406a32fc7d4bc74cc03faaced2-3840x1660.png" alt="" /><p>1. Clustering hierárquico em dois estágios</p><ul><li><p>Subclasses (correspondência exata): os logs são agregados por impressões digitais idênticas. Todo log em uma subclasse compartilha exatamente a mesma estrutura de formato.</p></li><li><p>Limpeza de discrepâncias. Nós descartamos quaisquer subclasses que representam menos de 5% do volume total de log. Isso garante que o LLM se concentre no sinal dominante e não seja desviado por ruído ou logs malformados.</p></li><li><p>Metaclasses (correspondência de prefixo): as subclasses restantes são agrupadas em metaclasses pelos primeiros N caracteres da correspondência da impressão digital do formato. Essa estratégia de agrupamento divide efetivamente formatos lexicalmente semelhantes sob uma mesma categoria. Escolhemos N=5 para análise de log e N=15 para particionamento de log quando as fontes de dados são desconhecidas.</p></li></ul><p>2. Amostragem estratificada. Após a construção da árvore hierárquica, construímos a amostra de log para o LLM. O objetivo estratégico é maximizar a cobertura de variações enquanto minimiza o uso de tokens.</p><ul><li><p>Selecionamos logs representativos de <em>cada</em> subclasse válida dentro da metaclasse mais ampla.</p></li><li><p>Para gerenciar um caso extremo de subclasses muito numerosas, aplicamos subamostragem aleatória para ajustar ao tamanho da janela alvo.</p></li></ul><p>3. Geração de regras Final, solicitamos ao LLM que gere uma regra de análise regex que se encaixe em todos os logs da amostra fornecida para cada metaclasse. Para nossa PoC, usamos o modelo mini GPT-4o.</p><h2>Resultados experimentais e observações</h2><p>Alcançamos 94% de precisão de análise sintática e 91% de precisão de particionamento no conjunto de dados do Loghub.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1b896b41b3b70e7e/6a170e757d8d67601a70e7d9/49b2b6a1401dd1f33951da68e5a3fac37d0b5aaa-1600x1506.png" alt="Cerca de 94% de precisão de análise sintática e 91% de precisão de particionamento no conjunto de dados do Loghub." /><p>A matriz de confusão acima ilustra os resultados da partição log. O eixo vertical representa as fontes de dados reais e o eixo horizontal representa as fontes de dados previstas. A intensidade do heatmap corresponde ao volume do log, com blocos mais claros indicando uma contagem maior. O alinhamento diagonal demonstra a alta fidelidade do modelo na atribuição da fonte, com espalhamento mínimo.</p><h2>Nossos insights sobre benchmarks de desempenho:</h2><ul><li><p><strong>Linha de base ideal:</strong> uma janela de contexto de <strong>30 a 40 amostras de log</strong> por categoria provou ser o ponto ideal, produzindo consistentemente uma análise robusta com padrões Regex e Grok.</p></li><li><p><strong>Minimização da entrada:</strong> aumentamos o tamanho da entrada para 10 registros por categoria para padrões Regex e observamos uma queda de apenas 2% no desempenho da análise, confirmando que a amostragem baseada na diversidade é mais importante do que o volume bruto.</p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/log-parsing-partitioning-automation-experiments-streams</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/log-parsing-partitioning-automation-experiments-streams</guid>
    <category><![CDATA[Pesquisa de aprendizado de máquina]]></category>
    <category><![CDATA[AI]]></category>
    <dc:creator><![CDATA[Nastia Havriushenko]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc1df5a7cae463d59/6a170e76a6c2b907d7e797ab/965c58f19742361160593c38fcaa8b2f4b0d6cc5-3838x2159.png" length="0" type="image/png"/>
    <pubDate>Fri, 02 Jan 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Geração de filtros e facetas usando aprendizado de máquina.]]></title>
    <description><![CDATA[Explorando as vantagens e desvantagens de automatizar a criação de filtros e facetas em uma experiência de busca usando modelos de aprendizado de máquina versus a abordagem clássica de codificação fixa.]]></description>
    <content:encoded><![CDATA[<p>Filtros e facetas são mecanismos usados para refinar os resultados da pesquisa, ajudando os usuários a encontrar conteúdo ou produtos relevantes mais rapidamente. Na abordagem clássica, as regras são definidas manualmente. Por exemplo, em um catálogo de filmes, atributos como gênero são predefinidos para uso em filtros e facetas. Por outro lado, com modelos de IA, novos atributos podem ser extraídos automaticamente das características dos filmes, tornando o processo mais dinâmico e personalizado. Neste blog, exploramos as vantagens e desvantagens de cada método, destacando suas aplicações e desafios.</p><h2>Filtros vs facetas</h2><p>Antes de começarmos, vamos definir o que são filtros e facetas. <strong>Os filtros</strong> são atributos predefinidos usados para restringir um conjunto de resultados. Em um mercado online, por exemplo, os filtros estão disponíveis mesmo antes de uma busca ser realizada. O usuário pode selecionar uma categoria, como <strong>"Videogames"</strong>, antes de pesquisar por <strong>"PS5"</strong>, refinando a busca para um subconjunto mais específico em vez de toda a base de dados. Isso aumenta significativamente as chances de se obter resultados mais relevantes.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0a77b38aae238938/6a170b821949f72a52e7aa51/5ed8868fa5017d034e1273e35c884a5430afdf3c-1600x937.png" alt="Filtros" /><p><strong>Os facets</strong> funcionam de forma semelhante aos filtros, mas só ficam disponíveis após a realização da pesquisa. Em outras palavras, a pesquisa retorna resultados e, com base neles, é gerada uma nova lista de opções de refinamento. Por exemplo, ao pesquisar um console PS5, características como <strong>capacidade</strong> de armazenamento, <strong>custo de envio</strong> e <strong>cor</strong> podem ser exibidas para ajudar os usuários a escolher o produto ideal.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt166e356b80d423ef/6a170b840e2e494ca341a10f/c5633fcc5b6fbb916110faf32144d8d43572e33a-1600x937.png" alt="Facetas " /><p>Agora que definimos filtros e facetas, vamos discutir o impacto das abordagens clássicas e baseadas em Aprendizado de Máquina (ML) em sua implementação e uso. Cada método possui vantagens e desafios que influenciam a eficiência da busca.</p><h2>Abordagem clássica de filtros e facetas</h2><p>Nessa abordagem, os filtros e as facetas são definidos manualmente com base em regras predefinidas. Isso significa que os atributos disponíveis para refinar a busca são fixos e planejados antecipadamente, levando em consideração a estrutura do catálogo e as necessidades do usuário.</p><p>Por exemplo, em um marketplace, categorias como "Eletrônicos" ou "Moda" podem ter filtros específicos como marca, formato e faixa de preço. Essas regras são criadas estaticamente, garantindo consistência na experiência de busca, mas exigindo ajustes manuais sempre que novos produtos ou categorias surgirem.</p><p>Embora essa abordagem proporcione previsibilidade e controle sobre os filtros e facetas exibidos, ela pode ser limitada quando surgem novas tendências que exigem refinamento dinâmico.</p><p><strong>Prós:</strong></p><ul><li><p><strong>Previsibilidade e controle:</strong> Como os filtros e as facetas são definidos manualmente, o gerenciamento torna-se mais fácil.</p></li><li><p><strong>Baixa complexidade:</strong> Não há necessidade de treinar modelos.</p></li><li><p><strong>Facilidade de manutenção:</strong> Como as regras são predefinidas, ajustes e correções podem ser feitos rapidamente.</p></li></ul><p><strong>Contras</strong>:</p><ul><li><p><strong>Reindexação necessária para novos filtros:</strong> Sempre que um novo atributo precisar ser usado como filtro, todo o conjunto de dados deverá ser reindexado para garantir que os documentos contenham essa informação.</p></li><li><p><strong>Falta de adaptação dinâmica:</strong> os filtros são estáticos e não se ajustam automaticamente às mudanças no comportamento do usuário.</p></li></ul><h3>Implementação de filtros/facetas – Abordagem clássica</h3><p>Nas <strong>Ferramentas de Desenvolvimento, Kibana</strong>, criaremos uma demonstração de filtros/facetas usando a <strong>abordagem clássica</strong>.</p><p>Primeiro, definimos o mapeamento para estruturar o índice:</p>PUT videogames
{
  "mappings": {
    "properties": {
      "name": { "type": "text" },
      "brand": { "type": "keyword" },
      "storage": { "type": "keyword" },
      "price": { "type": "float" },
      "description": { "type": "text" }
    }
  }
}<p>Os campos <strong>de marca</strong> e <strong>armazenamento</strong> são definidos como <strong>palavras-chave</strong>, permitindo que sejam usados diretamente em agregações (<strong>facetas</strong>). O campo <strong>de preço</strong> é do tipo <strong>float</strong>, permitindo a criação de <strong>intervalos de preço</strong>.</p><p>Na próxima etapa, os dados do produto serão indexados:</p>POST videogames/_bulk
{ "index": { "_id": 1 } }
{ "name": "Play Station 5", "brand": "Sony", "storage": "1TB", "price": 499.99, "description": "Stunning Gaming: Marvel at stunning graphics and experience the features of the new PS5. Breathtaking Immersion: Discover a deeper gaming experience with support for haptic feedback, adaptive triggers, and 3D Audio technology. Slim Design: With the PS5 Digital Edition, gamers get powerful gaming technology in a sleek, compact design. 1TB of Storage: Have your favorite games ready and waiting for you to play with 1TB of built-in SSD storage. Backward Compatibility and Game Boost: The PS5 console can play over 4,000 PS4 games. With Game Boost, you can even enjoy faster, smoother frame rates in some of the best PS4 console games." }
{ "index": { "_id": 2 } }
{ "name": "Xbox Series X", "brand": "Microsoft", "storage": "1TB", "price": 499.99, "description": "Fastest, most powerful Xbox console ever. Play thousands of titles: Every game looks and plays better on Xbox Series X. At the heart of Series X is the Xbox Velocity. Architecture, which combines a custom SSD and built-in software to significantly reduce load times in and out of game. Switch between multiple games in an instant with Quick Resume. Explore new worlds and experience the action like never before with an unparalleled 12 teraflops of graphics processing power. Enjoy 4K gaming at up to 120 frames per second, premium advanced 3D sound, and more. 4K at 120 FPS: requires compatible content and display X version - with disc drive" }
{ "index": { "_id": 3 } }
{ "name": "Nintendo Switch", "brand": "Nintendo", "storage": "512GB", "price": 299.99, "description": "SHARPER, VIBRANT VISUALS. The new 7-inch screen on the Nintendo Switch OLED takes your gaming to the next level: vibrant colors with sharp contrasts for every moment. INTEGRATED GAMEPLAY. Enjoy the console's many multiplayer modes and connect with other players. Online or locally, the fun on the Nintendo Switch is guaranteed. ENJOY IMMERSION FOR LONGER. In addition to delivering an unparalleled experience, thanks to its improved audio, the Nintendo Switch has a rechargeable battery while you play. From 4.5 hours to 9 hours of battery life. INCLUDES SUPER MARIO BROS. WONDER. Transform your world with the phenomenal flowers in this new Mario game, full of amazing adventures, power-ups and new abilities. NINTENDO SWITCH ONLINE SUBSCRIPTION. Access online games, play with friends and enjoy the exclusive benefits of the Nintendo Switch Online subscription." }
{ "index": { "_id": 4 } }
{ "name": "Steam Deck", "brand": "Valve", "storage": "512GB", "price": 399.99, "description": "You can save games, apps, photos and videos without worrying about space. High-Level Performance: The 4-core processor and graphics ensure a dynamic experience and fast responses. High-Definition Images: Smooth transitions and sharp images provide complete immersion in the game. Wireless Connectivity: Wi-Fi technology allows you to play wherever you want, without wires or cables limiting your fun" }
{ "index": { "_id": 5 } }
{ "name": "Nintendo Switch Lite", "brand": "Nintendo", "storage": "512GB", "price": 299.99, "description": "MADE TO BE PORTABLE. Nintendo Switch Lite is designed specifically for portable gaming. The console lets you jump into your favorite games wherever you are. COMPACT AND LIGHTWEIGHT. With its sleek, lightweight design, this console is ready to hit the road wherever you are. COMPATIBLE GAMES. The Nintendo Switch Lite system plays the library of Nintendo Switch games that work in handheld mode. A WORLD OF COLOR TO CHOOSE FROM. Available in a variety of vibrant and unique colors, Nintendo Switch Lite lets you bring even more personality wherever you go." }<p>Agora, vamos recuperar as características clássicas agrupando os resultados por marca, armazenamento e faixa de preço. Na consulta, foi definido o tamanho:0. Nesse cenário, o objetivo é recuperar apenas os resultados da agregação, sem incluir os documentos correspondentes à consulta.</p>POST videogames/_search
{
  "size": 0,
  "aggs": {
    "brands": {
      "terms": { "field": "brand" }
    },
    "storage_sizes": {
      "terms": { "field": "storage" }
    },
    "price_ranges": {
      "range": {
        "field": "price",
        "ranges": [
          { "to": 300 },   
          { "from": 300, "to": 500 },  
          { "from": 500 }  
        ]
      }
    }
  }
}<p>A resposta incluirá contagens para <strong>Marca</strong>, <strong>Armazenamento</strong> e <strong>Preço</strong>, ajudando a criar filtros e segmentações.</p>"aggregations": {
   "brands": {
     "doc_count_error_upper_bound": 0,
     "sum_other_doc_count": 0,
     "buckets": [
       {
         "key": "Microsoft",
         "doc_count": 1
       },
       {
         "key": "Nintendo",
         "doc_count": 1
       },
       {
         "key": "Sony",
         "doc_count": 1
       },
       {
         "key": "Valve",
         "doc_count": 1
       }
     ]
   },
   "storage_sizes": {
     "doc_count_error_upper_bound": 0,
     "sum_other_doc_count": 0,
     "buckets": [
       {
         "key": "1TB",
         "doc_count": 2
       },
       {
         "key": "512GB",
         "doc_count": 2
       }
     ]
   },
   "price_ranges": {
     "buckets": [
       {
         "key": "*-300.0",
         "to": 300,
         "doc_count": 1
       },
       {
         "key": "300.0-500.0",
         "from": 300,
         "to": 500,
         "doc_count": 3
       },
       {
         "key": "500.0-*",
         "from": 500,
         "doc_count": 0
       }
     ]
   }
 }<h2>Abordagem baseada em machine learning/IA para filtros e facetas</h2><p>Nessa abordagem, modelos de Aprendizado de Máquina (ML), incluindo técnicas de Inteligência Artificial (IA), analisam atributos de dados para gerar filtros e facetas relevantes. Em vez de depender de regras predefinidas, o aprendizado de máquina/inteligência artificial aproveita as características dos dados indexados. Isso possibilita a descoberta dinâmica de novas facetas e filtros.</p><p><strong>Prós</strong>:</p><ul><li><p><strong>Atualizações automáticas:</strong> Novos filtros e facetas são gerados automaticamente, sem a necessidade de ajustes manuais.</p></li><li><p><strong>Descoberta de novos atributos:</strong> Pode identificar características de dados <strong>anteriormente não consideradas </strong>como filtros, enriquecendo a experiência de busca.</p></li><li><p><strong>Redução do esforço manual:</strong> a equipe não precisa definir e atualizar constantemente as regras de filtragem, pois a IA aprende com os dados disponíveis.</p></li></ul><p><strong>Contras:</strong></p><ul><li><p><strong>Complexidade de manutenção:</strong> O uso de modelos pode exigir pré-validação para garantir a consistência dos filtros gerados.</p></li><li><p><strong>Requer experiência em aprendizado de máquina e inteligência artificial:</strong> A solução exige profissionais qualificados para ajustar e monitorar o desempenho do modelo.</p></li><li><p><strong>Risco de filtros irrelevantes:</strong> Se o modelo não estiver bem calibrado, poderá gerar facetas que não sejam úteis para os usuários.</p></li><li><p><strong>Custo:</strong> O uso de aprendizado de máquina e inteligência artificial pode exigir serviços de terceiros, aumentando os custos operacionais.</p></li></ul><p>Vale ressaltar que, mesmo com um modelo bem calibrado e um prompt bem elaborado, as facetas geradas ainda devem passar por uma etapa de revisão. Essa validação pode ser manual ou baseada em regras de moderação, garantindo que o conteúdo seja apropriado e seguro. Embora não seja necessariamente uma desvantagem, é importante considerar a qualidade e a adequação dos recursos antes que sejam disponibilizados aos usuários.</p><h3>Implementação de filtros/facetas – abordagem de IA</h3><p>Nesta demonstração, utilizaremos um modelo de IA para analisar automaticamente as características do produto e sugerir atributos relevantes. Com um prompt bem estruturado, extraímos informações do catálogo e as transformamos em filtros e facetas. A seguir, apresentamos cada etapa do processo.</p><p>Inicialmente, usaremos a <strong>API de Inferência</strong> para registrar um endpoint para integração com um serviço de aprendizado de máquina. Abaixo, segue um exemplo de integração com <strong>o serviço da OpenAI</strong>.</p>PUT _inference/completion/generate_filter_ia
{
   "service": "openai",
   "service_settings": {
       "api_key": "your-key",
       "model_id": "gpt-4o-mini"
   }
}<p>Agora, definimos o pipeline para executar o prompt e obter os novos filtros gerados pelo modelo.</p>PUT /_ingest/pipeline/generate_filter_ai
{
   "processors": [
     {
       "script": {
         "source": """ctx.prompt = "You are an expert in data organization for search and product categorization. Your task is to analyze the following product and identify the best dynamic facets that can be used in an e-commerce search experience. Product: " + ctx.name + "description: " + ctx.description + "Instructions: - Analyze the product name and description. - Extract only the dynamic facets (technological features or product characteristics that can be inferred from the description, try to create max 3 facets by characteristics found). Put the values into an array. Using key and value, e.g. dynamic_facets: [{ \"name\": \"Gaming Experience\", \"value\": \"Haptic Feedback\" },{ \"name\": \"Gaming Experience\", \"value\": \"Adaptive Triggers\" } - Return only a JSON."
         """
       }
     },
     {
       "inference": {
         "model_id": "generate_filter_ia",
         "input_output": {
           "input_field": "prompt",
           "output_field": "result"
         }
       }
     },
     {
       "gsub": {
         "field": "result",
         "pattern": "```json",
         "replacement": ""
       }
     },
     {
       "json" : {
         "field" : "result",
         "strict_json_parsing": false,
         "add_to_root" : true
       }
     },
     {
       "remove": {
         "field": "result"
       }
     },
     {
       "remove": {
         "field": "prompt"
       }
     }
   ]
}<p>Executando uma simulação desse pipeline para o produto "PlayStation 5", com a seguinte descrição:</p><p><em>Jogabilidade impressionante: Maravilhe-se com gráficos deslumbrantes e experimente os recursos do novo PS5.</em></p><p><em>Imersão de tirar o fôlego: Descubra uma experiência de jogo mais profunda com suporte para feedback tátil, gatilhos adaptáveis e tecnologia de áudio 3D.</em></p><p><em>Design fino: Com o PS5 Digital Edition, os jogadores têm acesso a uma poderosa tecnologia de jogos em um design elegante e compacto.</em></p><p><em>1 TB de armazenamento: Tenha seus jogos favoritos prontos para jogar com 1 TB de armazenamento SSD integrado.</em></p><p><em>Compatibilidade com versões anteriores e Game Boost: O console PS5 pode rodar mais de 4.000 jogos de PS4. Com o Game Boost, você pode desfrutar de taxas de quadros mais rápidas e suaves até mesmo em alguns dos melhores jogos para PS4.</em></p><p>Vamos observar a saída de comando gerada por esta simulação.</p>{
 "docs": [
   {
     "doc": {
       "_index": "index",
       "_version": "-3",
       "_id": "1",
       "_source": {
         "name": "Play Station 5",
         "result": """```json
{
 "dynamic_facets": [
   { "name": "Storage Capacity", "value": "1TB SSD" },
   { "name": "Graphics Technology", "value": "Stunning Graphics" },
   { "name": "Audio Technology", "value": "3D Audio" }
 ]
}
```""",
         "description": "Stunning Gaming: Marvel at stunning graphics and experience the features of the new PS5. Breathtaking Immersion: Discover a deeper gaming experience with support for haptic feedback, adaptive triggers, and 3D Audio technology. Slim Design: With the PS5 Digital Edition, gamers get powerful gaming technology in a sleek, compact design. 1TB of Storage: Have your favorite games ready and waiting for you to play with 1TB of built-in SSD storage. Backward Compatibility and Game Boost: The PS5 console can play over 4,000 PS4 games. With Game Boost, you can even enjoy faster, smoother frame rates in some of the best PS4 console games.",
         "model_id": "generate_filter_ia",
         "prompt": """You are an expert in data organization for search and product categorization. Your task is to analyze the following product and identify the best dynamic facets that can be used in an e-commerce search experience. Product: Play Station 5description: Stunning Gaming: Marvel at stunning graphics and experience the features of the new PS5. Breathtaking Immersion: Discover a deeper gaming experience with support for haptic feedback, adaptive triggers, and 3D Audio technology. Slim Design: With the PS5 Digital Edition, gamers get powerful gaming technology in a sleek, compact design. 1TB of Storage: Have your favorite games ready and waiting for you to play with 1TB of built-in SSD storage. Backward Compatibility and Game Boost: The PS5 console can play over 4,000 PS4 games. With Game Boost, you can even enjoy faster, smoother frame rates in some of the best PS4 console games.Instructions: - Analyze the product name and description. - Extract only the dynamic facets (technological features or product characteristics that can be inferred from the description, try create max 3 facets by characteristics found). Put the values like arrays. Using key and value, e.g. dynamic_facets: [{ "name": "Gaming Experience", "value": "Haptic Feedback" },{ "name": "Gaming Experience", "value": "Adaptive Triggers" } - Return only a JSON."""
       },
       "_ingest": {
         "timestamp": "2025-03-19T22:14:32.0161803Z"
       }
     }
   }
 ]
}<p>Agora, um novo campo, <strong>dynamic_facets</strong>, será adicionado ao novo índice para armazenar as facetas geradas pela IA.</p>PUT videogames_1
{
 "mappings": {
   "properties": {
     "name": { "type": "text" },
     "brand": { "type": "keyword" },
     "storage": { "type": "keyword" },
     "price": { "type": "float" },
     "description": { "type": "text" },
     "dynamic_facets": { "type": "nested",
     "properties": { "name": { "type": "keyword" },
                     "value": { "type": "keyword" } } }
   }
 }
}<p>Utilizando a <strong>API Reindex</strong>, vamos reindexar o índice <strong>de videogames</strong> para <strong>videogames_1</strong>, aplicando o pipeline <strong>generate_filter_ai</strong> durante o processo. Este pipeline irá gerar automaticamente facetas dinâmicas durante a indexação.</p>POST _reindex?wait_for_completion=false
{
 "source": {
   "index": "videogames"
 },
 "dest": {
   "index": "videogames_1",
   "pipeline": "generate_filter_ai"
 }
}<p>Agora, vamos executar uma pesquisa e obter os novos filtros:</p>GET videogames_1/_search
{
 "size": 0,
 "query": {
   "match": {
     "name": "nintendo"
   }
 },
 "aggs": {
   "dynamic_facets": {
     "nested": {
       "path": "dynamic_facets"
     },
     "aggs": {
       "facets": {
         "terms": {
           "field": "dynamic_facets.name"
         },
         "aggs": {
           "facets": {
             "terms": {
               "field": "dynamic_facets.value"
             }
           }
         }
       }
     }
   }
 }
}<p>Resultados:</p>"aggregations": {
   "dynamic_facets": {
     "doc_count": 3,
     "facets": {
       "doc_count_error_upper_bound": 0,
       "sum_other_doc_count": 0,
       "buckets": [
         {
           "key": "Frame Rate",
           "doc_count": 1,
           "facets": {
             "doc_count_error_upper_bound": 0,
             "sum_other_doc_count": 0,
             "buckets": [
               {
                 "key": "120 FPS",
                 "doc_count": 1
               }
             ]
           }
         },
         {
           "key": "Gaming Resolution",
           "doc_count": 1,
           "facets": {
             "doc_count_error_upper_bound": 0,
             "sum_other_doc_count": 0,
             "buckets": [
               {
                 "key": "4K",
                 "doc_count": 1
               }
             ]
           }
         },
         {
           "key": "Graphics Processing Power",
           "doc_count": 1,
           "facets": {
             "doc_count_error_upper_bound": 0,
             "sum_other_doc_count": 0,
             "buckets": [
               {
                 "key": "12 Teraflops",
                 "doc_count": 1
               }
             ]
           }
         }
       ]
     }
   }
 }<p>Para simbolizar a implementação das facetas, segue abaixo um exemplo simples de interface:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb0d6aa40caf7a91a/6a170b86ab7f0839afdb9eb6/12b6d9d4f4d0985848d92841545fd22b7253ae6d-1600x1288.png" alt="implementação das facetas" /><p>O código da interface do usuário apresentado está <a href="https://gist.github.com/andreluiz1987/06d9ec1b381e942e9def0e969bd811a0">aqui</a>.</p><h2>Conclusão</h2><p>Ambas as abordagens para a criação de filtros e facetas têm seus benefícios e pontos de atenção. A abordagem clássica, baseada em regras manuais, oferece controle e custos mais baixos, mas requer atualizações constantes e não se adapta dinamicamente a novos produtos ou recursos.</p><p>Por outro lado, a abordagem baseada em IA e Aprendizado de Máquina automatiza a extração de facetas, tornando a busca mais flexível e permitindo a descoberta de novos atributos sem intervenção manual. No entanto, essa abordagem pode ser mais complexa de implementar e manter, exigindo calibração para garantir resultados consistentes.</p><p>A escolha entre as abordagens clássicas e as baseadas em IA depende das necessidades e da complexidade do negócio. Para cenários mais simples, onde os atributos dos dados são estáveis e previsíveis, a abordagem clássica pode ser mais eficiente e fácil de manter, evitando custos desnecessários com infraestrutura e modelos de IA. Por outro lado, o uso de aprendizado de máquina/inteligência artificial para extrair facetas pode agregar valor significativo, melhorando a experiência de busca e tornando a filtragem mais inteligente.</p><p>O importante é avaliar se a automação justifica o investimento ou se uma solução mais tradicional já atende às necessidades do negócio de forma eficaz.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/filters-facets-using-ml</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/filters-facets-using-ml</guid>
    <category><![CDATA[Relevância]]></category>
    <category><![CDATA[Pesquisa de aprendizado de máquina]]></category>
    <dc:creator><![CDATA[Andre Luiz]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4084864dcdaa25d3/6a170b880c485781f901aaa9/6f196643d573614fe5124705c7e4db9bfce004b0-1200x628.png" length="0" type="image/png"/>
    <pubDate>Thu, 03 Apr 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Avaliação da relevância de busca - parte 1: o benchmark BEIR]]></title>
    <description><![CDATA[Aprenda a avaliar seu sistema de busca no contexto de uma melhor compreensão do benchmark BEIR, com dicas e técnicas para aprimorar seus processos de avaliação de busca.]]></description>
    <content:encoded><![CDATA[<p>Este é o primeiro de uma série de posts que discutem como pensar a avaliação dos seus próprios sistemas de busca a partir de uma compreensão mais aprofundada do benchmark BEIR. Vamos apresentar dicas e técnicas específicas para melhorar os processos de avaliação de busca nesse contexto. Também destacaremos armadilhas comuns que tornam a avaliação menos confiável. Por fim, observamos que os LLMs oferecem uma nova e poderosa ferramenta no arsenal de engenheiros de busca e mostraremos, com exemplos, como usá-los para auxiliar na avaliação de busca.</p><h2>Entendendo o benchmark BEIR na avaliação de relevância de busca</h2><p>Para melhorar qualquer sistema, é preciso conseguir medir o quão bem ele está funcionando. No contexto de busca, o <a href="https://arxiv.org/abs/2104.08663">BEIR</a> (ou, de forma equivalente, a seção de recuperação da tabela de classificação do <a href="https://huggingface.co/spaces/mteb/leaderboard">MTEB</a>) é considerado o “santo graal” pela comunidade de recuperação de informação, e isso não é por acaso. Trata-se de um benchmark muito bem estruturado, com conjuntos de dados variados que abrangem diferentes tarefas. Mais especificamente, as seguintes áreas são contempladas:</p><ul><li><p>Recuperação de argumentos (ArguAna, Touche2020)</p></li><li><p>QA de domínio aberto (HotpotQA, Natural Questions, FiQA)</p></li><li><p>Recuperação de passagens (MSMARCO)</p></li><li><p>Recuperação de perguntas duplicadas (Quora, CQADupstack)</p></li><li><p>Verificação de fatos (FEVER, Climate-FEVER, Scifact)</p></li><li><p>Recuperação de informações biomédicas (TREC-COVID, NFCorpus, BioASQ)</p></li><li><p>Recuperação de entidades (DBPedia)</p></li><li><p>Previsão de citações (SCIDOCS)</p></li></ul><p>O benchmark fornece uma única métrica, nDCG@10, relacionada a quão bem um sistema corresponde aos documentos mais relevantes para cada exemplo de tarefa entre os principais resultados retornados. Para um sistema de busca com o qual pessoas interagem, a relevância dos primeiros resultados é fundamental. No entanto, existem muitas nuances na avaliação de busca que uma única métrica resumida não consegue capturar.</p><h2>Estrutura de um conjunto de dados BEIR</h2><p>Cada benchmark é composto por três artefatos:</p><ul><li><p>o corpus, ou seja, os documentos a serem recuperados</p></li><li><p>as consultas</p></li><li><p>Os julgamentos de relevância para as consultas (também conhecidos como <code>qrels</code>).</p></li></ul><p>Os julgamentos de relevância são fornecidos como uma pontuação igual ou maior que zero. Pontuações diferentes de zero indicam que o documento tem alguma relação com a consulta.</p><p>Conjunto de dados</p><p>Tamanho do corpus</p><p>#Consultas no conjunto de testes</p><p>#qrels com rótulo positivo</p><p>#qrels igual a zero</p><p>#duplicatas no corpus</p><p>ArguAna</p><p>8.674</p><p>1.406</p><p>1.406</p><p>0</p><p>96</p><p>Climate-FEVER</p><p>5.416.593</p><p>1.535</p><p>4.681</p><p>0</p><p>0</p><p>DBPedia</p><p>4.635.922</p><p>400</p><p>15.286</p><p>28.229</p><p>0</p><p>FEVER</p><p>5.416.568</p><p>6.666</p><p>7.937</p><p>0</p><p>0</p><p>FiQA-2018</p><p>57.638</p><p>648</p><p>1.706</p><p>0</p><p>0</p><p>HotpotQA</p><p>5.233.329</p><p>7.405</p><p>14.810</p><p>0</p><p>0</p><p>Natural Questions</p><p>2.681.468</p><p>3.452</p><p>4.021</p><p>0</p><p>16.781</p><p>NFCorpus</p><p>3.633</p><p>323</p><p>12.334</p><p>0</p><p>80</p><p>Quora</p><p>522.931</p><p>10.000</p><p>15.675</p><p>0</p><p>1.092</p><p>SCIDOCS</p><p>25.657</p><p>1.000</p><p>4.928</p><p>25.000</p><p>2</p><p>SciFact</p><p>5.183</p><p>300</p><p>339</p><p>0</p><p>0</p><p>Touche2020</p><p>382.545</p><p>49</p><p>932</p><p>1.982</p><p>5.357</p><p>TREC-COVID</p><p>171.332</p><p>50</p><p>24.763</p><p>41.663</p><p>0</p><p>MSMARCO</p><p>8.841.823</p><p>6.980</p><p>7.437</p><p>0</p><p>324</p><p>CQADupstack (soma)</p><p>457.199</p><p>13.145</p><p>23.703</p><p>0</p><p>0</p><p><strong>Tabela 1</strong>: Estatísticas dos conjuntos de dados. Os números foram calculados com base na porção de teste dos conjuntos de dados (<code>dev</code> para <code>MSMARCO</code>).</p><p>A <strong>Tabela 1</strong> apresenta algumas estatísticas dos conjuntos de dados que compõem o benchmark <code>BEIR</code>, como o número de documentos no corpus, o número de consultas no conjunto de teste e o número de pares positivos/negativos (consulta, documento) no arquivo <code>qrels</code>. Com uma análise rápida dos dados, é possível inferir imediatamente o seguinte:</p><ul><li><p>maioria dos conjuntos de dados não contém relações negativas no arquivo <code>qrels</code>, ou seja, pontuações zero que indicariam explicitamente que um documento é irrelevante para determinada consulta.</p></li><li><p>O número médio de relações entre documentos por consulta (<code>#qrels</code> / <code>#queries</code>) varia de 1,0 no caso de <code>ArguAna</code> até 493,5 (<code>TREC-COVID</code>), mas fica em torno de <code>&lt;</code>5 na maioria dos casos.</p></li><li><p>Alguns conjuntos de dados apresentam documentos duplicados no corpus, o que em certos casos pode levar a avaliações incorretas, por exemplo quando um documento é considerado relevante para uma consulta, mas seu duplicado não é. Como exemplo, em <code>ArguAna</code>, identificamos 96 casos de pares de documentos duplicados em que apenas um documento do par foi marcado como relevante para uma consulta. Ao “expandir” a lista inicial de qrels para incluir também os duplicados, observamos um aumento relativo médio de aproximadamente 1% na pontuação <code>nDCG@10</code>.</p></li></ul>{
  "_id": "test-economy-epiasghbf-pro02b",
  "title": "economic policy international africa society gender house believes feminisation",
  "text": "Again employment needs to be contextualised with …",
  "metadata": {}
}
{
  "_id": "test-society-epiasghbf-pro02b",
  "title": "economic policy international africa society gender house believes feminisation",
  "text": "Again employment needs to be contextualised with …",
  "metadata": {}
}
<p><strong>Exemplo de pares duplicados no ArguAna. No arquivo qrels, apenas o primeiro aparece como relevante (como contra-argumento) para a consulta (“test-economy-epiasghbf-pro02a”).</strong></p><p>Ao comparar modelos na tabela de classificação do MTEB, é tentador focar na qualidade média de recuperação. Essa é uma boa aproximação da qualidade geral do modelo, mas não necessariamente indica como ele vai se comportar no seu caso de uso específico. Como os resultados são reportados por conjunto de dados, vale a pena entender o quanto cada conjunto se relaciona com a sua tarefa de busca e reavaliar os modelos usando apenas os mais relevantes. Se quiser se aprofundar ainda mais, também é possível verificar a sobreposição de tópicos entre os diferentes corpora dos conjuntos de dados. Estratificar as métricas de qualidade por tópico fornece uma avaliação muito mais detalhada de pontos fortes e limitações específicas.</p><p>Um ponto importante a destacar é que, quando um documento não está marcado no arquivo <code>qrels</code> , ele é considerado irrelevante para a consulta por padrão. Aprofundamos um pouco mais essa análise e reunimos evidências para esclarecer melhor a seguinte pergunta: “Com que frequência um avaliador se depara com pares (consulta, documento) para os quais não existe informação de comprovação?” Isso é importante porque, quando apenas anotações superficiais estão disponíveis (ou seja, nem todos os documentos relevantes são rotulados como tal), um sistema de recuperação de informação pode ser avaliado como pior do que outro simplesmente porque ele “escolhe” destacar documentos relevantes diferentes, porém não marcados. Essa é uma armadilha comum na criação de conjuntos de avaliação de alta qualidade, especialmente em conjuntos de dados grandes. Para que a rotulagem manual seja viável, ela normalmente se concentra nos principais resultados retornados pelo sistema atual, o que pode deixar de fora documentos relevantes que estão fora do seu campo de visão. Por isso, em geral é preferível concentrar mais recursos em uma anotação mais completa de um número menor de consultas, em vez de realizar uma anotação ampla porém superficial.</p><h2>Usando o benchmark BEIR para avaliação de relevância de busca</h2><p>Para iniciar nossa análise, implementamos o seguinte cenário (ver o <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/evaluating-search-relevance-part-1/retrieve-and-rerank.ipynb">notebook</a>):</p><ol><li><p>Primeiro, carregamos o corpus de cada conjunto de dados em um índice do Elasticsearch.</p></li><li><p>Para cada consulta no conjunto de teste, recuperamos os top 100 documentos usando BM25.</p></li><li><p>Em seguida, fazemos a reclassificação dos documentos recuperados usando uma variedade de modelos de reclassificação de última geração.</p></li><li><p>Por fim, reportamos a “taxa de julgamento” para os top 10 documentos provenientes das etapas 2 (após a recuperação) e 3 (após a reclassificação). Em outras palavras, calculamos a porcentagem média dos top 10 documentos que possuem uma pontuação no arquivo <code>qrels</code>.</p></li></ol><p>A lista de modelos de reclassificação que usamos é a seguinte:</p><ul><li><p><a href="https://docs.cohere.com/reference/rerank">Cohere</a> <code>rerank-english-v2.0</code> e <code>rerank-english-v3.0</code></p></li><li><p><a href="https://huggingface.co/BAAI/bge-reranker-base">BGE-base</a></p></li><li><p><a href="https://huggingface.co/mixedbread-ai/mxbai-rerank-xsmall-v1">mxbai-rerank-xsmall-v1</a></p></li><li><p><a href="https://huggingface.co/cross-encoder/ms-marco-MiniLM-L-6-v2">MiniLM-L-6-v2</a></p></li></ul><p></p><p>Recuperação</p><p>Reclassificação</p><p></p><p></p><p></p><p></p><p>Conjunto de dados</p><p>BM25 (%)</p><p>Cohere Rerank v2 (%)</p><p>Cohere Rerank v3 (%)</p><p>BGE-base (%)</p><p>mxbai-rerank-xsmall-v1 (%)</p><p>MiniLM-L-6-v2 (%)</p><p>ArguAna</p><p>7,54</p><p>4,87</p><p>7,87</p><p>4,52</p><p>4,53</p><p>6,84</p><p>Climate-FEVER</p><p>5,75</p><p>6,24</p><p>8,15</p><p>9,36</p><p>7,79</p><p>7,58</p><p>DBPedia</p><p>61,18</p><p>60,78</p><p>64,15</p><p>63,9</p><p>63,5</p><p>67,62</p><p>FEVER</p><p>8,89</p><p>9,97</p><p>10,08</p><p>10,19</p><p>9,88</p><p>9,88</p><p>FiQa-2018</p><p>7,02</p><p>11,02</p><p>10,77</p><p>8,43</p><p>9,1</p><p>9,44</p><p>HotpotQA</p><p>12,59</p><p>14,5</p><p>14,76</p><p>15,1</p><p>14,02</p><p>14,42</p><p>Natural Questions</p><p>5,94</p><p>8,84</p><p>8,71</p><p>8,37</p><p>8,14</p><p>8,34</p><p>NFCorpus</p><p>31,67</p><p>32,9</p><p>33,91</p><p>30,63</p><p>32,77</p><p>32,45</p><p>Quora</p><p>12,2</p><p>10,46</p><p>13,04</p><p>11,26</p><p>12,58</p><p>12,78</p><p>SCIDOCS</p><p>8,62</p><p>9,41</p><p>9,71</p><p>8,04</p><p>8,79</p><p>8,52</p><p>SciFact</p><p>9,07</p><p>9,57</p><p>9,77</p><p>9,3</p><p>9,1</p><p>9,17</p><p>Touche2020</p><p>38,78</p><p>30,41</p><p>32,24</p><p>33,06</p><p>37,96</p><p>33,67</p><p>TREC-COVID</p><p>92,4</p><p>98,4</p><p>98,2</p><p>93,8</p><p>99,6</p><p>97,4</p><p>MSMARCO</p><p>3,97</p><p>6,00</p><p>6,03</p><p>6,07</p><p>5,47</p><p>6,11</p><p>CQADupstack (média)</p><p>5,47</p><p>6,32</p><p>6,87</p><p>5,89</p><p>6,22</p><p>6,16</p><p><strong>Tabela 2</strong>: Taxa de julgamento por pares (conjunto de dados, reclassificador), calculada sobre os top 10 documentos recuperados/reclassificados</p><p>A partir da <strong>Tabela 2</strong>, com exceção de <code>TREC-COVID</code> (cobertura de &gt;90%), <code>DBPedia</code> (~65%), <code>Touche2020</code> e <code>nfcorpus</code> (~35%), observamos que a maioria dos conjuntos de dados apresenta uma taxa de rotulagem entre 5% e pouco mais de 10% após a recuperação ou a reclassificação. Isso não significa que todos esses documentos não marcados sejam relevantes, mas pode haver um subconjunto deles — especialmente aqueles posicionados no topo — que seja positivo.</p><p>Com a chegada de modelos de linguagem de propósito geral ajustados por instruções, passamos a contar com uma nova e poderosa ferramenta que pode, potencialmente, automatizar a avaliação de relevância. Esses métodos normalmente são computacionalmente caros demais para uso online em sistemas de busca, mas aqui estamos tratando de avaliação offline. A seguir, usamos esses modelos para explorar evidências de que alguns conjuntos de dados do BEIR sofrem com anotações superficiais.</p><p>Para investigar melhor essa hipótese, decidimos focar no MSMARCO e selecionar um subconjunto de 100 consultas, juntamente com os top 5 documentos reclassificados (com Cohere v2) que atualmente não estão marcados como relevantes. Primeiro, usamos um prompt cuidadosamente ajustado (falaremos mais sobre isso em um post futuro) para preparar o modelo <a href="https://huggingface.co/microsoft/Phi-3-mini-4k-instruct">Phi-3-mini-4k</a>, lançado recentemente, a prever se um documento é ou não relevante para a consulta. Em paralelo, esses mesmos casos também foram rotulados manualmente, de modo a avaliar a taxa de concordância entre a saída do LLM e o julgamento humano. De forma geral, podemos tirar as duas conclusões a seguir:</p><ul><li><p>A taxa de concordância entre as respostas dos LLMs e os julgamentos humanos ficou próxima de 80%, o que parece um ponto de partida razoável nessa direção.</p></li><li><p>Em 57,6% dos casos (com base em julgamento humano), os documentos retornados foram considerados realmente relevantes para a consulta. Colocando isso de outra forma: para 100 consultas, temos 107 documentos julgados como relevantes, mas pelo menos 0,576 × 5 × 100 = 288 documentos adicionais que também são, de fato, relevantes.</p></li></ul><p>Aqui estão alguns exemplos extraídos do conjunto de dados <code>MSMARCO</code>/<code>dev</code> que incluem a consulta, o documento positivo anotado (de <code>qrels</code>) e um documento falso negativo devido a anotações incompletas:</p><p>Exemplo 1:</p>{
  "query":
    {
        "_id": 155234,
        "text": "do bigger tires affect gas mileage"
    },
  "positive_doc":
    {
        "_id": 502713,
        "text": "Tire Width versus Gas Mileage. Tire width is one of the only tire size factors that can influence gas mileage in a positive way. For example, a narrow tire will have less wind resistance, rolling resistance, and weight; thus increasing gas mileage.",
    },
    "negative_doc":
    {
        "_id": 7073658,
        "text": "Tire Size and Width Influences Gas Mileage. There are two things to consider when thinking about tires and their effect on gas mileage; one is wind resistance, and the other is rolling resistance. When a car is driving at higher speeds, it experiences higher wind resistance; this means lower fuel economy."
    }
}
<p>Exemplo 2:</p>{
  "query":
    {
        "_id": 300674,
        "text": "how many years did william bradford serve as governor of plymouth colony?"
    },
  "positive_doc":
    {
        "_id": 7067032,
        "text": "http://en.wikipedia.org/wiki/William_Bradford_(Plymouth_Colony_governor) William Bradford (c.1590 \u00e2\u0080\u0093 1657) was an English Separatist leader in Leiden, Holland and in Plymouth Colony was a signatory to the Mayflower Compact. He served as Plymouth Colony Governor five times covering about thirty years between 1621 and 1657."
    },
    "negative_doc":
    {
        "_id": 2495763,
        "text": "William Bradford was the governor of Plymouth Colony for 30 years. The colony was founded by people called Puritans. They were some of the first people from England to settle in what is now the United States. Bradford helped make Plymouth the first lasting colony in New England."
    }
}
<p>Avaliar manualmente consultas específicas dessa forma é uma técnica geralmente útil para entender a qualidade da busca e complementa métricas quantitativas como o nDCG@10. Se você tiver um conjunto representativo de consultas que sempre executa ao fazer alterações no sistema de busca, isso fornece informações qualitativas importantes sobre como a performance muda, algo que não aparece nas estatísticas. Por exemplo, essa abordagem oferece muito mais visibilidade sobre resultados incorretos retornados pela busca: ajuda a identificar erros evidentes nos documentos recuperados, classes de falhas recorrentes, como interpretações equivocadas de terminologia específica de um domínio, entre outros.</p><p>Nossos resultados estão alinhados com pesquisas relevantes sobre avaliação em <code>MSMARCO</code>. Por exemplo, <a href="https://arxiv.org/pdf/2109.00062">Arabzadeh et al.</a> seguem um procedimento semelhante ao empregar trabalhadores de crowdsourcing para realizar julgamentos de preferência. Entre outros achados, eles mostram que, em muitos casos, os documentos retornados pelos módulos de reclassificação são preferidos em relação aos documentos presentes no arquivo <code>qrels</code> do MSMARCO. Outra evidência vem dos autores do reclassificador <a href="https://arxiv.org/pdf/2010.08191">RocketQA</a>, que relatam que mais de 70% dos documentos reclassificados foram considerados relevantes após inspeção manual.</p><p> Atualização – 9 de setembro: após uma reavaliação cuidadosa do conjunto de dados, identificamos mais 15 casos de documentos relevantes, aumentando o total de 273 para 288.</p><h2>Principais conclusões e próximos passos</h2><ul><li><p>A busca por uma comprovação melhor é contínua e extremamente importante para benchmarking e comparação de modelos. Os LLMs podem auxiliar em algumas áreas da avaliação, desde que usados com cautela e ajustados com instruções adequadas.</p></li><li><p>De forma mais geral, considerando que benchmarks nunca serão perfeitos, pode ser preferível migrar de uma comparação puramente baseada em pontuações para técnicas mais robustas, capazes de capturar diferenças estatisticamente significativas. O trabalho de <a href="https://arxiv.org/pdf/2109.00062">Arabzadeh et al.</a> oferece um bom exemplo disso: com base em seus resultados, os autores constroem intervalos de confiança de 95% para indicar se as diferenças entre diferentes execuções são estatisticamente significativas ou não. No <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/evaluating-search-relevance-part-1/retrieve-and-rerank.ipynb">notebook</a> que acompanha este conteúdo, fornecemos uma implementação de intervalos de confiança usando <a href="https://en.wikipedia.org/wiki/Bootstrapping_(statistics)">bootstrapping</a>.</p></li><li><p>Do ponto de vista do usuário final, é útil pensar em alinhamento com a tarefa ao interpretar resultados de benchmarks. Por exemplo, para um engenheiro de IA que constrói um pipeline de RAG e sabe que o caso de uso mais comum envolve reunir múltiplas informações de diferentes fontes, faz mais sentido avaliar o desempenho do modelo de recuperação em conjuntos de dados de QA multi-hop, como o HotpotQA, em vez de considerar apenas a média global de todo o benchmark BEIR.</p></li></ul><p>No <a href="https://www.elastic.co/search-labs/blog/evaluating-search-relevance-part-2">próximo post do blog,</a> vamos nos aprofundar no uso do Phi-3 como avaliador baseado em LLM e no processo de ajuste do modelo para prever relevância.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/evaluating-search-relevance-part-1</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/evaluating-search-relevance-part-1</guid>
    <category><![CDATA[Pesquisa de aprendizado de máquina]]></category>
    <category><![CDATA[Python]]></category>
    <dc:creator><![CDATA[Thanos Papaoikonomou,Thomas Veasey]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9d9912c8d4187096/6a1704f5b0367d30e672bc17/54a6e5197f5721b36fc65f27387d29803ed35589-721x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Tue, 16 Jul 2024 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Entendendo a quantização escalar no Lucene]]></title>
    <description><![CDATA[Descubra como a Elastic introduziu a quantização escalar no Lucene, incluindo a quantização automática de bytes, a quantização por segmento e insights de desempenho.]]></description>
    <content:encoded><![CDATA[<h2>Quantização automática de bytes no Lucene</h2><p>Embora o HNSW seja uma maneira poderosa e flexível de armazenar e pesquisar vetores, ele exige uma quantidade significativa de memória para funcionar rapidamente. Por exemplo, consultar vetores float32 de 1 milhão de dimensões e 768 dimensões requer aproximadamente  de RAM. Quando você começa a pesquisar um número significativo de vetores, isso se torna caro. Uma forma de usar cerca de  menos memória é através da quantização de bytes. O Lucene, e consequentemente o Elasticsearch, já suportam a indexação de vetores  há algum tempo, mas a construção desses vetores era responsabilidade do usuário. Isso está prestes a mudar, pois introduzimos a quantização escalar  no Lucene.</p><h2>Quantização escalar 101</h2><p>Todas as técnicas de quantização são consideradas transformações com perda dos dados brutos. Significa que algumas informações são perdidas em função do espaço disponível. Para uma explicação detalhada da quantização escalar, veja: <a href="https://www.elastic.co/search-labs/scalar-quantization-101">Quantização Escalar 101</a>. Em termos gerais, a quantização escalar é uma técnica de compressão com perdas. Uma matemática simples permite economizar espaço significativamente com pouco impacto na capacidade de memorização.</p><h2>Explorando a arquitetura</h2><p>Quem já está acostumado a trabalhar com o Elasticsearch provavelmente já conhece esses conceitos, mas aqui vai uma breve visão geral da distribuição de documentos para pesquisa.</p><p>Cada índice do Elasticsearch é composto por <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/size-your-shards.html#size-your-shards">múltiplos shards</a>. Embora cada fragmento só possa ser atribuído a um único nó, vários fragmentos por índice proporcionam paralelismo computacional entre os nós.</p><p>Cada fragmento é composto por um único <a href="https://lucene.apache.org/core/9_8_0/core/org/apache/lucene/index/package-summary.html">Índice Lucene</a>. Um índice Lucene consiste em múltiplos segmentos somente leitura. Durante a indexação, os documentos são armazenados em buffer e periodicamente transferidos para um segmento somente leitura. Quando determinadas condições são atendidas, esses segmentos podem ser mesclados em segundo plano, formando um segmento maior. Tudo isso é configurável e possui seu próprio conjunto de complexidades. Mas, quando falamos de segmentos e fusão, estamos falando de segmentos Lucene somente leitura e da fusão periódica automática desses segmentos. <a href="https://www.elastic.co/search-labs/vector-search-elasticsearch-rationale">Aqui está uma análise mais aprofundada</a> sobre a fusão de segmentos e as decisões de design.</p><h2>Quantização por segmento no Lucene</h2><p>Cada segmento no Lucene armazena o seguinte: os vetores individuais, os índices do grafo HNSW, os vetores quantizados e os quantis calculados. Por uma questão de brevidade, vamos nos concentrar em como o Lucene armazena vetores quantizados e brutos. Para cada segmento, mantemos o controle dos vetores brutos no arquivo  , dos vetores quantizados e de um único multiplicador corretivo de ponto flutuante em , além dos metadados relativos à quantização no arquivo  .</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1861d0af970fd096/6a17d9887f6f15a45dc099c0/507a4d578f8a5d2225b11d16ac1fc0b7dd39eaa1-1207x228.png" alt="O arquivo .vec Arquivo" /><p>Figura 1: Layout simplificado de um arquivo de armazenamento vetorial bruto. Ocupa  de espaço em disco, já que os valores  têm 4 bytes. Como estamos utilizando quantização, esses dados não serão carregados durante a busca por HNSW. Eles só são usados se forem especificamente solicitados (por exemplo, força bruta secundária via <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/filter-search-results.html#query-rescorer">reavaliação</a>), ou para requantização durante a fusão de segmentos.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8c52b51939357280/6a17d9897b54f9130f8b3761/ffc6e8bffefc5cd36f14aae315184c89e04a6587-1440x207.png" alt="O arquivo .veq" /><p>Figura 2: Layout simplificado do arquivo  arquivo. Ocupa  de espaço e será carregado na memória durante a busca. Os  bytes servem para contabilizar o multiplicador corretivo de ponto flutuante, usado para ajustar a pontuação visando maior precisão e melhor recuperação da informação.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt28e007988f81e5c0/6a17d98b25daabe23208a0d9/555cc92d7d179d8c9711cefbaaac3e0b815d2e42-1440x182.png" alt="O arquivo .vemq" /><p>Figura 3: Layout simplificado do arquivo de metadados. Aqui, monitoramos a quantização e a configuração vetorial, juntamente com os quantis calculados para este segmento.</p><p>Assim, para cada segmento, armazenamos não apenas os vetores quantizados, mas também os quantis usados na criação desses vetores quantizados e os vetores brutos originais. Mas, afinal, por que ainda guardamos os vetores brutos?</p><h2>Quantização que cresce com você</h2><p>Como o Lucene periodicamente limpa os segmentos para que fiquem somente leitura, cada segmento possui apenas uma visão parcial de todos os seus dados. Isso significa que os quantis calculados se aplicam diretamente apenas a esse conjunto de amostras do total de seus dados. Isso não é um grande problema se sua amostra representar adequadamente todo o seu conjunto de dados. Mas o Lucene permite que você classifique seu índice de várias maneiras. Portanto, você pode estar indexando dados classificados de uma forma que introduza viés nos cálculos de quantis por segmento. Além disso, você pode apagar os dados quando quiser! Seu conjunto de amostras pode ser minúsculo, até mesmo contendo apenas um vetor. Outro fator complicador é que você tem controle sobre quando as fusões ocorrem. Embora o Elasticsearch tenha configurações padrão e mesclagem periódica definidas, você pode solicitar uma mesclagem sempre que desejar por meio da API <a href="https://www.elastic.co/guide/en/elasticsearch/reference/8.10/indices-forcemerge.html">_force_merge</a> . Como podemos, então, manter toda essa flexibilidade e, ao mesmo tempo, fornecer uma boa quantização que proporcione uma boa recuperação?</p><p>A quantização vetorial do Lucene se ajustará automaticamente ao longo do tempo. Como o Lucene foi projetado com uma arquitetura de segmentos somente leitura, temos a garantia de que os dados em cada segmento não foram alterados e demarcações claras no código para quando as coisas podem ser atualizadas. Isso significa que, durante a fusão de segmentos, podemos ajustar os quantis conforme necessário e, possivelmente, requantizar os vetores.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0d9a2390958c3e82/6a17d98cbe6086e4fd0045d5/646baa8279719d06c05c1a4fdb80a0c060e0dd94-1440x446.png" alt="quantis de múltiplos segmentos" /><p>Figura 4: Três exemplos de segmentos com diferentes quantis.</p><p>Mas a requantização não é cara? Possui alguma sobrecarga, mas o Lucene lida com quantis de forma inteligente e só requantiza completamente quando necessário. Vamos usar os segmentos da Figura 4 como exemplo. Vamos atribuir   e  , e apenas  documentos ao segmento  O Lucene calculará a média ponderada dos quantis e, se o quantil resultante da fusão for suficientemente próximo dos quantis originais do segmento, não será necessário requantizar esse segmento, utilizando-se os quantis recém-combinados.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte2596c10ee616cf3/6a17d98eec0f8903b85a6497/58fa20d60dc337ca7108eb01e84a07c330e87ee6-1440x447.png" alt="quantis combinados" /><p>Figura 5: Exemplo de quantis combinados onde os segmentos  e  têm  documentos e  tem apenas .</p><p>Na situação visualizada na figura 5, podemos ver que os quantis resultantes da fusão são muito semelhantes aos quantis originais em  e  Portanto, eles não justificam a quantização dos vetores. O segmento  parece desviar-se demasiado. Consequentemente, os vetores em  seriam requantizados com os valores de quantil recém-combinados.</p><p>Existem, de fato, casos extremos em que os quantis combinados diferem drasticamente de quaisquer quantis originais. Neste caso, iremos extrair uma amostra de cada segmento e recalcular completamente os quantis.</p><h2>Desempenho e números da quantização</h2><p>Então, é rápido e ainda oferece boa capacidade de memorização? Os números a seguir foram coletados executando o experimento em uma instância <code>c3-standard-8</code> do GCP. Para garantir uma comparação justa com  usamos uma instância grande o suficiente para armazenar vetores brutos na memória. Indexamos  vetores <a href="https://huggingface.co/datasets/Cohere/wikipedia-22-12-simple-embeddings">do Cohere Wiki</a> usando o método do produto interno máximo.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfa48e3724ad97fed/6a17d98f445de96aca4cff88/81958f99b8a1397f669db48de00f264cacc6b49f-576x455.png" alt="Recuperação de Quantização" /><p>Figura 6: Recall@10 para vetores quantizados versus vetores brutos. O desempenho de busca de vetores quantizados é significativamente mais rápido do que o de vetores brutos, e a recuperação é rapidamente possível reunindo apenas mais 5 vetores; visível por .</p><p>A Figura 6 ilustra a história. Embora haja uma diferença na recordação, como era de se esperar, ela não é significativa. Além disso, a diferença na taxa de recall desaparece ao coletar apenas mais 5 vetores. Tudo isso com fusões de segmentos  mais rápidas e 1/4 da memória dos vetores  .</p><h2>Conclusão</h2><p>O Lucene oferece uma solução única para um problema difícil. Não há necessidade de uma etapa de "treinamento" ou "otimização" para a quantização. No Lucene, simplesmente funcionará. Não há necessidade de se preocupar com a possibilidade de ter que "re-treinar" seu índice vetorial caso seus dados mudem. O Lucene detectará mudanças significativas e cuidará disso automaticamente ao longo da vida útil dos seus dados. Aguardem ansiosamente o momento em que implementaremos essa funcionalidade no Elasticsearch!</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/scalar-quantization-in-lucene</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/scalar-quantization-in-lucene</guid>
    <category><![CDATA[Lucene]]></category>
    <category><![CDATA[Pesquisa de aprendizado de máquina]]></category>
    <dc:creator><![CDATA[Benjamin Trent]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb382d99ffac9992c/6a17d991b1e113640179f12c/dc07f16d347a68476bded5df9adb831452f61278-1024x1024.jpg" length="0" type="image/jpeg"/>
    <pubDate>Sat, 11 Nov 2023 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Open-source do Sysgrok — um assistente de IA para analisar, compreender e otimizar sistemas.]]></title>
    <description><![CDATA[O Sysgrok é uma prova de conceito experimental, destinada a demonstrar como os LLMs podem ser usados para ajudar os engenheiros de software e os engenheiros de confiabilidade de sistemas a entender os sistemas, depurar problemas e otimizar o desempenho.]]></description>
    <content:encoded><![CDATA[<p>Neste post, apresentarei o Sysgrok, um protótipo de pesquisa no qual estamos investigando como grandes modelos de linguagem (LLMs), como os modelos GPT da OpenAI, podem ser aplicados a problemas nas áreas de otimização de desempenho, análise de causa raiz e engenharia de sistemas. Você pode encontrá-lo no <a href="https://github.com/elastic/perf-copilot">GitHub</a>.</p><h2>O que faz o Sysgrok?</h2><p>O Sysgrok pode fazer coisas como:</p><ul><li><p>Selecione as funções e os processos mais dispendiosos identificados por um analisador de desempenho, explique a funcionalidade que cada um oferece e sugira otimizações.</p></li><li><p>Receba um host e uma descrição do problema que esse host está enfrentando e depure automaticamente o problema, sugerindo soluções e ações adicionais.</p></li><li><p>Pegue o código-fonte que foi anotado por um profiler, explique os caminhos críticos (hot paths) e sugira maneiras de melhorar o desempenho do código.</p></li></ul><p>A funcionalidade do Sysgrok visa três grandes categorias de soluções:</p><ol><li><p><strong>Como mecanismo de análise para desempenho, confiabilidade e outros dados relacionados a sistemas.</strong> Nesse modo, o LLM recebe a saída de alguma outra ferramenta usada pelo engenheiro (por exemplo, uma ferramenta de linha de comando do Linux, um profiler ou uma plataforma de observabilidade). O objetivo do Sysgrok é interpretar, resumir e formular hipóteses sobre o estado do sistema usando um Modelo de Liderança Linear (LLM). Também pode sugerir otimizações ou correções.</p></li><li><p><strong>Como uma solução automatizada e focada para tarefas específicas relacionadas a desempenho e confiabilidade.</strong> Existem algumas tarefas que surgem repetidamente no trabalho de engenharia de desempenho e SRE (Confiabilidade de Site). Para isso, podemos construir assistentes automatizados e focados que podem ser usados diretamente pelo engenheiro ou pelo próprio Sysgrok na resolução de outros problemas. Por exemplo, em engenharia de desempenho, é comum responder à pergunta: "Existe uma versão mais rápida desta biblioteca com funcionalidade equivalente?". O sysgrok oferece suporte direto a isso.</p></li><li><p><strong>Como uma ferramenta automatizada de análise de causa raiz para problemas de desempenho e confiabilidade.</strong> As duas primeiras categorias de solução são uma mistura de análise de dados, interpretação, pesquisa e sumarização. Fundamentalmente, elas são aplicadas de forma direcionada aos dados que o próprio engenheiro coletou. No Sysgrok, também estamos investigando uma terceira abordagem para a resolução de problemas com LLMs, na qual o LLM é combinado com outras ferramentas para realizar, de forma autônoma, a análise da causa raiz e a resolução de um determinado problema. Nessa abordagem, o LLM recebe uma descrição do problema (por exemplo, "O servidor web está apresentando alta latência") e é informado sobre quais recursos estão disponíveis para ele (por exemplo, "conectar-se a um host via SSH", "executar ferramentas de linha de comando Linux arbitrárias"). Em seguida, o LLM é questionado sobre as ações a serem tomadas, utilizando os recursos disponíveis, para priorizar o problema. Essas ações são executadas pelo Sysgrok, e o Gerente de Liderança de Equipe (LLM) é solicitado a analisar os resultados, priorizar o problema, sugerir soluções e recomendar os próximos passos.</p></li></ol><p>O sysgrok ainda está em seus estágios iniciais, mas estamos lançando-o porque já se mostrou útil para diversas tarefas — esperamos que seja uma base conveniente para que outros realizem experimentos semelhantes. Fique à vontade para nos enviar PRs ou abrir issues <a href="https://github.com/elastic/sysgrok">no GitHub</a> se tiver alguma ideia!</p><h2>Analisando problemas de desempenho com LLMs</h2><p>Os modelos de linguagem natural (LLMs), como os modelos GPT da OpenAI, explodiram em popularidade nos últimos meses, fornecendo uma interface de linguagem natural e servindo como mecanismo central para todos os tipos de produtos, desde chatbots de atendimento ao cliente até assistentes de manipulação de dados e assistentes de programação. Um aspecto interessante dessa tendência é que, essencialmente, todas essas aplicações utilizam modelos genéricos e prontos para uso, que não foram especificamente treinados ou ajustados para a tarefa em questão. Em vez disso, foram treinadas em grandes extensões da internet como um todo e, como resultado, são aplicáveis a uma ampla variedade de tarefas.</p><p>Então, podemos usar esses modelos para auxiliar na análise de desempenho, depuração e otimização? Existem <a href="https://www.brendangregg.com/methodology.html">diversas</a> metodologias para investigar problemas de desempenho, identificar as causas principais e propor otimizações. Em sua essência, qualquer trabalho de análise de desempenho envolverá a observação da saída de várias ferramentas, como ferramentas de linha de comando do Linux ou uma plataforma de observabilidade, e a interpretação dessa saída para formular uma hipótese sobre o estado do sistema. Entre os materiais utilizados no treinamento dos modelos GPT, encontram-se fontes que abrangem engenharia de software, depuração, análise de infraestrutura, funcionamento interno de sistemas operacionais, Kubernetes, comandos Linux e sua utilização, além de metodologias de análise de desempenho. Como resultado, os modelos podem ser usados para resumir, interpretar e formular hipóteses sobre os dados e problemas que os engenheiros de desempenho encontram no dia a dia, o que pode acelerar o ritmo com que um engenheiro realiza suas análises.</p><p>Podemos ir além e utilizar o LLM não apenas para análise de dados e resposta a perguntas, mas também no contexto do processo investigativo do próprio engenheiro. Como mostraremos mais adiante neste post, o próprio LLM pode ser usado para direcionar o processo em alguns cenários, decidindo quais comandos executar ou quais fontes de dados analisar para depurar um problema.</p><h2>Demos</h2><p>Para obter a lista completa de recursos suportados pelo sysgrok, consulte o <a href="https://github.com/elastic/sysgrok">repositório</a> do GitHub. De forma geral, apoia três abordagens para a resolução de problemas:</p><h3>Abordagem 1: Como um mecanismo de análise para desempenho, confiabilidade e outros dados relacionados a sistemas.</h3><p>Nesse modo, o LLM recebe a saída de outra ferramenta que está sendo usada pelo engenheiro, como uma ferramenta de linha de comando do Linux, um profiler ou uma plataforma de observabilidade. O objetivo do Sysgrok é interpretar, resumir e sugerir soluções.</p><p>Por exemplo, o subcomando <em>topn</em> analisa as funções mais custosas, conforme relatado por um profiler, explica a saída e, em seguida, sugere maneiras de otimizar o sistema.</p><p>Este vídeo também mostra a funcionalidade de chat oferecida pelo Sysgrok. Ao receber o argumento –chat, o sysgrok iniciará uma sessão de bate-papo após cada resposta do LLM.</p><p>Essa funcionalidade também pode ser aplicada genericamente à saída de ferramentas de linha de comando do Linux. Por exemplo, no artigo <a href="https://www.brendangregg.com/Articles/Netflix_Linux_Perf_Analysis_60s.pdf">Análise de desempenho do Linux em 60 segundos</a>, Brendan Gregg descreve 10 comandos que um SRE deve executar ao se conectar pela primeira vez a um host que esteja apresentando um problema de desempenho ou estabilidade. O subcomando <em>analyzecmd</em> recebe como entrada um host ao qual se conectar e um comando a ser executado, analisando e resumindo a saída do comando para o usuário. Podemos usar isso para automatizar o processo descrito por Gregg e fornecer ao usuário um resumo de um parágrafo com todos os dados gerados pelos 10 comandos, evitando que ele tenha o trabalho de analisar a saída de cada comando individualmente.</p><h3>Abordagem 2: Como uma solução focada e automatizada para tarefas específicas relacionadas a desempenho e confiabilidade.</h3><p>Existem algumas tarefas que surgem repetidamente no trabalho de engenharia de desempenho e SRE (Confiabilidade de Site). Para isso, podemos construir assistentes automatizados e focados que podem ser usados diretamente pelo engenheiro ou pelo próprio Sysgrok na resolução de outros problemas.</p><p>Por exemplo, o subcomando <em>findfaster</em> recebe como entrada o nome de uma biblioteca ou programa e usa o LLM para encontrar uma alternativa equivalente mais rápida. Essa é uma tarefa muito comum em engenharia de desempenho.</p><p>Outro exemplo dessa abordagem no Sysgrok é o subcomando <em>explainfunction</em> . Este subcomando recebe o nome de uma biblioteca e uma função dentro dessa biblioteca. O texto explica o que a biblioteca faz e seus casos de uso comuns, e em seguida explica a função. Por fim, sugere possíveis otimizações caso essa biblioteca e função estejam consumindo uma quantidade significativa de recursos da CPU.</p><h3>Abordagem 3: Como uma ferramenta automatizada de análise de causa raiz para problemas de desempenho e confiabilidade.</h3><p>A utilização de LLMs não se limita apenas a respostas a perguntas específicas, sumarização e tarefas semelhantes. E não se limita a um uso pontual, em que lhes é feita uma única pergunta isolada. O subcomando sysgrok <em>debughost</em> demonstra como um LLM pode ser usado como o "cérebro" em um agente com o objetivo de resolução automatizada de problemas. Nesse modo, o LLM está incorporado em um processo que o utiliza para decidir como depurar um problema específico e lhe confere a capacidade de se conectar a hosts, executar comandos e acessar outras fontes de dados.</p><p>O comando debughost é provavelmente a parte mais experimental do sysgrok no momento. Isso demonstra um passo no caminho rumo a agentes automatizados para análise de desempenho, mas ainda é necessário um investimento significativo em pesquisa e desenvolvimento para chegarmos lá.</p><h2>Conclusão</h2><p>Neste post, apresentei o Sysgrok, um novo assistente de IA de código aberto para analisar, compreender e otimizar sistemas. Também discutimos as três categorias gerais de abordagem que o Sysgrok implementa:</p><ol><li><p>Um mecanismo de análise para desempenho, confiabilidade e outros dados relacionados a sistemas: consulte os subcomandos topn, stacktrace, analyzecmd e code.</p></li><li><p>Soluções automatizadas e focadas em tarefas específicas relacionadas a desempenho e confiabilidade: consulte os subcomandos explainprocess, explainfunction e findfaster.</p></li><li><p>Análise automatizada da causa raiz para problemas de desempenho e confiabilidade: consulte o subcomando debughost.</p></li></ol><p>Você pode encontrar o projeto sysgrok <a href="https://github.com/elastic/sysgrok">no GitHub</a>. Fique à vontade para criar PRs e Issues, ou entre em contato comigo diretamente pelo e-mail <a href="mailto:sean.heelan@elastic.co">sean.heelan@elastic.co</a> se quiser discutir o projeto ou as aplicações de LLMs em geral.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/open-sourcing-sysgrok-ai-assistant</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/open-sourcing-sysgrok-ai-assistant</guid>
    <category><![CDATA[Pesquisa de aprendizado de máquina]]></category>
    <dc:creator><![CDATA[Sean Heelan]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltff8f9a2d63790904/6a170bbbcdacbf61eb7d2a26/86f6f563d9f1ee6929ce4afc9005dfacd93f2990-720x420.png" length="0" type="image/png"/>
    <pubDate>Wed, 28 Jun 2023 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Sem estado — seu novo estado de busca com o Elasticsearch]]></title>
    <description><![CDATA[Aprenda sobre o Elasticsearch sem estado e explore a arquitetura sem estado, que proporciona melhorias de desempenho e redução de custos.]]></description>
    <content:encoded><![CDATA[<p>Com o Elasticsearch sem estado, estamos investindo na construção de uma nova arquitetura totalmente nativa da nuvem para ampliar os limites de escala e velocidade. Neste blog, exploramos onde começamos, o futuro do Elasticsearch com a introdução de uma arquitetura sem estado e os detalhes dessa arquitetura.</p><h2>Onde tudo começou</h2><p>A primeira versão do <a href="https://www.elastic.co/what-is/elasticsearch">Elasticsearch</a> foi lançada em 2010 como um mecanismo de busca distribuído e escalável, permitindo aos usuários pesquisar e encontrar rapidamente informações importantes. Doze anos e mais de 65.000 commits depois, o Elasticsearch continua a fornecer aos usuários soluções testadas e comprovadas para uma ampla variedade de problemas de busca. Graças aos esforços de mais de 1.500 colaboradores, incluindo centenas de funcionários em tempo integral da Elastic, o Elasticsearch evoluiu constantemente para atender aos novos desafios que surgem na área de buscas.</p><p>No início da trajetória do Elasticsearch, quando surgiram preocupações com a perda de dados, a equipe da Elastic realizou um <a href="https://www.elastic.co/blog/a-new-era-for-cluster-coordination-in-elasticsearch">esforço de vários anos</a> para reescrever o sistema de coordenação do cluster, garantindo que os dados confirmados fossem armazenados com segurança. Quando ficou claro que gerenciar índices em grandes clusters era um problema, a equipe trabalhou na implementação de uma <a href="https://www.elastic.co/blog/elasticsearch-data-lifecycle-management-with-data-tiers">solução ILM</a> abrangente para automatizar esse trabalho, permitindo que os usuários predefinissem padrões de índice e ações de ciclo de vida. À medida que os usuários perceberam a necessidade de armazenar grandes quantidades de dados métricos e de séries temporais, vários recursos, como melhor compressão, foram adicionados para reduzir o tamanho dos dados. À medida que o custo de armazenamento para pesquisar grandes quantidades de dados inativos aumentava, investimos na criação de <a href="https://www.elastic.co/blog/introducing-elasticsearch-searchable-snapshots">Snapshots Pesquisáveis</a> como uma forma de pesquisar dados do usuário diretamente em armazenamentos de objetos de baixo custo.</p><p>Esses investimentos lançam as bases para a próxima evolução do Elasticsearch. Com o crescimento dos serviços nativos da nuvem e dos novos sistemas de orquestração, decidimos que é hora de evoluir o Elasticsearch para melhorar a experiência ao trabalhar com sistemas nativos da nuvem. Acreditamos que essas mudanças representam oportunidades para melhorias operacionais, de desempenho e de custos ao executar o Elasticsearch no <a href="https://www.elastic.co/cloud/">Elastic Cloud</a>.</p><h2>Para onde estamos indo — Adotando uma arquitetura sem estado</h2><p>Um dos principais desafios ao operar ou orquestrar o Elasticsearch é que ele depende de inúmeros elementos de estado persistente, sendo, portanto, um sistema com estado. Os três componentes principais são o translog, o armazenamento de índice e os metadados do cluster. Este estado significa que o armazenamento deve ser persistente e não pode ser perdido durante a reinicialização ou substituição de um nó.</p><p>A arquitetura Elasticsearch existente no Elastic Cloud precisa duplicar a indexação em várias zonas de disponibilidade para fornecer redundância em caso de interrupções. Pretendemos transferir o armazenamento persistente desses dados de discos locais para um armazenamento de objetos, como o AWS S3. Ao utilizar serviços externos para armazenar esses dados, eliminaremos a necessidade de replicação de indexação, reduzindo significativamente o hardware associado à ingestão. Essa arquitetura também oferece garantias de durabilidade muito altas devido à forma como os armazenamentos de objetos em nuvem, como AWS S3, GCP Cloud Storage e Azure Blob Storage, replicam dados entre as zonas de disponibilidade.</p><p>Ao transferir o armazenamento de índices para um serviço externo, também nos será possível reestruturar o Elasticsearch, separando as responsabilidades de indexação e pesquisa. Em vez de termos instâncias primárias e réplicas gerenciando ambas as cargas de trabalho, pretendemos ter uma camada de indexação e uma camada de busca. A separação dessas cargas de trabalho permitirá que elas sejam dimensionadas independentemente e que a seleção de hardware seja mais direcionada para os respectivos casos de uso. Isso também ajuda a resolver um desafio antigo, em que a carga de busca e a carga de indexação podem afetar uma à outra.</p><p>Após uma fase experimental e de prova de conceito que durou vários meses, estamos convencidos de que esses serviços de armazenamento de objetos atendem aos requisitos que previmos para armazenamento de índices e metadados de cluster. Nossos testes e benchmarks indicam que esses serviços de armazenamento podem atender às altas necessidades de indexação dos maiores clusters que vimos no Elastic Cloud. Além disso, armazenar os dados em um repositório de objetos reduz os custos de indexação e permite um ajuste simples do desempenho da busca. Para pesquisar dados, o Elasticsearch usará o modelo Searchable Snapshots, amplamente testado, no qual os dados são armazenados permanentemente no armazenamento de objetos nativo da nuvem e os discos locais são usados como caches para dados acessados com frequência.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf17ddc7c69dc6e76/6a17d9f563baff2cc5741b02/e1d7b7b36bd1bbf906d50c3b873bfe2e1acd7fb3-1440x805.png" alt="" /><p>Para facilitar a diferenciação, descrevemos nosso modelo atual como replicação "nó a nó". Na camada de processamento intensivo deste modelo, os shards primário e de réplica realizam o mesmo trabalho pesado para lidar com a ingestão e atender às solicitações de pesquisa. Esses nós são "com estado", pois dependem de seus discos locais para persistir com segurança os dados dos fragmentos que hospedam. Além disso, os shards primários e de réplica estão em constante comunicação para se manterem sincronizados. Isso é feito replicando as operações realizadas no shard primário para o shard de réplica, o que significa que o custo dessas operações (principalmente CPU) é incorrido para cada réplica especificada. Os mesmos fragmentos e nós que realizam esse trabalho de ingestão também atendem às solicitações de pesquisa, portanto, o provisionamento e o dimensionamento devem ser feitos levando em consideração ambas as cargas de trabalho.</p><p>Além da busca e ingestão, os shards no modelo de replicação nó a nó lidam com outras responsabilidades intensivas, como a fusão de segmentos do Lucene. Embora esse design tenha seus méritos, vimos muitas oportunidades com base no que aprendemos com os clientes ao longo dos anos e na evolução do ecossistema de nuvem em geral.</p><p>A nova arquitetura possibilita diversas melhorias imediatas e futuras, incluindo:</p><ol><li><p>É possível aumentar significativamente a taxa de transferência de ingestão no mesmo hardware ou, visto de outra forma, melhorar significativamente a eficiência para a mesma carga de trabalho de ingestão. Esse aumento resulta da eliminação da duplicação de operações de indexação para cada réplica. As operações de indexação que exigem muito processamento da CPU precisam ocorrer apenas uma vez na camada de indexação, que então envia os segmentos resultantes para um armazenamento de objetos. A partir daí, os dados estão prontos para serem consumidos tal como estão pela camada de pesquisa.</p></li><li><p>Você pode separar o processamento do armazenamento para simplificar a topologia do seu cluster. Atualmente, o Elasticsearch possui vários níveis de dados (conteúdo, quente, morno, frio e congelado) para adequar os dados ao perfil de hardware. O nível "hot" é para buscas quase em tempo real, enquanto o nível "frozen" é para dados pesquisados com menos frequência. Embora esses níveis ofereçam valor, eles também aumentam a complexidade. Na nova arquitetura, as camadas de dados não serão mais necessárias, simplificando a configuração e a operação do Elasticsearch. Estamos também separando a indexação da pesquisa, o que reduz ainda mais a complexidade e nos permite dimensionar ambas as cargas de trabalho de forma independente.</p></li><li><p>É possível obter custos de armazenamento mais baixos na camada de indexação reduzindo a quantidade de dados que precisam ser armazenados em um disco local. Atualmente, o Elasticsearch precisa armazenar uma cópia completa do shard nos nós ativos (tanto primários quanto réplicas) para fins de indexação. Com a abordagem sem estado de indexação direta ao armazenamento de objetos, apenas uma parte desses dados locais é necessária. Para casos de uso de simples anexação, apenas determinados metadados precisarão ser armazenados para indexação. Isso reduzirá significativamente o armazenamento local necessário para a indexação.</p></li><li><p>Você pode reduzir os custos de armazenamento associados às consultas de pesquisa. Ao tornar o modelo de Snapshots Pesquisáveis o modo nativo de pesquisa de dados, o custo de armazenamento associado às consultas de pesquisa diminuirá significativamente. Dependendo das necessidades de latência de pesquisa dos usuários, o Elasticsearch permitirá ajustes para aumentar o armazenamento em cache local dos dados solicitados com frequência.</p></li></ol><h2>Benchmarking — melhoria de 75% na taxa de transferência de indexação</h2><p>Para validar essa abordagem, implementamos uma extensa prova de conceito onde os dados foram indexados em um único nó e a replicação foi realizada por meio de armazenamentos de objetos na nuvem. Constatamos que poderíamos obter uma <strong>melhoria de 75% na taxa de transferência de indexação</strong> , eliminando a necessidade de dedicar hardware à replicação de indexação. Além disso, o custo de CPU associado à simples extração de dados do armazenamento de objetos era muito menor do que indexar os dados e gravá-los localmente, como é necessário para a camada de processamento ativa atualmente. Isso significa que os nós de busca poderão dedicar totalmente sua CPU à busca.</p><p>Esses testes de desempenho foram realizados em um cluster de dois nós, utilizando os três principais provedores de nuvem pública (AWS, GCP e Azure). Pretendemos continuar a desenvolver benchmarks maiores à medida que avançamos para uma implementação sem estado em produção.</p><p><strong>Taxa de transferência de indexação</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4a44b141e077a8cf/6a17d9f7445de982084cffa9/2c3c94b38a5c816a720112851b4a497b4176c285-593x270.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8dfd035e67eaf0a8/6a17d9f9e3179127802d56d5/ee236cd455e8fa8f4af62a0f8557a5e907deffbf-596x270.png" alt="" /><p><strong>Utilização da CPU</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt13df63861f1149a6/6a17d9fa414c643b05945026/76632a9211a4762e3559ab498beb5381b7d441d2-547x329.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfd352e4ebd0a1417/6a17d9fcbe60863c0c0045e0/62dd9063a05d5841e196a5abf39db7e9c990fb01-547x326.png" alt="" /><h2>Sem pátria para nós, economia para você.</h2><p>A arquitetura sem estado do Elastic Cloud permitirá reduzir a sobrecarga de indexação, dimensionar a ingestão e a pesquisa de forma independente, simplificar o gerenciamento de camadas de dados e acelerar operações como escalonamento ou atualização. Este é o primeiro marco rumo a uma modernização substancial da plataforma Elastic Cloud.</p><h2>Junte-se à nossa visão de Elasticsearch sem estado.</h2><p>Interessado em experimentar esta solução antes de todos os outros? Você pode entrar em contato conosco pelo <a href="https://discuss.elastic.co/">Discord</a> ou pelo nosso <a href="https://ela.st/slack">canal da comunidade no Slack</a>. Gostaríamos muito de receber seu feedback para nos ajudar a definir a direção da nossa nova arquitetura.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/stateless-your-new-state-of-find-with-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/stateless-your-new-state-of-find-with-elasticsearch</guid>
    <category><![CDATA[Pesquisa de aprendizado de máquina]]></category>
    <category><![CDATA[Elastic Cloud Serverless]]></category>
    <dc:creator><![CDATA[Leaf Lin,Tim Brooks,Quin Hoxie]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcc6aaa7d1d08f8d5/6a17d9c94b055d1ca0432084/dd0e2f3d452a288a185558102c705c60fdf77ad9-1440x840.png" length="0" type="image/png"/>
    <pubDate>Thu, 06 Oct 2022 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Implementando artigos acadêmicos: Lições aprendidas com Elasticsearch e Lucene]]></title>
    <description><![CDATA[Descubra estratégias para incorporar artigos de pesquisa em um aplicativo de software, com base em nossas experiências com Elasticsearch e Lucene.]]></description>
    <content:encoded><![CDATA[<p>Este artigo compartilha estratégias para implementar artigos acadêmicos em um aplicativo de software. Este artigo utiliza exemplos do Elasticsearch e do Lucene com o objetivo de ajudar outros engenheiros a aprender com nossas experiências. Você pode ler essas estratégias e pensar: "Mas isso é só desenvolvimento de software!" E isso seria de fato verdade: como engenheiros, já possuímos as práticas e ferramentas adequadas, elas só precisam ser adaptadas a um novo desafio.</p><h2>Histórico</h2><p>Ao desenvolver o Elasticsearch, ocasionalmente nos deparamos com um problema importante para o qual não existe uma abordagem simples ou estabelecida para resolvê-lo. É natural perguntar: "Hum, existe algum artigo acadêmico que aborde esse assunto?" Outras vezes, o trabalho acadêmico é uma fonte de inspiração. Nos deparamos com um artigo que propõe um novo algoritmo ou estrutura de dados e pensamos: "Isso seria muito útil!" Aqui estão alguns exemplos de como o Elasticsearch e o Apache Lucene incorporam o trabalho acadêmico:</p><ul><li><p><a href="https://research.google/pubs/pub40671/">HyperLogLog++</a> para <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.15/search-aggregations-metrics-cardinality-aggregation.html">agregações de cardinalidade</a></p></li><li><p><a href="https://www.usenix.org/system/files/conference/nsdi15/nsdi15-paper-suresh.pdf">Algoritmo C3</a> para <a href="https://www.elastic.co/blog/improving-response-latency-in-elasticsearch-with-adaptive-replica-selection">seleção adaptativa de réplicas</a></p></li><li><p><a href="https://arxiv.org/abs/1603.09320">Grafos Hierárquicos Navegáveis de Pequeno Mundo (HNSW)</a> para busca de vetor mais próximo no Lucene.</p></li><li><p><a href="https://jmlr.csail.mit.edu/papers/volume17/15-308/15-308.pdf">Estatística MIC</a> para <a href="https://github.com/elastic/ml-cpp/pull/488">aprimorar a classificação em aprendizado de máquina.</a></p></li><li><p><a href="http://engineering.nyu.edu/~suel/papers/bmw.pdf">Block-max WAND</a> para <a href="https://www.elastic.co/blog/faster-retrieval-of-top-hits-in-elasticsearch-with-block-max-wand">recuperação mais rápida dos melhores resultados no Lucene</a></p></li><li><p>... e <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.15/query-dsl-combined-fields-query.html">muito</a> <a href="https://github.com/elastic/elasticsearch/blob/b2a9328890b23e7ccf6c66a3b13d6d65e453a3dd/server/src/main/java/org/elasticsearch/search/sort/BucketedSort.java#L302-L323">mais</a></p></li></ul><p>Artigos acadêmicos são um recurso inestimável para engenheiros que desenvolvem sistemas com uso intensivo de dados. Mas implementá-los pode ser intimidante e propenso a erros — as descrições dos algoritmos costumam ser complexas, com detalhes práticos importantes omitidos. E os testes representam um verdadeiro desafio: por exemplo, como podemos testar minuciosamente um algoritmo de aprendizado de máquina cujo resultado depende fortemente do conjunto de dados?</p><h2>Avalie o artigo como se fosse uma dependência de software.</h2><p>Adicionar uma nova dependência de software exige uma avaliação cuidadosa: se o outro pacote estiver incorreto, lento ou inseguro, nosso projeto também poderá estar. Antes de incluir uma dependência, os desenvolvedores certificam-se de avaliar sua qualidade.</p><p>O mesmo se aplica aos artigos acadêmicos que você está considerando publicar. Pode parecer que, pelo simples fato de um algoritmo ter sido publicado em um artigo, ele deve estar correto e ter um bom desempenho. Mas, mesmo tendo passado por um processo de revisão, um artigo acadêmico pode apresentar problemas. Talvez a prova de correção dependa de pressupostos que não são realistas. Ou talvez a seção de "experimentos" mostre um desempenho muito melhor do que a linha de base, mas isso só se aplica a um conjunto de dados específico. Mesmo que o artigo seja de ótima qualidade, sua abordagem pode não ser adequada para o seu projeto.</p><p>Ao considerar se devemos ou não nos “depender” de um artigo acadêmico, é útil fazer as mesmas perguntas que faríamos sobre um pacote de software:</p><ul><li><p>A biblioteca é amplamente utilizada e "testada em situações reais"? → Outros pacotes implementaram este artigo e funcionou bem para eles?</p></li><li><p>Existem parâmetros de comparação de desempenho disponíveis? Essas medidas parecem precisas e justas? → O artigo inclui experimentos realistas? Eles são bem projetados?</p></li><li><p>A melhoria de desempenho é suficientemente significativa para justificar a complexidade? → O artigo se compara a uma abordagem de referência robusta? Em quanto ele supera essa linha de base?</p></li><li><p>Essa abordagem se integrará bem ao nosso sistema? → As premissas e as compensações do algoritmo são adequadas ao nosso caso de uso?</p></li></ul><p>Por algum motivo, quando um pacote de software publica uma comparação de desempenho com seus concorrentes, ele sempre acaba sendo o mais rápido! Se os parâmetros de referência fossem elaborados por terceiros, eles poderiam ser mais equilibrados. O mesmo fenômeno se aplica a artigos acadêmicos. Se um algoritmo apresenta bom desempenho não apenas no artigo original, mas também aparece em outros artigos como uma base de referência sólida, então é muito provável que seja confiável.</p><h2>Seja criativo nos testes.</h2><p>Os algoritmos descritos em artigos acadêmicos geralmente apresentam um comportamento mais sofisticado do que os tipos de algoritmos que encontramos rotineiramente. Talvez seja um algoritmo de aproximação que prioriza a velocidade em detrimento da precisão. Ou talvez seja um método de aprendizado de máquina que recebe um grande conjunto de dados e produz resultados (às vezes inesperados). Como podemos escrever testes para esses algoritmos se não conseguimos caracterizar seu comportamento de forma simples?</p><h3>Foco nos invariantes</h3><p>Ao projetar testes unitários, é comum pensar em termos de exemplos: se fornecermos ao algoritmo esta entrada de exemplo, ele deverá produzir aquela saída. Infelizmente, para a maioria dos algoritmos matemáticos, os testes baseados em exemplos não abrangem suficientemente seu comportamento.</p><p>Vamos considerar o algoritmo C3, que o Elasticsearch usa para determinar qual nó deve processar uma solicitação de pesquisa. O sistema classifica cada nó usando uma fórmula complexa que incorpora o serviço anterior do nó, os tempos de resposta e o tamanho da sua fila. Testar alguns exemplos não garante que entendemos a fórmula corretamente. É útil dar um passo atrás e pensar em testar invariantes: se o tempo de serviço aumentar, a classificação do nó diminui? Se o tamanho da fila for 0, a classificação é determinada pelo tempo de resposta, como afirma o artigo?</p><p>Focar nos invariantes pode ajudar em diversos casos comuns:</p><ul><li><p>O método deve ser independente da ordem? Nesse caso, passar os dados de entrada em uma ordem diferente deve resultar na mesma saída.</p></li><li><p>Alguma etapa do algoritmo produz probabilidades de classe? Nesse caso, a soma dessas probabilidades deve ser igual a 1.</p></li><li><p>A função é simétrica em relação à origem? Nesse caso, inverter o sinal da entrada deve simplesmente inverter o sinal da saída.</p></li></ul><p>Quando implementamos o C3 pela primeira vez, encontramos um erro na fórmula em que, acidentalmente, usamos o inverso do tempo de resposta em vez do próprio tempo de resposta. Isso significava que os nós mais lentos podiam ser classificados em posições mais altas! Ao corrigir o problema, <a href="https://github.com/elastic/elasticsearch/pull/70283">garantimos a adição de verificações de invariância</a> para evitar erros futuros.</p><h3>Compare com uma implementação de referência.</h3><p>Juntamente com o artigo, espera-se que os autores tenham publicado uma implementação do algoritmo. (Isso é especialmente provável se o artigo contiver experimentos, já que muitas revistas exigem que os autores publiquem o código para reproduzir os resultados.) Você pode testar sua abordagem em relação a esta implementação de referência para garantir que não tenha deixado passar detalhes importantes do algoritmo.</p><p>Ao desenvolver a implementação HNSW do Lucene para busca de vizinhos mais próximos, realizamos <a href="https://issues.apache.org/jira/browse/LUCENE-9937">testes em relação a uma biblioteca de referência</a> dos autores do artigo. Executamos o Lucene e a biblioteca no mesmo conjunto de dados, comparando a precisão dos resultados e o número de cálculos realizados. Quando esses números coincidem de perto, sabemos que o Lucene implementa o algoritmo fielmente.</p><p>Ao incorporar um algoritmo em um sistema, muitas vezes é necessário fazer modificações ou extensões, como escalá-lo para vários núcleos ou adicionar heurísticas para melhorar o desempenho. O ideal é primeiro implementar uma versão "vanilla", testá-la em comparação com a versão de referência e, em seguida, fazer alterações incrementais. Dessa forma, você pode ter certeza de que capturou todas as partes principais antes de fazer personalizações.</p><h3>Duelo contra um algoritmo existente</h3><p>A última seção levanta outra ideia para um invariante de teste: comparar a saída do algoritmo com a saída de um algoritmo mais simples e melhor compreendido. Como exemplo, considere o algoritmo block-max WAND do Lucene, que acelera a recuperação de documentos ignorando aqueles que não podem aparecer nos primeiros resultados. É difícil descrever exatamente como o WAND com block-max deve se comportar em todos os casos, mas sabemos que aplicá-lo não deve alterar os melhores resultados! Assim, nossos testes podem gerar diversas consultas de pesquisa aleatórias e, em seguida, <a href="https://github.com/apache/lucene/blob/main/lucene/core/src/test/org/apache/lucene/search/TestWANDScorer.java#L669">executá-las com e sem a otimização WAND</a> , verificando se os resultados sempre coincidem.</p><p>Um aspecto importante desses testes é que eles <a href="https://www.elastic.co/blog/elasticsearch-testing-qa-increasing-coverage-randomizing-test-runs">geram entradas aleatórias</a> para realizar a comparação. Isso pode ajudar a analisar casos que você não teria imaginado e revelar problemas inesperados. Como exemplo, o teste de comparação aleatória do Lucene para pontuação BM25F ajudou <a href="https://issues.apache.org/jira/browse/LUCENE-10039">a detectar erros em casos extremos sutis</a>. A ideia de alimentar um algoritmo com entradas aleatórias está intimamente relacionada ao conceito de <a href="https://en.wikipedia.org/wiki/Fuzzing">fuzzing</a>, uma técnica de teste comum em segurança da computação.</p><p>Elasticsearch e Lucene frequentemente utilizam essa abordagem de teste. Se você vir um teste que menciona um "duelo" entre dois algoritmos (TestDuelingAnalyzers, testDuelTermsQuery...), então você sabe que essa estratégia está em ação.</p><h2>Utilize a terminologia do artigo.</h2><p>Quando outro desenvolvedor trabalhar com seu código, ele precisará consultar o documento para seguir os detalhes. O <a href="https://github.com/elastic/elasticsearch/blob/4f22f437ee50cacb94b37b457be1da0b8ba0e8ce/server/src/main/java/org/elasticsearch/search/aggregations/metrics/HyperLogLogPlusPlus.java#L24-L39">comentário sobre a implementação do HyperLogLog++ do Elasticsearch</a> resume bem a situação: "Tentar entender o que essa classe faz sem ter lido o artigo é considerado uma aventura." Este comentário sobre o método também serve de bom exemplo. Inclui um link para o artigo acadêmico e destaca as modificações feitas no algoritmo em relação à sua descrição original.</p><p>Como os desenvolvedores irão basear sua compreensão do código no documento, é útil usar exatamente a mesma terminologia. Como a notação matemática é concisa, isso pode resultar em nomes que normalmente não seriam considerados de "bom estilo", mas que são muito claros no contexto do artigo. As fórmulas de artigos acadêmicos são uma das poucas ocasiões em que você encontrará nomes de variáveis enigmáticos no Elasticsearch, como <a href="https://github.com/elastic/elasticsearch/blob/4f22f437ee50cacb94b37b457be1da0b8ba0e8ce/server/src/main/java/org/elasticsearch/node/ResponseCollectorService.java#L151">rS e muBarSInverse</a>.</p><p>
<em>A maneira recomendada pelo autor para ler um artigo: com um café bem forte.</em></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt12d81453c706f7cb/6a17d80e0b0bede6badd3424/d03a8e2a50e173b15a4ec3732810c63ff53321f6-1440x1081.jpg" alt="elastic-blog-academicpaper.jpg" /><h2>Você pode enviar um e-mail ao autor.</h2><p>Ao analisar uma prova difícil, você pode passar horas tentando decifrar uma fórmula, sem saber se está entendendo errado ou se há apenas um erro de digitação. Se fosse um projeto de código aberto, você poderia fazer a pergunta no GitHub ou no StackOverflow. Mas onde você pode encontrar um artigo acadêmico? Os autores parecem estar ocupados e podem se incomodar com seus e-mails.</p><p>Pelo contrário, muitos acadêmicos adoram saber que suas ideias estão sendo colocadas em prática e ficam felizes em responder a perguntas por e-mail. Se você trabalhar em um produto com o qual eles estejam familiarizados, eles podem até listar o aplicativo em seu site!</p><p>Há também uma tendência crescente entre os acadêmicos de discutir artigos publicamente, utilizando muitas das mesmas ferramentas do desenvolvimento de software. Se um artigo for acompanhado de um pacote de software, você poderá encontrar respostas para <a href="https://github.com/facebookresearch/faiss/issues/1928">perguntas frequentes no Github</a>. Comunidades do Stack Exchange como "Theoretical Computer Science" e "Cross Validated" também contêm <a href="https://cstheory.stackexchange.com/questions/49296/problem-in-the-paper-stable-minimum-space-partitioning-in-linear-time">discussões detalhadas sobre artigos populares</a>. Algumas conferências começaram a publicar todas as resenhas de artigos online. Essas resenhas contêm <a href="https://openreview.net/forum?id=H1eA7AEtvS">discussões</a> com os autores que podem revelar informações úteis sobre a abordagem.</p><h2>Continua</h2><p>Este post aborda os princípios básicos da escolha de um artigo acadêmico e </p><p>implementá-lo corretamente é suficiente, mas não abrange todos os aspectos da implantação do algoritmo. Por exemplo, se o algoritmo for apenas um componente em um sistema complexo, como podemos garantir que as alterações nesse componente levem a melhorias de ponta a ponta? E se a integração do algoritmo exigir modificações ou extensões substanciais que o artigo original não aborda? Esses são tópicos importantes sobre os quais esperamos compartilhar mais em publicações futuras.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/implementing-academic-papers-lessons-learned-from-elasticsearch-and-lucene</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/implementing-academic-papers-lessons-learned-from-elasticsearch-and-lucene</guid>
    <category><![CDATA[Pesquisa de aprendizado de máquina]]></category>
    <category><![CDATA[Lucene]]></category>
    <dc:creator><![CDATA[Julie Tibshirani]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbd7e961f594005e7/6a17d80f033c8d981f6bb009/d240bfef29e9d432069059b312dd044eb76eec6c-1440x840.png" length="0" type="image/png"/>
    <pubDate>Wed, 29 Sep 2021 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>