<?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[Neha Saini - 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[Neha Saini - 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/neha-saini</link>
    </image>
    <link>https://www.elastic.co/es/search-labs/author/neha-saini</link>
    <atom:link href="https://www.elastic.co/es/search-labs/rss/author/neha-saini.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[es]]></language>
    <lastBuildDate>Mon, 28 Sep 2026 07:34:37 GMT</lastBuildDate>
  <item>
    <title><![CDATA[​​Construcción de un flujo de trabajo RAG usando LangGraph y Elasticsearch]]></title>
    <description><![CDATA[Aprende a configurar y personalizar una plantilla de agente de recuperación LangGraph con Elasticsearch para crear un flujo de trabajo RAG que permita una recuperación eficiente de datos y respuestas impulsadas por IA.]]></description>
    <content:encoded><![CDATA[<p>La <a href="https://github.com/langchain-ai/retrieval-agent-template">plantilla del agente de recuperación de LangGraph</a> es un proyecto inicial desarrollado por LangChain para facilitar la creación de sistemas de respuesta a preguntas basados en la recuperación empleando LangGraph en LangGraph Studio. Esta plantilla está preconfigurada para integrar perfectamente con Elasticsearch, lo que permite a los desarrolladores crear rápidamente agentes que puedan indexar y recuperar documentos de manera eficiente.</p><p>Este blog se centra en la ejecución y personalización de la plantilla del agente de recuperación de LangChain mediante LangGraph Studio y LangGraph CLI. La plantilla proporciona un marco para crear aplicaciones de generación aumentada de recuperación (RAG), aprovechando varios backends de recuperación como Elasticsearch.</p><p>Te guiaremos a través de la instalación, la configuración del entorno y la ejecución de la plantilla de manera eficiente con Elastic mientras personalizas el flujo del agente.</p><h2>Prerrequisitos</h2><p>Antes de continuar, cerciorar de tener instalado lo siguiente:</p><ul><li><p>Despliegue de Elasticsearch Cloud o despliegue de Elasticsearch local (o crea una <a href="https://www.elastic.co/es/cloud/cloud-trial-overview">prueba gratis </a>de 14 días en Elastic Cloud) - Versión 8.0.0 o superior</p></li><li><p>Python 3.9+</p></li><li><p>Acceso a un proveedor de LLM como <a href="https://cohere.com/">Cohere</a> (empleado en esta guía), <a href="https://openai.com/">OpenAI</a> o <a href="https://www.anthropic.com/claude">Anthropic/Claude</a></p></li></ul><h2>Creación de la aplicación LangGraph</h2><h3>1. Instalar la CLI de LangGraph</h3>pip install --upgrade "langgraph-cli[inmem]"<h3>2. Crear la aplicación LangGraph a partir de retrieval-agent-template</h3>mkdir lg-agent-demo
cd lg-agent-demo
langgraph new lg-agent-demo <p><em>Se le presentará un menú interactivo que le permitirá elegir entre una lista de plantillas disponibles. </em>Seleccione 4 para el Agente de recuperación y 1 para Python, como se muestra a continuación:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd44177037ea46d45/6a17f86b3e9e45265fba1663/6a41a41f95c2477c67810adc7be46d91faf06878-1600x407.png" alt="Plantilla interactiva de recuperación." /><ul><li><p><strong>Solución de problemas</strong>: Si encuentra el error "urllib.error.URLError: error &lt;urlopen [SSL: CERTIFICATE_VERIFY_FAILED] error de verificación del certificado: no se puede obtener el certificado del emisor local (_ssl.c:1000)&gt; “</p></li></ul><p>Ejecute el comando Instalar certificado de Python para resolver el problema, como se muestra a continuación.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbbe2d1d3a1af75b1/6a17f86d445de97c9c4d02e7/83ec238136c41738457299fd42c83aff32eb5b97-1407x75.png" alt="Ejecutando el comando de certificado de instalación en Python." /><h3>3. Instalar dependencias</h3><p>En la raíz de su nueva aplicación LangGraph, cree un entorno virtual e instale las dependencias en modo <code>edit</code> para que el servidor emplee sus cambios locales:</p>#For Mac
python3 -m venv lg-demo
source lg-demo/bin/activate 
pip install -e .

#For Windows
python3 -m venv lg-demo
lg-demo\Scripts\activate 
pip install -e .<h2>Configuración del entorno</h2><h3>1. Crear un entorno .. archivo</h3><p>El archivo <code>.env</code> contiene claves y configuraciones de API para que la aplicación pueda conectarse al proveedor de recuperación y LLM elegido. Genere un nuevo archivo <code>.env</code> duplicando la configuración de ejemplo:</p>cp .env.example .env<h3>2. Configurar el .env archivo</h3><p>El archivo <code>.env</code> viene con un conjunto de configuraciones predeterminadas. Puede actualizarlo agregando las claves y los valores de API necesarios según su configuración. Las claves que no sean relevantes para tu caso de uso se pueden dejar sin cambios o quitar.</p># To separate your traces from other applications
LANGSMITH_PROJECT=retrieval-agent

# LLM choice (set the API key for your selected provider):
ANTHROPIC_API_KEY=your_anthropic_api_key
FIREWORKS_API_KEY=your_fireworks_api_key
OPENAI_API_KEY=your_openai_api_key

# Retrieval provider (configure based on your chosen service):

## Elastic Cloud:
ELASTICSEARCH_URL=https://your_elastic_cloud_url
ELASTICSEARCH_API_KEY=your_elastic_api_key

## Elastic Local:
ELASTICSEARCH_URL=http://host.docker.internal:9200
ELASTICSEARCH_USER=elastic
ELASTICSEARCH_PASSWORD=changeme

## Pinecone:
PINECONE_API_KEY=your_pinecone_api_key
PINECONE_INDEX_NAME=your_pinecone_index_name

## MongoDB Atlas:
MONGODB_URI=your_mongodb_connection_string

# Cohere API key:
COHERE_API_KEY=your_cohere_api_key<ul><li><p>Ejemplo <code>.env</code> archivo (con Elastic Cloud y Cohere)</p></li></ul><p>A continuación, se muestra un ejemplo de configuración <code>.env</code> para usar <strong>Elastic Cloud</strong> como proveedor de recuperación y <strong>Cohere</strong> como LLM, como se muestra en este blog:</p># To separate your traces from other applications
LANGSMITH_PROJECT=retrieval-agent
#Retrieval Provider
# Elasticsearch configuration
ELASTICSEARCH_URL=elastic-url:443
ELASTICSEARCH_API_KEY=elastic_api_key
# Cohere API key
COHERE_API_KEY=cohere_api_key<p><em>Nota: Si bien esta guía usa Cohere tanto para la generación de respuestas como para las incrustaciones, puede usar otros proveedores de LLM como </em><em><strong>OpenAI,</strong></em><em><strong>Claude</strong></em><em>o incluso un modelo de LLM local, según su caso de uso. Cerciorar de que cada tecla que desea emplear esté presente y configurada correctamente en el </em><em> archivo.env.</em></p><h3>3. Actualizar archivo de configuración -configuration.py </h3><p>Luego de configurar tu archivo <code>.env</code> con las claves de API adecuadas, el siguiente paso es actualizar la configuración del modelo predeterminado de tu aplicación. La actualización de la configuración garantiza que el sistema use los servicios y modelos que especificó en el archivo <code>.env</code> .</p><p>Vaya al archivo de configuración:</p> cd src/retrieval_graph<p>El archivo <code>configuration.py</code> contiene la configuración predeterminada del modelo empleada por el agente de recuperación para tres tareas principales:</p><ul><li><p><strong>Modelo de incrustación</strong> : convierte documentos en representaciones vectoriales</p></li><li><p><strong>Modelo de consulta</strong> : procesa la consulta del usuario en un vector</p></li><li><p><strong>Modelo de respuesta</strong> : genera la respuesta final</p></li></ul><p>De forma predeterminada, el código emplea modelos de <strong>OpenAI</strong> (por ejemplo, <code>openai/text-embedding-3-small</code>) y <strong>Anthropic</strong> (por ejemplo, <code>anthropic/claude-3-5-sonnet-20240620 and anthropic/claude-3-haiku-20240307</code>).

En este blog, estamos cambiando al uso de modelos Cohere. Si ya está empleando OpenAI o Anthropic, no se necesitan cambios.</p><h4>Ejemplos de cambios (usando Cohere):</h4><p>Abra <code>configuration.py</code> y modifique los valores predeterminados del modelo como se muestra a continuación:</p>…
 embedding_model: Annotated[
       str,
       {"__template_metadata__": {"kind": "embeddings"}},
   ] = field(
       default="cohere/embed-english-v3.0",
…
response_model: Annotated[str, {"__template_metadata__": {"kind": "llm"}}] = field(
       default="cohere/command-r-08-2024",
…
query_model: Annotated[str, {"__template_metadata__": {"kind": "llm"}}] = field(
       default="cohere/command-r-08-2024",
       metadata={<h2>Ejecutando el agente de recuperación con la CLI de LangGraph</h2><h3>1. Inicie el servidor LangGraph</h3>cd lg-agent-demo
langgraph dev<p>Esto iniciará el servidor de la API de LangGraph localmente. Si esto se ejecuta correctamente, debería ver algo como:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt46c7a703e715ef66/6a17f86eb1e113272d79f42e/e3c3344b24651067e2d0892d870feca505b3be35-1494x542.png" alt=" Servidor API de LangGraph funcionando con éxito." /><p>Abra la URL de la interfaz de usuario de Studio.</p><p>Hay dos gráficos disponibles:</p><ul><li><p><strong>Gráfico de recuperación</strong>: Recupera datos de Elasticsearch y responde a la consulta usando un LLM.</p></li><li><p><strong>Gráfico indexador</strong>: Indexa documentos en Elasticsearch y genera incrustaciones usando un LLM.</p></li></ul><h3>2. Configuración del grafo indexador</h3><ul><li><p>Abre el gráfico del indexador.</p></li><li><p>Haz clic en gestionar asistentes.</p><ul><li><p>Haz clic <strong>en 'Agregar nuevo asistente</strong>', introduce los datos del usuario según lo especificado y luego cierra la ventana.</p></li></ul></li></ul>{"user_id": "101"}<h3>3. Indexación de documentos de muestra</h3><ul><li><p>Indexe los siguientes documentos de muestra, que representan un reporte trimestral hipotético para la organización NoveTech:</p></li></ul>[
  {    "page_content": "NoveTech Solutions Q1 2025 Report - Revenue: $120.5M, Net Profit: $18.2M, EPS: $2.15. Strong AI software launch and $50M government contract secured."
  },
  {
    "page_content": "NoveTech Solutions Business Highlights - AI-driven analytics software gained 15% market share. Expansion into Southeast Asia with two new offices. Cloud security contract secured."
  },
  {
    "page_content": "NoveTech Solutions Financial Overview - Operating expenses at $85.3M, Gross Margin 29.3%. Stock price rose from $72.5 to $78.3. Market Cap reached $5.2B."
  },
  {
    "page_content": "NoveTech Solutions Challenges - Rising supply chain costs impacting hardware production. Regulatory delays slowing European expansion. Competitive pressure in cybersecurity sector."
  },
  {
    "page_content": "NoveTech Solutions Future Outlook - Expected revenue for Q2 2025: $135M. New AI chatbot and blockchain security platform launch planned. Expansion into Latin America."
  },
  {
    "page_content": "NoveTech Solutions Market Performance - Year-over-Year growth at 12.7%. Stock price increase reflects investor confidence. Cybersecurity and AI sectors remain competitive."
  },
  {
    "page_content": "NoveTech Solutions Strategic Moves - Investing in R&amp;D to enhance AI-driven automation. Strengthening partnerships with enterprise cloud providers. Focusing on data privacy solutions."
  },
  {
    "page_content": "NoveTech Solutions CEO Statement - 'NoveTech Solutions continues to innovate in AI and cybersecurity. Our growth strategy remains strong, and we foresee steady expansion in the coming quarters.'"
  }
]<p>Una vez indexados los documentos, verá un mensaje de eliminación en el hilo, como se muestra a continuación.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt38715eadffcb62f0/6a17f877faa9135f7393ca4c/fd3a1efd64cb54d54ea56ef5055249dd066d5708-1600x854.png" alt="Documentos de flujo de trabajo RAG de LangGraph y Elasticsearch indexados." /><h3>4. Ejecutar el grafo de recuperación</h3><ul><li><p>Cambia al gráfico de recuperación.</p></li><li><p>Introduzca la siguiente consulta de búsqueda:</p></li></ul>What was NovaTech Solutions total revenue in Q1 2025?<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5c0d070fca52e512/6a17f879505ac36d37ad8d12/eb4d8ddfe0effd7e1868fba921b8ef13f7baf27a-1600x755.png" alt="Ejecutando el grafo de recuperación de LangGraph y Elasticsearch" /><p>El sistema devolverá los documentos relevantes y proporcionará una respuesta exacta basada en los datos indexados.</p><h2>Personalizar el agente de recuperación</h2><p>Para mejorar la experiencia del usuario, introducimos un paso de personalización en el gráfico de recuperación para predecir las siguientes tres preguntas que un usuario podría hacer. Esta predicción se basa en:</p><ul><li><p>Contexto de los documentos recuperados</p></li><li><p>Interacciones anteriores de los usuarios</p></li><li><p>Última consulta de usuario</p></li></ul><p>Se requieren los siguientes cambios de código para implementar la función de predicción de consultas:</p><h3>1. Actualización graph.py</h3><ul><li><p>Agregue <code>predict_query</code> función:</p></li></ul>async def predict_query(
   state: State, *, config: RunnableConfig
) -&gt; dict[str, list[BaseMessage]]:
   logger.info(f"predict_query predict_querypredict_query predict_query predict_query predict_query")  # Log the query

   configuration = Configuration.from_runnable_config(config)
   prompt = ChatPromptTemplate.from_messages(
       [
           ("system", configuration.predict_next_question_prompt),
           ("placeholder", "{messages}"),
       ]
   )
   model = load_chat_model(configuration.response_model)
   user_query = state.queries[-1] if state.queries else "No prior query available"
   logger.info(f"user_query: {user_query}")
   logger.info(f"statemessage: {state.messages}")
   #human_messages = [msg for msg in state.message if isinstance(msg, HumanMessage)]

   message_value = await prompt.ainvoke(
       {
           "messages": state.messages,
           "user_query": user_query,  # Use the most recent query as primary input
           "system_time": datetime.now(tz=timezone.utc).isoformat(),
       },
       config,
   )

   next_question = await model.ainvoke(message_value, config)
   return {"next_question": [next_question]}<ul><li><p>Modifique <code>respond</code> función para devolver <strong><code>response</code></strong> Object , en lugar de message:</p></li></ul>async def respond(
   state: State, *, config: RunnableConfig
) -&gt; dict[str, list[BaseMessage]]:
   """Call the LLM powering our "agent"."""
   configuration = Configuration.from_runnable_config(config)
   # Feel free to customize the prompt, model, and other logic!
   prompt = ChatPromptTemplate.from_messages(
       [
           ("system", configuration.response_system_prompt),
           ("placeholder", "{messages}"),
       ]
   )
   model = load_chat_model(configuration.response_model)

   retrieved_docs = format_docs(state.retrieved_docs)
   message_value = await prompt.ainvoke(
       {
           "messages": state.messages,
           "retrieved_docs": retrieved_docs,
           "system_time": datetime.now(tz=timezone.utc).isoformat(),
       },
       config,
   )
   response = await model.ainvoke(message_value, config)
   # We return a list, because this will get added to the existing list
   return {"response": [response]}<ul><li><p>Actualice la estructura del gráfico para agregar un nuevo nodo y borde para predict_query:</p></li></ul>builder.add_node(generate_query)
builder.add_node(retrieve)
builder.add_node(respond)
builder.add_node(predict_query)
builder.add_edge("__start__", "generate_query")
builder.add_edge("generate_query", "retrieve")
builder.add_edge("retrieve", "respond")
builder.add_edge("respond", "predict_query")<h3>2. Actualización prompts.py</h3><ul><li><p>Prompt de creación para predicción de guery en <code>prompts.py</code>:</p></li></ul>PREDICT_NEXT_QUESTION_PROMPT = """Given the user query and the retrieved documents, suggest the most likely next question the user might ask.

**Context:**
- Previous Queries:
{previous_queries}

- Latest User Query: {user_query}

- Retrieved Documents:
{retrieved_docs}

**Guidelines:**
1. Do not suggest a question that has already been asked in previous queries.
2. Consider the retrieved documents when predicting the next logical question.
3. If the user's query is already fully answered, suggest a relevant follow-up question.
4. Keep the suggested question natural and conversational.
5. Suggest at least 3 question

System time: {system_time}"""<h3>3. Actualización configuration.py</h3><ul><li><p>Agregar <code>predict_next_question_prompt</code>:</p></li></ul>predict_next_question_prompt: str = field(
       default=prompts.PREDICT_NEXT_QUESTION_PROMPT,
       metadata={"description": "The system prompt used for generating responses."},
   )<h3>4. Actualización state.py</h3><ul><li><p>Agregue los siguientes atributos:</p></li></ul>response: Annotated[Sequence[AnyMessage], add_messages]
next_question : Annotated[Sequence[AnyMessage], add_messages]<h3>5. Volver a ejecutar el grafo de recuperación</h3><ul><li><p>Vuelva a introducir la siguiente consulta de búsqueda:</p></li></ul>What was NovaTech Solutions total revenue in Q1 2025?<p>El sistema procesará la entrada y predecirá tres preguntas relacionadas que los usuarios podrían hacer, como se muestra a continuación.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd8d4de9396ca4853/6a17f87be31791dc742d59c7/70e855a2e4edc0ba5a147588df0de30eb081d053-1600x777.png" alt="Ejecutar el grafo de recuperación con 3 preguntas de usuario usando LangGraph y Elasticsearch" /><h2>Conclusión</h2><p>La integración de la plantilla del agente de recuperación dentro de LangGraph Studio y CLI proporciona varios beneficios clave:</p><ul><li><p><strong>Desarrollo acelerado</strong>: las herramientas de plantilla y visualización agilizan la creación y depuración de flujos de trabajo de recuperación, lo que reduce el tiempo de desarrollo.</p></li><li><p><strong>Implementación perfecta</strong>: la compatibilidad integrada con las API y el escalado automático garantiza una implementación fluida en todos los entornos.</p></li><li><p><strong>Actualizaciones fáciles:</strong> Modificar los flujos de trabajo, agregar nuevas funcionalidades e integrar nodos adicionales es simple, lo que facilita escalar y mejorar el proceso de recuperación.</p></li><li><p><strong>Memoria persistente</strong>: el sistema conserva los estados y el conocimiento de los agentes, lo que mejora la coherencia y la confiabilidad.</p></li><li><p><strong>Modelado de flujo de trabajo flexible:</strong> los desarrolladores pueden personalizar la lógica de recuperación y las reglas de comunicación para casos de uso específicos.</p></li><li><p><strong>Interacción y depuración en tiempo real</strong>: la capacidad de interactuar con los agentes en ejecución permite realizar pruebas y resolver problemas de manera eficiente.</p></li></ul><p>Al aprovechar estas características, las organizaciones pueden crear sistemas de recuperación poderosas, eficientes y escalables que mejoren la accesibilidad de los datos y la experiencia del usuario.</p><p>El código fuente completo de este proyecto está disponible en <a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/langraph-retrieval-agent-template-demo">GitHub</a>.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/build-rag-workflow-langgraph-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/build-rag-workflow-langgraph-elasticsearch</guid>
    <category><![CDATA[AI]]></category>
    <dc:creator><![CDATA[Neha Saini]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0c9f03d2c1a9cb4c/6a17f87d0b0bed3781dd377c/17b7e7b336f73e232375d1add582ae5f6c52a279-1440x840.png" length="0" type="image/png"/>
    <pubDate>Fri, 25 Apr 2025 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>