iae.Senai / app.py
GalvaoFilho's picture
Upload 2 files
42e4c97 verified
# 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)