Spaces:
Sleeping
Sleeping
| # app_tri.py | |
| import os | |
| import gradio as gr | |
| from dotenv import load_dotenv | |
| from crewai import Agent, Task, Crew | |
| from langchain_groq import ChatGroq | |
| # Carrega as variáveis de ambiente | |
| load_dotenv() | |
| # --- CONFIGURAÇÃO DO MODELO DE LINGUAGEM (LLM) --- | |
| try: | |
| llm = ChatGroq( | |
| model="groq/llama-3.3-70b-versatile", | |
| api_key=os.getenv("GROQ_API_KEY") | |
| ) | |
| except Exception as e: | |
| print(f"Erro ao inicializar o LLM: {e}") | |
| llm = None | |
| # --- DEFINIÇÃO DA CREW DE ESPECIALISTAS TRI --- | |
| # Agente 1: O Criador | |
| elaborador_tri = Agent( | |
| role="Especialista em Avaliação e Elaborador de Itens de Múltipla Escolha (TRI)", | |
| goal="""Criar um item de múltipla escolha completo, seguindo rigorosamente as especificações da Teoria de Resposta ao Item (TRI), | |
| com base nas variáveis fornecidas (curso, capacidade, nível, etc.).""", | |
| backstory="""Você é um avaliador de larga escala com vasta experiência na elaboração de itens para exames nacionais. | |
| Sua especialidade é criar questões contextualizadas, com comandos precisos e distratores plausíveis, | |
| seguindo um manual de elaboração detalhado.""", | |
| llm=llm, | |
| verbose=True | |
| ) | |
| # Agente 2: O Revisor do Comando | |
| revisor_comando = Agent( | |
| role="Revisor Técnico de Comandos de Itens", | |
| goal="""Analisar criticamente o comando (a pergunta) de um item de múltipla escolha para garantir que ele seja | |
| claro, objetivo, direto e que siga todas as regras de estilo proibitivas (sem 'assinale a correta', 'exceto', etc.).""", | |
| backstory="""Você é um linguista computacional e especialista em psicometria focado na clareza de enunciados de prova. | |
| Seu trabalho é eliminar qualquer ambiguidade ou fraseado que possa induzir o aluno ao erro por má interpretação, | |
| e não por falta de conhecimento.""", | |
| llm=llm, | |
| verbose=True | |
| ) | |
| # Agente 3: O Revisor das Alternativas | |
| revisor_alternativas = Agent( | |
| role="Analista de Distratores e Gabarito", | |
| goal="""Avaliar as alternativas de um item, garantindo que o gabarito seja inequivocamente correto e que os | |
| distratores sejam plausíveis, homogêneos e baseados em erros cognitivos comuns dos estudantes.""", | |
| backstory="""Você é um especialista no conteúdo técnico do curso avaliado e um psicometrista. Você entende | |
| profundamente os erros conceituais que os alunos cometem e usa esse conhecimento para validar se os | |
| distratores representam etapas não consolidadas da aprendizagem, em vez de 'pegadinhas'.""", | |
| llm=llm, | |
| verbose=True | |
| ) | |
| # Agente 4: O Gerente Final | |
| gerente_qualidade = Agent( | |
| role="Gerente de Qualidade de Itens de Avaliação", | |
| goal="""Consolidar as revisões dos especialistas de comando and alternativas para produzir a versão final | |
| e aprovada de um item de múltipla escolha, garantindo que todos os padrões de qualidade TRI foram atendidos.""", | |
| backstory="""Você é o chefe do banco de itens. Nada é publicado sem sua aprovação final. Você recebe o rascunho | |
| e as críticas dos revisores e tem a palavra final, realizando os ajustes necessários para garantir | |
| um item perfeito e pronto para ser aplicado.""", | |
| llm=llm, | |
| verbose=True | |
| ) | |
| def gerar_item_tri(curso, capacidade, nivel, obj_conhecimento, competencias, nivel_cognitivo): | |
| """ | |
| Função principal que monta e executa a Crew para gerar um item TRI. | |
| """ | |
| if not llm: | |
| return "ERRO: LLM não inicializado. Verifique sua chave de API." | |
| # A especificação detalhada, baseada na sua solicitação, que será usada pelos agentes. | |
| especificacao_tri = """ | |
| Siga estas diretrizes para a elaboração e revisão do item: | |
| 1. **Contexto:** Cada item deve apresentar um breve contexto para fornecer informações necessárias aos estudantes sobre o que está sendo avaliado. Este contexto irá apoiar os estudantes na compreensão do problema apresentado. Esse contexto pode compreender imagens, gráficos ou outros recursos de suporte relevantes para o estudante responder a questão. | |
| O contexto do item deve: | |
| - apresentar estímulo motivador de uma situação que esteja restrita à capacidade a ser avaliada; | |
| - abranger situação factível e admissível, devendo ser válido e relevante, dando significado real ao problema proposto; | |
| - ser significativo e capaz de mobilizar os recursos necessários para resolver o item, para possibilitar que o estudante tenha a oportunidade de demonstrar a capacidade desenvolvida e, dessa forma, avaliar em que medida a aprendizagem foi efetivamente realizada; | |
| - indicar o recurso de suporte (figura ou imagem) que facilite o a interpretação do comando pelo estudante, caso seja necessário; | |
| - aproximar-se do que o estudante vivenciou em sua formação ou vivenciará em seu cotidiano profissional; | |
| - ser objetivo, direto e claro, evitando a abordagem de textos desnecessários, com informações supérfluas, ou repetidas leituras, já que o tempo que o estudante terá para responder o item é de três minutos; | |
| - apresentar linguagem muito clara, objetiva e técnica, de modo que, se o aluno não responder corretamente o item, deva ser descartada a hipótese de que alguma palavra o tenha impedido de compreender o que fora solicitado; | |
| - apresentar-se sem erros ortográficos, gramaticais, de concordância verbal, nominal, entre outros, que possam distorcer o sentido do que está sendo contemplado; | |
| - referenciar, quando da utilização de publicações, de onde se extraiu o texto, seguindo as normas da Associação Brasileira de Normas Técnicas (ABNT). Atenção para: | |
| - quando houver inserção ou supressão de textos, indique, entre parênteses (com adaptações); e | |
| - se suprimir textos do contexto, insira no trecho retirado o símbolo [...] para indicar a alteração. | |
| . | |
| 2. **Comando:** O comando é o enunciado que explica ao estudante o que deve ser buscado ou identificado no contexto apresentado. Ele deve ser formulado em uma frase clara, objetiva e direta, sempre relacionado ao contexto. | |
| O comando deve: | |
| - deve descrever uma ação que o estudante deve realizar, como identificar, relacionar, determinar, analisar, interpretar, entre outras; | |
| - estar diretamente vinculado ao contexto apresentado; | |
| - orientar o estudante sobre o que deve buscar, identificar, relacionar ou determinar, sem indicar diretamente o que deve ser feito passo a passo; | |
| - ser elaborado de forma que, sem a leitura do contexto, o estudante não consiga responder ao item; | |
| - utilizar linguagem impessoal e técnica; | |
| ser expresso em uma única frase, curta e objetiva. | |
| Restrições obrigatórias: | |
| - Não pode ser uma pergunta direta (não deve conter interrogação); | |
| - Não utilizar expressões como: “É correto afirmar que”, “Assinale a alternativa correta”, “Qual das alternativas...”, “A alternativa que indica...”; | |
| - Não empregar termos absolutos, tais como: sempre, nunca, totalmente, absolutamente, completamente, somente ou semelhantes; | |
| - Não utilizar sentenças negativas, como: exceto, não, incorreto, errado, evitando indução ao erro por falta de clareza. | |
| Exemplo de saida: | |
| - Indique o documento que reúne os princípios que sustentam a abordagem descrita no contexto. | |
| - Qual das alternativas apresenta a definição correta do conceito descrito no contexto? | |
| - Com base no contexto, qual é a função do componente X no sistema descrito? | |
| - De acordo com o contexto, qual é a principal vantagem da metodologia apresentada? | |
| 3. **Alternativas:** Crie 5 alternativas (A, B, C, D, E). | |
| - **Gabarito:** | |
| -- O gabarito correto deve ser claramente identificado. | |
| -- Deve explicar tecnicamente por que essa alternativa é a correta. | |
| -- Deve ser a única resposta correta para o problema apresentado. | |
| -- Não deve conter atrativos especiais que o tornem óbvio. | |
| - O gabarito: | |
| -- é a única resposta correta; | |
| -- NÃO apresenta atrativos para a resolução do item. | |
| - **Distratores:** Cada distrator deve ser plausível de escolha pelo estudante, considerando o contexto apresentado na questão. | |
| -- É fundamental fornecer uma justificativa do porquê o estudante poderia escolher a alternativa errada, destacando o processo cognitivo envolvido. | |
| -- A plausibilidade implica que essas respostas, embora não sejam corretas, são razoáveis ou admitidas do ponto de vista do aluno que não adquiriu, ainda, o domínio do conhecimento abordado. | |
| -- Idealmente, o distrator deve representar o processo de construção da aprendizagem ainda não consolidado | |
| - Os distratores devem: | |
| -- ser todos plausíveis, pois a plausibilidade implica que cada distrator esteja no mesmo campo conceitual da alternativa correta, mas seguramente está incorreta. | |
| -- não pode se constituir uma pegadinha; ela se apresenta plausível para o aluno que não sabe. A pegadinha visa atingir o aluno que sabe e é característica de provas de concurso, que não é o caso aqui; e | |
| -- propor hipóteses de raciocínio provavelmente imaginados pelo respondente, delimitando a etapa do desenvolvimento da capacidade em que ele se encontra. | |
| - **Justificativas dos distratores:** | |
| -- Deve explicar a lógica por trás de cada distrator. | |
| -- Deve revelar as possíveis hipóteses de raciocínio do estudante que o levariam a escolher essa alternativa. | |
| 4. **Formato Final:** O item final deve conter: | |
| Contexto, Comando, Alternativas (A-E), Justificativa do Gabarito, Justificativa de cada Distrator, e as Informações Essenciais (Curso, Capacidade, Nível, etc.). | |
| """ | |
| # Tarefa 1: Elaborar o rascunho do item | |
| tarefa_elaborar = Task( | |
| description=f"""Crie um item de múltipla escolha (TRI) completo com base nas seguintes informações e na especificação fornecida. | |
| **Informações Essenciais para a Construção do Item:** | |
| - Curso técnico avaliado: {curso} | |
| - Capacidade avaliada: {capacidade} | |
| - Nível de dificuldade do item: {nivel} | |
| - Objetos de conhecimento: {obj_conhecimento} | |
| - Competências a serem avaliadas: {competencias} | |
| - Nível cognitivo (Taxonomia de Bloom): {nivel_cognitivo} | |
| **Especificação a Seguir:** | |
| {especificacao_tri} | |
| """, | |
| expected_output="A primeira versão completa do item, contendo todos os elementos: Contexto, Comando, Alternativas, Justificativas e Informações Essenciais.", | |
| agent=elaborador_tri | |
| ) | |
| # Tarefa 2: Revisar o comando | |
| tarefa_revisar_comando = Task( | |
| description=f"""Analise o 'Comando' do item elaborado. Verifique se ele segue 100% das regras da especificação, especialmente as proibições. | |
| Seu feedback deve ser: 'Comando Aprovado.' ou 'Comando Reprovado. Motivo: [explicação]. Sugestão de reescrita: [novo comando]'.""", | |
| expected_output="Uma análise concisa do comando do item, com aprovação ou sugestão de melhoria.", | |
| agent=revisor_comando, | |
| context=[tarefa_elaborar] | |
| ) | |
| # Tarefa 3: Revisar as alternativas | |
| tarefa_revisar_alternativas = Task( | |
| description=f"""Analise as 'Alternativas' (gabarito e distratores) e suas justificativas. Verifique a plausibilidade dos distratores, | |
| a correção inequívoca do gabarito e a qualidade técnica das justificativas. | |
| Seu feedback deve ser: 'Alternativas Aprovadas.' ou 'Alternativas Reprovadas. Motivo: [explicação detalhada sobre o problema no distrator X ou gabarito].'""", | |
| expected_output="Uma análise detalhada das alternativas, com aprovação ou feedback para melhoria.", | |
| agent=revisor_alternativas, | |
| context=[tarefa_elaborar] | |
| ) | |
| # Tarefa 4: Finalizar e aprovar | |
| tarefa_finalizar = Task( | |
| description=f"""Você recebeu um item rascunho e as análises dos revisores de Comando e Alternativas. | |
| Sua tarefa é: | |
| 1. Ler as revisões. | |
| 2. Se ambas as revisões forem 'Aprovado', apresente o item original no formato final padrão. | |
| 3. Se houverem sugestões de melhoria, aplique as correções necessárias ao item original e apresente a versão final corrigida. | |
| 4. O seu resultado final deve ser APENAS o item completo e formatado, pronto para ser publicado.""", | |
| expected_output="O item de múltipla escolha final, revisado e formatado, pronto para uso.", | |
| agent=gerente_qualidade, | |
| context=[tarefa_elaborar, tarefa_revisar_comando, tarefa_revisar_alternativas] | |
| ) | |
| # Montando a Crew | |
| crew_tri = Crew( | |
| agents=[elaborador_tri, revisor_comando, revisor_alternativas, gerente_qualidade], | |
| tasks=[tarefa_elaborar, tarefa_revisar_comando, tarefa_revisar_alternativas, tarefa_finalizar], | |
| verbose=True | |
| ) | |
| # Executando a Crew | |
| resultado = crew_tri.kickoff() | |
| return resultado.raw | |
| # --- INTERFACE GRÁFICA COM GRADIO --- | |
| with gr.Blocks(theme=gr.themes.Soft(primary_hue="teal")) as demo: | |
| gr.Markdown("# 📝 Gerador de Itens de Avaliação (TRI)") | |
| gr.Markdown("Preencha os campos abaixo para definir os parâmetros do item a ser criado. A equipe de especialistas virtuais irá elaborar e revisar o item para você.") | |
| with gr.Row(): | |
| curso_input = gr.Textbox(label="Curso Técnico", value="Técnico em Informática para Internet") | |
| capacidade_input = gr.Textbox(label="Capacidade a ser Avaliada", value="Desenvolver algoritmos e estruturas de dados utilizando uma linguagem de programação.") | |
| with gr.Row(): | |
| nivel_dropdown = gr.Dropdown(label="Nível de Dificuldade", choices=["Fácil", "Média", "Difícil"], value="Média") | |
| nivel_cognitivo_dropdown = gr.Dropdown( | |
| label="Nível Cognitivo (Bloom)", | |
| choices=["Conhecimento", "Compreensão", "Aplicação", "Análise", "Síntese", "Avaliação"], | |
| value="Aplicação" | |
| ) | |
| obj_conhecimento_input = gr.Textbox(label="Objeto(s) de Conhecimento", value="Estruturas de repetição (loops for, while), Variáveis e Tipos de Dados em JavaScript.") | |
| competencias_input = gr.Textbox(label="Competência(s)", value="Aplicar lógica de programação para resolver problemas práticos e criar funcionalidades em aplicações web.") | |
| gerar_btn = gr.Button("Gerar Item", variant="primary") | |
| output_markdown = gr.Markdown(label="Item Gerado e Revisado") | |
| gerar_btn.click( | |
| fn=gerar_item_tri, | |
| inputs=[ | |
| curso_input, | |
| capacidade_input, | |
| nivel_dropdown, | |
| obj_conhecimento_input, | |
| competencias_input, | |
| nivel_cognitivo_dropdown | |
| ], | |
| outputs=output_markdown | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch(debug=True) |