INTRODUÇÃO
Post anterior: Estudo de Caso T1E3: Como fazer sem saber, experimentando GPS, IA e MASP - Exemplo de Prompt usando MASP
Contexto
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
1. Verificar a Configuração do Ambiente de Execução
- 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.
- Verifique se o arquivo flashplayer.exe está sendo corretamente empacotado no .jar ou se está no diretório esperado.
- 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
- Adicione logs ou mensagens de depuração para verificar o caminho retornado por Constants.directory().
- Certifique-se de que o diretório e os arquivos esperados existem no local correto após a criação do .jar.
- Substitua o acesso a arquivos externos por recursos empacotados no .jar (usando getResourceAsStream).
3. Verificar a Criação do Arquivo .jar
- 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".
- 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
- Copie o arquivo .jar para um diretório limpo em outra máquina.
- Execute o comando java -jar CaixaDoSaberDesktop.jar e verifique se o erro persiste.
- 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
- Adicione logs ou mensagens de depuração antes da linha 91 para verificar se algum objeto está nulo.
- Verifique se o método Constants.directory() está retornando um valor válido.
- Verifique se o arquivo caixa.zip ou outros recursos estão presentes no diretório esperado.
6. Documentar o Processo de Criação do .jar
- Descreva todos os passos necessários para configurar o ambiente de desenvolvimento e produção.
- Inclua exemplos de comandos e configurações.
- Compartilhe o documento com a equipe para evitar problemas futuros.
7. Treinamento da Equipe
- Organize uma sessão de treinamento para explicar os conceitos de empacotamento e execução de aplicações Java.
- Demonstre como usar ferramentas como Eclipse, Maven e Gradle para criar arquivos .jar.
- Forneça exemplos práticos e exercícios para a equipe.
- Verificar a configuração do ambiente de execução.
- Verificar o código que acessa recursos externos.
- Verificar a criação do arquivo .jar.
- Testar o .jar em um ambiente limpo.
- Corrigir o NullPointerException.
- Documentar o processo de criação do .jar.
- Treinar a equipe.
- Siga as instruções detalhadas em cada ação.
- Use ferramentas como Eclipse, Maven, Gradle e comandos do terminal para executar as verificações e correções.
- Teste cada alteração para garantir que o problema foi resolvido.
- Eclipse (para exportar o .jar).
- Maven/Gradle (para gerenciar dependências e criar o .jar).
- Terminal/Command Prompt (para executar comandos Java e verificar o conteúdo do .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.
- Série Estudo de Caso:
- Temporada T1 Como fazer sem saber, experimentando GPS, IA e MASP:
- Episódio E1 Criação de Checklists do Serviço
- Episódio E2 Execução do Serviço
- Episódio E3 Exemplo de Prompt usando MASP
- Episódio E5 Lições aprendidas
Nenhum comentário:
Postar um comentário