Por que um ChatBOT em uma PMO ?

A integração de um assistente GPT customizado, através de um ChatBOT, a um ambiente de escritório de gestão de projetos (PMO) pode transformar radicalmente a eficiência e a capacidade de resposta da equipe.

Neste artigo, exploraremos uma maneira de criar um assistente GPT personalizado, utilizando uma abordagem baseada em código que oferece flexibilidade e um contexto totalmente voltado ao histórico de projetos na organização.

Com base neste modelo, será possível obter recomendações para novos projetos com base nos projetos similares previamente executados pela Organização. Além da possibilidade de respostas sobre pontos específicos do projeto, levando em consideração áreas de conhecimento, restrições e áreas de controle nos projetos .

  • 📈 Resultado Esperado
  • 📃 Estruturação da Base de Conhecimento
  • 👀 Componentes da Solução
  • 🤖 Configurando tudo
  • 🎉 Conclusão
  • 👍 Vamos nos conectar no LinkedIN
  • Resultados Esperados desta Implementação



    0:00
    /0:41
    0:00
    /1:09

    Como criar uma Base de Conhecimento para o GPT-4 ?



    Um ponto bastante importante e que, de fato, representa uma grande diferença nos chatBots convencionais ao que estamos propondo aqui,  é a base de referência para utilização pelo GPT-4. Ou seja, a referência para respostas ao prompt baseada em base de conhecimento e dados atuais sobre projetos executados anteriormente ou vigentes.

    Costumo organizar a base de conhecimento da PMO em áreas de controle e restrições do projeto em uma perspectiva de controle estratégico dos Projetos sob responsabilidade da  PMO. Estes dados são alimentados a partir de um Sistema de Gestão de Projetos que desenvolvi e serve para auxiliar os Gerentes de Projetos no monitoramento do Projeto em suas distintas fases.  As áreas de controle são:

    • Highlights: Pontos de atenção em projetos, atividades ou compromissos demandados pelo projeto. Um Highlight deve estar vinculado a algum tipo de restrição do projeto, como Cronograma, Escopo, custo, recurso, faturamento, entre outros. Um highlight pode ser uma atividade para mitigar um risco, um evento significativo como ausência de um recurso e buscar por substituição. Necessidade de enviar uma notificação ao cliente.
    • Itens de Gestão de Mudança: Pontos de mudança em relação às linhas de base dos projetos ou premissas do projeto. Os itens de mudança também precisam estar vinculados às restrições do projeto.
    • Riscos: Eventos ou oportunidades com todos os campos vinculados aos registros de riscos, inclusive áreas afetadas e restrições vinculadas ao evento. Inclusive o campo de seguimento do risco/problema/oportunidade, que são as ações para mitigação ou acompanhamento do risco. Este campo é uma excelente fonte de informação, inclusive com ações para evitar problemas em novos projetos.

    Essas são as três áreas de controle que compilamos os registros relacionados em um arquivo chamado COMPILADO.pdf

    A outra fonte que compõe a base de conhecimento são os registros de restrições do projeto. Estes registros são adicionados à base de conhecimento de maneira totalmente separada, em arquivos PDF específicos. São eles:

    • Roadmap: São os marcos representativos com as datas estimadas das principais entregas dos projetos ou mudança de fases no projeto. Cada fase sendo controlada durante o transcurso de execução dos projetos possui status quanto ao seu avanço, A INICIAR,   VIGENTE, CONCLUÍDO, EM ATRASO.
    • Compras: São as compras relacionadas ao projeto, também conhecidos como recursos materiais, que podem ser Serviços, Hardware, Software, ou qualquer outra natureza de aquisição. O importante aqui é controlar as compras com base no valor Previsto para esta compra, o valor executado até o momento, o valor total a ser executado e o valor ainda pendente de executar a partir deste momento. Além disso, os desvios positivos ou negativos em relação à previsão de valor total a ser executado em relação ao pressuposto estimado originalmente. Não podemos esquecer dos fornecedores vinculados às compras.
    • Horas: Horas previstas, Horas executadas, Horas estimadas como pendentes a executar, total de horas previstas a executar, desvio negativos ou positivos  das horas totais a serem executadas em função das horas estimadas.
    • Entregáveis: Documentos ou objetos do contrato que fazem parte das entregas a serem realizadas no transcurso do projeto, assim como seu status: Em atraso, Em tempo, Expirado, Entregue. Além disso, as datas estimadas de entrega, as referências documentais relacionadas, por exemplo, Cláusula do contrato ou Termo de Referência da licitação, entre outros. Esta restrição compõe uma ótima fonte de conhecimento sobre documentos a serem esperados ou agregados às entregas para prover um melhor monitoramento do projeto, além das lições aprendidas sobre atrasos e ações para mitigar riscos vinculados a estes entregáveis.
    • Lista de Materiais ( BOM ): São os itens de compras a serem adquiridos no projeto, o detalhe sobre especificação técnica, quantidades. É imprescindível que, ao solicitarmos recomendações diversas sobre um novo projeto, nos sejam fornecidos também os detalhes  de equipamentos e materiais de distintas naturezas ( Software Cots) que podem compor o novo projeto.
    • Recursos: Recursos com percentual de vinculação a projetos e perfis de vinculação.
    • Balanço de Gestão: Resumo financeiro do projeto com base nos gastos de materiais, horas, horas homem, custo com pessoal, custos financeiros e administrativos. Além disso, o valor estimado de gasto para cada item de gasto, quanto se executou até o momento, valores pendentes a executar, e valor total estimado de gasto para este item. A estes dados ainda se somam os desvios negativos ou positivos em função do valor total a ser executado em função do que se previu. Este item agrega compras e demais custos do projeto, como custos financeiros.

     Por fim, alguns arquivos a serem adicionados para melhorar a qualidade das recomendações dizem respeito aos Detalhes do projeto, com uma descrição de cada projeto como cronograma, budget, horas estimadas, fornecedores vinculados, tipo de projeto, datas de vigência, entre outras informações.

    Estes dados de projetos simplificam a criação de um template de projeto com recomendações baseada em grupos de recomendações norteados pelos grupo de controle e restrições mencionados acima. Ao solicitar uma recomendação passando ao assistente dados básicos do novo projeto, as recomendações serão dadas com base no histórico de informação previamente armazenado no Backend. A simplificação vem devido ao fato destes dados funcionarem como uma base  para validação de similaridade entre um projeto que você descreve e os projetos armazenados na base de conhecimento.

    Além dos dados dos projetos, também compõe a base de conhecimento os Detalhes dos fornecedores, já que recomendações para um novo projeto também devem levar em consideração  fornecedores com bons resultados nas compras de projetos armazenados na base de conhecimento.

    Quais os Componentes para criação do ChatBOT integrado ao GPT-4 customizado ?



     Vamos agrupar os componentes relevantes desta solução em Backend (Base de Informação, API de integração com o GPT-4 e Chave de API OpenAI), Front-end (ChatBOT).  Utilizaremos o REPLIT para rodar nosso Backend e o VoiceFlow para criar nosso ChatBOT.

    • REPLIT

      Utilizaremos o Replit para rodar nosso Backend, costumo realizar o Deploy também no Replit para criação de uma instância em produção que roda 24x7, mas por hora utilizaremos apenas o modo Desenvolvedor.
      • No Replit ( https://replit.com/ ) teremos os seguintes componentes:
        • Arquivo Index.js
        • Arquivo Openai.service.js
        • Arquivo Assistant.json ( criado automaticamente )
        • Base de informação a ser enviada ao OpenAI a ser consumido pelo Modelo.
        • Chave API OpenAI configurada no ambiente REPLIT em que criaremos os scripts para criação de serviço para conectar ao OpenAI e ao ChatBOT.
    • VOICEFLOW

      No VOICEFLOW (https://www.voiceflow.com/) teremos o template com fluxo de interação do ChatBOT com o usuário e com o Backend. Teremos a camada de apresentação com o usuário. Desta forma, no VoiceFlow teremos:
        • ChatBOT - Fluxo de interação ( Camada de apresentação )
    • OPENAI

      Na plataforma OpenAI (https://platform.openai.com/api-keys)  teremos que criar a chave para integração do assistente com a API.

    Como configurar e integrar os componentes ?



    • BACKEND
      • Chave API OpenAI

        Primeiro vamos adquirir a chave para integração entre aplicações que utilizam a API OpenAI ao GPT-4 ( Ou qualquer outro). Esta chave é necessária para comunicação entre nossos serviços oriundos dos scripts que disponibilizaremos a seguir. Através desta chave será criada uma instância de um assistente na plataforma OpenAI levando em consideração também a criação de um repositório, também na plataforma OpenAI, para receber os arquivos a serem utilizados como referência de consulta pelo modelo.

        Link para API-KEYS: https://platform.openai.com/api-keys

        • Com a chave para integração em mãos, poderemos adicioná-la à variável ambiente no espaço em que o backend irá trabalhar, ou seja, onde rodaremos os scripts que funcionarão como nossos serviços de integração.

     

      • Criando os SCRIPTS

        São dois os scripts que devemos criar em nosso backend: Index.js e Openai.service.js. O terceiro Script, Assistant.json , será criado automaticamente após execução do projeto. Primeiro vamos criar os scripts e posteriormente vamos adicionar a chave para integração da API, a API Secret obtida na plataforma OpenAI.

        • Index.js:
        
    const express = require("express"); // Importa o framework Express, que é usado para criar o servidor web.
    const cors = require("cors"); // Importa o middleware CORS, que permite o compartilhamento de recursos entre diferentes origens.
    const bodyParser = require("body-parser"); // Importa o body-parser, que é utilizado para processar os corpos das requisições HTTP (normalmente JSON).
    const app = express(); // Cria uma instância do Express.
    const OpenAI = require("openai"); // Importa a biblioteca OpenAI para se comunicar com a API da OpenAI.
    const openai = new OpenAI({
      apiKey: process.env.OPENAI_API_KEY, // Inicializa o cliente da OpenAI com a chave da API, que é obtida das variáveis de ambiente.
    });
    const { createAssistant } = require("./openai.service"); // Importa uma função personalizada 'createAssistant' do arquivo 'openai.service'.
    
    app.use(cors()); // Aplica o middleware CORS para permitir requisições de diferentes origens.
    app.use(bodyParser.json()); // Aplica o body-parser para interpretar requisições com corpo em JSON.
    
    (async () => { 
      const assistant = await createAssistant(openai); // Cria uma instância do assistente utilizando a função importada.
      
      // Define uma rota GET em "/start"
      app.get("/start", async (req, res) => {
        const thread = await openai.beta.threads.create(); // Cria uma nova thread na API da OpenAI.
        return res.json({ thread_id: thread.id }); // Retorna o ID da thread criada como resposta.
      });
    
      // Define uma rota POST em "/chat"
      app.post("/chat", async (req, res) => {
        const assistantId = assistant.id; // Obtém o ID do assistente criado.
        const threadId = req.body.thread_id; // Obtém o ID da thread da requisição.
        const message = req.body.message; // Obtém a mensagem do usuário da requisição.
    
        if (!threadId) { // Verifica se o ID da thread foi passado.
          return res.status(400).json({ error: "Missing thread_id" }); // Retorna um erro se o ID da thread estiver faltando.
        }
    
        console.log(`Received message: ${message} for thread ID: ${threadId}`); // Loga a mensagem e o ID da thread no console.
        
        // Envia a mensagem do usuário para a thread específica na API da OpenAI.
        await openai.beta.threads.messages.create(threadId, {
          role: "user",
          content: message,
        });
    
        // Inicia e aguarda a execução da interação com o assistente.
        const run = await openai.beta.threads.runs.createAndPoll(threadId, {
          assistant_id: assistantId,
        });
    
        // Obtém a lista de mensagens da thread após a interação.
        const messages = await openai.beta.threads.messages.list(run.thread_id);
    
        // Extrai a resposta do assistente a partir das mensagens retornadas.
        const response = messages.data[0].content[0].text.value;
    
        return res.json({ response }); // Retorna a resposta como JSON.
      });
    
      // Inicia o servidor na porta 8080
      app.listen(8080, () => {
        console.log("Server running on port 8080"); // Loga no console que o servidor está rodando.
      });
    })();
        
      

     Caso queria, posso disponibilizar os scripts e demais dados exemplos. Me envia um e-mail ou me solicita no Linkedin que enviarei a você.

        • Openai.service.js:
        
    const fs = require("fs");
    const path = require("path");
     
    const createAssistant = async (openai) => {
      // Caminho para o arquivo do assistente
      const assistantFilePath = "assistant.json";
     
      // Verifica se o arquivo existe
      if (!fs.existsSync(assistantFilePath)) {
        // Diretório contendo os arquivos de conhecimento
        const basedataDir = "./basedata";
        const files = fs.readdirSync(basedataDir);
     
        // Armazena os IDs dos arquivos enviados
        let fileIds = [];
     
        // Envia cada arquivo dentro do diretório basedata
        for (const fileName of files) {
          const filePath = path.join(basedataDir, fileName);
     
          // Certifica-se de que é um arquivo e não um diretório
          if (fs.lstatSync(filePath).isFile()) {
            const file = await openai.files.create({
              file: fs.createReadStream(filePath),
              purpose: "assistants",
            });
            fileIds.push(file.id);
            console.log(`Arquivo enviado: ${fileName}`);
          }
        }
     
        // Cria um vector store incluindo todos os arquivos enviados
        let vectorStore = await openai.beta.vectorStores.create({
          name: "Chat Demo",
          file_ids: fileIds,
        });
     
        // Cria o assistente
        const assistant = await openai.beta.assistants.create({
          name: "Chat Demo",
          instructions:
     
    `Você é o PMO responsável por guiar os gerentes de projetos, fornecendo suporte para o sucesso em novos projetos e em projetos vigentes. Este GPT atuará como uma ferramenta de suporte, oferecendo recomendações baseadas na base de conhecimento da empresa, que consiste em dados de projetos presentes em arquivos PDF.
    
    As recomendações são organizadas nas seguintes seções de controle:
    
    HIGHLIGHTS: Pontos de atenção e sugestões de ações que merecem acompanhamento.
    RISCOS: Identificação e mitigação de riscos com ações preventivas.
    GESTÃO DE MUDANÇA: Mudanças em relação ao baseline do projeto.
    ENTREGÁVEIS: Itens a serem entregues conforme proposta técnica, contrato ou termo de referência.
    ROADMAP: Fases significativas do projeto e milestones.
    RECURSOS: Alocação e papel dos recursos no projeto.
    BALANÇO DE GESTÃO: Gestão financeira, incluindo despesas e orçamento.
    COMPRAS: Compras relacionadas ao projeto, com status financeiro.
    BOM (Lista de Materiais): Materiais necessários para o projeto.
    PROVEDORES: Fornecedores de equipamentos e serviços.
    Essas seções têm registros em arquivos distintos que devem ser utilizados para gerar recomendações em novos projetos. Abaixo, os arquivos relacionados a cada seção:
    
    COMPILADO.PDF: Registros de Highlights, Gestão de Mudança e Riscos, incluindo o campo "acompanhamento".
    DETALHES PROJETOS.PDF: Informações resumidas dos projetos.
    RECURSOS.PDF: Recursos vinculados aos projetos.
    ROADMAP.PDF: Marcos e fases dos projetos.
    BOM.PDF: Lista de materiais dos projetos.
    DETALHE FORNECEDORES.PDF: Detalhes dos fornecedores.
    COMPRAS.PDF: Compras vinculadas aos fornecedores, com status e desvios.
    BALANÇO.PDF: Saúde financeira do projeto.
    ENTREGÁVEIS.PDF: Entregáveis do projeto, com status e datas.
    HORAS.PDF: Horas previstas e executadas.
    Orientações específicas:
    
    Recomendamos que as sugestões de HIGHLIGHTS, GESTÃO DE MUDANÇA e RISCOS sejam baseadas no arquivo COMPILADO.PDF, considerando o campo "acompanhamento" e a origem dos registros.
    Realize correlação entre arquivos usando o ID do Projeto para dar respostas detalhadas, como identificar projetos em determinado país com desvios negativos nas compras.
    Para cada seção de controle, forneça pelo menos 12 recomendações por categoria (ex: 12 de highlights, 12 de riscos, etc.), considerando sempre o campo "acompanhamento".
    As recomendações de provedores devem ser baseadas em experiências anteriores da empresa em projetos similares.
    As sugestões de BOM e recursos devem se basear em projetos similares, com recomendações específicas para itens e alocação de recursos.
    Os riscos devem ser apresentados em formato de tabela, com consequências e ações mitigatórias.
    Destacar possíveis atrasos nos marcos de avanço do projeto e considerar experiências passadas para evitar problemas recorrentes em novos projetos.
    `
      // Suas instruções até aqui
      
          tools: [{ type: "file_search" }],
          tool_resources: { file_search: { vector_store_ids: [vectorStore.id] } },
          model: "gpt-4o",
        });
     
        // Grava o assistente no arquivo
        fs.writeFileSync(assistantFilePath, JSON.stringify(assistant));
        return assistant;
     
      } else {
        // Lê o assistente a partir do arquivo
        const assistant = JSON.parse(fs.readFileSync(assistantFilePath));
        return assistant;
      }
    };
     
    module.exports = { createAssistant };
        
      

     Caso queria, posso disponibilizar os scripts e demais dados exemplos. Me envia um e-mail ou me solicita no Linkedin que enviarei a você.

      • Base de Informação

         
        Para a Base de informação será necessário realizar o Upload dos arquivos relacionados às áreas de controle e às restrições do projeto. Aqui tenho uma dica, além dos arquivos PDF que enviamos, eu exporto os arquivos HTML da minha ferramenta, Sistema de Gestão de Projetos, onde, para cada projeto, existe uma tela com todos os registros de controle e restrições vinculados ao projeto. Percebi que isso contextualizou muito as respostas e direcionou muito bem as perguntas ao contexto real dos projetos executados.

        Vamos criar um diretório no Replit e faremos o Upload destes arquivos. Chamaremos este diretório de basedata
        • Arquivos que enviaremos com base em nossa descrição da Base do Conhecimento :

          DETALHES PROJETOS.PDF
          RECURSOS.PDF
          ROADMAP.PDF
          BOM.PDF
          DETALHES PROVEDORES.PDF
          COMPRAS.PDF
          PROVEDORES.PDF
          BALANÇO.PDF
          COMPILADO.PDF

          Além disso, como mencionado, enviaremos os arquivos HTML relacionado a cada projeto e com os respectivos registros vinculados ao projeto e vinculados aos grupos de controle e restrições. Ou seja, uma página HTML para cada projeto e nesta página todos os registros dos grupos mencionados.

     

      • Configurando a Chave da API OpenAI no ambiente REPLIT

         Adicione a chave obtida no plataforma OpenAI no módulos de variáveis ambiente SECRETS, no REPLIT:
      • Executando o código:
        • Temos agora todos os scripts criados e os arquivos da base de informação carregados
        • Clique em RUN
        • Após clicar em RUN, você verá a lista de arquivos utilizados como base de informação sendo sincronizados com a Plataforma OpenAI, além da informação de que o serviços está executando:
        • Observe que agora temos o arquivo assistant.json criado:
        • Tudo certo com nosso Backend! Agora vamos copiar o URL para acessar o serviço e, de pronto, configurar nosso front-end. O objetivo é utilizar esta URL nos métodos de interação do Front-end com o Backend.

    • FRONT-END

      Nosso Front-end será estruturado no Voiceflow (https://creator.voiceflow.com/). Possuo um template pronto para o chatBOT que estamos construindo aqui. Você precisará apenas importá-lo e alterar dois parâmetros relacionado ao mesmo valor, este valor é a URL que copiamos do Backend ( Replit) no passo anterior. Me envia um e-mail solicitando que enviarei a você.

      Vamos adicionar a URL aos métodos indicados em vermelho. Adicionaremos a URL ao parâmetro GET e POST. Sempre conservando o /start e /chat :

        • Após as configurações você pode executar testes funcionais, através do RUN, ou Publicar:
        • Se optar por Publicar, ficará disponível para você o código para por em seu Sistema de Gestão Projetos ou qualquer sistema de atendimento aos gestores de projetos de sua organização:

    Conclusão



    Por fim, esperamos uma assistente IA que de fato esteja contextualizada com a base de conhecimento da Organização com objetivo claro de realizar recomendações baseadas em histórico de eventos e registro de restrições e dados de controle, assim como respostas às consultas sobre dados específicos de projetos. Para ter acesso aos dados que demonstrei neste artigo, me solicita por email, ou através do Linkedin.

    0:00
    /0:41
    0:00
    /1:09