Elasticsearch te permite indexar datos de manera rápida y flexible. Pruébalo gratis en el cloud o ejecútalo localmente para ver lo fácil que puede ser indexar.
En este artículo, implementaremos un motor de búsqueda para las preguntas frecuentes empleando LlamaIndex para indexar los datos. Elasticsearch servirá como nuestra base de datos vectorial, permitiendo la búsqueda vectorial, mientras que RAG (Generación Aumentada por Recuperación) enriquecerá el contexto, proporcionando respuestas más precisas.

¿Qué es LlamaIndex?
LlamaIndex es un marco que facilita la creación de agentes y flujos de trabajo impulsados por Grandes Modelos de Lenguaje (LLMs) para interactuar con datos específicos o privados. Permite la integración de datos de diversas fuentes (APIs, PDFs, bases de datos) con LLMs, facilitando tareas como investigación, extracción de información y generación de respuestas contextualizadas.
Conceptos clave:
- Agentes: Asistentes inteligentes que emplean LLMs para realizar tareas, desde respuestas simples hasta acciones complejas.
- Flujos de trabajo: Procesos de varios pasos que combinan agentes, conectores de datos y herramientas para tareas avanzadas.
- Aumento de contexto: Una técnica que enriquece el LLM con datos externos, superando sus limitaciones de entrenamiento.
Integración de LlamaIndex con Elasticsearch:
Elasticsearch puede usar de varias formas con LlamaIndex:
- Fuente de datos: Emplea el Elasticsearch Reader para extraer documentos.
- Modelo de incrustaciones: Codificar datos en vectores para búsquedas semánticas.
- Almacenamiento vectorial: Emplea Elasticsearch como repositorio para buscar documentos vectorizados.
- Almacenamiento avanzado: Configurar estructuras como resúmenes de documentos o grafos de conocimiento.
Uso de LlamaIndex y Elasticsearch para crear una búsqueda de preguntas frecuentes
Preparación de datos
Usaremos como ejemplo las preguntas frecuentes de Elasticsearch Service . Cada pregunta se extraía de la web y se almacenaba en un archivo de texto individual. Puedes usar cualquier método para organizar los datos; En este ejemplo, elegimos almacenar los archivos localmente.
Archivo de ejemplo:
Luego de almacenar todas las preguntas, el directorio se verá así:

Instalación de dependencias
Implementaremos la ingestión y búsqueda usando el lenguaje Python, la versión que usé fue la 3.9. Como requisito previo, será necesario instalar las siguientes dependencias:
Elasticsearch y Kibana se crearán con Docker, configurados mediante docker-compose.yml para ejecutar la versión 8.16.2. Esto facilita la creación del entorno local.
Ingesta de documentos usando LlamaIndex
Los documentos se indexarán en Elasticsearch usando LlamaIndex. Primero, cargamos los archivos con SimpleDirectoryReader, que permite cargar archivos desde un directorio local. Luego de cargar los documentos, los indexaremos usando el VectorStoreIndex.
Los Vector Stores en LlamaIndex son responsables de almacenar y gestionar las incrustaciones de documentos. LlamaIndex soporta diferentes tipos de Vector Stores, y en este caso, usaremos Elasticsearch. En el StorageContext, configuramos la instancia de Elasticsearch. Dado que el contexto es local, no se requerían parámetros adicionales. Para configuraciones en otros entornos, consulte la documentación para comprobar los parámetros necesarios: ElasticsearchStore Configuration.
Por defecto, LlamaIndex emplea el modelo OpenAI text-embedding-ada-002 para generar embeddings. Sin embargo, en este ejemplo, usaremos el modelo text-embedding-3-small . Es importante señalar que se requerirá una clave API de OpenAI para usar el modelo.
A continuación se muestra el código completo para la ingestión de documentos.
Tras la ejecución, los documentos se indexarán en el índice de preguntas frecuentes como se muestra a continuación:

Búsqueda con RAG
Para realizar búsquedas, configuramos el cliente ElasticsearchStore , configurando los campos index_name y es_url con la URL de Elasticsearch. En retrieval_strategy, definimos la AsyncDenseVectorStrategy para búsquedas vectoriales. También están disponibles otras estrategias, como AsyncBM25Strategy (búsqueda por palabras clave) y AsyncSparseVectorStrategy (vectores dispersos). Se pueden encontrar más detalles en la documentación oficial.
A continuación, se creará un objeto VectorStoreIndex , donde configuramos el vector_store usando el objeto ElasticsearchStore. Con el método as_retriever , realizamos la búsqueda de los documentos más relevantes para una consulta, estableciendo el número de resultados devueltos a 5 mediante el parámetro similarity_top_k .
El siguiente paso es RAG. Los resultados de la búsqueda vectorial se incorporan en un prompt formateado para el LLM, permitiendo una respuesta contextualizada basada en la información recuperada.
En la PromptPlantilla, definimos el formato del prompt, que incluye:
- Contexto ({context_str}): documentos recuperados por el recuperador.
- Consulta ({query_str}): la pregunta del usuario.
- Instrucciones: pautas para que el modelo responda según el contexto, sin depender de conocimientos externos.
Finalmente, el LLM procesa el prompt y devuelve una respuesta precisa y contextual.
El código completo se encuentra a continuación:
Ahora podemos realizar nuestra búsqueda, por ejemplo, "¿Los servicios de Elastic son gratis?" y obtener una respuesta contextualizada basada en los datos de las preguntas frecuentes en sí.
Para generar esta respuesta, se emplearon los siguientes documentos:
Conclusión
Empleando LlamaIndex, demostramos cómo crear un sistema eficiente de búsqueda de preguntas frecuentes con soporte para Elasticsearch como base de datos vectorial. Los documentos se ingieren e indexan mediante incrustaciones, lo que permite búsquedas vectoriales. A través de una PromptPlantilla, los resultados de la búsqueda se incorporan al contexto y se envían al LLM, que genera respuestas precisas y contextualizadas basadas en los documentos recuperados.
Este flujo de trabajo integra la recuperación de información con la generación contextualizada de respuestas para ofrecer resultados precisos y relevantes.
Referencias
https://www.elastic.co/guide/en/cloud/current/ec-faq-getting-started.html
https://docs.llamaindex.ai/en/stable/api_reference/readers/elasticsearch/
https://docs.llamaindex.ai/en/stable/module_guides/indexing/vector_store_index/
https://docs.llamaindex.ai/en/stable/examples/query_engine/custom_query_engine/
Preguntas frecuentes
¿Qué es LlamaIndex?
LlamaIndex es un marco que facilita la creación de agentes y flujos de trabajo impulsados por Grandes Modelos de Lenguaje (LLMs) para interactuar con datos específicos o privados.
¿Se puede integrar LlamaIndex con Elasticsearch?
Sí, Elasticsearch puede emplear de diversas formas con LlamaIndex, incluyendo como fuente de datos (usando el Elasticsearch Reader para extraer documentos), como modelo de incrustaciones (codificando datos en vectores para búsquedas semánticas), como almacenamiento vectorial (usando Elasticsearch como repositorio para buscar documentos vectorizados) y para almacenamiento avanzado (configuración de estructuras como resúmenes de documentos o grafos de conocimiento).




