<?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[Priscilla Parodi - 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[Priscilla Parodi - 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/priscilla-parodi</link>
    </image>
    <link>https://www.elastic.co/pt/search-labs/author/priscilla-parodi</link>
    <atom:link href="https://www.elastic.co/pt/search-labs/rss/author/priscilla-parodi.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[pt]]></language>
    <lastBuildDate>Mon, 28 Sep 2026 05:13:23 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Detecção de plágio por IA: usando o Elasticsearch]]></title>
    <description><![CDATA[Veja como verificar plágio em inteligência artificial usando o Elasticsearch, com foco em casos de uso com modelos de PNL (Processamento de Linguagem Natural) e Busca Vetorial.]]></description>
    <content:encoded><![CDATA[<p>O plágio pode ser <strong>direto</strong>, envolvendo a cópia de partes ou do conteúdo inteiro, ou <strong>parafraseado</strong>, onde a obra do autor é reformulada alterando-se algumas palavras ou frases.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb6e139760e56ec98/6a171147dc55de0ad2e00edf/5d7073187fda829438aeec8d3a1194a5bea2ba57-1440x347.png" alt="" /><p>Existe uma distinção entre inspiração e paráfrase. É possível ler um conteúdo, se inspirar e depois explorar a ideia com suas próprias palavras, mesmo que você chegue a uma conclusão semelhante.</p><p>Embora o plágio seja um tema de discussão há muito tempo, a produção e publicação aceleradas de conteúdo o mantiveram relevante e representaram um desafio constante.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc2af1678cb04506b/6a171149cf4f251c2ab2d257/a0b9a98d729db09dae0a79315c001e6763c12704-1400x1016.png" alt="" /><p>Esse desafio não se limita a livros, pesquisas acadêmicas ou documentos judiciais, onde verificações de plágio são realizadas com frequência. Isso também pode se estender a jornais e até mesmo às redes sociais.</p><p>Com a abundância de informações e o fácil acesso à publicação, como o plágio pode ser verificado de forma eficaz e em larga escala?</p><p>Universidades, entidades governamentais e empresas utilizam diversas ferramentas, mas, embora uma simples <a href="https://www.elastic.co/search-labs/lexical-and-semantic-search-with-elasticsearch">busca lexical</a> possa detectar plágio direto com eficácia, o principal desafio reside na identificação <strong>de conteúdo parafraseado.</strong></p><h2>Detecção de plágio com IA generativa</h2><p>Um novo desafio surge com a IA generativa. O conteúdo gerado por IA é considerado plágio quando copiado?</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8a1ed1b6fa3f1a56/6a17114b4a531bc40736aa69/9345b28d6d27c37469bc38e823c41780b4eabfe5-1440x875.png" alt="" /><p>Os <a href="https://openai.com/policies/terms-of-use">termos de uso</a> da <a href="https://openai.com/">OpenAI , por exemplo, especificam que a OpenAI não reivindicará direitos autorais sobre o conteúdo gerado pela API para os usuários.</a> Nesse caso, os indivíduos que utilizam sua IA generativa podem usar o conteúdo gerado como preferirem, sem necessidade de citação.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbc2e08ab5b808e38/6a17114dab7f086cbadb9f93/e1f415f69a247666f02ddc81468944920c874cd7-968x814.png" alt="" /><p>No entanto, a aceitação do uso de IA generativa para melhorar a eficiência ainda é um tema de debate.</p><p>Na tentativa de contribuir para a detecção de plágio, a OpenAI desenvolveu um <a href="https://huggingface.co/roberta-base-openai-detector">modelo de detecção</a> , mas posteriormente reconheceu que sua precisão não é suficientemente alta.</p><p><em>"Acreditamos que essa precisão não é suficiente para uma detecção independente e precisa ser combinada com abordagens baseadas em metadados, julgamento humano e educação pública para ser mais eficaz."</em></p><p>O desafio persiste; no entanto, com a disponibilidade de mais ferramentas, existem agora mais opções para detectar plágio, mesmo em casos de conteúdo parafraseado e gerado por IA.</p><h2>Detecção de plágio com Elasticsearch</h2><p>Reconhecendo isso, neste blog exploraremos mais um caso de uso com modelos de Processamento de Linguagem Natural (PLN) e Busca Vetorial: a detecção de plágio, além das buscas por metadados.</p><p>Isso é demonstrado com <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/plagiarism-detection-with-elasticsearch/plagiarism_detection_es.ipynb">exemplos em Python</a>, onde utilizamos um <a href="https://sbert.net/datasets/emnlp2016-2018.json">conjunto de dados</a> do <a href="https://www.sbert.net/">SentenceTransformers</a> contendo artigos relacionados a PNL (Processamento de Linguagem Natural). Verificamos se os resumos contêm plágio realizando uma 'similaridade textual semântica', considerando representações vetoriais de 'resumos' geradas com um <a href="https://huggingface.co/sentence-transformers/all-mpnet-base-v2">modelo de incorporação de texto</a> previamente importado para o Elasticsearch. Além disso, para identificar conteúdo gerado por IA — plágio por IA —, um <a href="https://huggingface.co/roberta-base-openai-detector">modelo de PNL</a> desenvolvido pela OpenAI também foi importado para o Elasticsearch.</p><p>A imagem a seguir ilustra o fluxo de dados:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0464f88d3ed12070/6a17114fab7f084905db9f97/1ad89c98a2f42a497548ca3947749bad54ec1172-1440x880.png" alt="" /><p>Durante o <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/ingest.html">processo de ingestão</a> com um <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/inference-processor.html">processador de inferência</a>, o parágrafo 'abstract' é mapeado para um vetor de 768 dimensões, o 'abstract_vector.predicted_value'.</p><p>Mapeamento:</p>"abstract_vector.predicted_value": { # Inference results field
"type": "dense_vector", 
"dims": 768, # model embedding_size
"index": "true", 
"similarity": "dot_product" # When indexing vectors for approximate kNN search, you need to specify the similarity function for comparing the vectors.
<p>A similaridade entre representações vetoriais é medida usando uma métrica de similaridade vetorial, definida pelo <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/dense-vector.html#dense-vector-params">parâmetro</a> 'similaridade'.</p><p><a href="https://en.wikipedia.org/wiki/Cosine_similarity">O cosseno</a> é a métrica de similaridade padrão, calculada como '(1 + cosseno(consulta, vetor)) / 2'. A menos que seja necessário preservar os vetores originais e não seja possível normalizá-los antecipadamente, a maneira mais eficiente de realizar a similaridade de cosseno é normalizar todos os vetores para comprimento unitário. Isso ajuda a evitar cálculos extras de comprimento de vetor durante a busca; em vez disso, use 'produto escalar'.</p><p>Nesse mesmo fluxo de trabalho, outro processador de inferência contendo o <a href="https://huggingface.co/roberta-base-openai-detector">modelo de classificação de texto</a> detecta se o conteúdo é 'Real', provavelmente escrito por humanos, ou 'Falso', provavelmente escrito por IA, adicionando o 'openai-detector.predicted_value' a cada documento.</p><p>Pipeline de ingestão:</p>client.ingest.put_pipeline( 
    id="plagiarism-checker-pipeline",
    processors = [
    {
      "inference": { #for ml models - to infer against the data that is being ingested in the pipeline
        "model_id": "roberta-base-openai-detector", #text classification model id
        "target_field": "openai-detector", # Target field for the inference results
        "field_map": { #Maps the document field names to the known field names of the model.
        "abstract": "text_field" # Field matching our configured trained model input. 
        }
      }
    },
    {
      "inference": {
        "model_id": "sentence-transformers__all-mpnet-base-v2", #text embedding model id
        "target_field": "abstract_vector", # Target field for the inference results
        "field_map": {
        "abstract": "text_field" # Field matching our configured trained model input. Typically for NLP models, the field name is text_field.
        }
      }
    }
    
  ]
)
<p>No momento da consulta, o mesmo modelo de incorporação de texto também é empregado para gerar a representação vetorial da consulta 'model_text' em um objeto 'query_vector_builder'.</p><p>Uma busca por k-vizinhos mais próximos (kNN) encontra os k vetores mais próximos do vetor de consulta, medidos pela métrica de similaridade.</p><p>A pontuação de cada documento é derivada da similaridade, garantindo que uma pontuação maior corresponda a uma classificação mais alta. Isso significa que o documento é semanticamente mais semelhante. Como resultado, estamos apresentando três possibilidades: se a pontuação for &gt; 0,9, consideramos 'alta similaridade'; se for &lt; 0,7, 'baixa similaridade'; caso contrário, 'similaridade moderada'. Você tem a flexibilidade de definir diferentes valores de limite para determinar qual nível de _score se qualifica como plágio ou não, com base no seu caso de uso.</p><p>Além disso, é realizada uma classificação de texto para verificar também a presença de elementos gerados por IA na consulta textual.</p><p>Consulta:</p>from elasticsearch import Elasticsearch
from elasticsearch.client import MlClient

#duplicated text - direct plagiarism test

model_text = 'Understanding and reasoning about cooking recipes is a fruitful research direction towards enabling machines to interpret procedural text. In this work, we introduce RecipeQA, a dataset for multimodal comprehension of cooking recipes. It comprises of approximately 20K instructional recipes with multiple modalities such as titles, descriptions and aligned set of images. With over 36K automatically generated question-answer pairs, we design a set of comprehension and reasoning tasks that require joint understanding of images and text, capturing the temporal flow of events and making sense of procedural knowledge. Our preliminary results indicate that RecipeQA will serve as a challenging test bed and an ideal benchmark for evaluating machine comprehension systems. The data and leaderboard are available at http://hucvl.github.io/recipeqa.'

response = client.search(index='plagiarism-checker', size=1,
    knn={
        "field": "abstract_vector.predicted_value",
        "k": 9,
        "num_candidates": 974,
        "query_vector_builder": { #The 'all-mpnet-base-v2' model is also employed to generate the vector representation of the query in a 'query_vector_builder' object.
            "text_embedding": {
                "model_id": "sentence-transformers__all-mpnet-base-v2",
                "model_text": model_text
            }
        }
    }
)

for hit in response['hits']['hits']:
    score = hit['_score']
    title = hit['_source']['title']
    abstract = hit['_source']['abstract']
    openai = hit['_source']['openai-detector']['predicted_value']
    url = hit['_source']['url']

    if score &gt; 0.9:
        print(f"\nHigh similarity detected! This might be plagiarism.")
        print(f"\nMost similar document: '{title}'\n\nAbstract: {abstract}\n\nurl: {url}\n\nScore:{score}\n\n")

        if openai == 'Fake':
            print("This document may have been created by AI.\n")

    elif score &lt; 0.7:
        print(f"\nLow similarity detected. This might not be plagiarism.")

        if openai == 'Fake':
            print("This document may have been created by AI.\n")

    else:
        print(f"\nModerate similarity detected.")
        print(f"\nMost similar document: '{title}'\n\nAbstract: {abstract}\n\nurl: {url}\n\nScore:{score}\n\n")

        if openai == 'Fake':
            print("This document may have been created by AI.\n")

ml_client = MlClient(client)

model_id = 'roberta-base-openai-detector' #open ai text classification model

document = [
    {
        "text_field": model_text
    }
]

ml_response = ml_client.infer_trained_model(model_id=model_id, docs=document)

predicted_value = ml_response['inference_results'][0]['predicted_value']

if predicted_value == 'Fake':
    print("\nNote: The text query you entered may have been generated by AI.\n")
<p>Saída:</p>High similarity detected! This might be plagiarism.

Most similar document: 'RecipeQA: A Challenge Dataset for Multimodal Comprehension of Cooking Recipes'

Abstract: Understanding and reasoning about cooking recipes is a fruitful research direction towards enabling machines to interpret procedural text. In this work, we introduce RecipeQA, a dataset for multimodal comprehension of cooking recipes. It comprises of approximately 20K instructional recipes with multiple modalities such as titles, descriptions and aligned set of images. With over 36K automatically generated question-answer pairs, we design a set of comprehension and reasoning tasks that require joint understanding of images and text, capturing the temporal flow of events and making sense of procedural knowledge. Our preliminary results indicate that RecipeQA will serve as a challenging test bed and an ideal benchmark for evaluating machine comprehension systems. The data and leaderboard are available at[ http://hucvl.github.io/recipeqa](http://hucvl.github.io/recipeqa).

url:[http://aclweb.org/anthology/D18-1166](http://aclweb.org/anthology/D18-1166)

Score:1.0
<p>Neste exemplo, após utilizar um dos valores 'abstratos' do nosso conjunto de dados como a consulta de texto 'model_text', foi identificado plágio. A pontuação de similaridade é 1,0, indicando um alto nível de similaridade — <strong>plágio direto</strong>. A consulta vetorizada e o documento não foram reconhecidos como conteúdo gerado por IA, o que era esperado.</p><p>Consulta:</p>#similar text - paraphrase plagiarism test 

model_text = 'Comprehending and deducing information from culinary instructions represents a promising avenue for research aimed at empowering artificial intelligence to decipher step-by-step text. In this study, we present CuisineInquiry, a database for the multifaceted understanding of cooking guidelines. It encompasses a substantial number of informative recipes featuring various elements such as headings, explanations, and a matched assortment of visuals. Utilizing an extensive set of automatically crafted question-answer pairings, we formulate a series of tasks focusing on understanding and logic that necessitate a combined interpretation of visuals and written content. This involves capturing the sequential progression of events and extracting meaning from procedural expertise. Our initial findings suggest that CuisineInquiry is poised to function as a demanding experimental platform.'
<p>Saída:</p>High similarity detected! This might be plagiarism.

Most similar document: 'RecipeQA: A Challenge Dataset for Multimodal Comprehension of Cooking Recipes'

Abstract: Understanding and reasoning about cooking recipes is a fruitful research direction towards enabling machines to interpret procedural text. In this work, we introduce RecipeQA, a dataset for multimodal comprehension of cooking recipes. It comprises of approximately 20K instructional recipes with multiple modalities such as titles, descriptions and aligned set of images. With over 36K automatically generated question-answer pairs, we design a set of comprehension and reasoning tasks that require joint understanding of images and text, capturing the temporal flow of events and making sense of procedural knowledge. Our preliminary results indicate that RecipeQA will serve as a challenging test bed and an ideal benchmark for evaluating machine comprehension systems. The data and leaderboard are available at[ http://hucvl.github.io/recipeqa](http://hucvl.github.io/recipeqa).

url:[http://aclweb.org/anthology/D18-1166](http://aclweb.org/anthology/D18-1166)

Score:0.9302529

Note: The text query you entered may have been generated by AI.
<p>Ao atualizar a consulta de texto 'model_text' com um texto gerado por IA que transmite a mesma mensagem, minimizando a repetição de palavras semelhantes, a similaridade detectada ainda foi alta, mas a pontuação foi de 0,9302529 em vez de 1,0 — <strong>plágio por paráfrase</strong>. Também era esperado que essa consulta, gerada por IA, fosse detectada.</p><p>Por fim, considerando a consulta de texto 'model_text' como um texto sobre Elasticsearch, que não é um resumo de nenhum desses documentos, a similaridade detectada foi de 0,68991005, indicando baixa similaridade de acordo com os valores de limite considerados.</p><p>Consulta:</p>#different text - not a plagiarism

model_text = 'Elasticsearch provides near real-time search and analytics for all types of data.'
<p>Saída:</p>Low similarity detected. This might not be plagiarism.
<p>Embora o plágio tenha sido identificado com precisão na consulta de texto gerada pela IA, bem como em casos de paráfrase e conteúdo copiado diretamente, navegar pelo cenário da detecção de plágio envolve reconhecer vários aspectos.</p><p>No contexto da detecção de conteúdo gerado por IA, exploramos um modelo que oferece uma contribuição valiosa. No entanto, é crucial reconhecer as limitações inerentes à detecção isolada, o que torna necessária a incorporação de outros métodos para aumentar a precisão.</p><p>A variabilidade introduzida pela escolha dos modelos de incorporação de texto é outra consideração importante. Diferentes modelos, treinados com conjuntos de dados distintos, resultam em níveis variados de similaridade, o que destaca a importância das representações vetoriais de texto geradas.</p><p>Por fim, nesses exemplos, utilizamos o resumo do documento. No entanto, a detecção de plágio geralmente envolve documentos extensos, tornando essencial abordar o desafio do tamanho do texto. É comum que o texto exceda o limite de tokens de um modelo, exigindo segmentação em partes antes da construção dos embeddings. Uma <a href="https://www.elastic.co/guide/en/elasticsearch/reference/8.11/knn-search.html#nested-knn-search">abordagem prática</a> para lidar com isso envolve a utilização de estruturas aninhadas com dense_vector.</p><h2>Conclusão</h2><p>Neste blog, discutimos os desafios da detecção de plágio, particularmente em conteúdo parafraseado e gerado por IA, e como a similaridade textual semântica e a classificação de texto podem ser usadas para esse fim.</p><p>Ao combinar esses métodos, fornecemos um exemplo de detecção de plágio no qual identificamos com sucesso conteúdo gerado por IA, plágio direto e plágio por paráfrase.</p><p>O objetivo principal era estabelecer um sistema de filtragem que simplificasse a detecção, mas a avaliação humana continua sendo essencial para a validação.</p><p>Se você tiver interesse em aprender mais sobre similaridade textual semântica e PNL, recomendamos que você também confira estes links:</p><ul><li><p><a href="https://www.elastic.co/what-is/semantic-search">O que é a busca semântica?</a></p></li><li><p><a href="https://www.elastic.co/what-is/natural-language-processing">O que é processamento de linguagem natural (PLN)?</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/lexical-and-semantic-search-with-elasticsearch">Busca Léxica e Semântica com Elasticsearch</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/chunking-via-ingest-pipelines">Fragmentar documentos grandes por meio de pipelines de ingestão, juntamente com vetores aninhados, resulta em uma busca de trechos facilitada.</a></p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/ai-plagiarism-checker-with-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/ai-plagiarism-checker-with-elasticsearch</guid>
    <category><![CDATA[Banco de dados vetorial]]></category>
    <category><![CDATA[Python]]></category>
    <dc:creator><![CDATA[Priscilla Parodi]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt68a5bc2434a9b03b/6a1711510e2e49a09641a22a/83e05cd4f81799fbb7b7950ed87600e825ec81e9-1024x1024.png" length="0" type="image/png"/>
    <pubDate>Tue, 19 Dec 2023 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Busca lexical e semântica com Elasticsearch]]></title>
    <description><![CDATA[Neste blog, exploraremos várias abordagens para recuperar informações usando o Elasticsearch, com foco em busca lexical e semântica.]]></description>
    <content:encoded><![CDATA[<p>A busca é o processo de localizar as informações mais relevantes com base na sua consulta de pesquisa ou em consultas combinadas, e os resultados de pesquisa relevantes são os documentos que melhor correspondem a essas consultas. Embora existam diversos desafios e métodos associados à busca, o objetivo final permanece o mesmo: <strong>encontrar a melhor resposta possível para sua pergunta</strong>.</p><p>Considerando esse objetivo, neste post do blog, exploraremos diferentes abordagens para recuperar informações usando o Elasticsearch, com foco específico em busca de texto: <strong>busca lexical e busca semântica.</strong></p><h2>Pré-requisitos</h2><p>Para isso, forneceremos exemplos em Python que demonstram vários cenários de pesquisa em um <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/lexical-and-semantic-search-with-elasticsearch/products-ecommerce.json">conjunto de dados</a> gerado para simular informações de produtos de comércio eletrônico.</p><p>Este conjunto de dados contém mais de 2.500 produtos, cada um com uma descrição. Esses produtos estão categorizados em 76 categorias distintas, cada uma contendo um número variável de produtos, conforme mostrado abaixo:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt34415151c00ced2b/6a17d8710b0bed6c9bdd342c/4104466050f3024b6bcaf382da2a702650f62227-1440x708.png" alt="" /><p><em>Visualização em mapa de árvore - os 22 principais valores de category.keyword (categorias de produtos)</em></p><p>Para a configuração, você precisará de:</p><ul><li><p>Python 3.6 ou posterior</p></li><li><p>O <a href="https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/index.html">cliente Elastic Python</a></p></li><li><p>Implantação do Elasticsearch 8.8 ou posterior, com nó de aprendizado de máquina de 8 GB de memória.</p></li><li><p>O modelo <a href="https://www.elastic.co/guide/en/machine-learning/8.9/ml-nlp-elser.html">Elastic Learned Sparse EncodeR</a> que vem pré-carregado no Elastic instalado e em execução na sua implementação.</p></li></ul><p>Usaremos o Elastic Cloud, e um <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">período de teste gratuito está disponível</a>.</p><p>Além das consultas de pesquisa fornecidas nesta postagem do blog, um <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/lexical-and-semantic-search-with-elasticsearch/ecommerce_dense_sparse_project.ipynb">notebook Python</a> irá guiá-lo pelos seguintes processos:</p><ul><li><p>Estabeleça uma conexão com nossa implantação Elastic usando o cliente Python.</p></li><li><p>Carregar um modelo de incorporação de texto no cluster Elasticsearch</p></li><li><p>Crie um índice com mapeamentos para indexar vetores de características e vetores densos.</p></li><li><p>Crie um pipeline de ingestão com processadores de inferência para incorporação e expansão de texto.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0e95406ece8f08d9/6a17d8731d1b83d32e93e2f4/54a9a490a3b0cf1b9c2228bee8eddd3f566bd435-1418x1102.png" alt="" /><h2>Busca lexical - recuperação esparsa</h2><p>A forma clássica como os documentos são classificados por relevância pelo Elasticsearch com base em uma consulta de texto utiliza a implementação Lucene do modelo <a href="https://en.wikipedia.org/wiki/Okapi_BM25">BM25</a> , um <strong>modelo esparso para busca lexical</strong>. Este método segue a abordagem tradicional para busca de texto, procurando por correspondências exatas dos termos.</p><p>Para tornar essa busca possível, o Elasticsearch converte os dados <strong>dos campos de texto</strong> em um formato pesquisável, realizando uma análise de texto.</p><p><strong>A análise de texto</strong> é realizada por um<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/analyzer-anatomy.html"> analisador</a>, um conjunto de regras que regem o processo de extração de tokens relevantes para a pesquisa. Um analisador deve ter exatamente um<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenizers.html"> tokenizador</a>. O analisador léxico recebe um fluxo de caracteres e o divide em tokens individuais (geralmente palavras individuais), como no exemplo abaixo:</p><h3>Tokenização de strings para busca lexical</h3>#Performs text analysis on a string and returns the resulting tokens.

# Define the text to be analyzed
text = "Comfortable furniture for a large balcony"

# Define the analyze request
request_body = {
  "analyzer": "standard",
  "text": text
}

# Perform the analyze request
response = client.indices.analyze(analyzer=request_body["analyzer"], text=request_body["text"])

# Extract and display the analyzed tokens
tokens = [token["token"] for token in response["tokens"]]
print("Analyzed Tokens:", tokens)
<p>Saída</p>Analyzed Tokens: ['comfortable', 'furniture', 'for', 'a', 'large', 'balcony']
<p>Neste exemplo, estamos usando o analisador <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-standard-analyzer.html">padrão</a> , que funciona bem para a maioria dos casos de uso, pois fornece tokenização baseada na gramática inglesa. A tokenização permite a correspondência de termos individuais, mas cada token ainda é correspondido literalmente.</p><p>Se você deseja personalizar sua experiência de busca, pode escolher um<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-analyzers.html"> analisador integrado</a> diferente. Por exemplo, ao atualizar o código para usar o <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-stop-analyzer.html">analisador de palavras irrelevantes,</a> o texto será dividido em tokens em qualquer caractere que não seja letra, com suporte para a remoção de palavras irrelevantes.</p>...
# Define the analyze request
request_body = {
  "analyzer": "stop",
  "text": text
}
...
<p>Saída</p>Analyzed Tokens: ['comfortable', 'furniture', 'large', 'balcony']
<p>Quando os analisadores integrados não atendem às suas necessidades, você pode criar um <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-custom-analyzer.html">analisador personalizado</a>, que utiliza a combinação apropriada de zero ou mais <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-charfilters.html">filtros de caracteres</a>, um <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenizers.html">analisador léxico</a> e zero ou mais <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenfilters.html">filtros de tokens</a>.</p>"analyzer":  {

  "my_analyzer": {

    "type": "custom", #For custom analyzers, use a type of custom or omit the type parameter.

    "tokenizer": "standard", #Built-in or customized tokenizer

    "filter": ["lowercase", "synonym"] #Built-in or customized token filters
  }
}
<p>No exemplo acima, que combina um analisador léxico e filtros de tokens, o texto será convertido para minúsculas pelo <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lowercase-tokenfilter.html">filtro de minúsculas</a> antes de ser processado pelo <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-synonym-tokenfilter.html#:~:text=Elasticsearch%20will%20use%20the%20token,applied%20to%20the%20synonym%20entries.">filtro de tokens de sinônimos</a>.</p><h2>Correspondência lexical</h2><p><a href="https://www.elastic.co/blog/practical-bm25-part-2-the-bm25-algorithm-and-its-variables">O BM25</a> medirá a relevância dos documentos para uma determinada consulta de pesquisa com base na frequência dos termos e na sua importância.</p><p>O código abaixo realiza uma consulta <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html">de correspondência</a> , buscando até dois documentos considerando os valores do campo <em>"description"</em> do índice <em>"ecommerce-search"</em> e a consulta de pesquisa <strong>"</strong><em><strong>Móveis confortáveis para uma varanda grande</strong></em><strong>"</strong>.</p><p>Refinar os critérios para que um documento seja considerado uma correspondência para esta consulta pode melhorar a precisão. No entanto, resultados mais específicos têm como contrapartida uma menor tolerância a variações.</p># BM25

response = client.search(size=2,
index="ecommerce-search",
query= {
  "match": {
    "description" : {  
      "query": "Comfortable furniture for a large balcony",
      "analyzer": "stop"
    }
  }
}
)

hits = response['hits']['hits']

if not hits:
  print("No matches found")

else:
  for hit in hits:
    score = hit['_score']
    product = hit['_source']['product']
    category = hit['_source']['category']
    description = hit['_source']['description']
    print(f"\nScore: {score}\nProduct: {product}\nCategory: {category}\nDescription: {description}\n")
<p>Saída</p>Score: 15.607948
Product: Barbie Dreamhouse
Category: Toys
Description: is a classic Barbie playset with multiple rooms, furniture, a large balcony, a pool, and accessories. It allows kids to create their dream Barbie world.

Score: 9.137739
Product: Comfortable Rocking Chair
Category: Indoor Furniture
Description: enjoy relaxing moments with this comfortable rocking chair. Its smooth motion and cushioned seat make it an ideal piece of furniture for unwinding.
<p>Ao analisar os resultados, o mais relevante é o produto "<em>Casa dos Sonhos da Barbie</em>", na categoria "<em>Brinquedos</em>", cuja descrição é altamente relevante por incluir os termos "<em>móveis</em>", "<em>grande"</em> e <em>"varanda</em>". Este é o único produto com três termos na descrição que correspondem à consulta de pesquisa, sendo também o único com o termo <em>"varanda"</em> na descrição.</p><p>O segundo produto mais relevante é uma "<em>Cadeira de Balanço Confortável</em>", categorizada como "<em>Móveis para Interiores</em>", cuja descrição inclui os termos "<em>confortável</em>" e "<em>móveis</em>". Apenas 3 produtos no conjunto de dados correspondem a pelo menos 2 termos desta consulta de pesquisa, e este produto é um deles.</p><p><em>"Confortável"</em> aparece na descrição de 105 produtos e <em>"móveis"</em> na descrição de 4 produtos com 4 categorias diferentes: <em>Brinquedos</em>, <em>Móveis para Interior, Móveis para Exterior e 'Suprimentos e Brinquedos para Cães e Gatos'.</em></p><p>Como você pôde ver, o produto mais relevante considerando a consulta é um brinquedo e o segundo produto mais relevante são móveis para interiores. Se você deseja informações detalhadas sobre o cálculo da pontuação para saber por que esses documentos correspondem, pode definir o parâmetro <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-explain.html"><em>explain</em></a> __query como verdadeiro.</p><p>Apesar de ambos os resultados serem os mais relevantes, considerando tanto o número de documentos quanto a ocorrência de termos neste conjunto de dados, a intenção por trás da consulta "<em>Móveis confortáveis para uma varanda grande</em>" é buscar móveis para uma varanda grande de fato, excluindo, entre outros, brinquedos e móveis de interior.</p><p>A busca lexical é relativamente <strong>simples e rápida</strong>, mas tem limitações, já que nem sempre é possível conhecer todos os termos e sinônimos possíveis sem necessariamente conhecer a intenção e as consultas do usuário. Um fenômeno comum no uso da linguagem natural é <strong>a incompatibilidade de vocabulário</strong>. <a href="https://dl.acm.org/doi/abs/10.1145/32206.32212">Pesquisas</a> mostram que, em média, <strong>80% das vezes,</strong> pessoas diferentes (especialistas na mesma área) nomeiam a mesma coisa de maneiras diferentes.</p><p>Essas limitações nos motivam a buscar outros modelos de pontuação que incorporem conhecimento semântico. Os modelos baseados em Transformers, que se destacam no processamento de tokens de entrada sequenciais, como a linguagem natural, capturam o significado subjacente da sua pesquisa considerando representações matemáticas tanto dos documentos quanto das consultas. Isso permite uma representação vetorial densa e contextualizada do texto, impulsionando <strong>a Busca Semântica</strong>, uma maneira refinada de encontrar conteúdo relevante.</p><h2>Busca semântica - recuperação densa</h2><p>Nesse contexto, após converter seus dados em valores vetoriais significativos, o algoritmo de busca <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html">k-vizinhos mais próximos (kNN)</a> é utilizado para encontrar representações vetoriais em um conjunto de dados que sejam mais semelhantes a um vetor de consulta. O Elasticsearch suporta dois métodos para busca kNN: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html#exact-knn">kNN exato por força bruta</a> e <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html#approximate-knn">kNN aproximado</a>, também conhecido como ANN.</p><p>O kNN de força bruta garante resultados precisos, mas não escala bem com grandes conjuntos de dados. O algoritmo kNN aproximado encontra de forma eficiente os vizinhos mais próximos aproximados, sacrificando um pouco de precisão em troca de um melhor desempenho.</p><p>Com o suporte do Lucene para busca kNN e índices vetoriais densos, o Elasticsearch aproveita o algoritmo Hierarchical Navigable Small World (HNSW), que demonstra um forte desempenho de busca em diversos conjuntos de <a href="http://ann-benchmarks.com/">dados de benchmark de redes neurais</a>. Uma busca aproximada por kNN pode ser realizada em Python usando o código de exemplo abaixo.</p><h3>Busca semântica com kNN aproximado</h3># KNN - approximate kNN

response = client.search(index='ecommerce-search', size=2,
knn={
  "field": "description_vector.predicted_value",
  "k": 50, # Number of nearest neighbors to return as top hits.
#The optimal value of k is dependent on the data. It can vary in different scenarios.

  "num_candidates": 500, # Number of nearest neighbor candidates to consider per shard.

#Increasing num_candidates tends to improve the accuracy of the final k results.

  "query_vector_builder": { # Object indicating how to build a query_vector. kNN search enables you to perform semantic search by using a previously deployed text embedding model, the steps for this process are demonstrated in the Python notebook.
    "text_embedding": { 
      "model_id": "sentence-transformers__all-mpnet-base-v2", # Text embedding model id
      "model_text": "Comfortable furniture for a large balcony" # Query
    }
  }
}
)

for hit in response['hits']['hits']:
        
  score = hit['_score']
  product = hit['_source']['product']
  category = hit['_source']['category']
  description = hit['_source']['description']
  print(f"\nScore: {score}\nProduct: {product}\nCategory: {category}\nDescription: {description}\n")
<p>Este bloco de código usa o kNN do Elasticsearch para retornar até dois produtos com uma descrição semelhante à consulta vetorizada (query_vector_build) de "<em>Móveis confortáveis para uma varanda grande</em>", considerando os embeddings do campo "<em>descrição</em> " no conjunto de dados de produtos.</p><p>Os embeddings dos produtos foram gerados previamente em um pipeline de ingestão com um processador de inferência contendo o modelo de embedding de texto <em>"</em><a href="https://huggingface.co/sentence-transformers/all-mpnet-base-v2"><em>all-mpnet-base-v2</em></a><em>"</em> para inferir com base nos dados que estavam sendo ingeridos no pipeline.</p><p>Este modelo foi escolhido com base na avaliação de modelos pré-treinados usando <em>"</em><a href="https://github.com/UKPLab/sentence-transformers/blob/master/docs/package_reference/sentence_transformer/evaluation.md"><em>sentence_transformers.evaluation</em></a><em>".</em> onde diferentes classes são usadas para avaliar um modelo durante o treinamento. O modelo "all-mpnet-base-v2" demonstrou o melhor desempenho médio de acordo com o <a href="https://www.sbert.net/docs/pretrained_models.html">ranking do Sentence-Transformers</a> e também garantiu uma posição favorável no ranking do <a href="https://huggingface.co/spaces/mteb/leaderboard">Massive Text Embedding Benchmark (MTEB)</a> . O modelo, pré-treinado a partir do modelo<a href="https://huggingface.co/microsoft/mpnet-base"> microsoft/mpnet-base</a> e ajustado em um conjunto de dados de 1 bilhão de pares de frases, mapeia as frases para um espaço vetorial denso de 768 dimensões.</p><p>Alternativamente, existem muitos outros modelos disponíveis que podem ser utilizados, especialmente aqueles ajustados especificamente para os dados do seu domínio.</p><p>Saída</p>Score: 0.79207325
Product: Patio Sofa Set with Ottoman
Category: Outdoor Furniture
Description: is a versatile and comfortable patio sofa set, including a sofa, ottoman, and coffee table, great for outdoor lounging.

Score: 0.7836937
Product: Patio Sofa Set with Canopy
Category: Outdoor Furniture
Description: is a luxurious and comfortable patio sofa set with a canopy, providing shade and style for outdoor lounging.
<p><em>O resultado pode variar dependendo do modelo escolhido,</em> <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html#knn-search-filter-example"><em>dos filtros</em></a> <em>e</em> <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html#tune-approximate-knn-for-speed-accuracy"><em>do ajuste aproximado do kNN</em></a><em>.</em></p><p>Os resultados da pesquisa kNN estão ambos na categoria "<em>Móveis para Exterior</em>", embora a palavra "<em>exterior</em>" não tenha sido mencionada explicitamente na consulta, o que destaca a importância da compreensão semântica no contexto.</p><p>A busca vetorial densa oferece diversas vantagens:</p><ul><li><p>Habilitar a pesquisa semântica</p></li><li><p>Escalabilidade para lidar com conjuntos de dados muito grandes</p></li><li><p>Flexibilidade para lidar com uma ampla variedade de tipos de dados.</p></li></ul><p>No entanto, <strong>a busca vetorial densa também apresenta seus próprios desafios</strong>:</p><ul><li><p>Selecionando o modelo de incorporação correto para o seu caso de uso.</p></li><li><p>Uma vez escolhido o modelo, pode ser necessário ajustá-lo para otimizar o desempenho em um conjunto de dados específico do domínio, um processo que exige o envolvimento de especialistas na área.</p></li><li><p>Além disso, a indexação de vetores de alta dimensão pode ser computacionalmente dispendiosa.</p></li></ul><h2>Busca semântica - recuperação esparsa aprendida</h2><p>Vamos explorar uma abordagem alternativa: recuperação esparsa aprendida, outra maneira de realizar buscas semânticas.</p><p>Como um modelo esparso, ele utiliza o índice invertido baseado em Lucene do Elasticsearch, que se beneficia de décadas de otimizações. No entanto, essa abordagem vai além da simples adição de sinônimos com funções de pontuação lexical como o BM25. Em vez disso, incorpora associações aprendidas usando um conhecimento mais profundo em escala linguística para otimizar a relevância.</p><p>Ao expandir as consultas de pesquisa para incluir termos relevantes que não estão presentes na consulta original, o <a href="https://www.elastic.co/guide/en/machine-learning/current/ml-nlp-elser.html">Elastic Learned Sparse Encoder</a> <strong>aprimora os embeddings de vetores esparsos</strong>, como você pode ver no exemplo abaixo.</p><h3>Busca vetorial esparsa com codificador esparso de aprendizado elástico</h3># Elastic Learned Sparse Encoder

response = client.search(index='ecommerce-search', size=2,
query={
  "text_expansion": {
    "ml.tokens": {
      "model_id":"elser_model",
      "model_text":"Comfortable furniture for a large balcony"                
    }
  }
}
)

for hit in response['hits']['hits']:

  score = hit['_score']
  product = hit['_source']['product']
  category = hit['_source']['category']
  description = hit['_source']['description']
  print(f"\nScore: {score}\nProduct: {product}\nCategory: {category}\nDescription: {description}\n")
<p>Saída</p>Score: 14.405318
Product: Garden Lounge Set with Side Table
Category: Garden Furniture
Description: is a comfortable and stylish garden lounge set, including a sofa, chairs, and a side table for outdoor relaxation.

Score: 14.281318
Product: Rattan Patio Conversation Set
Category: Outdoor Furniture
Description: is a stylish and comfortable outdoor furniture set, including a sofa, two chairs, and a coffee table, all made of durable rattan material.
<p>Os resultados, neste caso, incluem a categoria "<em>Móveis de Jardim</em>", que oferece produtos bastante semelhantes aos de "<em>Móveis para Exterior</em>".</p><p>Ao analisar "ml.tokens", Ao analisar o campo "rank_features" que contém os tokens gerados pela Recuperação Esparsa Aprendida, torna-se evidente que, entre os vários tokens gerados, existem termos que, embora não façam parte da consulta de pesquisa, ainda são relevantes em significado, como "<em>relaxar</em>" (confortável), "<em>sofá</em>" (móveis) e "<em>exterior</em>" (varanda).</p><p>A imagem abaixo destaca alguns desses termos juntamente com a consulta, tanto com quanto sem expansão de termos.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7e869985347b19a7/6a17d875e31791dc2c2d56a1/dd86607fce6137d843a3ec002390eaa988b432f9-1440x502.png" alt="" /><p>Conforme observado, este modelo proporciona uma busca sensível ao contexto e ajuda a mitigar o problema de incompatibilidade de vocabulário, ao mesmo tempo que oferece resultados mais interpretáveis. Ele pode até superar modelos vetoriais densos quando nenhum re-treinamento específico do domínio é aplicado.</p><h2>Busca híbrida: resultados relevantes combinando busca lexical e semântica.</h2><p>Quando se trata de pesquisa, não existe uma solução universal. Cada um desses métodos de recuperação tem seus pontos fortes, mas também seus desafios. Dependendo do caso de uso, a melhor opção pode mudar. Muitas vezes, os melhores resultados obtidos com diferentes métodos de recuperação de informação podem ser complementares. Portanto, para melhorar a relevância, vamos analisar a possibilidade de combinar os pontos fortes de cada método.</p><p>Existem várias maneiras de implementar uma <strong>busca híbrida</strong>, incluindo combinação linear, atribuição de um peso a cada pontuação e fusão de classificação recíproca (RRF), onde especificar um peso não é necessário.</p><h3>Elasticsearch: o melhor dos dois mundos com busca lexical e semântica</h3># BM25 + Elastic Learned Sparse Encoder (Linear Combination)

response = client.search(index='ecommerce-search', size=2,

query= {
  "bool": {
    "should": [
    {
      "match": {
        "description" : {  
          "query": "A dining table and comfortable chairs for a large balcony",
          "boost": 1
        }
      }
    },                   
    {
      "text_expansion": {
        "ml.tokens": {
          "model_id": "elser_model",
          "model_text": "A dining table and comfortable chairs for a large balcony",
          "boost": 1
        }
      }
     }
    ]
  }
}
)

# The boost value is 1 for the text expansion and match query. This means that the relevance score of the results of these queries are not boosted. You can specify a boost value to give a weight to each score in the sum. The scores will be calculated as: score = boost value * match_score + boost value * text_expansion_score

for hit in response['hits']['hits']:

  score = hit['_score']
  product = hit['_source']['product']
  category = hit['_source']['category']
  description = hit['_source']['description']
  print(f"\nScore: {score}\nProduct: {product}\nCategory: {category}\nDescription: {description}\n")
<p>Neste código, realizamos uma busca híbrida com duas consultas que tinham o valor "<em>Uma mesa de jantar e cadeiras confortáveis para uma varanda grande</em>". Em vez de usar "<em>móveis</em>" como termo de busca, estamos especificando o que procuramos, e ambas as buscas consideram os mesmos valores de campo, "descrição". A classificação é determinada por uma combinação linear com pesos iguais para as pontuações BM25 e ELSER.</p><p>Saída</p>Score: 31.628141
Product: Garden Dining Set with Swivel Rockers
Category: Garden Furniture
Description: is a functional and comfortable garden dining set, including a table and chairs with swivel rockers for easy movement.

Score: 31.334227
Product: Garden Dining Set with Swivel Chairs
Category: Garden Furniture
Description: is a functional and comfortable garden dining set, including a table and chairs with swivel seats for convenience.
<p>No código abaixo, usaremos o mesmo valor para a consulta, mas combinaremos as pontuações de BM25 (parâmetro de consulta) e kNN (parâmetro knn) usando o método de fusão de classificação recíproca para combinar e classificar os documentos.</p># BM25 + KNN (RRF)

response = client.search(index='ecommerce-search', size=2,
query={
  "bool": {
    "should": [
    {
      "match": {
        "description": {
        "query": "A dining table and comfortable chairs for a large balcony"
        }
      }
    }
    ]
  }
},
knn={
  "field": "description_vector.predicted_value",
  "k": 50,
  "num_candidates": 500,
  "query_vector_builder": {
    "text_embedding": {
      "model_id": "sentence-transformers__all-mpnet-base-v2",
      "model_text": "A dining table and comfortable chairs for a large balcony"
    }
  }
},
rank={
  "rrf": { # Reciprocal rank fusion
    "window_size": 50, # This value determines the size of the individual result sets per query.
    "rank_constant": 20 # This value determines how much influence documents in individual result sets per query have over the final ranked result set.
  }
}
)

for hit in response['hits']['hits']:
        
  rank = hit['_rank']
  category = hit['_source']['category']
  product = hit['_source']['product']
  description = hit['_source']['description']
  print(f"\nRank: {rank}\nProduct: {product}\nCategory: {category}\nDescription: {description}\n")
<p><em>A funcionalidade RRF está em fase de pré-visualização técnica. A sintaxe provavelmente mudará antes do lançamento oficial.</em></p><p>Saída</p>Rank: 1
Product: Patio Dining Set with Bench
Category: Outdoor Furniture
Description: is a spacious and functional patio dining set, including a dining table, chairs, and a bench for additional seating.

Rank: 2
Product: Garden Dining Set with Swivel Chairs
Category: Garden Furniture
Description: is a functional and comfortable garden dining set, including a table and chairs with swivel seats for convenience.
<p>Aqui também poderíamos usar campos e valores diferentes; alguns desses exemplos estão disponíveis no <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/lexical-and-semantic-search-with-elasticsearch/ecommerce_dense_sparse_project.ipynb">notebook Python</a>.</p><p>Como você pode ver, com o Elasticsearch você tem o melhor dos dois mundos: a busca lexical tradicional e a busca vetorial, seja ela esparsa ou densa, para atingir seu objetivo <strong>e encontrar a melhor resposta possível para sua pergunta.</strong></p><p>Se você deseja continuar aprendendo sobre as abordagens mencionadas aqui, estes blogs podem ser úteis:</p><ul><li><p><a href="https://www.elastic.co/blog/improving-information-retrieval-elastic-stack-hybrid">Aprimorando a recuperação de informações no Elastic Stack: Recuperação híbrida</a></p></li><li><p><a href="https://www.elastic.co/blog/vector-search-elasticsearch-rationale">Busca vetorial no Elasticsearch: a lógica por trás do design</a></p></li><li><p><a href="https://www.elastic.co/blog/lexical-ai-powered-search-elastic-vector-database">Como obter o melhor da busca lexical e da busca com inteligência artificial usando o banco de dados vetorial da Elastic.</a></p></li><li><p><a href="https://www.elastic.co/blog/may-2023-launch-sparse-encoder-ai-model">Apresentando o Elastic Learned Sparse Encoder: o modelo de IA da Elastic para busca semântica.</a></p></li><li><p><a href="https://www.elastic.co/blog/may-2023-launch-information-retrieval-elasticsearch-ai-model">Aprimorando a recuperação de informações no Elastic Stack: Apresentando o Elastic Learned Sparse Encoder, nosso novo modelo de recuperação.</a></p></li></ul><p>O Elasticsearch fornece um banco de dados vetorial, juntamente com todas as ferramentas necessárias para criar pesquisas vetoriais:</p><ul><li><p><a href="https://www.elastic.co/elasticsearch/vector-database">banco de dados vetorial</a>Elasticsearch</p></li><li><p>Casos de uso <a href="https://www.elastic.co/enterprise-search/vector-search">de busca vetorial</a> com Elastic</p></li></ul><h2>Conclusão</h2><p>Neste artigo, exploramos diversas abordagens para recuperar informações usando o Elasticsearch, com foco específico em busca textual, lexical e semântica. Para demonstrar isso, fornecemos exemplos em Python que mostram diferentes cenários de pesquisa usando um conjunto de dados contendo informações de produtos de comércio eletrônico.</p><p>Analisamos a busca lexical clássica com BM25 e discutimos seus benefícios e desafios, como a incompatibilidade de vocabulário. Enfatizamos a importância de incorporar conhecimento semântico para superar esse problema. Além disso, discutimos a busca vetorial densa, que possibilita a busca semântica, e abordamos os desafios associados a esse método de recuperação, incluindo o custo computacional na indexação de vetores de alta dimensão.</p><p>Por outro lado, mencionamos que vetores esparsos se comprimem excepcionalmente bem. Assim, discutimos o Learned Sparse Encoder da Elastic, que expande as consultas de pesquisa para incluir termos relevantes não presentes na consulta original.</p><p>Não existe uma solução única que sirva para todos quando se trata de pesquisa. Cada método de recuperação tem seus pontos fortes e desafios. Portanto, também discutimos o conceito de busca híbrida.</p><p>Como você pôde ver, com o Elasticsearch, você pode ter o melhor dos dois mundos: busca lexical tradicional e busca vetorial!</p><p>Pronto para começar? Confira o <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/lexical-and-semantic-search-with-elasticsearch/ecommerce_dense_sparse_project.ipynb">notebook Python</a> disponível e inicie um <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">teste gratuito do Elastic Cloud</a>.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/lexical-and-semantic-search-with-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/lexical-and-semantic-search-with-elasticsearch</guid>
    <category><![CDATA[Banco de dados vetorial]]></category>
    <category><![CDATA[Python]]></category>
    <category><![CDATA[Linguagens de consulta]]></category>
    <dc:creator><![CDATA[Priscilla Parodi]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbd7e961f594005e7/6a17d80f033c8d981f6bb009/d240bfef29e9d432069059b312dd044eb76eec6c-1440x840.png" length="0" type="image/png"/>
    <pubDate>Tue, 03 Oct 2023 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Aprimorando as capacidades de chatbots com PNL e busca vetorial no Elasticsearch.]]></title>
    <description><![CDATA[Descubra como a busca vetorial e o PNL (Processamento de Linguagem Natural) trabalham juntos para aprimorar os recursos dos chatbots e veja como o Elasticsearch facilita esse processo.]]></description>
    <content:encoded><![CDATA[<p>Interfaces conversacionais existem há algum tempo e estão se tornando cada vez mais populares como forma de auxiliar em diversas tarefas, como atendimento ao cliente, recuperação de informações e automação de tarefas. Normalmente acessadas por meio de assistentes de voz ou aplicativos de mensagens, essas interfaces simulam a conversa humana para ajudar os usuários a resolver suas dúvidas com mais eficiência.</p><p>Com o avanço da tecnologia, os chatbots são usados para lidar com tarefas mais complexas — e rapidamente — sem deixar de oferecer uma experiência personalizada aos usuários. O processamento de linguagem natural (PLN) permite que os chatbots processem a linguagem do usuário, identifiquem a intenção por trás da mensagem e extraiam informações relevantes dela. Por exemplo, o Reconhecimento de Entidades Nomeadas extrai informações importantes de um texto, classificando-as em um conjunto de categorias. A Análise de Sentimentos identifica o tom emocional, e o Question Answering (Resposta a Perguntas) a “resposta” a uma consulta. O objetivo do PNL (Processamento de Linguagem Natural) é permitir que algoritmos processem a linguagem humana e executem tarefas que historicamente apenas os humanos eram capazes de realizar, como encontrar trechos relevantes em grandes quantidades de texto, resumir textos e gerar conteúdo novo e original.</p><p>Essas capacidades avançadas de PNL (Processamento de Linguagem Natural) são baseadas em uma tecnologia conhecida como <a href="https://www.elastic.co/what-is/vector-search">busca vetorial</a>. O Elasticsearch oferece suporte nativo para busca vetorial, realizando <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html#knn-search">buscas exatas e aproximadas de k-vizinhos mais próximos (kNN)</a>, e para PNL (Processamento de Linguagem Natural), permitindo o uso de <a href="https://www.elastic.co/guide/en/machine-learning/current/ml-nlp-model-ref.html#ml-nlp-model-ref">modelos personalizados ou de terceiros</a> diretamente no Elasticsearch.</p><p>Neste artigo, exploraremos como a busca vetorial e o PNL (Processamento de Linguagem Natural) trabalham juntos para aprimorar as capacidades dos chatbots e demonstraremos como o Elasticsearch facilita esse processo. Vamos começar com uma breve visão geral da busca vetorial.</p><h2>Busca vetorial</h2><p>Embora os seres humanos consigam compreender o significado e o contexto da linguagem escrita, as máquinas não conseguem fazer o mesmo. É aí que entram os vetores. Ao converter o texto em representações vetoriais (representações numéricas do significado do texto), as máquinas podem superar essa limitação. Em comparação com uma busca tradicional, em vez de depender de palavras-chave e busca lexical baseada em frequências, os vetores permitem o processamento de dados textuais usando operações definidas para valores numéricos.</p><p>Isso permite que a busca vetorial localize dados que compartilham conceitos ou contextos semelhantes, usando distâncias no "espaço de incorporação" para representar a similaridade, dado um vetor de consulta. Quando os dados são semelhantes, os vetores correspondentes também serão semelhantes.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt53a615a8ba0ac931/6a17d795fbc5f8b257491910/08542abf8108aace288745b1aca8579b476ddc1b-1440x618.png" alt="" /><p>A busca vetorial não é utilizada apenas em aplicações de PNL (Processamento de Linguagem Natural), mas também em vários outros domínios que envolvem dados não estruturados, incluindo processamento de imagem e vídeo.</p><p>Em um fluxo de chatbot, podem existir diversas abordagens para as consultas dos usuários e, consequentemente, diferentes maneiras de aprimorar a recuperação de informações para uma melhor experiência do usuário. Como cada alternativa possui seu próprio conjunto de vantagens e possíveis desvantagens, é essencial levar em consideração os dados e recursos disponíveis, bem como o tempo de treinamento (quando aplicável) e a precisão esperada. Na seção seguinte, abordaremos esses aspectos para modelos de PNL (Processamento de Linguagem Natural) de resposta a perguntas.</p><h2>Respostas a perguntas</h2><p>Um modelo de perguntas e respostas (QA, na sigla em inglês) é um tipo de modelo de PNL (Processamento de Linguagem Natural) projetado para responder a perguntas feitas em linguagem natural. Quando os usuários têm dúvidas que exigem a inferência de respostas a partir de múltiplas fontes, sem que haja uma resposta preexistente nos documentos, os modelos generativos de perguntas e respostas podem ser úteis. No entanto, esses modelos podem ser computacionalmente dispendiosos e exigem grandes quantidades de dados para treinamento relacionado ao domínio, o que pode torná-los menos práticos em algumas situações, embora esse método possa ser particularmente valioso para lidar com questões fora do domínio.</p><p>Por outro lado, quando os usuários têm dúvidas sobre um tópico específico e a resposta correta está presente no documento, podem ser utilizados modelos de perguntas e respostas extrativas. Esses modelos extraem a resposta diretamente do documento original, fornecendo resultados transparentes e verificáveis, o que os torna uma opção mais prática para empresas ou organizações que desejam oferecer uma maneira simples e eficiente de responder a perguntas.</p><p>O exemplo abaixo demonstra o uso de um modelo de perguntas e respostas extrativo pré-treinado, <a href="https://huggingface.co/deepset/minilm-uncased-squad2">disponível no Hugging Face</a> e implantado no Elasticsearch, para extrair respostas de um determinado contexto:</p>POST _ml/trained_models/deepset__minilm-uncased-squad2/deployment/_infer
{
    "docs": [{"text_field": "Canvas is a data visualization and presentation application within Kibana. With Canvas, live data can be pulled directly from Elasticsearch and combined with colors, images, text, and other customized options to create dynamic, multi-page displays."}],
    "inference_config": {"question_answering": {"question": "What is Kibana Canvas?"}}
}


{
  "predicted_value": "a data visualization and presentation application",
  "start_offset": 10,
  "end_offset": 59,
  "prediction_probability": 0.28304219431376443
}
<p><a href="https://www.elastic.co/guide/en/machine-learning/current/ml-nlp-deploy-models.html">Implantar modelos treinados.</a></p><p><a href="https://www.elastic.co/guide/en/machine-learning/current/ml-nlp-ner-example.html#ex-ner-ingest">Adicionar um modelo a um pipeline de ingestão de inferência.</a></p><p>Existem diversas maneiras de lidar com consultas de usuários e recuperar informações, e o uso de múltiplos modelos de linguagem e fontes de dados pode ser uma alternativa eficaz ao lidar com dados não estruturados. Para ilustrar isso, temos um exemplo do processamento de dados de um chatbot utilizado para responder a perguntas com respostas que consideram dados extraídos de documentos selecionados.</p><h2>Processamento de dados de chatbots: PNL e busca vetorial</h2><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta418a9c54bb16cf9/6a17d7975772624b371bca43/c2d1a2f110e937b1d3e5df0d5caac3c906c98fb0-1440x748.png" alt="" /><p>Conforme mostrado acima, o processamento de dados do nosso chatbot pode ser dividido em três partes:</p><ul><li><p><strong>Processamento vetorial:</strong> Esta etapa converte documentos em representações vetoriais.</p></li><li><p><strong>Processamento da entrada do usuário:</strong> Esta etapa extrai informações relevantes da consulta do usuário e realiza busca semântica e recuperação híbrida.</p></li><li><p><strong>Otimização:</strong> Esta etapa inclui o monitoramento e é crucial para garantir a confiabilidade do chatbot, o desempenho ideal e uma ótima experiência do usuário.</p></li></ul><h2>Processamento vetorial</h2><p>Na etapa <strong>de processamento</strong> , o primeiro passo é determinar os componentes de cada documento para, em seguida, converter cada elemento em uma representação vetorial; essas representações podem ser criadas para uma ampla variedade de formatos de dados.</p><p>Existem vários métodos que podem ser usados para calcular embeddings, incluindo modelos pré-treinados e bibliotecas.</p><p>É importante notar que a eficácia da busca e recuperação nessas representações depende dos dados existentes e da qualidade e relevância do método utilizado.</p><p>À medida que os vetores são calculados, eles são armazenados no Elasticsearch com um tipo de campo <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/dense-vector.html">dense_vector</a> .</p>PUT &lt;target&gt;
{
  "mappings": {
    "properties": {
      "doc_part_vector": {
        "type": "dense_vector",
        "dims": 3
      },
      "doc_part" : {
        "type" : "keyword"
      }
    }
  }
}
<h2>Processamento de entrada do usuário do chatbot</h2><p>Do ponto de vista <strong>do usuário</strong> , após receber uma pergunta, é útil extrair todas as informações possíveis dela antes de prosseguir. Isso ajuda a entender a intenção do usuário e, neste caso, estamos usando um <a href="https://huggingface.co/dslim/bert-base-NER">modelo de Reconhecimento de Entidades Nomeadas (NER)</a> para auxiliar nesse processo. NER é o processo de identificar e classificar entidades nomeadas em categorias de entidades predefinidas.</p>POST _ml/trained_models/dslim__bert-base-ner/deployment/_infer
{
  "docs": { "text_field": "How many people work for Elastic?"}
}


{
  "predicted_value": "How many people work for [Elastic](ORG&amp;Elastic)?",
  "entities": [
    {
      "entity": "Elastic",
      "class_name": "ORG",
      "class_probability": 0.4993975435876747,
      "start_pos": 25,
      "end_pos": 32
    }
  ]
}
<p>Embora não seja um passo necessário, ao usar dados estruturados ou o resultado do modelo de PNL acima ou de outro modelo para categorizar a consulta do usuário, podemos restringir a pesquisa kNN usando um <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html#knn-search-filter-example">filtro</a>. Isso ajuda a melhorar o desempenho e a precisão, reduzindo a quantidade de dados que precisam ser processados.</p>    "filter": {
      "term": {
        "org": "Elastic"
      }
    }
<h2>Busca semântica e recuperação híbrida</h2><p>Como a solicitação surge de consultas do usuário e o chatbot precisa processar a linguagem humana com sua variabilidade e ambiguidade, <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html#semantic-search">a busca semântica</a> é uma ótima opção. No Elasticsearch, você pode realizar uma busca semântica em uma única etapa, passando a string de consulta e o ID do <a href="https://huggingface.co/sentence-transformers/msmarco-MiniLM-L-12-v3">modelo de incorporação</a> para um objeto `query_vector_builder`. Isso vetorizará a consulta e realizará <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html">uma busca</a> kNN para recuperar as k correspondências mais próximas em significado à consulta:</p>POST /&lt;target&gt;/_search
{
  "knn": {
    "field": "doc_part_vector",
    "k": 5,
    "num_candidates": 20,
    "query_vector_builder": {
      "text_embedding": {
        "model_id": "&lt;text-embedding-model-id&gt;",
        "model_text": "&lt;query_string&gt;"
      }
    }
  }
 }
<p><a href="https://www.elastic.co/guide/en/machine-learning/8.7/ml-nlp-text-emb-vector-search-example.html">Exemplo completo: Como implantar um modelo de incorporação de texto e usá-lo para pesquisa semântica.</a> O Elasticsearch utiliza a implementação Lucene do Okapi BM25, um <strong>modelo esparso</strong> , para classificar as consultas de texto quanto à relevância, enquanto <strong>modelos densos</strong> são usados para <strong>busca semântica</strong>. Para <strong>combinar</strong> os <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html#_combine_approximate_knn_with_other_features"><strong>pontos fortes das</strong></a> correspondências vetoriais <strong>e</strong> das correspondências obtidas a partir da consulta de texto, você pode realizar uma <strong>recuperação híbrida</strong> :</p>POST &lt;target&gt;/_search
{
  "query": {
          "match": {
            "content": {
              "query": "&lt;query_string&gt;"
            }
        }
  },
  "knn": {
    "field": "doc_part_vector",
    "query_vector_builder": {
      "text_embedding": {
    "model_id": "&lt;text-embedding-model-id&gt;",
     "model_text": "&lt;query_string&gt;"
      }
    },
    "filter": {
      "term": {
        "org": "Elastic"
      }
    }
  }
}
<h3>A combinação de modelos esparsos e densos geralmente produz os melhores resultados.</h3><p>Os modelos esparsos geralmente têm melhor desempenho em consultas curtas e terminologias específicas, enquanto os modelos densos aproveitam o contexto e as associações. Se você quiser saber mais sobre como esses métodos se comparam e se complementam, aqui comparamos o BM25 com dois modelos densos que foram treinados especificamente para recuperação de dados.</p><p>O resultado mais relevante geralmente é a primeira resposta fornecida ao usuário; o_score é um número usado para determinar a <strong>relevância</strong> do documento retornado.</p><h2>Otimização de chatbot</h2><p>Para ajudar a melhorar a experiência do usuário, o desempenho e a confiabilidade do seu chatbot, além de aplicar a pontuação híbrida, você pode incorporar as seguintes abordagens: <strong>Análise de Sentimento:</strong> Para fornecer informações sobre os comentários e reações dos usuários à medida que o diálogo se desenrola, você pode incorporar um <a href="https://huggingface.co/distilbert-base-uncased-finetuned-sst-2-english">modelo de análise de sentimento</a>:</p>POST _ml/trained_models/distilbert-base-uncased-finetuned-sst-2-english/deployment/_infer
{
  "docs": { "text_field": "That was not my question!"}
}


{
  "predicted_value": "NEGATIVE",
  "prediction_probability": 0.980080439016437
}
<p><a href="https://www.elastic.co/blog/chatgpt-elasticsearch-openai-meets-private-data"><strong>Funcionalidades do GPT</strong></a> <strong>:</strong> Como alternativa para aprimorar a experiência geral, você pode combinar a relevância de pesquisa do Elasticsearch com os recursos de resposta a perguntas do GPT da OpenAI, utilizando a <a href="https://platform.openai.com/docs/guides/chat">API Chat Completion</a> para retornar ao usuário respostas geradas pelo modelo, considerando esses k documentos principais como contexto. <em>Prompt: "responda a esta pergunta &lt;user_question&gt; usando apenas este documento &lt;top_search_result&gt;"</em></p><p><strong>Observabilidade:</strong> Garantir o desempenho de qualquer chatbot é crucial, e o monitoramento é um componente essencial para atingir esse objetivo. Além dos registros que capturam as interações do chatbot, é importante monitorar o tempo de resposta, a latência e outras métricas relevantes do chatbot. Dessa forma, você pode identificar padrões, tendências e até mesmo detectar anomalias. As ferramentas <a href="https://www.elastic.co/blog/monitor-openai-api-gpt-models-opentelemetry-elastic">do Elastic Observability</a> permitem coletar e analisar essas informações.</p><h2>Resumo</h2><p>Esta postagem do blog aborda o que são PNL (Processamento de Linguagem Natural) e busca vetorial e explora um exemplo de um chatbot usado para responder a perguntas de usuários, considerando dados extraídos da representação vetorial de documentos.</p><p>Conforme demonstrado, utilizando PNL (Processamento de Linguagem Natural) e busca vetorial, os chatbots são capazes de executar tarefas complexas que vão além de dados estruturados e direcionados. Isso inclui fazer recomendações e responder a perguntas específicas relacionadas a produtos ou negócios, usando múltiplas fontes e formatos de dados como contexto, além de proporcionar uma experiência personalizada ao usuário.</p><p>Os casos de uso variam desde o atendimento ao cliente, auxiliando os clientes com suas dúvidas, até o auxílio a desenvolvedores com suas perguntas, fornecendo orientações passo a passo, sugerindo recomendações ou até mesmo automatizando tarefas. Dependendo do objetivo e dos dados existentes, outros modelos e métodos também podem ser utilizados para alcançar resultados ainda melhores e aprimorar a experiência geral do usuário.</p><p>Aqui estão alguns links sobre o assunto que podem ser úteis:</p><ol><li><p><a href="https://www.elastic.co/blog/how-to-deploy-natural-language-processing-nlp-getting-started">Como implementar o processamento de linguagem natural (PLN): Primeiros passos</a></p></li><li><p><a href="https://www.elastic.co/blog/overview-image-similarity-search-in-elastic">Visão geral da busca por similaridade de imagens no Elasticsearch</a></p></li><li><p><a href="https://www.elastic.co/blog/chatgpt-elasticsearch-openai-meets-private-data">ChatGPT e Elasticsearch: OpenAI encontra dados privados</a></p></li><li><p><a href="https://www.elastic.co/blog/monitor-openai-api-gpt-models-opentelemetry-elastic">Monitor OpenAI API and GPT models with OpenTelemetry and Elastic (Monitore a API do OpenAI e os modelos do GPT com o OpenTelemetry e a Elastic)</a></p></li><li><p><a href="https://www.elastic.co/blog/why-technology-leaders-need-vector-search">5 motivos pelos quais os líderes de TI precisam da busca vetorial para melhorar a experiência de busca.</a></p></li></ol><p>Ao incorporar PNL (Processamento de Linguagem Natural) e busca vetorial nativa no Elasticsearch, você pode aproveitar sua velocidade, escalabilidade e recursos de busca para criar chatbots altamente eficientes e eficazes, capazes de lidar com grandes quantidades de dados, sejam eles estruturados ou não estruturados.</p><p>Pronto para começar? Inicie um <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">teste gratuito do Elastic Cloud</a>.</p><p><em>Neste artigo, podemos ter usado ou podemos fazer referência a ferramentas de IA generativa de terceiros, que são propriedade e operadas por seus respectivos proprietários. A Elastic não tem qualquer controle sobre as ferramentas de terceiros e não nos responsabilizamos pelo seu conteúdo, funcionamento ou utilização, nem por quaisquer perdas ou danos que possam resultar da sua utilização. Tenha cautela ao usar ferramentas de IA com informações pessoais, sensíveis ou confidenciais. Quaisquer dados que você enviar poderão ser usados para treinamento de IA ou outros fins. Não há garantia de que as informações fornecidas serão mantidas em segurança ou confidenciais. Você deve se familiarizar com as práticas de privacidade e os termos de uso de quaisquer ferramentas de IA generativa antes de utilizá-las.</em></p><p><em>Elastic, Elasticsearch e marcas associadas são marcas comerciais, logotipos ou marcas registradas da Elasticsearch NV nos Estados Unidos e em outros países. Todos os outros nomes de empresas e produtos são marcas comerciais, logotipos ou marcas registradas de seus respectivos proprietários.</em></p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/enhancing-chatbot-capabilities-with-nlp-and-vector-search-in-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/enhancing-chatbot-capabilities-with-nlp-and-vector-search-in-elasticsearch</guid>
    <category><![CDATA[Banco de dados vetorial]]></category>
    <dc:creator><![CDATA[Priscilla Parodi]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5c545fc80b6d79d6/6a170214839dfad776dcfd6f/d968e646240cd3ef7c79b5124d562a5f951d812b-1440x840.png" length="0" type="image/png"/>
    <pubDate>Wed, 21 Jun 2023 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>