<?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/es/search-labs/author/priscilla-parodi</link>
    </image>
    <link>https://www.elastic.co/es/search-labs/author/priscilla-parodi</link>
    <atom:link href="https://www.elastic.co/es/search-labs/rss/author/priscilla-parodi.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[es]]></language>
    <lastBuildDate>Mon, 28 Sep 2026 05:13:23 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Plagio por IA: detección de plagio con Elasticsearch]]></title>
    <description><![CDATA[Aquí tienes cómo comprobar el plagio de IA usando Elasticsearch, centrándote en casos de uso con modelos de PLN y Búsqueda Vectorial.]]></description>
    <content:encoded><![CDATA[<p>El plagio puede ser <strong>directo</strong>, implicando la copia de partes o de todo el contenido, o <strong>parafraseado</strong>, donde la obra del autor se reformula cambiando algunas palabras o frases.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb6e139760e56ec98/6a171147dc55de0ad2e00edf/5d7073187fda829438aeec8d3a1194a5bea2ba57-1440x347.png" alt="" /><p>Hay una distinción entre inspiración y parafraseo. Es posible leer un contenido, inspirar y luego explorar la idea con tus propias palabras, incluso si llegas a una conclusión similar.</p><p>Aunque el plagio fue un tema de debate durante mucho tiempo, el aceleramiento de la producción y publicación de contenido lo mantuvo relevante y supuso un desafío constante.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc2af1678cb04506b/6a171149cf4f251c2ab2d257/a0b9a98d729db09dae0a79315c001e6763c12704-1400x1016.png" alt="" /><p>Este desafío no se limita a libros, investigaciones académicas o documentos judiciales, donde con frecuencia se realizan comprobaciones de plagio. También puede extender a los periódicos e incluso a las redes sociales.</p><p>Con la abundancia de información y el fácil acceso a la publicación, ¿cómo se puede controlar el plagio de forma eficaz a un nivel escalable?</p><p>Las universidades, entidades gubernamentales y compañías emplean herramientas diversas, pero aunque una <a href="https://www.elastic.co/search-labs/lexical-and-semantic-search-with-elasticsearch">búsqueda léxica</a> sencilla puede detectar el plagio directo, el principal desafío radica en identificar <strong>contenido parafraseado.</strong></p><h2>Detección de plagio con IA generativa</h2><p>Surge un nuevo reto con la IA generativa. ¿Se considera plagio el contenido generado por IA cuando se copia?</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8a1ed1b6fa3f1a56/6a17114b4a531bc40736aa69/9345b28d6d27c37469bc38e823c41780b4eabfe5-1440x875.png" alt="" /><p>Los <a href="https://openai.com/policies/terms-of-use">términos de uso</a> de <a href="https://openai.com/">OpenAI, por ejemplo, especifican que OpenAI no reclamará derechos de autor sobre el contenido generado por la API para los usuarios.</a> En este caso, las personas que usan su IA generativa pueden emplear el contenido generado como prefieran sin necesidad de citas.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbc2e08ab5b808e38/6a17114dab7f086cbadb9f93/e1f415f69a247666f02ddc81468944920c874cd7-968x814.png" alt="" /><p>Sin embargo, la aceptación del uso de IA generativa para mejorar la eficiencia sigue siendo un tema de debate.</p><p>En un esfuerzo por contribuir a la detección de plagio, OpenAI desarrolló un <a href="https://huggingface.co/roberta-base-openai-detector">modelo de detección</a> , pero más tarde reconoció que su precisión no es suficientemente alta.</p><p><em>"Creemos que esto no es lo suficientemente preciso para una detección independiente y debe combinar con enfoques basados en metadatos, juicio humano y educación pública para ser más efectivo."</em></p><p>El desafío persiste; sin embargo, con la disponibilidad de más herramientas, ahora hay más opciones para detectar plagio, incluso en casos de contenido parafraseado y de IA.</p><h2>Detección de plagio con Elasticsearch</h2><p>Reconociendo esto, en este blog exploramos un caso de uso más con los modelos de Procesamiento del Lenguaje Natural (PLN) y la búsqueda vectorial, la detección de plagio, más allá de las búsquedas de metadatos.</p><p>Esto se demuestra con <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/plagiarism-detection-with-elasticsearch/plagiarism_detection_es.ipynb">ejemplos en Python</a>, donde empleamos un conjunto de <a href="https://sbert.net/datasets/emnlp2016-2018.json">datos</a> de <a href="https://www.sbert.net/">SentenceTransformers</a> que contiene artículos relacionados con el PLN. Comprobamos los resúmenes en busca de plagio realizando una 'similitud textual semántica' considerando incrustaciones 'abstractas' generadas con un <a href="https://huggingface.co/sentence-transformers/all-mpnet-base-v2">modelo de incrustación de texto</a> previamente importado a Elasticsearch. Además, para identificar contenido generado por IA — plagio por IA, también se importó un <a href="https://huggingface.co/roberta-base-openai-detector">modelo de PLN</a> desarrollado por OpenAI a Elasticsearch.</p><p>La siguiente imagen ilustra el flujo de datos:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0464f88d3ed12070/6a17114fab7f084905db9f97/1ad89c98a2f42a497548ca3947749bad54ec1172-1440x880.png" alt="" /><p>Durante la <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/ingest.html">tubería de ingesta</a> con un <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/inference-processor.html">procesador de inferencia</a>, el párrafo 'abstracto' se mapea a un vector de 768 dimensiones, el 'valor_predicho abstract_vector.predicho'.</p><p>Cartografía:</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>La similitud entre representaciones vectoriales se mide mediante una métrica de similitud vectorial, definida mediante el <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/dense-vector.html#dense-vector-params">parámetro</a> de 'similitud'.</p><p><a href="https://en.wikipedia.org/wiki/Cosine_similarity">El coseno</a> es la métrica de similitud por defecto, calculada como '(1 + coseno(consulta, vector)) / 2'. A menos que necesites preservar los vectores originales y no puedas normalizarlos de antemano, la forma más eficiente de realizar similitud coseno es normalizar todos los vectores a longitud unitaria. Esto ayuda a evitar realizar cálculos adicionales de longitud vectorial durante la búsqueda, y en su lugar emplea 'dot_product'.</p><p>En esta misma canalización, otro procesador de inferencia que contiene el <a href="https://huggingface.co/roberta-base-openai-detector">modelo de clasificación de texto</a> detecta si el contenido es 'real' probablemente escrito por humanos, o 'falso' probablemente escrito por IA, agregando el 'openai-detector.predicted_value' a cada documento.</p><p>Pipeline de ingestión:</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>En el momento de la consulta, también se emplea el mismo modelo de incrustación de texto para generar la representación vectorial de la consulta 'model_text' en un objeto 'query_vector_builder'.</p><p>Una búsqueda de k vecinos más cercanos (kNN) encuentra el k vector más cercano al vector de consulta medido por la métrica de similitud.</p><p>El _score de cada documento se deriva de la similitud, cerciorando que un puntaje mayor corresponda a una clasificación más alta. Esto significa que el documento es más similar semánticamente. Como resultado, imprimimos tres posibilidades: si el puntaje &gt; 0,9, consideramos 'alta similitud'; si &lt; 0,7, 'baja similitud', de lo contrario, 'similitud moderada'. Tienes la flexibilidad de establecer diferentes valores umbral para determinar qué nivel de _score califica como plagio o no, según tu caso de uso.</p><p>Además, se realiza la clasificación de texto para comprobar también la presencia de elementos generados por IA en la consulta de texto.</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>Salida:</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>En este ejemplo, tras emplear uno de los valores 'abstractos' de nuestro conjunto de datos como consulta de texto 'model_text', se identificó plagio. El puntaje de similitud es 1,0, lo que indica un alto nivel de similitud: <strong>plagio directo</strong>. La consulta vectorizada y el documento no fueron reconocidos como contenido generado por IA, lo cual era de esperar.</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>Salida:</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>Al actualizar la consulta de texto 'model_text' con un texto generado por IA que transmite el mismo mensaje minimizando la repetición de palabras similares, la similitud detectada seguía siendo alta, pero el puntaje era de 0,9302529 en lugar de 1,0 — <strong>plagio de paráfrasis</strong>. También se esperaba que esta consulta, generada por IA, fuera detectada.</p><p>Por último, considerando la consulta de texto 'model_text' como texto sobre Elasticsearch, que no es un resumen de ninguno de estos documentos, la similitud detectada fue 0,68991005, lo que indica baja similitud según los valores umbral 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>Salida:</p>Low similarity detected. This might not be plagiarism.
<p>Aunque el plagio se identificó correctamente en la consulta de texto generada por IA, así como en casos de paráfrasis y contenido copiado directamente, navegar por el panorama de la detección de plagio implica reconocer diversos aspectos.</p><p>En el contexto de la detección de contenido generado por IA, exploramos un modelo que aporta una contribución valiosa. Sin embargo, es fundamental reconocer las limitaciones inherentes a la detección independiente, lo que requiere incorporar otros métodos para mejorar la precisión.</p><p>La variabilidad introducida por la elección de modelos de incrustación de texto es otra consideración. Diferentes modelos, capacitados con conjuntos de datos distintos, resultan en distintos niveles de similitud, lo que destaca la importancia de las incrustaciones de texto generadas.</p><p>Por último, en estos ejemplos, usamos el resumen del documento. Sin embargo, la detección de plagio suele implicar documentos grandes, por lo que es esencial abordar el reto de la longitud del texto. Es común que el texto supere el límite de tokens de un modelo, requiriendo segmentación en fragmentos antes de construir incrustaciones. Un <a href="https://www.elastic.co/guide/en/elasticsearch/reference/8.11/knn-search.html#nested-knn-search">enfoque práctico</a> para manejar esto implica emplear estructuras anidadas con dense_vector.</p><h2>Conclusión</h2><p>En este blog, hablamos sobre los desafíos de detectar plagio, especialmente en contenido parafraseado y generado por IA, y cómo la similitud textual semántica y la clasificación de texto pueden emplear para este propósito.</p><p>Combinando estos métodos, proporcionamos un ejemplo de detección de plagio donde identificamos con éxito contenido generado por IA, plagio directo y parafraseado.</p><p>El objetivo principal era establecer un sistema de filtrado que simplificara la detección, pero la evaluación humana sigue siendo esencial para la validación.</p><p>Si te interesa aprender más sobre similitud textual semántica y PNL, te animamos a que también consultes estos enlaces:</p><ul><li><p><a href="https://www.elastic.co/what-is/semantic-search">¿Qué es la búsqueda semántica?</a></p></li><li><p><a href="https://www.elastic.co/what-is/natural-language-processing">¿Qué es el procesamiento del lenguaje natural (PLN)?</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/lexical-and-semantic-search-with-elasticsearch">Búsqueda léxica y semántica con Elasticsearch</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/chunking-via-ingest-pipelines">Fragmentar documentos grandes mediante pipelines de ingesta más vectores anidados equivale a una búsqueda de pasajes fácil</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[Base de datos vectorial]]></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[Búsqueda léxica y semántica con Elasticsearch]]></title>
    <description><![CDATA[En este blog, exploraremos diversos enfoques para recuperar información empleando Elasticsearch, centrándonos en la búsqueda léxica y semántica.]]></description>
    <content:encoded><![CDATA[<p>La búsqueda es el proceso de localizar la información más relevante basar en tu consulta de búsqueda o en la combinación de consultas y resultados de búsqueda relevantes son documentos que mejor se ajustan a estas consultas. Aunque existen varios desafíos y métodos asociados a la búsqueda, el objetivo final sigue siendo el mismo: <strong>encontrar la mejor respuesta posible a tu pregunta</strong>.</p><p>Teniendo en cuenta este objetivo, en esta entrada de blog exploraremos diferentes enfoques para recuperar información usando Elasticsearch, con un enfoque específico en la búsqueda de texto: <strong>búsqueda léxica y semántica.</strong></p><h2>Prerrequisitos</h2><p>Para lograrlo, proporcionaremos ejemplos en Python que demuestren diversos escenarios de búsqueda en un <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/lexical-and-semantic-search-with-elasticsearch/products-ecommerce.json">conjunto de datos</a> generado para simular información de productos de comercio electrónico.</p><p>Este conjunto de datos contiene más de 2.500 productos, cada uno con una descripción. Estos productos se clasifican en 76 categorías distintas, cada una conteniendo un número variable de productos, como se muestra a continuación:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt34415151c00ced2b/6a17d8710b0bed6c9bdd342c/4104466050f3024b6bcaf382da2a702650f62227-1440x708.png" alt="" /><p><em>Visualización de treemap: 22 valores principales de category.keyword (categorías de productos)</em></p><p>Para la configuración necesitarás:</p><ul><li><p>Python 3.6 o posterior</p></li><li><p>El <a href="https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/index.html">cliente Python Elástico</a></p></li><li><p>Despliegue Elastic 8.8 o posterior, con nodo de aprendizaje automático de 8GB de memoria</p></li><li><p>El modelo <a href="https://www.elastic.co/guide/en/machine-learning/8.9/ml-nlp-elser.html">Elastic Learned Sparse EncodeR</a> , que viene preinstalado en Elastic, se instaló y comenzó en tu despliegue</p></li></ul><p>Usaremos Elastic Cloud, <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">hay una prueba gratis disponible</a>.</p><p>Además de las consultas de búsqueda que se proporcionan en esta entrada del blog, un <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/lexical-and-semantic-search-with-elasticsearch/ecommerce_dense_sparse_project.ipynb">cuaderno de Python</a> te guiará a través de los siguientes procesos:</p><ul><li><p>Establece una conexión con nuestro despliegue de Elastic usando el cliente de Python</p></li><li><p>Carga un modelo de incrustación de texto en el clúster de Elasticsearch</p></li><li><p>Crea un índice con mapeos para indexar vectores de características y vectores densos.</p></li><li><p>Crear una tubería de ingesta con procesadores de inferencia para incrustación y expansión de texto</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0e95406ece8f08d9/6a17d8731d1b83d32e93e2f4/54a9a490a3b0cf1b9c2228bee8eddd3f566bd435-1418x1102.png" alt="" /><h2>Búsqueda léxica - recuperación dispersa</h2><p>La forma tradicional en que los documentos se clasifican para relevancia según Elasticsearch basar en una consulta de texto emplea la implementación Lucene del modelo <a href="https://en.wikipedia.org/wiki/Okapi_BM25">BM25</a> , un <strong>modelo disperso para la búsqueda léxica</strong>. Este método sigue el enfoque tradicional de búsqueda de texto, buscando coincidencias exactas de términos.</p><p>Para hacer posible esta búsqueda, Elasticsearch convierte los datos <strong>de los campos de texto</strong> en un formato buscable mediante análisis de texto.</p><p><strong>El análisis de texto</strong> se realiza mediante un<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/analyzer-anatomy.html"> analizador</a>, un conjunto de reglas que regulan el proceso de extracción de tokens relevantes para la búsqueda. Un analizador debe tener exactamente un<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenizers.html"> tokenizador</a>. El tokenizador recibe una secuencia de caracteres y la divide en fichas individuales (normalmente palabras individuales), como en el ejemplo siguiente:</p><h3>Tokenización de cadenas para búsqueda léxica</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>Salida</p>Analyzed Tokens: ['comfortable', 'furniture', 'for', 'a', 'large', 'balcony']
<p>En este ejemplo estamos usando el analizador por defecto, el <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-standard-analyzer.html">analizador estándar</a> , que funciona bien para la mayoría de los casos de uso ya que proporciona tokenización basada en gramática inglesa. La tokenización permite la coincidencia en términos individuales, pero cada token sigue siendo emparejado literalmente.</p><p>Si quieres personalizar tu experiencia de búsqueda, puedes elegir otro<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-analyzers.html"> analizador integrado</a> diferente. Por ejemplo, actualizando el código para usar el <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-stop-analyzer.html">analizador de atajada</a> , se descompone el texto en tokens en cualquier carácter que no sea letra, con soporte para eliminar palabras de atajada.</p>...
# Define the analyze request
request_body = {
  "analyzer": "stop",
  "text": text
}
...
<p>Salida</p>Analyzed Tokens: ['comfortable', 'furniture', 'large', 'balcony']
<p>Cuando los analizadores integrados no satisfacen tus necesidades, puedes crear un <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-custom-analyzer.html">analizador personalizado</a>, que emplee la combinación adecuada de filtros de cero o <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-charfilters.html">más caracteres</a>, un <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenizers.html">tokenizador</a> y filtros de cero o más <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenfilters.html">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>En el ejemplo anterior, que combina un tokenizador y filtros de token, el texto se pondrá en minúsculas con el <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lowercase-tokenfilter.html">filtro</a> minúsculo antes de ser procesado por el <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 sinónimos.</a></p><h2>Emparejamiento léxico</h2><p><a href="https://www.elastic.co/blog/practical-bm25-part-2-the-bm25-algorithm-and-its-variables">BM25</a> medirá la relevancia de los documentos para una consulta de búsqueda determinada en función de la frecuencia de los términos y su importancia.</p><p>El código siguiente realiza una consulta <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html">de coincidencia</a>, buscando hasta dos documentos que consideren los valores del campo <em>"descripción"</em> del índice <em>"ecommerce-search"</em> y la consulta <strong>de búsqueda "</strong><em><strong>Muebles cómodos para un balcón grande</strong></em><strong>".</strong></p><p>Refinar los criterios para que un documento se considere compatible con esta consulta puede mejorar la precisión. Sin embargo, los resultados más específicos tienen el costo de una menor tolerancia a las variaciones.</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>Salida</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>Analizando el resultado, el resultado más relevante es el producto "<em>Barbie Dreamhouse</em>", en la categoría "<em>Juguetes</em>", y su descripción es muy relevante ya que incluye los términos "<em>muebles</em>", "<em>grande"</em> y <em>"balcón";</em>este es el único producto con 3 términos en la descripción que coinciden con la consulta de búsqueda,  El producto es también el único que tiene el <em>término "balcón"</em> en la descripción.</p><p>El segundo producto más relevante es una "<em>Mecedora Cómoda</em>" categorizada como "<em>Mobiliario de Interior</em>" y su descripción incluye los términos "<em>cómodo</em>" y "<em>mueble".</em> Solo 3 productos en el conjunto de datos coinciden con al menos 2 términos de esta consulta de búsqueda, este producto es uno de ellos.</p><p><em>"Cómodo"</em> aparece en la descripción de 105 productos y <em>"muebles"</em> en la descripción de 4 productos con 4 categorías diferentes: <em>Juguetes</em>, <em>Muebles de interior, Muebles de exterior y 'Suministros y Juguetes para perros y gatos'.</em></p><p>Como puedes ver, el producto más relevante para la pregunta es un juguete y el segundo producto más relevante son los muebles de interior. Si quieres información detallada sobre el cálculo de puntaje para saber por qué estos documentos coinciden, puedes poner el <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-explain.html"><em>parámetro de explicación</em></a> __query en verdadero.</p><p>A pesar de que ambos resultados son los más relevantes, considerando tanto el número de documentos como la presencia de términos en este conjunto de datos, la intención detrás de la consulta "<em>Cómodos muebles para un balcón grande</em>" es buscar muebles para un balcón grande real, excluyendo, entre otros, juguetes y muebles de interior.</p><p>La búsqueda léxica es relativamente <strong>sencilla y rápida</strong>, pero tiene limitaciones ya que no siempre es posible conocer todos los términos y sinónimos posibles sin necesariamente conocer la intención y las consultas del usuario. Un fenómeno común en el uso del lenguaje natural es la <strong>desadaptación del vocabulario</strong>. <a href="https://dl.acm.org/doi/abs/10.1145/32206.32212">Las investigaciones</a> muestran que, de media, el <strong>80% de las veces</strong> diferentes personas (expertos en el mismo campo) nombran el mismo nombre de forma distinta.</p><p>Estas limitaciones nos motivan a buscar otros modelos de puntaje que incorporen conocimientos semánticos. Los modelos basados en transformadores, que destacan en el procesamiento de tokens de entrada secuenciales como el lenguaje natural, capturan el significado subyacente de tu búsqueda considerando representaciones matemáticas tanto de documentos como de consultas. Esto permite una representación vectorial densa y consciente del contexto del texto, impulsando <strong>la Búsqueda Semántica</strong>, una forma refinada de encontrar contenido relevante.</p><h2>Búsqueda semántica - recuperación densa</h2><p>En este contexto, tras convertir tus datos en valores vectoriales significativos, se emplea el algoritmo de búsqueda <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html">de k-vecinos más cercanos (kNN)</a> para encontrar representaciones vectoriales en un conjunto de datos que sean más similares a un vector de consulta. Elasticsearch soporta dos métodos para la búsqueda en kNN: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html#exact-knn">kNN exacto de fuerza bruta</a> y <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html#approximate-knn">kNN aproximado</a>, también conocido como ANN.</p><p>La kNN de fuerza bruta garantiza resultados precisos pero no escala bien con grandes conjuntos de datos. El kNN aproximado encuentra eficientemente a los vecinos más cercanos sacrificando cierta precisión para mejorar el rendimiento.</p><p>Con el soporte de Lucene para la búsqueda kNN y los índices vectoriales densos, Elasticsearch aprovecha el algoritmo Hierarchical Navigable Small World (HNSW), que demuestra un rendimiento estable en búsquedas en una variedad de <a href="http://ann-benchmarks.com/">conjuntos de datos ann-benchmark</a>. Se puede realizar una búsqueda aproximada de kNN en Python usando el código de ejemplo siguiente.</p><h3>Búsqueda semántica con 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 bloque de código emplea kNN de Elasticsearch para devolver hasta dos productos con una descripción similar a la consulta vectorizada (query_vector_build) de "<em>Cómodo mobiliario para un balcón grande</em>" considerando las incrustaciones del campo "<em>descripción</em>" en el conjunto de datos de productos.</p><p>Las incrustaciones de productos se generaban previamente en una tubería de ingesta con un procesador de inferencia que contenía el modelo de incrustación <em>de texto "</em><a href="https://huggingface.co/sentence-transformers/all-mpnet-base-v2"><em>all-mpnet-base-v2</em></a><em>"</em> para inferir contra los datos que se estaban ingeriendo en la canalización.</p><p>Este modelo se eligió basar en la evaluación de modelos preentrenados 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> donde se emplean diferentes clases para evaluar un modelo durante el entrenamiento. El modelo "all-mpnet-base-v2" mostró el mejor rendimiento medio según la <a href="https://www.sbert.net/docs/pretrained_models.html">clasificación de Sentence-Transformers</a> y también cercioró una posición favorable en la tabla de clasificación <a href="https://huggingface.co/spaces/mteb/leaderboard">del Massive Text Embedding Benchmark (MTEB</a> ). El modelo preentrenado<a href="https://huggingface.co/microsoft/mpnet-base"> es Microsoft y mpnet-base</a> y ajustado finamente en un conjunto de datos de pares de oraciones de 1B, que mapea oraciones a un espacio vectorial denso de 768 dimensiones.</p><p>Alternativamente, existen muchos otros modelos disponibles que se pueden emplear, especialmente aquellos ajustados para los datos específicos de tu dominio.</p><p>Salida</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>La salida puede variar según el modelo elegido,</em> <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html#knn-search-filter-example"><em>los filtros</em></a> <em>y</em> <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html#tune-approximate-knn-for-speed-accuracy"><em>la afinación aproximada de kNN</em></a><em>.</em></p><p>Los resultados de búsqueda de kNN están ambos en la categoría de "<em>Muebles de exterior</em>", aunque la palabra "<em>exterior</em>" no se mencionó explícitamente en la consulta, lo que resalta la importancia de la comprensión semántica en este contexto.</p><p>La búsqueda vectorial densa ofrece varios beneficios:</p><ul><li><p>Activación de la búsqueda semántica</p></li><li><p>Escalabilidad para manejar conjuntos de datos muy grandes</p></li><li><p>Flexibilidad para manejar una amplia variedad de tipos de datos</p></li></ul><p>Sin embargo, la <strong>búsqueda vectorial densa también conlleva sus propios desafíos</strong>:</p><ul><li><p>Seleccionar el modelo de incrustación adecuado para tu caso de uso</p></li><li><p>Una vez elegido un modelo, puede ser necesario ajustarlo para optimizar el rendimiento en un conjunto de datos específico de un dominio, un proceso que requiere la participación de expertos en el dominio</p></li><li><p>Además, indexar vectores de alta dimensión puede ser computacionalmente costoso</p></li></ul><h2>Búsqueda semántica - recuperación escasa aprendida</h2><p>Exploremos un enfoque alternativo: la recuperación esparsa aprendida, otra forma de realizar búsqueda semántica.</p><p>Como modelo escaso, emplea el índice invertido basado en Lucene de Elasticsearch, que se beneficia de décadas de optimizaciones. Sin embargo, este enfoque va más allá de simplemente agregar sinónimos con funciones de puntaje léxico como BM25. En su lugar, incorpora asociaciones aprendidas empleando un conocimiento más profundo a escala del lenguaje para optimizar su relevancia.</p><p>Al ampliar las consultas de búsqueda para incluir términos relevantes que no están presentes en la consulta original, el <a href="https://www.elastic.co/guide/en/machine-learning/current/ml-nlp-elser.html">Codificador Escaso Aprendido</a> <strong>Elástico mejora las incrustaciones vectoriales dispersas</strong>, como puedes ver en el ejemplo siguiente.</p><h3>Búsqueda vectorial dispersa con codificador elástico aprendido de dispersión</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>Salida</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>Los resultados en este caso incluyen la categoría "<em>Muebles de jardín</em>", que ofrece productos bastante similares a los "<em>Muebles de Exterior</em>".</p><p>Analizando "ml.tokens", el campo "rank_features" que contiene tokens generados por Recuperación Escasa Aprendida, se hace evidente que entre los diversos tokens generados hay términos que, aunque no forman parte de la consulta de búsqueda, siguen siendo relevantes en su significado, como "<em>relax</em>" (cómodo), "<em>sofá</em>" (muebles) y "<em>exterior</em>" (balcón).</p><p>La imagen de abajo destaca algunos de estos términos junto con la consulta, tanto con como sin ampliación de términos.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7e869985347b19a7/6a17d875e31791dc2c2d56a1/dd86607fce6137d843a3ec002390eaa988b432f9-1440x502.png" alt="" /><p>Como se observó, este modelo proporciona una búsqueda consciente del contexto y ayuda a mitigar el problema de la descoordinación de vocabulario, a la vez que proporciona resultados más interpretables. Incluso puede superar a los modelos vectoriales densos cuando no se aplica un reentrenamiento específico de dominio.</p><h2>Búsqueda híbrida: resultados relevantes combinando la búsqueda léxica y semántica</h2><p>Cuando se trata de búsqueda, no hay una solución universal. Cada uno de estos métodos de recuperación tiene sus fortalezas pero también sus desafíos. Dependiendo del caso de uso, la mejor opción puede cambiar. A menudo, los mejores resultados entre los métodos de recuperación pueden ser complementarios. Por tanto, para mejorar la relevancia, veremos la combinación de las fortalezas de cada método.</p><p>Existen múltiples formas de implementar una <strong>búsqueda híbrida</strong>, incluyendo la combinación lineal, que da un peso a cada puntaje y la fusión recíproca de rangos (RRF), donde no es necesario especificar un peso.</p><h3>Elasticsearch: lo mejor de ambos mundos con búsqueda léxica y 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>En este código, realizamos una búsqueda híbrida con dos consultas que tenían el valor "<em>Una mesa de comedor y sillas cómodas para un balcón grande</em>". En lugar de usar "<em>muebles</em>" como término de búsqueda, especificamos lo que buscamos, y ambas búsquedas consideran los mismos valores de campo, "descripción". La clasificación se determina mediante una combinación lineal con el mismo peso para los puntajes BM25 y ELSER.</p><p>Salida</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>En el código siguiente, usaremos el mismo valor para la consulta, pero combinaremos los puntajes de BM25 (parámetro de consulta) y kNN (parámetro knn) usando el método de fusión de rangos recíprocos para combinar y clasificar los 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>La funcionalidad de RRF está en vista previa técnica. La sintaxis probablemente cambiará antes de GA.</em></p><p>Salida</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>Aquí también podríamos usar diferentes campos y valores; algunos de estos ejemplos están disponibles en el <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/lexical-and-semantic-search-with-elasticsearch/ecommerce_dense_sparse_project.ipynb">cuaderno de Python</a>.</p><p>Como puedes ver, con Elasticsearch tienes lo mejor de ambos mundos: la búsqueda léxica tradicional y la búsqueda vectorial, ya sea escasa o densa, para alcanzar tu objetivo <strong>y encontrar la mejor respuesta posible a tu pregunta.</strong></p><p>Si quieres seguir aprendiendo sobre los enfoques mencionados aquí, estos blogs pueden ser útiles:</p><ul><li><p><a href="https://www.elastic.co/blog/improving-information-retrieval-elastic-stack-hybrid">Mejorar la recuperación de información en el Elastic Stack: Recuperación híbrida</a></p></li><li><p><a href="https://www.elastic.co/blog/vector-search-elasticsearch-rationale">Búsqueda vectorial en Elasticsearch: La razón detrás del diseño</a></p></li><li><p><a href="https://www.elastic.co/blog/lexical-ai-powered-search-elastic-vector-database">Cómo obtener lo mejor de la búsqueda léxica y basada en IA con la base de datos vectorial de Elastic</a></p></li><li><p><a href="https://www.elastic.co/blog/may-2023-launch-sparse-encoder-ai-model">Presentamos Elastic Learned Sparse Encoder: el modelo de IA de Elastic para búsqueda semántica</a></p></li><li><p><a href="https://www.elastic.co/blog/may-2023-launch-information-retrieval-elasticsearch-ai-model">Mejorando la recuperación de información en el Elastic Stack: Presentamos Elastic Learned Sparse Encoder, nuestro nuevo modelo de recuperación</a></p></li></ul><p>Elasticsearch proporciona una base de datos vectorial, junto con todas las herramientas que necesitas para construir la búsqueda vectorial:</p><ul><li><p><a href="https://www.elastic.co/elasticsearch/vector-database">Base de datos de vectoresElasticsearch</a></p></li><li><p>Casos de uso <a href="https://www.elastic.co/enterprise-search/vector-search">de búsqueda vectorial</a> con Elastic</p></li></ul><h2>Conclusión</h2><p>En esta entrada del blog, exploramos varios enfoques para recuperar información usando Elasticsearch, centrándonos específicamente en la búsqueda textual, léxica y semántica. Para demostrarlo, proporcionamos ejemplos en Python que muestran diferentes escenarios de búsqueda empleando un conjunto de datos que contiene información de productos de comercio electrónico.</p><p>Revisamos la búsqueda léxica tradicional con BM25 y discutimos sus beneficios y desafíos, como la descoordinación del vocabulario. Destacamos la importancia de incorporar el conocimiento semántico para superar este problema. Además, hablamos sobre la búsqueda vectorial densa, que permite la búsqueda semántica, y abordamos los retos asociados a este método de recuperación, incluyendo el costo computacional al indexar vectores de alta dimensión.</p><p>Por otro lado, mencionamos que los vectores dispersos comprimen excepcionalmente bien. Por ello, hablamos del Learned Sparse Encoder de Elastic, que amplía las consultas de búsqueda para incluir términos relevantes que no estaban presentes en la consulta original.</p><p>No existe una solución única para todos en cuanto a búsqueda. Cada método de recuperación tiene sus fortalezas y desafíos. Por ello, también discutimos el concepto de búsqueda híbrida.</p><p>Como puedes ver, con Elasticsearch puedes tener lo mejor de ambos mundos: ¡búsqueda léxica tradicional y búsqueda vectorial!</p><p>¿Listo para empezar? Consulta el <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/lexical-and-semantic-search-with-elasticsearch/ecommerce_dense_sparse_project.ipynb">cuaderno Python</a> disponible y comienza una <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">prueba gratis de 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[Base de datos vectorial]]></category>
    <category><![CDATA[Python]]></category>
    <category><![CDATA[Lenguajes de búsqueda]]></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[Mejorando las capacidades de los chatbots con PLN y búsqueda vectorial en Elasticsearch]]></title>
    <description><![CDATA[Explora cómo la búsqueda vectorial y el PLN mejoran las capacidades de los chatbots y descubre cómo Elasticsearch facilita el proceso.]]></description>
    <content:encoded><![CDATA[<p>Las interfaces conversacionales existen desde hace tiempo y cada vez son más populares como medio para ayudar en diversas tareas, como atención al cliente, recuperación de información y automatización de tareas. Normalmente accesibles a través de asistentes de voz o aplicaciones de mensajería, estas interfaces simulan la conversación humana para ayudar a los usuarios a resolver sus consultas de forma más eficiente.</p><p>A medida que avanza la tecnología, los chatbots se emplean para gestionar tareas más complejas —y de forma rápida— sin dejar de ofrecer una experiencia personalizada para los usuarios. El procesamiento del lenguaje natural (PLN) permite a los chatbots procesar el lenguaje del usuario, identificar la intención detrás de su mensaje y extraer información relevante de él. Por ejemplo, el Reconocimiento de Entidades Nombradas extrae información clave de un texto clasificándolos en un conjunto de categorías. El análisis de sentimiento identifica el tono emocional y la pregunta responde a la "respuesta" a una consulta. El objetivo del PLN es permitir que los algoritmos procesen el lenguaje humano y realicen tareas que históricamente solo los humanos eran capaces de realizar, como encontrar pasajes relevantes entre grandes cantidades de texto, resumir textos y generar contenido nuevo y original.</p><p>Estas avanzadas capacidades de PLN se basan en una tecnología conocida como <a href="https://www.elastic.co/what-is/vector-search">búsqueda vectorial</a>. Elastic tiene soporte nativo para búsqueda vectorial, realizando búsqueda exacta y aproximada de <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html#knn-search">k-nearest neighbor (kNN),</a> y para NLP, permitiendo el uso directo de modelos personalizados o <a href="https://www.elastic.co/guide/en/machine-learning/current/ml-nlp-model-ref.html#ml-nlp-model-ref">de terceros</a> en Elasticsearch.</p><p>En esta entrada del blog, exploraremos cómo la búsqueda vectorial y el PLN mejoran las capacidades de los chatbots y demostraremos cómo Elasticsearch facilita este proceso. Empecemos con una breve visión general de la búsqueda vectorial.</p><h2>Búsqueda de vectores</h2><p>Aunque los humanos pueden comprender el significado y el contexto del lenguaje escrito, las máquinas no pueden hacer lo mismo. Aquí es donde entran los vectores. Al convertir el texto en representaciones vectoriales (representaciones numéricas del significado del texto), las máquinas pueden superar esta limitación. En comparación con una búsqueda tradicional, en lugar de depender de palabras clave y búsqueda léxica basada en frecuencias, los vectores permiten el proceso de datos textuales mediante operaciones definidas para valores numéricos.</p><p>Esto permite la búsqueda vectorial localizar datos que comparten conceptos o contextos similares empleando distancias en el "espacio de incrustación" para representar similitud dado un vector de consulta. Cuando los datos son similares, los vectores correspondientes serán iguales.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt53a615a8ba0ac931/6a17d795fbc5f8b257491910/08542abf8108aace288745b1aca8579b476ddc1b-1440x618.png" alt="" /><p>La búsqueda vectorial no solo se emplea en aplicaciones de PLN, sino que también se emplea en varios otros ámbitos donde se involucran datos no estructurados, incluyendo el procesamiento de imágenes y video.</p><p>En un flujo de chatbot, puede haber varios enfoques para las consultas de los usuarios y, como resultado, existen diferentes formas de mejorar la recuperación de información para una mejor experiencia de usuario. Dado que cada alternativa tiene su propio conjunto de beneficios y posibles desventajas, es esencial tener en cuenta los datos y recursos disponibles, así como el tiempo de entrenamiento (cuando corresponda) y la precisión esperada. En la siguiente sección, trataremos estos aspectos para modelos de PLN con preguntas frecuentes.</p><h2>Preguntas frecuentes</h2><p>Un modelo de preguntas frecuentes (QA) es un tipo de modelo de PLN diseñado para responder preguntas formuladas en lenguaje natural. Cuando los usuarios tienen preguntas que requieren inferir respuestas a partir de múltiples fuentes, sin una respuesta objetivo preexistente disponible en los documentos, los modelos de QA generativa pueden ser útiles. Sin embargo, estos modelos pueden ser computacionalmente costosos y requieren grandes cantidades de datos para el entrenamiento relacionado con el dominio, lo que puede hacerlos menos prácticos en algunas situaciones, aunque este método puede ser especialmente valioso para tratar preguntas fuera del dominio.</p><p>Por otro lado, cuando los usuarios tienen preguntas sobre un tema específico y la respuesta real está presente en el documento, se pueden emplear modelos extractivos de control de calidad. Estos modelos extraen directamente la respuesta del documento fuente, proporcionando resultados transparentes y verificables, lo que los convierte en una opción más práctica para compañías u organizaciones que desean ofrecer una forma sencilla y eficiente de responder a sus preguntas.</p><p>El ejemplo siguiente demuestra el uso de un modelo extractivo de control de calidad preentrenado, <a href="https://huggingface.co/deepset/minilm-uncased-squad2">disponible en Hugging Face</a> y desplegado en Elasticsearch, para extraer respuestas de un contexto dado:</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">Despliega modelos capacitados.</a></p><p><a href="https://www.elastic.co/guide/en/machine-learning/current/ml-nlp-ner-example.html#ex-ner-ingest">Agrega un modelo a una tubería de ingestión de inferencia.</a></p><p>Existen varias formas de gestionar consultas de usuarios y recuperar información, y emplear múltiples modelos de lenguaje y fuentes de datos puede ser una alternativa eficaz al tratar con datos no estructurados. Para ilustrar esto, tenemos un ejemplo del procesamiento de datos de un chatbot empleado para responder a consultas con respuestas que consideran datos extraídos de documentos seleccionados.</p><h2>Procesamiento de datos en chatbots: PLN y búsqueda vectorial</h2><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta418a9c54bb16cf9/6a17d7975772624b371bca43/c2d1a2f110e937b1d3e5df0d5caac3c906c98fb0-1440x748.png" alt="" /><p>Como se mostró anteriormente, el procesamiento de datos para nuestro chatbot puede dividir en tres partes:</p><ul><li><p><strong>Procesamiento vectorial:</strong> Esta parte convierte documentos en representaciones vectoriales.</p></li><li><p><strong>Procesamiento de entrada por parte del usuario:</strong> Esta parte extrae información relevante de la consulta del usuario y realiza búsqueda semántica y recuperación híbrida.</p></li><li><p><strong>Optimización:</strong> Esta parte incluye la monitorización y es fundamental para garantizar la fiabilidad del chatbot, su rendimiento óptimo y una excelente experiencia de usuario.</p></li></ul><h2>Procesamiento vectorial</h2><p>Para la <strong>parte de procesamiento</strong> , el primer paso es determinar las partes componentes de cada documento para luego convertir cada elemento a una representación vectorial; Estas representaciones pueden crear para una amplia variedad de formatos de datos.</p><p>Existen varios métodos que pueden usar para calcular incrustaciones, incluyendo modelos y bibliotecas preentrenadas.</p><p>Es importante señalar que la efectividad de la búsqueda y recuperación en estas representaciones depende de los datos existentes y de la calidad y relevancia del método empleado.</p><p>A medida que se calculan los vectores, se almacenan en Elasticsearch con un <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/dense-vector.html">tipo de campo dense_vector</a> .</p>PUT &lt;target&gt;
{
  "mappings": {
    "properties": {
      "doc_part_vector": {
        "type": "dense_vector",
        "dims": 3
      },
      "doc_part" : {
        "type" : "keyword"
      }
    }
  }
}
<h2>Procesamiento de entrada de usuario en chatbots</h2><p>Para el <strong>usuario</strong> , tras recibir una pregunta, es útil extraer toda la información posible antes de continuar. Esto ayuda a entender la intención del usuario y, en este caso, estamos empleando un <a href="https://huggingface.co/dslim/bert-base-NER">modelo de Reconocimiento de Entidades Nombradas (NER)</a> para ayudar con ello. NER es el proceso de identificar y clasificar entidades nombradas en categorías 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>Aunque no es un paso necesario, usando datos estructurados o el anterior u otro resultado de modelo NLP para categorizar la consulta del usuario, podemos restringir la búsqueda kNN usando un <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html#knn-search-filter-example">filtro</a>. Esto ayuda a mejorar el rendimiento y la precisión al reducir la cantidad de datos que deben ser procesados.</p>    "filter": {
      "term": {
        "org": "Elastic"
      }
    }
<h2>Búsqueda semántica y recuperación híbrida</h2><p>Dado que el prompt se origina en consultas de usuarios y el chatbot necesita procesar el lenguaje humano con su variabilidad y ambigüedad, <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html#semantic-search">la búsqueda semántica</a> es una excelente opción. En Elasticsearch, puedes realizar búsqueda semántica en un solo paso pasando la cadena de consulta y el ID del <a href="https://huggingface.co/sentence-transformers/msmarco-MiniLM-L-12-v3">modelo de incrustación</a> a un objeto query_vector_builder. Esto vectorizará la consulta y realizará <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html">una búsqueda</a> kNN para recuperar las k coincidencias principales que sean las más cercanas en significado a la 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">Ejemplo de extremo a extremo: Cómo desplegar un modelo de incrustación de texto y usarlo para búsqueda semántica.</a> Elasticsearch emplea la implementación Lucene del Okapi BM25, un <strong>modelo disperso</strong> , para clasificar consultas de texto y determinar su relevancia, mientras que <strong>los modelos densos</strong> se emplean para <strong>la búsqueda semántica</strong>. Para <strong>combinar</strong> las <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html#_combine_approximate_knn_with_other_features"><strong>fortalezas de ambos</strong></a> <strong>,</strong> coincidencias vectoriales y coincidencias obtenidas a partir de la consulta de texto, puedes realizar una <strong>recuperación 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>Combinar modelos dispersos y densos suele dar los mejores resultados</h3><p>Los modelos dispersos generalmente rinden mejor en consultas cortas y terminologías específicas, mientras que los modelos densos aprovechan el contexto y las asociaciones. Si quieres aprender más sobre cómo estos métodos se comparan y complementan, aquí comparamos BM25 con dos modelos densos que fueron capacitados específicamente para la recuperación.</p><p>El resultado más relevante suele ser la primera respuesta dada al usuario, el_score es un número usado para determinar la <strong>relevancia</strong> del documento devuelto.</p><h2>Optimización de chatbots</h2><p>Para ayudar a mejorar la experiencia del usuario, el rendimiento y la fiabilidad de tu chatbot, además de aplicar puntaje híbrido, puedes incorporar los siguientes enfoques: <strong>Análisis de Sentimiento:</strong> Para proporcionar conciencia de los comentarios y reacciones de los usuarios a medida que se desarrolla el diálogo, puedes incorporar un <a href="https://huggingface.co/distilbert-base-uncased-finetuned-sst-2-english">modelo de análisis de sentimiento</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>Capacidades de GPT</strong></a> <strong>:</strong> Como alternativa para mejorar la experiencia global, puedes combinar la relevancia de búsqueda de Elasticsearch con las capacidades de respuesta a preguntas de GPT de OpenAI, empleando la <a href="https://platform.openai.com/docs/guides/chat">API de Finalización de Chat</a> para devolver a las respuestas generadas por el modelo de usuario considerando estos k primeros documentos como contexto. <em>Prompt: "responder a esta pregunta &lt;user_question&gt; usando solo este documento &lt;top_search_result&gt;"</em></p><p><strong>Observancia:</strong> Garantizar el rendimiento de cualquier chatbot es crucial, y la monitorización es un componente esencial para lograrlo. Además de los registros que capturan las interacciones con chatbots, es importante hacer un seguimiento del tiempo de respuesta, la latencia y otras métricas relevantes del chatbot. De este modo, puedes identificar patrones, tendencias e incluso detectar anomalías.<a href="https://www.elastic.co/blog/monitor-openai-api-gpt-models-opentelemetry-elastic">Las herramientas de observabilidad elástica</a> te permiten recopilar y analizar esta información.</p><h2>Resumen</h2><p>Esta entrada de blog explica qué son el PLN y la búsqueda vectorial y profundiza en un ejemplo de chatbot empleado para responder a consultas de usuarios considerando datos extraídos de la representación vectorial de documentos.</p><p>Como se demostró, usando PLN y búsqueda vectorial, los chatbots son capaces de realizar tareas complejas que van más allá de los datos estructurados y dirigidos. Esto incluye hacer recomendaciones y responder a consultas específicas relacionadas con productos o negocios empleando múltiples fuentes de datos y formatos como contexto, además de proporcionar una experiencia de usuario personalizada.</p><p>Los casos de uso van desde ofrecer atención al cliente ayudando a los clientes con sus consultas hasta ayudar a los desarrolladores con sus consultas, proporcionando orientación paso a paso, sugiriendo recomendaciones o incluso automatizando tareas. Dependiendo del objetivo y de los datos existentes, también se pueden emplear otros modelos y métodos para lograr resultados aún mejores y mejorar la experiencia global del usuario.</p><p>Aquí tienes algunos enlaces sobre el tema que pueden ser útiles:</p><ol><li><p><a href="https://www.elastic.co/blog/how-to-deploy-natural-language-processing-nlp-getting-started">Cómo desplegar el procesamiento de lenguaje natural (PLN): Comienzo</a></p></li><li><p><a href="https://www.elastic.co/blog/overview-image-similarity-search-in-elastic">Resumen de la búsqueda por similitud de imágenes en Elasticsearch</a></p></li><li><p><a href="https://www.elastic.co/blog/chatgpt-elasticsearch-openai-meets-private-data">ChatGPT y Elasticsearch: OpenAI se encuentra con datos privados</a></p></li><li><p><a href="https://www.elastic.co/blog/monitor-openai-api-gpt-models-opentelemetry-elastic">Monitoriza los modelos de OpenAI API y GPT con OpenTelemetry y Elastic</a></p></li><li><p><a href="https://www.elastic.co/blog/why-technology-leaders-need-vector-search">5 razones por las que los líderes de TI necesitan la búsqueda vectorial para mejorar la experiencia de búsqueda</a></p></li></ol><p>Al incorporar PLN y búsqueda vectorial nativa en Elasticsearch, puedes aprovechar su velocidad, escalabilidad y capacidades de búsqueda para crear chatbots altamente eficientes y eficaces, capaces de manejar grandes cantidades de datos, ya sean estructurados o no.</p><p>¿Listo para empezar? Comienza una <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">prueba gratis de Elastic Cloud</a>.</p><p><em>En esta entrada del blog, es posible que empleamos o podamos referirnos a herramientas de IA generativa de terceros, que son propiedad y están gestionadas por sus respectivos propietarios. Elastic no tiene ningún control sobre las herramientas de terceros y no tenemos responsabilidad ni responsabilidad por su contenido, funcionamiento o uso, ni por ninguna pérdida o daño que pueda surgir por su uso de dichas herramientas. Por favor, ten precaución al emplear herramientas de IA con información personal, sensible o confidencial. Cualquier dato que envíes puede usar para entrenamiento de IA u otros fines. No hay garantía de que la información que proporciones se mantenga segura o confidencial. Deberías familiarizarte con las prácticas de privacidad y los términos de uso de cualquier herramienta de IA generativa antes de emplearla.</em></p><p><em>Elastic, Elasticsearch y las marcas asociadas son marcas registradas, logotipos o marcas registradas de Elasticsearch N.V. en Estados Unidos y otros países. Todos los demás nombres de empresas y productos son marcas registradas, logotipos o marcas registradas de sus respectivos propietarios.</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[Base de datos vectorial]]></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>