Seguidores

segunda-feira, 3 de março de 2025

Estudo de Caso T1E4: Como fazer sem saber, experimentando GPS, IA e MASP - Outro exemplo

INTRODUÇÃO

Post anterior: Estudo de Caso T1E3: Como fazer sem saber, experimentando GPS, IA e MASP - Exemplo de Prompt usando MASP

Contexto

Home Office de qualquer especialidade, que tenha interesse em utilizar MASP e IA na solução de problemas.

Objetivo

O objetivo deste post é apresentar outro exemplo de uso do MASP (Método de Análise e Solução de Problemas) para melhorar a comunicação com a IA.

Perguntas de Ouro do MASP

A elaboração de um Prompt conforme o modelo do MASP ajuda a melhorar a compreensão do problema e, também, a fornecer informações completas, precisas e válidas para a IA.

A figura abaixo mostra a distribuição das 42 perguntas:

  • Etapa 1: 6 perguntas da técnica 5W1H
  • Etapa 2: 6 perguntas da técnica Diagrama de Ishikawa ou Causa e Efeito
  • Rtapa 3: 5 perguntas da técnica 5Porquês, para cada pergunta da Etapa 2, totalizando 30 perguntas


Modelo de Prompt: Um Questionário para Solução de Problema de TI

1 IDENTIFICAÇÃO DO ESPECIALISTA

1.1 Qual o papel do Chatbot? Profissional da área de TI, especialista em ... , atuando como ... .

2 IDENTIFICAÇÃO DO PROBLEMA: Definir claramente o problema (diferença entre o que é e o que deveria ser). Utilizar 5W1H.

2.1 [What?]  - O que aconteceu diferente do esperado?

2.2 [Who?]   - Quem iniciou a execução?

2.3 [When?]  - Evento que iniciou a execução?

2.4 [Where?] - Onde a execução parou?

2.5 [Why?]   - Por que a execução parou?

2.6 [How?]   - Como é o procedimento, passo a passo, para reproduzir o erro?

2.6.1 Passo 1: ...

2.6.2 Passo 2: ...

2.6.3 Passo 3: ...

3 OBSERVAÇÃO: Investigar as características específicas do problema com uma visão ampla e sob vários pontos de vista. Utilizar Diagrama de Ishikawa ou Causa e Efeito.

3.1 [Pessoas?] Como este item influencia no problema?

3.1.1 Falta de treinamento adequado da equipe?

3.1.2 Problemas de comunicação entre membros da equipe?

3.1.3 Ausência de revisões?

3.2 [Recurso?] Como este item influencia no problema?

3.2.1 Computador desatualizado?

3.2.2 Aplicativo desatualizado ou instável?

3.2.3 Configurações do ambiente incorretas ou inconsistentes?

3.2.4 Configuração incorreta das variáveis de ambiente?

3.2.5 Incompatibilidades no ambiente, ou seja, diferenças entre os ambientes onde o processo é executado?

3.2.6 Condições de rede, ou seja, problemas de conectividade que afetam a execução do processo?

3.3 [Método?] Como este item influencia no problema?

3.3.1 Práticas de execução inadequadas?

3.3.2 Falta de documentação do Procedimento Operacional Padrão?

3.3.3 Processo de verificação deficiente, com testes insuficientes ou mal planejados?

3.4 [Entrada?] Como este item influencia no problema?

3.4.1 Material (Informações) de terceiros com falhas ou incompatíveis?

3.4.2 Material (Informações) de terceiros instáveis ou desatualizados?

3.4.3 Dependências de material (Informações) de terceiros inadequadas ou desatualizadas?

3.5 [Saída?] Como este item influencia no problema?

3.5.1 Resultado incompleto, impreciso ou inválido?

3.5.2 Resultado indisponível no local esperado?

3.5.3 Resultado rejeitado por quem vai utilizá-lo?

3.6 [Medição?] Como este item influencia no problema?

3.6.1 Falta de monitoramento adequado do desempenho?

3.6.2 Falta de métricas claras e consistentes para avaliar a qualidade do processo?

3.6.3 Ausência de ferramentas de análise para detectar problemas no processo?

4 ANÁLISE: Descobrir as causas fundamentais. Utilizar "5 Porquês".

4.1 Para cada problema encontrado no item 3 OBSERVAÇÃO, perguntar 5 vezes o porquê do problema ou defeito ter ocorrido, a fim de descobrir a sua real causa, ou seja, a causa raiz.

4.1.1 Pessoas: Por quê? Por quê? Por quê? Por quê? Por quê?

4.1.2 Recurso: Por quê? Por quê? Por quê? Por quê? Por quê?

4.1.3 Método: Por quê? Por quê? Por quê? Por quê? Por quê?

4.1.4 Entrada: Por quê? Por quê? Por quê? Por quê? Por quê?

4.1.5 Saída: Por quê? Por quê? Por quê? Por quê? Por quê?

4.1.6 Medição: Por quê? Por quê? Por quê? Por quê? Por quê?

COMANDO: Por favor, crie um Plano de Ação para resolver o problema especificado acima e, se possível, ensine como executar as ações.

Montagem do Prompt: Reconhecendo que não sabe e que precisa aprender

Responder as perguntas do questionário não é uma tarefa simples para quem está tentando fazer o que não sabe.

Para quem é um especialista, este problema poderia ser resolvido em poucos minutos.

1 PERSONAGEM

1.1 Qual o papel do Chatbot? Profissional da área de TI especialista em Java.

2 IDENTIFICAÇÃO DO PROBLEMA: Definir claramente o problema (diferença entre o que é e o que deveria ser). Utilizar 5W1H.

2.1 [What?]  - O que aconteceu diferente do esperado?

Apareceram as mensagens de erro:

·         Para o usuário: “Erro ao inicializar o app Caixa do Saber”

·         Para o desenvolvedor:

·         java.lang.NullPointerException

·                 at java.util.Properties$LineReader.readLine(Unknown Source)

·                 at java.util.Properties.load0(Unknown Source)

·                 at java.util.Properties.load(Unknown Source)

·                 at mobi.stos.caixadosaber.util.Constants.init(Constants.java:45)

·                 at mobi.stos.caixadosaber.util.Constants.directory(Constants.java:54)

·                 at mobi.stos.caixadosaber.task.InitTask.run(InitTask.java:91)

2.2 [Who?]   - Quem iniciou a execução? O desenvolvedor

2.3 [When?]  - Evento que iniciou a execução? O início da execução foi com este comando no terminal Power Shell: PS C:\CaixaDoSaber> java -jar .\CaixaDoSaberDesktop.jar

2.4 [Where?] - Onde a execução parou? Conforme a mensagem Exception, na linha 91 da classe mobi.stos.caixadosaber.task.InitTask

2.5 [Why?]   - Por que a execução parou? Não sei, mas existe uma informação importante. A execução foi realizada com sucesso dentro do IDE Eclipse, mas ocorreu esse erro após na criação do arquivo .jar.

2.6 [How?]   - Como é o procedimento, passo a passo, para reproduzir o erro? Segue abaixo o código completo da classe InitTask.java

/*

 * To change this license header, choose License Headers in Project Properties.

 * To change this template file, choose Tools | Templates

 * and open the template in the editor.

 */

package mobi.stos.caixadosaber.task;

 

import com.google.gson.Gson;

import com.google.gson.reflect.TypeToken;

import java.io.File;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.net.HttpURLConnection;

import java.net.URI;

import java.net.URL;

import java.util.ArrayList;

import java.util.List;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JProgressBar;

import mobi.stos.caixadosaber.bean.Arquivo;

import mobi.stos.caixadosaber.bean.Caixa;

import mobi.stos.caixadosaber.bean.Categoria;

import mobi.stos.caixadosaber.bean.SubCategoria;

import mobi.stos.caixadosaber.bo.ArquivoBo;

import mobi.stos.caixadosaber.bo.CaixaBo;

import mobi.stos.caixadosaber.bo.CategoriaBo;

import mobi.stos.caixadosaber.bo.SubCategoriaBo;

import mobi.stos.caixadosaber.enumm.DisponibilidadeEnum;

import mobi.stos.caixadosaber.enumm.TipoArquivoEnum;

import mobi.stos.caixadosaber.gui.HomeUI;

import mobi.stos.caixadosaber.gui.layout.Player;

import mobi.stos.caixadosaber.util.Constants;

import mobi.stos.caixadosaber.util.Util;

import org.apache.commons.io.FileUtils;

import org.json.JSONArray;

import org.json.JSONObject;

 

/**

 *

 * @author 

 */

public class InitTask extends Thread {

 

    private final JProgressBar jProgressBar;

    private final JLabel jLabel;

 

    public InitTask(JProgressBar jProgressBar, JLabel jLabel) {

        this.jProgressBar = jProgressBar;

        this.jLabel = jLabel;

    }

 

    @Override

    public void run() {

      

        try {

            jProgressBar.setValue(0);

            jLabel.setText("0/5");

 

            try {

                //File fileCaixa = new File(Constants.directory(), "caixa.zip");

 

                //HttpURLConnection connection = (HttpURLConnection) new URL(Constants.rest("caixa/backup")).openConnection();

                //connection.setReadTimeout(1000 * 30);

                //connection.setDoInput(true);

                //connection.connect();

 

                //try (InputStream inputStream = connection.getInputStream(); FileOutputStream outputStream = new FileOutputStream(fileCaixa)) {

                //    jProgressBar.setValue(50);

                //    int read;

                //    byte[] bytes = new byte[1024];

                //    while ((read = inputStream.read(bytes)) != -1) {

                //        outputStream.write(bytes, 0, read);

                //    }

                //    jProgressBar.setValue(70);

                //}

            } catch (Exception e) {

                e.printStackTrace();

            }

            /* INÍCIO 1 Teste para verificar porque não funciona no jar, embora funcione no Eclipse

            jProgressBar.setValue(80);

            File file = new File(Constants.directory(), "caixa.zip");

            if (file.exists()) {

                Util.unzip(file.getAbsolutePath(), Constants.directory());

            }

            FIM 1*/

            jProgressBar.setValue(100);

            jLabel.setText("1/5");

 

            File dir = new File(Constants.directory());

            String jsonString;

            JSONArray array;

 

            //<editor-fold defaultstate="collapsed" desc="caixa">

            jProgressBar.setValue(0);

            jsonString = Util.jsonToString(dir.getAbsolutePath() + "/caixa.json");

            Gson gson = new Gson();

            java.lang.reflect.Type type = new TypeToken<List<Caixa>>() {

            }.getType();

            List<Caixa> list = gson.fromJson(jsonString, type);

            CaixaBo caixaBo = new CaixaBo();

            caixaBo.clean();

            caixaBo.insert(list, jProgressBar);

            jLabel.setText("2/5");

            //</editor-fold>

 

            //<editor-fold defaultstate="collapsed" desc="categoria">

            jProgressBar.setValue(0);

            jsonString = Util.jsonToString(dir.getAbsolutePath() + "/categoria.json");

            array = new JSONArray(jsonString);

            List<Categoria> categorias = new ArrayList<>();

            for (int i = 0; i < array.length(); i++) {

                JSONObject json = array.getJSONObject(i);

                Categoria entity = new Categoria();

 

                entity.setId(json.getInt("id"));

                entity.setNome(json.getString("nome"));

                entity.setImagem(json.getString("imagem"));

                entity.setOrdem(json.getInt("ordem"));

                entity.setBytes(json.getInt("bytes"));

                entity.setCaixa(new Caixa(json.getInt("caixa_id")));

 

                categorias.add(entity);

            }

            CategoriaBo categoriaBo = new CategoriaBo();

            categoriaBo.clean();

            categoriaBo.insert(categorias, jProgressBar);

            jLabel.setText("3/5");

            //</editor-fold>

 

            //<editor-fold defaultstate="collapsed" desc="sub categoria">

            File subFile = new File(dir.getAbsolutePath() + "/subcategoria.json");

            if (subFile.exists()) {

                jProgressBar.setValue(0);

                jsonString = Util.jsonToString(dir.getAbsolutePath() + "/subcategoria.json");

                array = new JSONArray(jsonString);

                List<SubCategoria> subCategorias = new ArrayList<>();

                for (int i = 0; i < array.length(); i++) {

                    JSONObject json = array.getJSONObject(i);

                    SubCategoria entity = new SubCategoria();

 

                    entity.setId(json.getInt("id"));

                    entity.setNome(json.getString("nome"));

                    entity.setImagem(json.getString("imagem"));

                    entity.setOrdem(json.getInt("ordem"));

                    entity.setBytes(json.getInt("bytes"));

                    entity.setCategoria(new Categoria(json.getInt("categoria_id")));

 

                    subCategorias.add(entity);

                }

                SubCategoriaBo subCategoriaBo = new SubCategoriaBo();

                subCategoriaBo.clean();

                subCategoriaBo.insert(subCategorias, jProgressBar);

            }

            jLabel.setText("4/5");

            //</editor-fold>

 

            //<editor-fold defaultstate="collapsed" desc="arquivo">

            jProgressBar.setValue(0);

            jsonString = Util.jsonToString(dir.getAbsolutePath() + "/arquivo.json");

            array = new JSONArray(jsonString);

            List<Arquivo> arquivos = new ArrayList<>();

            for (int i = 0; i < array.length(); i++) {

                JSONObject json = array.getJSONObject(i);

 

                Arquivo entity = new Arquivo();

                entity.setId(json.getInt("id"));

                entity.setNome(json.getString("nome"));

                entity.setConteudo(json.getString("conteudo"));

                if (json.has("imagem")) {

                    entity.setImagem(json.getString("imagem"));

                }

                entity.setArquivo(json.getString("arquivo"));

                entity.setTipoArquivo(TipoArquivoEnum.valueOf(json.getString("tipoArquivo")));

                entity.setDisponibilidade(DisponibilidadeEnum.valueOf(json.getString("disponibilidade")));

                entity.setBytes(json.getInt("bytes"));

                entity.setCategoria(new Categoria(json.getInt("categoria_id")));

                if (json.has("subcategoria_id")) {

                    entity.setSubCategoria(new SubCategoria(json.getInt("subcategoria_id")));

                }

 

                arquivos.add(entity);

            }

            ArquivoBo arquivoBo = new ArquivoBo();

            arquivoBo.clean();

            arquivoBo.insert(arquivos, jProgressBar);

            jLabel.setText("5/5");

            //</editor-fold>

            jProgressBar.setValue(100);

           

            URI uri = Player.class.getClassLoader().getResource("flashplayer.exe").toURI();

            try (InputStream inputStream = uri.toURL().openStream()) {

                File f = new File(Constants.directory(), "flashplayer.exe");

                FileUtils.copyInputStreamToFile(inputStream, f);

            }

 

            System.out.println("100% progressed");

 

            HomeUI homeUI = new HomeUI();

            homeUI.setVisible(true);

            homeUI.setFocusable(true);

            System.out.println("HomeUI.setVisible");

 

            jProgressBar.setVisible(false);

            jLabel.setVisible(false);

 

        } catch (Exception e) {

            JOptionPane.showMessageDialog(null, "Erro inicializar o App Caixa do Saber", "Erro", JOptionPane.ERROR_MESSAGE);

            e.printStackTrace();

        }

 

    }

 

}

 

3 OBSERVAÇÃO: Investigar as características específicas do problema com uma visão ampla e sob vários pontos de vista. Utilizar Diagrama de Ishikawa ou Causa e Efeito.

3.1 [Pessoas?] Como este item influencia no problema?

3.1.1 Falta de treinamento adequado da equipe? Sim

3.1.2 Problemas de comunicação entre membros da equipe? Não

3.1.3 Ausência de revisões? Não

3.2 [Recurso?] Como este item influencia no problema?

3.2.1 Computador desatualizado? Não

3.2.2 Aplicativo desatualizado ou instável? Não

3.2.3 Configurações do ambiente incorretas ou inconsistentes? Não sei

3.2.4 Configuração incorreta das variáveis de ambiente? Não sei

3.2.5 Incompatibilidades no ambiente, ou seja, diferenças entre os ambientes onde o processo é executado? Não sei

3.2.6 Condições de rede, ou seja, problemas de conectividade que afetam a execução do processo? Não, porque não usa rede, já que o app é Java Desktop.

3.3 [Método?] Como este item influencia no problema?

3.3.1 Práticas de execução inadequadas? Não sei

3.3.2 Falta de documentação do Procedimento Operacional Padrão? Não

3.3.3 Processo de verificação deficiente, com testes insuficientes ou mal planejados? Não

3.4 [Entrada?] Como este item influencia no problema?

3.4.1 Informações de terceiros com falhas ou incompatíveis? Não

3.4.2 Informações de terceiros instáveis ou desatualizadas? Não

3.4.3 Dependências de Informações de terceiros inadequadas ou desatualizadas? Não

3.5 [Saída?] Como este item influencia no problema?

3.5.1 Resultado incompleto, impreciso ou inválido? Não

3.5.2 Resultado indisponível no local esperado? Não

3.5.3 Resultado rejeitado por quem vai utilizá-lo? Não chegou a ser produzido para ser rejeitado

3.6 [Medição?] Como este item influencia no problema?

3.6.1 Falta de monitoramento adequado do desempenho? Não

3.6.2 Falta de métricas claras e consistentes para avaliar a qualidade do processo? Não

3.6.3 Ausência de ferramentas de análise para detectar problemas no processo? Não

4 ANÁLISE: Descobrir as causas fundamentais. Utilizar "5 Porquês".

4.1 Para cada problema encontrado no item 3 OBSERVAÇÃO, perguntar 5 vezes o porquê do problema ou defeito ter ocorrido, a fim de descobrir a sua real causa, ou seja, a causa raiz.

4.1.1 Pessoas: Por que a forma de executar o trabalho influencia no problema? Porque a falta de conhecimento pode ter causado erros de configuração ou de codificação da mudança.

4.1.2 Recurso: Por que os recursos utilizados podem ter influência no problema? Porque a falta de conhecimento do IDE Eclipse pode ter causado erro na criação do arquivo .jar

4.1.3 Método: Por que o método de produção ou processo de prestação de serviços influencia no problema? Porque a falta de conhecimento da tecnologia Java pode ter causado erro na mudança.

4.1.4 Entrada: Por que a qualidade da informação de entrada influencia no problema? Não influencia

4.1.5 Saída: Por que a qualidade da informação de saída influencia no problema? Não influencia

4.1.6 Medição: Por que o modo de medir o desenvolvimento de atividades influencia no problema? Não influencia

COMANDO: Por favor, crie um Plano de Ação para resolver o problema especificado acima e, se possível, ensine como executar as ações.

Revisão do Prompt: Foco para evitar alucinações nas perguntas

A revisão do Prompt é muito importante, para verificar se as 42 perguntas e respostas estão consistentes e coerentes com os dados e fatos obtidos na investigação do problema.

A falta de consistência e coerência caracteriza uma “alucinação” no Prompt, que poderia causar uma resposta inadequada da IA.

Enviar o Prompt Completo: Hora de perguntar a quem sabe as respostas

Após a revisão do Prompt, basta copiar e colar no Chatbot, enviar e esperar a resposta.

Resposta da IA: Entregando o Plano de Ação

Plano de Ação para Resolver o Problema


O problema identificado é um NullPointerException que ocorre durante a execução do arquivo .jar, mas não ocorre no ambiente de desenvolvimento (Eclipse). 

A causa raiz parece estar relacionada à falta de conhecimento sobre a configuração do ambiente de execução e a criação do arquivo .jar. 

Abaixo está um plano de ação detalhado para resolver o problema:

1. Verificar a Configuração do Ambiente de Execução


Ação: Verificar se todas as dependências e recursos necessários estão incluídos no arquivo .jar.

Como Executar:
  1. Certifique-se de que todos os arquivos de configuração (como caixa.json, categoria.json, etc.) estão no classpath ou no diretório correto.
  2. Verifique se o arquivo flashplayer.exe está sendo corretamente empacotado no .jar ou se está no diretório esperado.
  3. Use uma ferramenta como jar tf CaixaDoSaberDesktop.jar para listar o conteúdo do arquivo .jar e confirmar se todos os recursos estão presentes.

2. Verificar o Código que Acessa Recursos Externos


Ação: Verificar se o código que acessa arquivos externos (como Constants.directory()) está funcionando corretamente no .jar.

Como Executar:
  1. Adicione logs ou mensagens de depuração para verificar o caminho retornado por Constants.directory().
  2. Certifique-se de que o diretório e os arquivos esperados existem no local correto após a criação do .jar.
  3. Substitua o acesso a arquivos externos por recursos empacotados no .jar (usando getResourceAsStream).
Exemplo de modificação:

java

Copy

InputStream inputStream = InitTask.class.getClassLoader().getResourceAsStream("caixa.json");

3. Verificar a Criação do Arquivo .jar


Ação: Verificar se o arquivo .jar está sendo criado corretamente, incluindo todas as dependências e recursos.

Como Executar:
  1. Use o Eclipse para exportar o projeto como um .jar:
    • Clique com o botão direito no projeto > Export > Java > Runnable JAR file.
    • Selecione a classe principal e escolha a opção "Package required libraries into generated JAR".
  2. Se estiver usando Maven ou Gradle, verifique o arquivo de configuração (pom.xml ou build.gradle) para garantir que todos os recursos estejam sendo incluídos.

4. Testar o .jar em um Ambiente Limpo


Ação: Testar o arquivo .jar em um ambiente diferente para garantir que o problema não seja específico do ambiente de desenvolvimento.

Como Executar:
  1. Copie o arquivo .jar para um diretório limpo em outra máquina.
  2. Execute o comando java -jar CaixaDoSaberDesktop.jar e verifique se o erro persiste.
  3. Se o erro persistir, compare as configurações do ambiente (variáveis de ambiente, versão do Java, etc.) com o ambiente de desenvolvimento.

5. Corrigir o NullPointerException


Ação: Identificar e corrigir a causa do NullPointerException na linha 91 da classe InitTask.

Como Executar:
  1. Adicione logs ou mensagens de depuração antes da linha 91 para verificar se algum objeto está nulo.
  2. Verifique se o método Constants.directory() está retornando um valor válido.
  3. Verifique se o arquivo caixa.zip ou outros recursos estão presentes no diretório esperado.
Exemplo de depuração:

java

Copy

File dir = new File(Constants.directory());

System.out.println("Diretório: " + dir.getAbsolutePath());

System.out.println("Existe? " + dir.exists());

6. Documentar o Processo de Criação do .jar


Ação: Criar um documento detalhado sobre como configurar o ambiente e criar o arquivo .jar.

Como Executar:
  1. Descreva todos os passos necessários para configurar o ambiente de desenvolvimento e produção.
  2. Inclua exemplos de comandos e configurações.
  3. Compartilhe o documento com a equipe para evitar problemas futuros.

7. Treinamento da Equipe


Ação: Realizar um treinamento para a equipe sobre a criação de arquivos .jar e configuração de ambientes Java.

Como Executar:
  1. Organize uma sessão de treinamento para explicar os conceitos de empacotamento e execução de aplicações Java.
  2. Demonstre como usar ferramentas como Eclipse, Maven e Gradle para criar arquivos .jar.
  3. Forneça exemplos práticos e exercícios para a equipe.
Resumo das Ações

  1. Verificar a configuração do ambiente de execução.
  2. Verificar o código que acessa recursos externos.
  3. Verificar a criação do arquivo .jar.
  4. Testar o .jar em um ambiente limpo.
  5. Corrigir o NullPointerException.
  6. Documentar o processo de criação do .jar.
  7. Treinar a equipe.
Como Executar as Ações

Passo a Passo:
  1. Siga as instruções detalhadas em cada ação.
  2. Use ferramentas como Eclipse, Maven, Gradle e comandos do terminal para executar as verificações e correções.
  3. Teste cada alteração para garantir que o problema foi resolvido.
Ferramentas Úteis:
  1. Eclipse (para exportar o .jar).
  2. Maven/Gradle (para gerenciar dependências e criar o .jar).
  3. Terminal/Command Prompt (para executar comandos Java e verificar o conteúdo do .jar).
Seguindo este plano de ação, você deve ser capaz de identificar e resolver a causa raiz do problema, garantindo que o aplicativo funcione corretamente tanto no ambiente de desenvolvimento quanto no arquivo .jar.

CONCLUSÃO

Neste caso, o problema foi solucionado com ajuda do Plano de Ação.

A causa era um erro de configuração do classpath, especificamente, na pasta resources.

Para quem tem pouco conhecimento da tecnologia Java, quanto tempo levaria para resolver este problema, sem ajuda?

Lição aprendida: 

  • o esforço para responder as 42 perguntas do questionário, certamente, dá algum ganho de conhecimento para quem está tentando fazer o que não sabe; 
  • a execução do Plano de Ação criado pela IA, também, dá algum ganho de conhecimento, porque, em caso de dúvida, sempre poderá ser feita outra interação com a IA, com o foco bem definido.

Próximo Post: Estudo de Caso T1E5: Como fazer sem saber, experimentando GPS, IA e MASP – Lições aprendidas


Demais Episódios da Temporada

Nenhum comentário:

Postar um comentário

Entendendo a Metáfora "Home Office é Moto Boy"

Dashboard de Produtividade Pessoal T1E14: RESOLVIDO BugCT1-5 Erro 400 no login

INTRODUÇÃO Post anterior:  Dashboard de Produtividade Pessoal T1E13: BugCT1-5 Erro 400 no login O objetivo deste post é apresentar um prompt...