<?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[Julie Tibshirani - 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[Julie Tibshirani - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/pt/search-labs/author/julie-tibshirani</link>
    </image>
    <link>https://www.elastic.co/pt/search-labs/author/julie-tibshirani</link>
    <atom:link href="https://www.elastic.co/pt/search-labs/rss/author/julie-tibshirani.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[pt]]></language>
    <lastBuildDate>Tue, 29 Sep 2026 08:47:23 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Busca por similaridade de texto com campos vetoriais]]></title>
    <description><![CDATA[Este artigo explora como os embeddings de texto e o novo tipo dense_vector do Elasticsearch podem ser usados para dar suporte à busca por similaridade.]]></description>
    <content:encoded><![CDATA[<p>Desde seus primórdios como um <a href="https://www.elastic.co/about/history-of-elasticsearch">mecanismo de busca de receitas</a>, o Elasticsearch foi projetado para fornecer uma busca de texto completo rápida e poderosa. Dadas essas raízes, aprimorar a busca textual tem sido uma motivação importante para nosso trabalho contínuo com vetores. No Elasticsearch 7.0, introduzimos tipos de campo experimentais para vetores de alta dimensão e, agora, a versão 7.3 traz suporte para o uso desses vetores na pontuação de documentos.</p><p>Este artigo aborda uma técnica específica chamada busca por similaridade de texto. Nesse tipo de busca, o usuário insere uma breve consulta em texto livre, e os documentos são classificados com base em sua similaridade com a consulta. A similaridade textual pode ser útil em diversos casos de uso:</p><ul><li><p><strong>Resposta a perguntas:</strong> Dada uma coleção de perguntas frequentes, encontre perguntas semelhantes àquela que o usuário inseriu.</p></li><li><p><strong>Busca de artigos:</strong> Em uma coleção de artigos de pesquisa, retornar artigos com títulos intimamente relacionados à consulta do usuário.</p></li><li><p><strong>Busca por imagem:</strong> Em um conjunto de dados de imagens com legendas, encontre imagens cuja legenda seja semelhante à descrição do usuário.</p></li></ul><p>Uma abordagem direta para a busca por similaridade seria classificar os documentos com base em quantas palavras eles compartilham com a consulta. Mas um documento pode ser semelhante à consulta mesmo que tenha pouquíssimas palavras em comum — uma noção mais robusta de similaridade levaria em conta também seu conteúdo sintático e <a href="https://en.wikipedia.org/wiki/Semantic_similarity">semântico</a> .</p><p>A comunidade de processamento de linguagem natural (PLN) desenvolveu uma técnica chamada incorporação de texto que codifica palavras e frases como vetores numéricos. Essas representações vetoriais são projetadas para capturar o conteúdo linguístico do texto e podem ser usadas para avaliar a similaridade entre uma consulta e um documento.</p><p>Este artigo explora como os embeddings de texto e o tipo dense_vector do Elasticsearch podem ser usados para dar suporte à busca por similaridade. Primeiramente, apresentaremos uma visão geral das técnicas de incorporação e, em seguida, demonstraremos um protótipo simples de busca por similaridade usando o Elasticsearch.</p><strong>Nota:</strong> O uso de incorporação de texto em pesquisas é uma área complexa e em constante evolução. Este blog não constitui uma recomendação para uma arquitetura ou implementação específica. Comece aqui para aprender como você pode aprimorar sua experiência de busca com o poder da <a href="https://www.elastic.co/what-is/vector-search">busca vetorial</a>.<h2>O que são embeddings de texto?</h2><p>Vamos analisar mais de perto os diferentes tipos de incorporação de texto e como eles se comparam às abordagens de busca tradicionais.</p><h3>Incorporação de palavras</h3><p>Um modelo <a href="https://en.wikipedia.org/wiki/Word_embedding">de incorporação de palavras</a> representa uma palavra como um vetor numérico denso. Esses vetores visam capturar as propriedades semânticas da palavra — palavras cujos vetores estejam próximos uns dos outros devem ser semelhantes em termos de significado semântico. Numa boa incorporação, as direções no espaço vetorial estão ligadas a diferentes aspectos do significado da palavra. Por exemplo, o vetor para "Canadá" pode estar próximo de "França" em uma direção e próximo de "Toronto" em outra.</p><p>As comunidades de PNL (Processamento de Linguagem Natural) e de busca têm demonstrado interesse em representações vetoriais de palavras há bastante tempo. Nos últimos anos, houve um ressurgimento do interesse em word embeddings, quando muitas tarefas tradicionais foram revisitadas usando redes neurais. Alguns algoritmos de incorporação de palavras bem-sucedidos foram desenvolvidos, incluindo <a href="https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf">o word2vec</a> e <a href="https://nlp.stanford.edu/pubs/glove.pdf">o GloVe</a>. Essas abordagens utilizam grandes coleções de texto e examinam o contexto em que cada palavra aparece para determinar sua representação vetorial:</p><ul><li><p>O modelo Skip-gram do word2vec treina uma rede neural para prever as palavras de contexto ao redor de uma palavra em uma frase. Os pesos internos da rede fornecem os embeddings de palavras.</p></li><li><p>Em GloVe, a similaridade entre palavras depende da frequência com que elas aparecem em conjunto com outras palavras do mesmo contexto. O algoritmo treina um modelo linear simples com base na contagem de coocorrência de palavras.</p></li></ul><p>Muitos grupos de pesquisa distribuem modelos que foram pré-treinados em grandes corpora de texto, como a Wikipédia ou o Common Crawl, tornando-os convenientes para baixar e usar em tarefas subsequentes. Embora versões pré-treinadas sejam às vezes usadas diretamente, pode ser útil ajustar o modelo para que ele se adeque ao conjunto de dados e à tarefa específicos. Isso geralmente é feito executando uma etapa de "ajuste fino" no modelo pré-treinado.</p><p>Os word embeddings provaram ser bastante robustos e eficazes, e agora é prática comum usar embeddings em vez de tokens individuais em tarefas de PNL, como tradução automática e classificação de sentimentos.</p><h3>Incorporação de frases</h3><p>Mais recentemente, os pesquisadores começaram a se concentrar em técnicas de incorporação que representam não apenas palavras, mas também trechos de texto mais longos. A maioria das abordagens atuais baseia-se em arquiteturas complexas de redes neurais e, por vezes, incorpora dados rotulados durante o treinamento para auxiliar na captura de informações semânticas.</p><p>Uma vez treinados, os modelos são capazes de pegar uma frase e produzir um vetor para cada palavra em contexto, bem como um vetor para a frase inteira. Assim como no caso do word embedding, versões pré-treinadas de muitos modelos estão disponíveis, permitindo que os usuários ignorem o dispendioso processo de treinamento. Embora o processo de treinamento possa ser bastante intensivo em recursos, a invocação do modelo é muito mais leve — os modelos de incorporação de sentenças são normalmente rápidos o suficiente para serem usados em aplicações em tempo real.</p><p>Algumas técnicas comuns de incorporação de sentenças incluem <a href="https://arxiv.org/abs/1705.02364">InferSent</a>, <a href="https://arxiv.org/abs/1803.11175">Universal Sentence Encoder</a>, <a href="https://arxiv.org/abs/1802.05365">ELMo</a> e <a href="https://arxiv.org/abs/1810.04805">BERT</a>. A melhoria dos embeddings de palavras e frases é uma área ativa de pesquisa, e é provável que modelos robustos adicionais sejam introduzidos.</p><h3>Comparação com abordagens de busca tradicionais</h3><p>Na recuperação de informação tradicional, uma forma comum de representar texto como um vetor numérico é atribuir uma dimensão para cada palavra do vocabulário. O vetor para um trecho de texto é então baseado no número de vezes que cada termo do vocabulário aparece. Essa forma de representar o texto é frequentemente chamada de "saco de palavras", porque simplesmente contamos as ocorrências de palavras sem levar em consideração a estrutura da frase.</p><p>Os embeddings de texto diferem das representações vetoriais tradicionais em alguns aspectos importantes:</p><ul><li><p>Os vetores codificados são densos e de dimensionalidade relativamente baixa, geralmente variando de 100 a 1.000 dimensões. Em contraste, os vetores de saco de palavras são esparsos e podem conter mais de 50.000 dimensões. Os algoritmos de incorporação codificam o texto em um espaço de menor dimensão como parte da modelagem de seu significado semântico. Idealmente, palavras e frases sinônimas acabam com uma representação semelhante no novo espaço vetorial.</p></li><li><p>Os embeddings de sentenças podem levar em consideração a ordem das palavras ao determinar a representação vetorial. Por exemplo, a expressão "tune in" pode ser representada por um vetor muito diferente de "in tune".</p></li><li><p>Na prática, os embeddings de frases geralmente não se generalizam bem para grandes trechos de texto. Não são comumente usados para representar textos com mais de um parágrafo curto.</p></li></ul><h2>Utilizando embeddings para busca de similaridade</h2><p>Suponhamos que tivéssemos uma grande coleção de perguntas e respostas. Um usuário pode fazer uma pergunta, e queremos recuperar a pergunta mais semelhante em nossa coleção para ajudá-lo a encontrar uma resposta.</p><p>Poderíamos usar incorporações de texto para permitir a recuperação de perguntas semelhantes:</p><ul><li><p>Durante a indexação, cada pergunta é processada por um modelo de incorporação de sentenças para produzir um vetor numérico.</p></li><li><p>Quando um usuário insere uma consulta, ela é processada pelo mesmo modelo de incorporação de sentenças para produzir um vetor. Para classificar as respostas, calculamos a similaridade vetorial entre cada pergunta e o vetor de consulta. Ao comparar vetores de incorporação, é comum usar <a href="https://en.wikipedia.org/wiki/Cosine_similarity">a similaridade de cosseno</a>.</p></li></ul><p><a href="https://github.com/jtibshirani/text-embeddings">Este repositório</a> fornece um exemplo simples de como isso pode ser feito no Elasticsearch. O script principal indexa cerca de 20.000 perguntas do <a href="https://github.com/elastic/rally-tracks/tree/master/so">conjunto de dados do StackOverflow</a> e, em seguida, permite que o usuário insira consultas de texto livre no conjunto de dados.</p><p>Em breve, analisaremos cada parte do script em detalhes, mas primeiro vamos dar uma olhada em alguns exemplos de resultados. Em muitos casos, o método consegue captar semelhanças mesmo quando não há uma sobreposição significativa de palavras entre a consulta e a pergunta indexada:</p><ul><li><p>"Compactar arquivos" retorna "Comprimir/Descomprimir Pastas e Arquivos"</p></li><li><p>"Determinar se algo é um IP" retorna "Como saber se uma string é um IP ou um nome de host?"</p></li><li><p>"Converter bytes em doubles" retorna "Converter bytes em números de ponto flutuante em Python"</p></li></ul><h3>Detalhes da implementação</h3><p><a href="https://github.com/jtibshirani/text-embeddings/blob/blog/src/main.py">O script</a> começa baixando e criando o modelo de incorporação no TensorFlow. Optamos pelo Universal Sentence Encoder do Google, mas é possível usar muitos outros métodos de incorporação. O script utiliza o modelo de incorporação tal como está, sem qualquer treinamento ou ajuste fino adicional.</p><p>Em seguida, criamos o índice do Elasticsearch, que inclui mapeamentos para o título da pergunta, tags e também o título da pergunta codificado como um vetor:</p>"mappings": {
"properties": {
"title": {
"type": "text"
},
"title_vector": {
"type": "dense_vector",
"dims": 512
}
"tags": {
"type": "keyword"
},
...
}
}
<p>No mapeamento para dense_vector, é necessário especificar o número de dimensões que os vetores conterão. Ao indexar um campo title_vector, o Elasticsearch verificará se ele possui o mesmo número de dimensões especificado no mapeamento.</p><p>Para indexar os documentos, aplicamos o modelo de incorporação ao título da pergunta para obter uma matriz numérica. Essa matriz é adicionada ao documento no campo title_vector.</p><p>Quando um usuário insere uma consulta, o texto é primeiro processado pelo mesmo modelo de incorporação e armazenado no parâmetro `query_vector`. A partir da versão 7.3, o Elasticsearch fornece uma <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.6/query-dsl-script-score-query.html#vector-functions">função de similaridade de cosseno</a> em sua linguagem de script nativa. Para classificar as perguntas com base na sua similaridade com a consulta do usuário, utilizamos uma consulta `script_score`:</p>{
"script_score": {
"query": {"match_all": {}},
"script": {
"source": "cosineSimilarity(params.query_vector, 'title_vector') + 1.0",
"params": {"query_vector": query_vector}
}
}
}
<p>Garantimos passar o vetor de consulta como um parâmetro de script para <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.6/modules-scripting-using.html#prefer-params">evitar recompilar o script</a>() em cada nova consulta. Como o Elasticsearch não permite pontuações negativas, é necessário adicionar um à similaridade de cosseno.</p><p><strong>Nota:</strong> esta publicação no blog usava originalmente uma <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.3/query-dsl-script-score-query.html#vector-functions">sintaxe diferente para funções vetoriais</a> , disponível no Elasticsearch 7.3, mas que foi descontinuada na versão 7.6.
|</p><h3>Limitações importantes</h3><p>A consulta script_score foi projetada para encapsular uma consulta restritiva e modificar as pontuações dos documentos retornados. No entanto, fornecemos uma consulta match_all, o que significa que o script será executado em todos os documentos do índice. Essa é uma limitação atual da similaridade vetorial no Elasticsearch — vetores podem ser usados para pontuar documentos, mas não na etapa inicial de recuperação. O suporte para recuperação baseada na similaridade vetorial é uma importante área de <a href="https://github.com/elastic/elasticsearch/issues/42326">trabalho em andamento</a>.</p><p>Para evitar a varredura de todos os documentos e manter um desempenho rápido, a consulta match_all pode ser substituída por uma consulta mais seletiva. A consulta correta a ser usada para recuperação de dados provavelmente dependerá do caso de uso específico.</p><p>Embora tenhamos visto alguns exemplos encorajadores acima, é importante notar que os resultados também podem ser inconsistentes e pouco intuitivos. Por exemplo, "compactar arquivos" também atribui pontuações altas a ".csproj parcial". Arquivos" e "Como evitar arquivos .pyc" arquivos?". E quando o método retorna resultados inesperados, nem sempre é claro como depurar o problema — o significado de cada componente do vetor costuma ser opaco e não corresponde a um conceito interpretável. Com as técnicas tradicionais de pontuação baseadas na sobreposição de palavras, muitas vezes é mais fácil responder à pergunta "por que este documento está bem classificado?".</p><p>Conforme mencionado anteriormente, este protótipo serve como um exemplo de como os modelos de incorporação podem ser usados com campos vetoriais, e não como uma solução pronta para produção. Ao desenvolver uma nova estratégia de busca, é fundamental testar o desempenho da abordagem em seus próprios dados, certificando-se de compará-la com uma base de referência sólida, como uma consulta de correspondência. Pode ser necessário fazer mudanças significativas na estratégia antes que ela alcance resultados sólidos, incluindo o ajuste fino do modelo de incorporação para o conjunto de dados alvo ou a tentativa de diferentes maneiras de incorporar embeddings, como a expansão de consultas em nível de palavra.</p><h2>Conclusões</h2><p>As técnicas de incorporação oferecem uma maneira poderosa de capturar o conteúdo linguístico de um texto. Ao indexar representações vetoriais e atribuir pontuações com base na distância vetorial, podemos comparar documentos usando uma noção de similaridade que vai além da sobreposição em nível de palavras.</p><p>Estamos ansiosos para introduzir mais funcionalidades baseadas no tipo de campo vetorial. O uso de vetores para busca é uma área complexa e em constante desenvolvimento — como sempre, adoraríamos saber mais sobre seus casos de uso e experiências no <a href="https://github.com/elastic/elasticsearch">Github</a> e nos <a href="https://discuss.elastic.co/">fóruns de discussão</a>!</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/text-similarity-search-with-vectors-in-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/text-similarity-search-with-vectors-in-elasticsearch</guid>
    <category><![CDATA[Banco de dados vetorial]]></category>
    <dc:creator><![CDATA[Julie Tibshirani]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt91384bd99b05cd28/6a17e7e01d1b835cc593e467/c633ed737add7d22a7d65b3ca5c56480ef3d8b2c-720x420.jpg" length="0" type="image/jpeg"/>
    <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>