Com a contínua evolução da inteligência artificial (IA), os chatbots se tornaram ferramentas indispensáveis para as empresas, fornecendo assistência em tempo real, personalizando recomendações e automatizando o atendimento ao cliente em várias plataformas. À medida que esses chatbots lidam com tarefas cada vez mais complexas, como responder perguntas, buscar informações específicas e orientar usuários em processos de várias etapas, seu desempenho se torna crucial.

Se o seu chatbot for propenso a erros ou atrasos, ele poderá frustrar seus usuários, resultando em experiências ruins e potencial perda de negócios. Ao usar uma ferramenta de observabilidade como o New Relic AI Monitoring, você pode observar métricas importantes, como tempo de resposta, uso de tokens e taxas de erro, para garantir que seu chatbot tenha um desempenho ideal e ofereça uma experiência tranquila e eficiente para seus usuários.

Neste guia, você aprenderá a fazer exatamente isso! Aqui estão as etapas que você seguirá para monitorar e otimizar o desempenho de um chatbot usando o New Relic AI Monitoring:

  • Configurar um aplicativo de chatbot usando OpenAI
  • Integrar a New Relic para monitoramento em tempo real do seu chatbot
  • Acompanhar as principais métricas de desempenho
  • Identificar e resolver problemas de desempenho usando a New Relic

Como configurar o ambiente

Neste tutorial, você usará um aplicativo de demonstração chamado Relicstraurants, um chatbot de atendimento ao cliente projetado especificamente para interagir com um conjunto de dados fornecido, de modo que ele possa fornecer respostas personalizadas com base nas consultas do usuário. O chatbot foi criado usando o Flask e o modelo GPT-4o da OpenAI.

Requisitos:

Antes de começar, certifique-se de ter o seguinte:

Com esses pré-requisitos em vigor, agora você pode prosseguir para configurar o chatbot Relicstraurants.

  1. Clone o aplicativo chatbot Relicstraurants em seu ambiente local.
git clone https://github.com/mehreentahir16/relicstraurants_chatbot.git
 cd relicstraurants_chatbot
  1. Configure um ambiente virtual e instale os pacotes necessários.
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
  1. Antes de executar o aplicativo, você precisará exportar sua chave de API da OpenAI como uma variável de ambiente.
export OPENAI_API_KEY= your-openai-api-key
  1. Inicie o chatbot executando o seguinte comando.
python3 app.py

Quando o aplicativo estiver em execução, você deve ver uma saída similar à abaixo no seu terminal:

* Serving Flask app 'app'
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
  1. Acesse seu navegador em http://127.0.0.1:5000/ e comece a conversar!

Com o Relicstraurants em funcionamento, você pode explorar sua funcionalidade e ver como ele aproveita dados customizados para fornecer respostas personalizadas aos usuários.

Integrando a New Relic para monitoramento em tempo real

Com seu chatbot Relicstraurants em funcionamento, o próximo passo é instalar um agente New Relic para monitoramento em tempo real. Isso permitirá que você observe as principais métricas de desempenho, identifique possíveis problemas e otimize seu chatbot.

  1. Faça login na sua conta New Relic e clique em Integrations and Agents no menu de navegação à esquerda.
  2. Nos recursos listados, selecione Python.
  3. Na próxima tela, escolha On a host (package manager) como seu método de instrumentação.
  4. Em seguida, insira suas credenciais.
  5. Agora siga as instruções na tela para instalar o agente.
  • Se ainda não o fez, instale o pacote New Relic executando o seguinte comando:
pip install newrelic
  • Certifique-se de que o recurso Analyze your AI application responses* esteja ativado. Isso permitirá que você monitore o desempenho do seu chatbot no tratamento de consultas relacionadas à IA.
  • Baixe o arquivo de configuração newrelic.ini e adicione-o ao diretório raiz do seu projeto. 
  1. Depois que seu arquivo de configuração estiver pronto, adicione as seguintes linhas ao topo do seu arquivo app.py para inicializar o agente New Relic:
import newrelic.agent
newrelic.agent.initialize('newrelic.ini')
  1. Agora reinicie seu aplicativo usando o seguinte comando:
NEW_RELIC_CONFIG_FILE=newrelic.ini newrelic-admin run-program python3 app.py

Quando seu aplicativo estiver em execução, comece a conversar com o chatbot para gerar tráfego. O próximo passo é entender as métricas de desempenho que a New Relic fornece. Essas métricas ajudarão você a monitorar a saúde do seu aplicativo e identificar possíveis problemas de desempenho.

Acompanhamento das métricas-chave de desempenho

Como o New Relic AI Monitoring está incorporado ao agente APM Python, você obtém o melhor dos dois mundos: insights detalhados sobre seu aplicativo e as respostas orientadas por IA. Esse monitoramento em duas camadas garante que, enquanto você monitora a saúde geral do aplicativo, você também monitora o desempenho da IA. Vamos dar uma olhada nas principais métricas exibidas na New Relic.

  1. Navegue até sua conta New Relic e escolha seu aplicativo na seção APM & Services.
  2. Na próxima tela, você verá um dashboard que apresenta métricas de desempenho essenciais relacionadas ao seu aplicativo, como Web transaction time (tempo de transação da web), Apdex score (pontuação Apdex) e Throughput (taxas de transferência).
  1. Ao rolar para baixo no dashboard, você encontrará a seção de resumo das respostas da IA. É aqui que você pode encontrar as métricas específicas de IA, como Response time (tempo de resposta), Token usage per response (uso de token por resposta) e Error rate (taxa de erro), que fornecem uma visão geral do desempenho do seu chatbot.

Essas métricas são essenciais para identificar gargalos específicos do seu componente de IA. Ao monitorá-las, você consegue detectar rapidamente se seu chatbot está demorando muito para responder, consumindo mais tokens do que o esperado ou causando erros em certos tipos de interações.

Identificação e resolução de problemas de desempenho

É hora de se aprofundar em questões específicas que afetam o desempenho do seu chatbot. Por exemplo, a captura de tela acima mostra um tempo de resposta significativamente alto e erros. Esses são indicadores claros de que existem gargalos de desempenho. Vamos analisar mais de perto.

Tempo de resposta: identificando transações lentas

  1. Na página de resumo do aplicativo, você vê as 5 transações mais lentas (por tempo total). Selecione a transação mais lenta.

Na captura de tela a seguir, você pode ver a cascata de intervalos da transação junto com um gráfico de pizza que mostra quais componentes consumiram mais tempo durante a transação.

A duração do trace é de 29,77s, o que é bastante alto para um aplicativo de chatbot. Você também pode ver que a chamada da API para OpenAI (api.openai.com - httpx/POST) ocupou 99,92% do tempo total de resposta, tornando-se o principal motivo para o tempo de resposta geral lento.

Você também pode escolher Focar em períodos lentos, conforme mostrado na imagem a seguir:

Nesse caso, como a latência é introduzida por uma chamada de API externa, uma solução para reduzi-la é armazenar em cache as respostas comumente solicitadas. Se o seu chatbot responde frequentemente a perguntas semelhantes (por exemplo, sugestões de restaurantes), armazenar essas respostas em cache evitará que o sistema faça chamadas repetidas à OpenAI para obter os mesmos dados e consumir tokens adicionais. Outra solução possível é acessar a OpenAI por meio da opção de unidade de transferência de dados provisionada (PTU), dependendo do seu caso de uso.

Monitoramento de erros e resolução

Nenhum aplicativo está livre de erros e, em sistemas baseados em IA, os erros podem ocorrer por vários motivos, como entradas inválidas, falhas na API ou sobrecargas do sistema. No entanto, os erros nem sempre são fáceis de diagnosticar. Por exemplo, você pode ter notado que o chatbot encontra um erro ao pesquisar restaurantes quando nenhuma culinária é especificada.

Vamos analisar de perto o que está acontecendo.

Navegue até a seção AI Responses no menu de entidades na New Relic. Aqui, você verá informações detalhadas sobre como seu chatbot está interagindo com os usuários, sua eficiência de resposta e quaisquer problemas ou erros que precisam ser resolvidos. Selecione qualquer uma das respostas em que o usuário solicita sugestões de restaurantes.

Isso leva você para a página de detalhes da resposta junto com o trace, logs e metadados associados.

Nesta visualização, você verá Request Duration (duração da solicitação), Total Tokens (total de tokens), User input (entrada do usuário) e muito mais. O painel Response Details (Detalhes da resposta) é especialmente importante, pois fornece contexto sobre as ações do chatbot. Ele especifica as ferramentas, o formato e as perguntas do usuário para o chatbot e solicita a resposta. Você também pode examinar a ação e a entrada de ação como uma resposta à consulta do usuário.

Os intervalos destacados em vermelho indicam chamadas onde ocorreram erros ou gargalos de desempenho; neste caso, podemos ver que as chamadas LangChain/invoke e LangChain/run encontraram um problema. Você pode usar esses detalhes de trace para depurar o erro. Clique no intervalo LangChain/invoke para abrir a página de detalhes.

Clique em Error Details (Detalhes do erro) para ver os detalhes do erro.

Na captura de tela anterior, você vê o erro exato que ocorreu durante a solicitação. Especificamente, os detalhes do erro apontam para builtins:TypeError, onde uma função do Lambda recebeu um argumento que não esperava, com a mensagem: "() takes 0 positional arguments but 1 was given". [() recebe 0 argumentos posicionais, mas 1 foi fornecido]. Esse é um problema comum ao trabalhar com funções que não consideram argumentos de entrada.

Agora que você identificou o problema exato usando os detalhes de trace e erro, o próximo passo é retornar à base de código e ajustar a função do Lambda que está lidando com essa solicitação. Nesse caso, o LangChain está chamando a função 'search_top_restaurants' com a entrada adicional None. Modifique o 'search_top_restaurants' para levar em conta esse argumento adicional.

def search_top_restaurants(flattened_data, limit=5, _=None):
    results = []
    entries = flattened_data.split("\n\n")
    for i in range(min(limit, len(entries))):
        restaurant_info = format_restaurant_info(entries[i])
        results.append(restaurant_info)
    return "\n\n".join(results)

Você também precisará modificar as ferramentas do LangChain para levar em conta esse argumento.

 Tool(name="search_top_restaurants", func=lambda _: search_top_restaurants(flattened_data), description="Use esta ferramenta quando o usuário quiser encontrar restaurantes sem especificar uma culinária específica."),

Depois de aplicar a correção, reinicie o aplicativo e verifique se ele está funcionando conforme o esperado.

Monitoramento do uso e otimização do token

Na seção Summary (Resumo) do seu aplicativo de chatbot, conforme mostrado na imagem a seguir, você também pode ver o uso do token para o aplicativo de chatbot Relicstraurants.

O p99 (99º percentil) para tokens é relatado como 1822, enquanto o uso médio de tokens por solicitação é de cerca de 579 tokens para 28 solicitações. Observe que há uma variação significativa no consumo de tokens, com os limites superiores atingindo mais de 1.800 tokens, sugerindo que algumas solicitações podem ser altamente complexas, consumindo mais tokens do que o necessário.

Para entender melhor as métricas de uso de tokens, navegue até AI Responses e escolha qualquer resposta com uso significativo de tokens. Na imagem a seguir, a solicitação está usando cerca de 1,74 mil tokens.

Observe a análise do Token usage (uso do token), que mostra que uma parte significativa do uso total do token1.386 tokens — é consumida durante a chamada da ferramenta search_restaurants_by_cuisine. Isso indica que a maioria dos tokens é usada para recuperar dados (nesse caso, detalhes de restaurantes de culinária indiana), com 284 tokens adicionais sendo usados para gerar a entrada e o contexto que levam a essa ação. Os 67 tokens restantes são alocados para lidar com outros elementos da conversa, como processar a entrada da ação e formatar a resposta final. Isso sugere que a complexidade de gerar a entrada e o contexto para a tomada de decisões do LangChain está contribuindo fortemente para o uso geral do token, não a saída, que é muito menor. Para um chatbot como o Relicstraurants, esse uso de token pode parecer alto e pode resultar em maior latência e custos operacionais. Aqui estão algumas maneiras de otimizar o uso de tokens em seu aplicativo de chatbot.

  • Otimizar o processamento de entrada do LangChain: neste caso, o LangChain parece estar complicando demais a entrada que gera antes de passá-la para a OpenAI. Simplificar a lógica para criar essas entradas ou reduzir a complexidade das consultas internas pode ajudar a diminuir o uso de tokens.
  • Mude para um modelo menor: considere mudar para um modelo mais barato, como o GPT-4o mini ou o GPT-3.5 Turbo. Embora os modelos GPT-4 (como o GPT-4o) sejam mais habilidosos, eles também são caros e tendem a consumir mais tokens. O GPT-4o mini ou o GPT-3.5 Turbo podem ter desempenho suficientemente bom para tarefas relativamente simples, como recomendações de restaurantes.
  • Ajuste de prompts: revise a estrutura dos prompts de entrada que estão sendo gerados. Há informações redundantes? Há detalhes excessivos incluídos que não contribuem significativamente para o resultado? A redução dos detalhes desnecessários do prompt de entrada reduzirá o consumo de tokens.
  • Monitorar o uso do token: monitore continuamente o uso do token por meio da seção AI Responses na New Relic. Se o uso do token p99 continuar aumentando, isso pode indicar problemas relacionados a quão complexas ou detalhadas as entradas estão se tornando. Você pode monitorar transações individuais (como mostrado anteriormente) para identificar quais consultas consomem mais tokens.

Ao adotar essas técnicas de otimização, você pode potencialmente reduzir o consumo de tokens e economizar em custos operacionais sem comprometer a qualidade das respostas do chatbot.

Conclusão

Monitorar e otimizar seu chatbot é crucial para uma experiência eficiente e contínua para o usuário. Ao integrar a New Relic ao seu chatbot de IA, você obtém insights valiosos sobre seu desempenho, permitindo detectar e resolver problemas rapidamente, otimizar o uso de recursos e garantir que seu chatbot permaneça responsivo e confiável. À medida que você continua desenvolvendo e refinando seu chatbot, os dados coletados pela New Relic servirão de base para otimizações futuras, ajudando você a manter um alto nível de qualidade de serviço conforme as demandas dos usuários aumentam.

Para começar, clone o repositório GitHub do chatbot Relicstraurants e siga as etapas descritas neste blog. Boa codificação!