<?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/pt/search-labs/author/neha-saini</link>
    </image>
    <link>https://www.elastic.co/pt/search-labs/author/neha-saini</link>
    <atom:link href="https://www.elastic.co/pt/search-labs/rss/author/neha-saini.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[pt]]></language>
    <lastBuildDate>Mon, 28 Sep 2026 05:13:50 GMT</lastBuildDate>
  <item>
    <title><![CDATA[​​Construindo um fluxo de trabalho RAG usando LangGraph e Elasticsearch]]></title>
    <description><![CDATA[Aprenda como configurar e personalizar um modelo de agente de recuperação LangGraph com o Elasticsearch para criar um fluxo de trabalho RAG para recuperação de dados eficiente e respostas orientadas por IA.]]></description>
    <content:encoded><![CDATA[<p>O <a href="https://github.com/langchain-ai/retrieval-agent-template">modelo de agente de recuperação LangGraph</a> é um projeto inicial desenvolvido pela LangChain para facilitar a criação de sistemas de perguntas e respostas baseados em recuperação usando o LangGraph no LangGraph Studio. Este modelo é pré-configurado para integração perfeita com o Elasticsearch, permitindo que os desenvolvedores criem rapidamente agentes que podem indexar e recuperar documentos de forma eficiente.</p><p>Este blog se concentra na execução e personalização do modelo do agente de recuperação LangChain usando o LangGraph Studio e o LangGraph CLI. O modelo fornece uma estrutura para a criação de aplicativos de geração aumentada de recuperação (RAG), aproveitando vários backends de recuperação, como o Elasticsearch.</p><p>Orientaremos você na configuração do ambiente e na execução eficiente do modelo com o Elastic, ao mesmo tempo em que personalizamos o fluxo do agente.</p><h2>Pré-requisitos</h2><p>Antes de prosseguir, certifique-se de ter o seguinte instalado:</p><ul><li><p>Implantação do Elasticsearch Cloud ou implantação do Elasticsearch no local (ou crie uma <a href="https://www.elastic.co/pt/cloud/cloud-trial-overview">avaliação gratuita de </a>14 dias no Elastic Cloud) - Versão 8.0.0 ou superior</p></li><li><p>Python 3.9+</p></li><li><p>Acesso a um provedor de LLM como <a href="https://cohere.com/">Cohere</a> (usado neste guia), <a href="https://openai.com/">OpenAI</a> ou <a href="https://www.anthropic.com/claude">Anthropic/Claude</a></p></li></ul><h2>Criando o aplicativo LangGraph</h2><h3>1. Instale o LangGraph CLI</h3>pip install --upgrade "langgraph-cli[inmem]"<h3>2. Crie o aplicativo LangGraph a partir do modelo de agente de recuperação</h3>mkdir lg-agent-demo
cd lg-agent-demo
langgraph new lg-agent-demo <p><em>Será apresentado um menu interativo que permitirá que você escolha entre uma lista de modelos disponíveis. </em>Selecione 4 para Agente de Recuperação e 1 para Python, conforme mostrado abaixo:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd44177037ea46d45/6a17f86b3e9e45265fba1663/6a41a41f95c2477c67810adc7be46d91faf06878-1600x407.png" alt="Modelo de recuperação interativa." /><ul><li><p><strong>Solução de problemas</strong>: se você encontrar o erro “urllib.error.URLError: &lt;erro urlopen [SSL: CERTIFICATE_VERIFY_FAILED] falha na verificação do certificado: não é possível obter o certificado do emissor local (_ssl.c:1000)&gt; “</p></li></ul><p>Execute o comando Instalar Certificado do Python para resolver o problema, conforme mostrado abaixo.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbbe2d1d3a1af75b1/6a17f86d445de97c9c4d02e7/83ec238136c41738457299fd42c83aff32eb5b97-1407x75.png" alt="Executando o comando de instalação do certificado em Python." /><h3>3. Instalar dependências</h3><p>Na raiz do seu novo aplicativo LangGraph, crie um ambiente virtual e instale as dependências no modo <code>edit</code> para que suas alterações locais sejam usadas pelo servidor:</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>Configurando o ambiente</h2><h3>1. Crie um arquivo .environment arquivo</h3><p>O arquivo <code>.env</code> contém chaves de API e configurações para que o aplicativo possa se conectar ao LLM e ao provedor de recuperação escolhidos. Gere um novo arquivo <code>.env</code> duplicando a configuração de exemplo:</p>cp .env.example .env<h3>2. Configure o arquivo .env arquivo</h3><p>O arquivo <code>.env</code> vem com um conjunto de configurações padrão. Você pode atualizá-lo adicionando as chaves de API e os valores necessários com base na sua configuração. Quaisquer chaves que não sejam relevantes para seu caso de uso podem ser deixadas inalteradas ou removidas.</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>Exemplo de arquivo <code>.env</code> (usando Elastic Cloud e Cohere)</p></li></ul><p>Abaixo está um exemplo de configuração <code>.env</code> para usar o <strong>Elastic Cloud</strong> como provedor de recuperação e o <strong>Cohere</strong> como LLM, conforme demonstrado neste 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>Observação: embora este guia utilize o Cohere para geração de respostas e incorporações, você pode usar outros provedores de LLM, como </em><em><strong>OpenAI</strong></em><em>, </em><em><strong>Claude</strong></em><em>ou até mesmo um modelo de LLM local, dependendo do seu caso de uso. Certifique-se de que cada chave que você pretende usar esteja presente e definida corretamente no </em>arquivo<em><code>.env</code></em><em>.</em></p><h3>3. Atualize o arquivo de configuração - configuration.py </h3><p>Depois de configurar seu arquivo <code>.env</code> com as chaves de API apropriadas, a próxima etapa é atualizar a configuração do modelo padrão do seu aplicativo. Atualizar a configuração garante que o sistema use os serviços e modelos que você especificou no seu arquivo <code>.env</code> .</p><p>Navegue até o arquivo de configuração:</p> cd src/retrieval_graph<p>O arquivo <code>configuration.py</code> contém as configurações de modelo padrão usadas pelo agente de recuperação para três tarefas principais:</p><ul><li><p><strong>Modelo de incorporação</strong> – converte documentos em representações vetoriais</p></li><li><p><strong>Modelo de consulta</strong> – processa a consulta do usuário em um vetor</p></li><li><p><strong>Modelo de resposta</strong> – gera a resposta final</p></li></ul><p>Por padrão, o código usa modelos do <strong>OpenAI</strong> (por exemplo, <code>openai/text-embedding-3-small</code>) e <strong>do Anthropic</strong> (por exemplo, <code>anthropic/claude-3-5-sonnet-20240620 and anthropic/claude-3-haiku-20240307</code>).

Neste blog, estamos mudando para o uso de modelos Cohere. Se você já estiver usando OpenAI ou Anthropic, nenhuma alteração será necessária.</p><h4>Exemplos de alterações (usando Cohere):</h4><p>Abra <code>configuration.py</code> e modifique os padrões do modelo conforme mostrado abaixo:</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>Executando o agente de recuperação com a CLI do LangGraph</h2><h3>1. Inicie o servidor LangGraph</h3>cd lg-agent-demo
langgraph dev<p>Isso iniciará o servidor LangGraph API localmente. Se isso for executado com sucesso, você deverá ver algo como:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt46c7a703e715ef66/6a17f86eb1e113272d79f42e/e3c3344b24651067e2d0892d870feca505b3be35-1494x542.png" alt=" Servidor da API LangGraph em execução com sucesso." /><p>URL da interface do usuário do Open Studio.</p><p>Há dois gráficos disponíveis:</p><ul><li><p><strong>Gráfico de recuperação</strong>: Recupera dados do Elasticsearch e responde à consulta usando um LLM (Language-Level Model).</p></li><li><p><strong>Gráfico do indexador</strong>: Indexa documentos no Elasticsearch e gera embeddings usando um LLM.</p></li></ul><h3>2. Configurando o gráfico do indexador</h3><ul><li><p>Abra o gráfico do indexador.</p></li><li><p>Clique em Gerenciar assistentes.</p><ul><li><p>Clique em <strong>'Adicionar novo assistente</strong> ', insira os dados do usuário conforme especificado e, em seguida, feche a janela.</p></li></ul></li></ul>{"user_id": "101"}<h3>3. Indexação de documentos de amostra</h3><ul><li><p>Indexe os seguintes documentos de exemplo, que representam um relatório trimestral hipotético para a organização 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>Depois que os documentos forem indexados, você verá uma mensagem de exclusão no tópico, conforme mostrado abaixo.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt38715eadffcb62f0/6a17f877faa9135f7393ca4c/fd3a1efd64cb54d54ea56ef5055249dd066d5708-1600x854.png" alt="Documentos de fluxo de trabalho RAG do LangGraph e do Elasticsearch indexados." /><h3>4. Executando o grafo de recuperação</h3><ul><li><p>Mude para o gráfico de recuperação.</p></li><li><p>Digite a seguinte consulta de pesquisa:</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="Executando o gráfico de recuperação LangGraph e Elasticsearch" /><p>O sistema retornará documentos relevantes e fornecerá uma resposta exata com base nos dados indexados.</p><h2>Personalize o agente de recuperação.</h2><p>Para melhorar a experiência do usuário, introduzimos uma etapa de personalização no grafo de recuperação para prever as próximas três perguntas que um usuário poderá fazer. Essa previsão se baseia em:</p><ul><li><p>Contexto dos documentos recuperados</p></li><li><p>Interações anteriores do usuário</p></li><li><p>Última consulta do usuário</p></li></ul><p>As seguintes alterações de código são necessárias para implementar o recurso de Previsão de Consulta:</p><h3>1. Atualize o arquivo graph.py</h3><ul><li><p>Adicione a função <code>predict_query</code> :</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 a função <code>respond</code> para retornar o objeto <strong><code>response</code></strong> , em vez da mensagem:</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>Atualizar estrutura do gráfico para adicionar novo nó e aresta 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. Atualize o arquivo prompts.py</h3><ul><li><p>Crie um prompt para previsão de guery em <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. Atualize o arquivo configuration.py</h3><ul><li><p>Adicionar <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. Atualize o arquivo state.py</h3><ul><li><p>Adicione os seguintes atributos:</p></li></ul>response: Annotated[Sequence[AnyMessage], add_messages]
next_question : Annotated[Sequence[AnyMessage], add_messages]<h3>5. Execute novamente o grafo de recuperação.</h3><ul><li><p>Digite a seguinte consulta de pesquisa novamente:</p></li></ul>What was NovaTech Solutions total revenue in Q1 2025?<p>O sistema processará a entrada e preverá três perguntas relacionadas que os usuários podem fazer, conforme mostrado abaixo.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd8d4de9396ca4853/6a17f87be31791dc742d59c7/70e855a2e4edc0ba5a147588df0de30eb081d053-1600x777.png" alt="Executando o gráfico de recuperação com 3 perguntas de usuários usando LangGraph e Elasticsearch." /><h2>Conclusão</h2><p>A integração do modelo do Retrieval Agent no LangGraph Studio e na CLI oferece vários benefícios importantes:</p><ul><li><p><strong>Desenvolvimento acelerado</strong>: o modelo e as ferramentas de visualização simplificam a criação e a depuração de fluxos de trabalho de recuperação, reduzindo o tempo de desenvolvimento.</p></li><li><p><strong>Implantação perfeita</strong>: o suporte integrado para APIs e o dimensionamento automático garantem uma implantação tranquila em todos os ambientes.</p></li><li><p><strong>Atualizações fáceis:</strong> modificar fluxos de trabalho, adicionar novas funcionalidades e integrar nós adicionais é simples, facilitando o dimensionamento e o aprimoramento do processo de recuperação.</p></li><li><p><strong>Memória persistente</strong>: o sistema retém os estados e o conhecimento dos agentes, melhorando a consistência e a confiabilidade.</p></li><li><p><strong>Modelagem de fluxo de trabalho flexível</strong>: os desenvolvedores podem personalizar a lógica de recuperação e as regras de comunicação para casos de uso específicos.</p></li><li><p><strong>Interação e depuração em tempo real</strong>: a capacidade de interagir com agentes em execução permite testes eficientes e resolução de problemas.</p></li></ul><p>Ao aproveitar esses recursos, as organizações podem criar sistemas de recuperação poderosos, eficientes e escaláveis que melhoram a acessibilidade dos dados e a experiência do usuário.</p><p>O código-fonte completo deste projeto está disponível no <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>