Implemente um agente LangGraph ReAct de suporte de TI com IBM Granite no watsonx.ai

Autores

Anna Gutowska

AI Engineer, Developer Advocate

IBM

Neste tutorial, você criará um agente de IA ReAct (Reasoning and Action) com o framework LangGraph de código aberto, usando um modelo IBM Granite por meio da API do IBM® watsonx.ai  em Python. O caso de uso é gerenciar tickets de suporte de TI existentes e criar novos.

O que é um agente ReAct?

Um agente de inteligência artificial (IA) se refere a um sistema ou programa capaz de executar tarefas de forma autônoma em nome de um usuário ou outro sistema, projetando seu fluxo de trabalho e utilizando as ferramentas disponíveis. Os agentes de IA generativa usam técnicas avançadas de processamento de linguagem natural (NLP) de grandes modelos de linguagem (LLMs) para compreender e responder passo a passo às entradas do usuário e determinar quando recorrer a ferramentas externas. Um componente essencial dos agentes de IA é o raciocínio. Ao adquirir novas informações por meio de chamadas de ferramentas, intervenção humana ou outros agentes, o paradigma de raciocínio orienta as próximas etapas do agente.

Com cada ação e cada resposta da ferramenta, o paradigma ReAct (Reasoning and Action) instrui os agentes a pensar e planejar suas próximas etapas. Esse raciocínio passo a passo e lento nos fornece um insight de como o agente usa o contexto atualizado para formular conclusões. Como esse processo de reflexão é contínuo, ele é frequentemente chamado de ciclo pensar-agir-observar e é uma forma de prompts da cadeia de pensamento.

Uso do LangGraph para criar agentes ReAct

Este tutorial usará o framework LangGraph, um framework de agentes de IA de código aberto projetada para criar, implementar e gerenciar fluxos de trabalho complexos de IA generativa. A função create_react_agent criada previamente fornecida pelo LangGraph é uma maneira fácil de criar um agente personalizado simples. Agentes ReAct simples, como o deste tutorial, conforme representado na Figura 1, são compostos por dois nós. Um nó é responsável por chamar o modelo, e o outro nó é por usar ferramentas. Ferramentas comuns incluem a ferramenta criada previamente LangChain Wikipedia , a ferramenta DuckDuckGoSearchRun e até mesmo a geração aumentada de recuperação (RAG). Em casos com entrada de ações complexas, outro nó pode ser adicionado, como mostra a Figura 2. Esse nó adicional serviria para garantir que o agente devolva uma saída estruturada.

No LangGraph, a funcionalidade de "estado" serve como um banco de memória que registra e rastreia todas as informações valiosas processadas por cada iteração do sistema de IA. Esses gráficos com estado permitem que o agente recupere informações passadas e contexto valioso. A estrutura cíclica do gráfico do ReAct é aproveitada quando o resultado de uma etapa depende das etapas anteriores no loop. Os nós, ou "atores," no gráfico codificam a lógica do agente e são conectados por edges. Edges são essencialmente funções do Python que determinam o próximo nó a ser executado dependendo do estado atual.

Pré-requisitos

Você precisa de uma conta do IBM Cloud para criar um projeto do watsonx.ai .

Etapas

Para utilizar a interface de programação de aplicativos (API) do watsonx , é necessário concluir as etapas a seguir. Observe que você também pode acessar esse tutorial no GitHub

Etapa 1. Gere suas credenciais do watsonx.ai

  1. Faça login no watsonx.ai usando sua conta do IBM Cloud.

  2. Crie uma instância do serviço do watsonx.ai Runtime (tempo de execução) (selecione a região apropriada e escolha o plano Lite, que é uma instância gratuita).

  3. Gere uma chave de interface de programação de aplicativos (API).

Etapa 2. Configure o projeto em seu IDE

Para começar facilmente a implementar agentes no watsonx.ai, clone este repositório do GitHub e acesse o projeto de agentes ReAct de suporte de TI. Você pode executar o seguinte comando em seu terminal para fazê-lo.

git clone git@github.com:IBM/ibmdotcom-tutorials.git
cd react-agent-langgraph-it-support/base/langgraph-react-agent/

Em seguida, instale o poetry, se ainda não o tiver instalado. O poetry é uma ferramenta para gerenciar dependências e empacotamento do Python.

pipx install --python 3.11 poetry

Em seguida, ative seu ambiente virtual.

source $(poetry -q env use 3.11 && poetry env info --path)/bin/activate

Em vez de usar o comando pip install, o pacote poetry nos permite adicionar dependências executando o seguinte comando no terminal. Essa etapa instala as dependências do repositório refletidas no arquivo pyproject.toml para seu ambiente virtual separado.

poetry install

É necessário adicionar um diretório de trabalho a PYTHONPATH para as próximas etapas. Em seu terminal, execute:  

export PYTHONPATH=$(pwd):${PYTHONPATH}

Para configurar seu ambiente, siga as instruções no arquivo README.md no Github. Essa configuração exige que vários comandos sejam executados em seu IDE ou linha de comando.

Etapa 3. Defina as variáveis de ambiente

No arquivo config.toml, você encontrará as seguintes credenciais em branco que devem ser preenchidas antes de tentar implementar seu agente. Seu watsonx_apikey e watsonx_url foram inicializados na etapa 1 deste tutorial. Em seguida, siga o formulário simples encontrado na página Acesso do desenvolvedor para selecionar seu espaço de implementação ou criar um novo. Lá, você pode recuperar seu space_id necessário para conectar nosso agente à implementação do watsonx.ai. Por fim, seu model_id é definido como o modelo IBM Granite 3.2.

[deployment]
  watsonx_apikey = ""
  watsonx_url = ""  # should follow the format: `https://{REGION}.ml.cloud.ibm.com`
  space_id = "" # found in the "Manage" tab of your Deployment or in the Developer Access page here: https://dataplatform.cloud.ibm.com/developer-access

[deployment.custom]
# during creation of deployment additional parameters can be provided inside `CUSTOM` object for further referencing
# please refer to the API docs: https://cloud.ibm.com/apidocs/machine-learning-cp#deployments-create
  model_id = "ibm/granite-3-2-8b-instruct"
  thread_id = "thread-1" # More info here: https://langchain-ai.github.io/langgraph/how-tos/persistence/

Etapa 4. Carregue seus dados no IBM Cloud Object Storage

Nosso agente precisa de uma fonte de dados para apresentar informações atualizadas e adicionar novos dados. Armazenaremos nosso arquivo de dados no IBM® Cloud Object Storage.

  1. Primeiro, faça login no IBM Cloud. Em seguida, crie um novo projeto.
  2. No menu do lado esquerdo, selecione Lista de recursos. Usando o botão Criar recurso, crie uma nova instância do Cloud Object Storage ou simplesmente use este link.
  3. Abra sua instância do IBM Cloud Storage recém-criada e crie um novo bucket. Para este tutorial, você pode selecionar o Smart Tier, que é o pacote gratuito. Quando solicitado, carregue seu arquivo. Para o arquivo de amostra, consulte o arquivo tickets.csv no repositório do GitHub vinculado na etapa 2.

Etapa 5. Estabeleça sua conexão de dados

Para fornecer ao agente ReAct a funcionalidade de gerenciamento de tickets de TI, devemos nos conectar à nossa fonte de dados no IBM Cloud Object Storage. Para esta etapa, podemos usar a biblioteca ibm_boto3

Em tools.py , o COS_ENDPOINT , COS_INSTANCE_CRN , BUCKET_NAME e CSV_FILE_NAME deve ser preenchido com as informações apropriadas usando os detalhes do bucket encontrados em sua instância do Cloud Object Storage na guia Configuração. 

  COS_ENDPOINT = ""       #find in your COS bucket configuration
  COS_INSTANCE_CRN = ""   #find in your COS bucket configuration
  BUCKET_NAME = ""        #find in your COS bucket configuration
  CSV_FILE_NAME = "filename.csv" #you can use the provided tickets.csv sample file 

  cos = ibm_boto3.client(
      "s3",
      ibm_api_key_id=dep_config["watsonx_apikey"],
      ibm_service_instance_id=COS_INSTANCE_CRN,
      config=Config(signature_version="oauth"),
      endpoint_url=COS_ENDPOINT,
  )

Etapa 6. Crie suas ferramentas personalizadas

Nosso agente poderá ler e escrever dados no nosso arquivo. Primeiro, vamos criar a ferramenta para ler os dados usando o LangChain@tool decorator. 

Adicionamos essa ferramentafind_tickets aotools.py arquivo. Essa ferramenta recupera o objeto de dados do Cloud Object Storage e o devolve como um dataframe do Pandas. Caso contrário, uma exceção será lançada. 

  @tool 
  def find_tickets():
      """Returns a list of of all tickets."""
      try:
          response = cos.get_object(Bucket=BUCKET_NAME, Key=CSV_FILE_NAME)
          csv_data = pd.read_csv(response['Body']) 
          print("Ticket file loaded successfully:")
          return csv_data
      except Exception as e:
          print(f"Error loading file from COS: {e}")
          return None

 

Em seguida, adicionamos a ferramenta create_ticket

  @tool 
def create_ticket(issue: str, urgency:str):
    """Creates a tickets for a customer issue. Request a detailed explanation of the customer issue and urgency level before creating a ticket.
    
    Args:
        issue (str): A description of the issue.
        urgency (str): A category value for the level of urgency. Can be "low", "medium", or "high".
    
    Returns:
        The new ticket.
    """
    try:
        # retrieve the existing item to reload the contents
        response = cos.get_object(Bucket=BUCKET_NAME, Key=CSV_FILE_NAME)
        existing_body_df = pd.read_csv(response['Body'])
        new_ticket = {"issue": issue, "date_added":datetime.now().strftime("%m-%d-%Y"), "urgency":urgency, "status":"open"}
        # Add a new row (i.e. ticket) using loc[]
        existing_body_df.loc[len(existing_body_df)] = new_ticket

        cos.put_object(Bucket=BUCKET_NAME, Key=CSV_FILE_NAME, Body=existing_body_df.to_json())
        return "New ticket successfully created!"
    except Exception as e:
        print("Unable to create new ticket. Please try again.")

Essa ferramenta recebe a descrição do problema do usuário e a urgência do problema como seus argumentos. Uma nova linha é adicionada ao nosso arquivo no COS com essas informações e, assim, um novo ticket é criado. Caso contrário, uma exceção será lançada. 

Uma última ferramenta que devemos adicionar ao nosso tools.py arquivo é a ferramenta get_todays_date, que utiliza o módulo datetime para retornar a data de hoje no formato MM-DD-AAAA. Essa ferramenta será útil para acessar a data atual, que o agente não tem outra maneira de recuperar porque o LLM não foi treinado com esses dados. 

  @tool
  def get_todays_date():
    """Returns today's date in MM-DD-YYYY format."""
    date = datetime.now().strftime("%m-%d-%Y")
    return date 

Para conceder ao nosso agente acesso a essas ferramentas, as adicionamos à lista TOOLS no arquivo init.py do módulo arquivo. Essa lista deve ser o conteúdo de seu do módulo arquivo no diretório src/langgraph_react_agent.

  from .tools import (
    find_tickets,
    get_todays_date,
    create_ticket
  )

  TOOLS = [
      find_tickets,
      get_todays_date,
      create_ticket
  ]


Essas ferramentas são importadas no arquivo agent.py e passadas para o LangGraph criado previamente create_react_agent  atuando como agente executor. Outros parâmetros incluem o grande modelo de linguagem inicializado usando a classe ChatWatsonx, que permite a chamada de ferramentas no watsonx.ai, no economizador de memória e no prompt do sistema. Observe que alguns prompts se comportarão melhor do que outros e, portanto, algum nível de engenharia de prompts pode ser necessário dependendo do LLM escolhido. 

Antes de implementar seu agente, lembre-se de preencher todas as informações necessárias no config.toml, arquivo. 

Etapa 7. Converse com seu agente

Há três maneiras de conversar com seu agente.

Opção 1. Consulte o agente localmente


Execute o script para a execução de serviços de IA local.

  poetry run python examples/execute_ai_service_locally.py


Opção 2. Implemente o agente na interface de bate-papo integrada no watsonx.ai


A opção final é acessar o agente no espaço Implementações do watsonx.ai. Para fazer isso, selecione "Implementações" no menu lateral esquerdo. Em seguida, selecione seu espaço de implementação, selecione a guia "Ativos", selecione seu ativoonline ai_service, selecione o ativo com a tag "wx-agent" mais uma vez e, por fim, abra a guia "Pré-visualizar". Agora, você pode conversar com o agente na interface de chat interativo. Cada uma dessas três opções deve resultar em uma saída semelhante.

Opção 3. Implemente e converse com o agente em seu IDE

Para executar o script de implementação, inicialize a variável deployment_id  no arquivo query_existing_deployment.py .

O deployment_id de sua implementação pode ser obtido executando-se o arquivo scripts/deploy.py file.

Em seguida, execute o script de implementação. 

  poetry run python scripts/deploy.py

Em seguida, execute o script para consultar a implementação.

  poetry run python examples/query_existing_deployment.py


Para os fins deste tutorial, vamos escolher a opção 2 e consultar nosso agente implementado no watsonx.ai na forma de um chatbot agêntico. Vamos apresentar ao agente alguns prompts que exigiriam o uso de ferramentas. Ao seguir as etapas listadas na Opção 3, você deverá ver uma interface de bate-papo no watsonx.ai. Lá, podemos digitar nosso prompt. 

Primeiro, vamos testar se a create_ticket ferramenta será invocada com sucesso. Vamos solicitar que o agente crie um novo ticket.

Como você pode ver na resposta final do agente, o sistema de IA usou com sucesso a solução de problemas para criar um novo ticket com a create_ticket ferramenta. Ter visibilidade das chamadas de ferramentas é útil para fins de depuração. Agora, vamos verificar se o ticket foi adicionado ao nosso arquivo de dados que serve como base de conhecimento do agente. 

Ótimo! O agente adicionou o ticket ao arquivo com sucesso.

Conclusão

Neste tutorial, você criou um agente com o framework ReAct que utiliza a tomada de decisão para resolver tarefas complexas, como recuperação e criação de tickets de suporte. Existem vários modelos de IA que permitem a chamada de ferramentas agênticas, como o Gemini do Google, o Granite da IBM e o GPT-4 da OpenAI. Em nosso projeto, usamos um modelo de IA do IBM Granite por meio da API watsonx.ai. O modelo se comportou conforme o esperado tanto localmente quanto quando implementado no watsonx.ai. Como próxima etapa, verifique os modelos LlamaIndex e crewAI multiagentes disponíveis no repositório do GitHub do watsonx-developer-hub para criar agentes de IA.

Soluções relacionadas
Desenvolvimento de agentes de IA da IBM 

Permita que desenvolvedores criem, implementem e monitorem agentes de IA com o IBM watsonx.ai studio.

Explore o watsonx.ai
Agentes de IA e assistentes da IBM

Atinja uma produtividade revolucionária com um dos conjuntos de recursos mais abrangentes do setor para ajudar as empresas a criar, personalizar e gerenciar agentes e assistentes de IA. 

Explore agentes de IA
IBM Granite

Tenha mais de 90% de economia de custos com os modelos menores e abertos do Granite, projetados para a eficiência do desenvolvedor. Esses modelos prontos para uso corporativo oferecem desempenho excepcional em relação aos benchmarks de segurança e em uma ampla variedade de tarefas corporativas, da cibersegurança a RAG.

Explore Granite
Dê o próximo passo

Automatize seus fluxos de trabalho complexos e crie uma produtividade revolucionária com um dos conjuntos de recursos mais abrangentes do setor para ajudar empresas a construir, personalizar e fazer o gerenciamento de agentes e assistentes de IA. 

Explore o desenvolvimento de agentes no watsonx.ai Conheça o watsonx Orchestrate