From 374ac90a3b00676c58a6c36baeb8b70890f14683 Mon Sep 17 00:00:00 2001 From: Lucas Santana Date: Wed, 12 Feb 2025 19:26:05 -0300 Subject: [PATCH] =?UTF-8?q?feat:=20Adicionando=20an=C3=A1lises=20do=20ENEM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- supabase/functions/analyze-essay/index.ts | 196 +++++++++++++++++- ...001_add_competencies_to_essay_analyses.sql | 52 +++++ ...ompetencies_to_essay_analyses_rollback.sql | 20 ++ 3 files changed, 267 insertions(+), 1 deletion(-) create mode 100644 supabase/migrations/20240328000001_add_competencies_to_essay_analyses.sql create mode 100644 supabase/migrations/20240328000001_add_competencies_to_essay_analyses_rollback.sql diff --git a/supabase/functions/analyze-essay/index.ts b/supabase/functions/analyze-essay/index.ts index fb4cf34..e609d54 100644 --- a/supabase/functions/analyze-essay/index.ts +++ b/supabase/functions/analyze-essay/index.ts @@ -27,6 +27,28 @@ interface EssayAnalysisResponse { vocabulary: number; grammar: number; }; + competencies: { + language_domain: { + value: number; + justification: string; + }; + proposal_comprehension: { + value: number; + justification: string; + }; + argument_selection: { + value: number; + justification: string; + }; + linguistic_mechanisms: { + value: number; + justification: string; + }; + intervention_proposal: { + value: number; + justification: string; + }; + }; } interface EssayType { @@ -175,6 +197,69 @@ Forneça uma análise detalhada considerando: 7. Pontos a melhorar 8. Sugestões específicas para aprimoramento +Essas são as competências do ENEM para você analisar a redação: +- Competência 1: Domínio da língua +- Competência 2: Compreensão da proposta +- Competência 3: Seleção de argumentos +- Competência 4: Mecanismos linguísticos +- Competência 5: Proposta de intervenção + +## Competência 1: Demonstrar domínio da modalidade escrita formal da Língua Portuguesa + +| Nota | Grade de Correção | Características | +|------|------------------|-----------------| +| 200 pontos | Demonstra excelente domínio da modalidade escrita formal da Língua Portuguesa e de escolha de registro. Desvios gramaticais ou de convenções da escrita serão aceitos somente como excepcionalidade e quando não caracterizem reincidência. | • Ausência de marcas de oralidade e de registro informal
• Precisão vocabular
• Obediência às regras gramaticais
• Não apresenta ou apresenta pouquíssimos desvios gramaticais leves e de convenções da escrita | +| 160 pontos | Demonstra bom domínio da modalidade escrita formal da Língua Portuguesa e de escolha de registro, com poucos desvios gramaticais e de convenções da escrita. | • Poucos desvios gramaticais leves
• Desvios de pontuação que não comprometem o sentido
• Desvios de ortografia e acentuação que não comprometem o sentido | +| 120 pontos | Demonstra domínio mediano da modalidade escrita formal da Língua Portuguesa e de escolha de registro, com alguns desvios gramaticais e de convenções da escrita. | • Alguns desvios gramaticais graves
• Problemas de concordância
• Problemas de regência
• Problemas de estrutura sintática
• Marcas de oralidade | +| 80 pontos | Demonstra domínio insuficiente da modalidade escrita formal da Língua Portuguesa, com muitos desvios gramaticais, de escolha de registro e de convenções da escrita. | • Grande quantidade de desvios graves
• Períodos incompletos
• Graves problemas de pontuação
• Desvios graves de grafia e acentuação
• Presença de gíria | +| 40 pontos | Demonstra domínio precário da modalidade escrita formal da Língua Portuguesa, de forma sistemática, com diversificados e frequentes desvios gramaticais. | • Graves e frequentes desvios gramaticais
• Presença de gírias e marcas de oralidade
• Desestruturação sintática em excesso | +| 0 ponto | Demonstra desconhecimento da modalidade escrita formal da Língua Portuguesa. | • Excesso de desvios que impossibilitam a compreensão | + +## Competência 2: Compreender a proposta de redação e aplicar conceitos das várias áreas de conhecimento + +| Nota | Grade de Correção | Características | +|------|------------------|-----------------| +| 200 pontos | Desenvolve o tema por meio de argumentação consistente, a partir de um repertório sociocultural produtivo, e apresenta excelente domínio do texto dissertativo-argumentativo. | • Tema muito bem desenvolvido
• Estrutura completa (introdução, argumentos, conclusão)
• Argumentos originais, além dos textos motivadores | +| 160 pontos | Desenvolve o tema por meio de argumentação consistente e apresenta bom domínio do texto dissertativo-argumentativo. | • Desenvolve bem o tema
• Boa argumentação
• Não se limita aos textos motivadores | +| 120 pontos | Desenvolve o tema por meio de argumentação previsível e apresenta domínio mediano do texto dissertativo-argumentativo. | • Abordagem superficial
• Argumentação previsível
• Reproduz ideias do senso comum | +| 80 pontos | Desenvolve o tema recorrendo à cópia de trechos dos textos motivadores ou apresenta domínio insuficiente do texto dissertativo-argumentativo. | • Tendência ao tangenciamento
• Argumentação falha
• Cópia dos textos motivadores | +| 40 pontos | Apresenta o assunto, tangenciando o tema, ou demonstra domínio precário do texto dissertativo-argumentativo. | • Tangencia o tema
• Ausência de argumentação
• Pode apresentar texto narrativo | +| 0 ponto | Fuga ao tema/não atendimento à estrutura dissertativo-argumentativa. | • Desenvolve outro tema
• Usa outra estrutura textual | + +## Competência 3: Selecionar, relacionar, organizar e interpretar informações, fatos, opiniões e argumentos + +| Nota | Grade de Correção | Características | +|------|------------------|-----------------| +| 200 pontos | Apresenta informações, fatos e opiniões relacionados ao tema proposto, de forma consistente e organizada, configurando autoria. | • Seleciona e organiza informações consistentemente
• Explicita tese clara
• Argumentos comprovam a tese | +| 160 pontos | Apresenta informações, fatos e opiniões relacionados ao tema, de forma organizada, com indícios de autoria. | • Organização consistente
• Argumentos previsíveis mas próprios | +| 120 pontos | Apresenta informações, fatos e opiniões relacionados ao tema, limitados aos argumentos dos textos motivadores. | • Organização pouco consistente
• Informações aleatórias
• Argumentos pouco convincentes | +| 80 pontos | Apresenta informações, fatos e opiniões relacionados ao tema, mas desorganizados ou contraditórios. | • Argumentos pouco articulados
• Reprodução dos textos motivadores | +| 40 pontos | Apresenta informações, fatos e opiniões pouco relacionados ao tema ou incoerentes. | • Sem defesa de ponto de vista
• Informações desarticuladas | +| 0 ponto | Apresenta informações, fatos e opiniões não relacionados ao tema. | • Informações incoerentes
• Sem ponto de vista | + +## Competência 4: Demonstrar conhecimento dos mecanismos linguísticos necessários para a construção da argumentação + +| Nota | Grade de Correção | Características | +|------|------------------|-----------------| +| 200 pontos | Articula bem as partes do texto e apresenta repertório diversificado de recursos coesivos. | • Articulação muito boa
• Pleno domínio dos recursos coesivos | +| 160 pontos | Articula as partes do texto com poucas inadequações e apresenta repertório diversificado de recursos coesivos. | • Boa articulação
• Poucos desvios nos conectores
• Algumas repetições desnecessárias | +| 120 pontos | Articula as partes do texto, de forma mediana, com inadequações. | • Algumas inadequações nos recursos coesivos
• Frases fragmentadas ocasionais
• Problemas de paragrafação | +| 80 pontos | Articula as partes do texto, de forma insuficiente, com muitas inadequações. | • Muitas inadequações
• Frases fragmentadas frequentes
• Problemas de estrutura | +| 40 pontos | Articula as partes do texto de forma precária. | • Graves problemas de articulação
• Períodos muito longos ou fragmentados
• Ausência de conectores | +| 0 ponto | Apresenta informações desconexas. | • Não se configura como texto | + +## Competência 5: Elaborar proposta de intervenção para o problema abordado + +| Nota | Grade de Correção | Características | +|------|------------------|-----------------| +| 200 pontos | Elabora muito bem proposta de intervenção, detalhada, relacionada ao tema. | • Proposta detalhada (o que fazer, como fazer, meios e participantes) | +| 160 pontos | Elabora bem proposta de intervenção relacionada ao tema. | • Proposta relacionada mas não totalmente detalhada | +| 120 pontos | Elabora, de forma mediana, proposta de intervenção relacionada ao tema. | • Proposta relacionada mas sem detalhamento | +| 80 pontos | Elabora, de forma insuficiente, proposta de intervenção. | • Proposta não atende totalmente à discussão | +| 40 pontos | Apresenta proposta de intervenção vaga, precária ou relacionada apenas ao assunto. | • Proposta vaga ou não configurada adequadamente | +| 0 ponto | Não apresenta proposta de intervenção ou apresenta proposta não relacionada ao tema. | • Ausência de proposta
• Proposta foge ao tema | + + Responda em formato JSON seguindo exatamente esta estrutura: { "overall_score": number, // 0 a 100 @@ -192,6 +277,28 @@ Responda em formato JSON seguindo exatamente esta estrutura: "cohesion": number, // 0 a 100 - Coesão "vocabulary": number, // 0 a 100 - Vocabulário "grammar": number // 0 a 100 - Gramática e ortografia + }, + "competencies": { + "language_domain": { + value: number, // 0 a 200 - Competência 1 + justification: string // Justificativa para a pontuação + }, + "proposal_comprehension": { + value: number, // 0 a 200 - Competência 2 + justification: string // Justificativa para a pontuação + }, + "argument_selection": { + value: number, // 0 a 200 - Competência 3 + justification: string // Justificativa para a pontuação + }, + "linguistic_mechanisms": { + value: number, // 0 a 200 - Competência 4 + justification: string // Justificativa para a pontuação + }, + "intervention_proposal": { + value: number, // 0 a 200 - Competência 5 + justification: string // Justificativa para a pontuação + } } }` @@ -219,7 +326,7 @@ Responda em formato JSON seguindo exatamente esta estrutura: schema: { type: "object", additionalProperties: false, - required: ["overall_score", "suggestions", "feedback", "strengths", "improvements", "criteria_scores"], + required: ["overall_score", "suggestions", "feedback", "strengths", "improvements", "criteria_scores", "competencies"], properties: { overall_score: { type: "number", @@ -290,6 +397,93 @@ Responda em formato JSON seguindo exatamente esta estrutura: description: "Gramática e ortografia (0-100)" } } + }, + competencies: { + type: "object", + additionalProperties: false, + required: [ + "language_domain", + "proposal_comprehension", + "argument_selection", + "linguistic_mechanisms", + "intervention_proposal" + ], + properties: { + language_domain: { + type: "object", + additionalProperties: false, + required: ["value", "justification"], + properties: { + value: { + type: "number", + description: "Pontuação da competência (0-200)" + }, + justification: { + type: "string", + description: "Justificativa para a pontuação" + } + } + }, + proposal_comprehension: { + type: "object", + additionalProperties: false, + required: ["value", "justification"], + properties: { + value: { + type: "number", + description: "Pontuação da competência (0-200)" }, + justification: { + type: "string", + description: "Justificativa para a pontuação" + } + } + }, + argument_selection: { + type: "object", + additionalProperties: false, + required: ["value", "justification"], + properties: { + value: { + type: "number", + description: "Pontuação da competência (0-200)" + }, + justification: { + type: "string", + description: "Justificativa para a pontuação" + } + } + }, + linguistic_mechanisms: { + type: "object", + additionalProperties: false, + required: ["value", "justification"], + properties: { + value: { + type: "number", + description: "Pontuação da competência (0-200)" + }, + justification: { + type: "string", + description: "Justificativa para a pontuação" + } + } + }, + intervention_proposal: { + type: "object", + additionalProperties: false, + required: ["value", "justification"], + properties: { + value: { + type: "number", + description: "Pontuação da competência (0-200)" + }, + justification: { + type: "string", + description: "Justificativa para a pontuação" + } + } + } + } } } } diff --git a/supabase/migrations/20240328000001_add_competencies_to_essay_analyses.sql b/supabase/migrations/20240328000001_add_competencies_to_essay_analyses.sql new file mode 100644 index 0000000..7e03be2 --- /dev/null +++ b/supabase/migrations/20240328000001_add_competencies_to_essay_analyses.sql @@ -0,0 +1,52 @@ +-- Adiciona campos de competências na tabela essay_analyses +ALTER TABLE essay_analyses +ADD COLUMN language_domain_value INTEGER, +ADD COLUMN language_domain_justification TEXT, + +ADD COLUMN proposal_comprehension_value INTEGER, +ADD COLUMN proposal_comprehension_justification TEXT, + +ADD COLUMN argument_selection_value INTEGER, +ADD COLUMN argument_selection_justification TEXT, + +ADD COLUMN linguistic_mechanisms_value INTEGER, +ADD COLUMN linguistic_mechanisms_justification TEXT, + +ADD COLUMN intervention_proposal_value INTEGER, +ADD COLUMN intervention_proposal_justification TEXT; + +-- Adiciona restrições para garantir que os valores estejam entre 0 e 200 +ALTER TABLE essay_analyses +ADD CONSTRAINT check_competency_values +CHECK ( + language_domain_value BETWEEN 0 AND 200 AND + proposal_comprehension_value BETWEEN 0 AND 200 AND + argument_selection_value BETWEEN 0 AND 200 AND + linguistic_mechanisms_value BETWEEN 0 AND 200 AND + intervention_proposal_value BETWEEN 0 AND 200 +); + +-- Atualiza as políticas de segurança para incluir os novos campos +ALTER POLICY "Estudantes podem ver suas próprias análises" ON essay_analyses + USING ( + essay_id IN ( + SELECT id FROM student_essays + WHERE student_id = auth.uid() + ) + ); + +-- Comentários para documentação +COMMENT ON COLUMN essay_analyses.language_domain_value IS 'Valor da competência de domínio da língua (0-200)'; +COMMENT ON COLUMN essay_analyses.language_domain_justification IS 'Justificativa para a nota de domínio da língua'; + +COMMENT ON COLUMN essay_analyses.proposal_comprehension_value IS 'Valor da competência de compreensão da proposta (0-200)'; +COMMENT ON COLUMN essay_analyses.proposal_comprehension_justification IS 'Justificativa para a nota de compreensão da proposta'; + +COMMENT ON COLUMN essay_analyses.argument_selection_value IS 'Valor da competência de seleção de argumentos (0-200)'; +COMMENT ON COLUMN essay_analyses.argument_selection_justification IS 'Justificativa para a nota de seleção de argumentos'; + +COMMENT ON COLUMN essay_analyses.linguistic_mechanisms_value IS 'Valor da competência de mecanismos linguísticos (0-200)'; +COMMENT ON COLUMN essay_analyses.linguistic_mechanisms_justification IS 'Justificativa para a nota de mecanismos linguísticos'; + +COMMENT ON COLUMN essay_analyses.intervention_proposal_value IS 'Valor da competência de proposta de intervenção (0-200)'; +COMMENT ON COLUMN essay_analyses.intervention_proposal_justification IS 'Justificativa para a nota de proposta de intervenção'; \ No newline at end of file diff --git a/supabase/migrations/20240328000001_add_competencies_to_essay_analyses_rollback.sql b/supabase/migrations/20240328000001_add_competencies_to_essay_analyses_rollback.sql new file mode 100644 index 0000000..5c669f5 --- /dev/null +++ b/supabase/migrations/20240328000001_add_competencies_to_essay_analyses_rollback.sql @@ -0,0 +1,20 @@ +-- Remove a restrição de verificação dos valores +ALTER TABLE essay_analyses +DROP CONSTRAINT IF EXISTS check_competency_values; + +-- Remove os campos de competências +ALTER TABLE essay_analyses +DROP COLUMN IF EXISTS language_domain_value, +DROP COLUMN IF EXISTS language_domain_justification, + +DROP COLUMN IF EXISTS proposal_comprehension_value, +DROP COLUMN IF EXISTS proposal_comprehension_justification, + +DROP COLUMN IF EXISTS argument_selection_value, +DROP COLUMN IF EXISTS argument_selection_justification, + +DROP COLUMN IF EXISTS linguistic_mechanisms_value, +DROP COLUMN IF EXISTS linguistic_mechanisms_justification, + +DROP COLUMN IF EXISTS intervention_proposal_value, +DROP COLUMN IF EXISTS intervention_proposal_justification; \ No newline at end of file