DHEIVER commited on
Commit
74abfdf
·
verified ·
1 Parent(s): bee53f3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +51 -44
app.py CHANGED
@@ -72,35 +72,33 @@ def process_files(files):
72
 
73
 
74
  # --- 3. O CÉREBRO DA ANÁLISE: generate_compliance_report ---
75
- def generate_compliance_report(task, knowledge_state, progress=gr.Progress(track_tqdm=True)):
76
  """
77
- Esta função orquestra todo o processo de RAG: recupera um contexto amplo e usa um único
78
- 'super-prompt' para gerar o relatório de conformidade completo de uma só vez.
79
  """
80
- if not task:
81
- return "Por favor, forneça uma tarefa de análise."
82
- if not knowledge_state or not knowledge_state[0] or knowledge_state[1] is None:
83
- return "⚠️ A base de conhecimento está vazia. Por favor, processe alguns ficheiros primeiro."
 
84
 
85
- knowledge_base, knowledge_base_embeddings = knowledge_state
86
-
87
- progress(0, desc="A recuperar contexto relevante...")
88
-
89
- # Passo 1: Recuperação Ampla do Contexto
90
- # Usamos uma pergunta genérica para recuperar os chunks mais relevantes do documento inteiro.
91
- # Aumentamos o top_k para dar ao modelo uma visão mais completa.
92
- search_query = "Informações completas do certificado de calibração"
93
- question_embedding = retriever_model.encode(search_query, convert_to_tensor=True)
94
- cosine_scores = util.cos_sim(question_embedding, knowledge_base_embeddings)
95
- top_k = min(15, len(knowledge_base)) # Aumentado para 15 para um contexto muito mais rico
96
- top_results = torch.topk(cosine_scores, k=top_k, dim=-1)
97
- retrieved_context = "\n\n---\n\n".join([knowledge_base[i] for i in top_results.indices[0]])
98
-
99
- progress(0.5, desc="A gerar o relatório de conformidade...")
100
-
101
- # Passo 2: Geração com "Super-Prompt"
102
- # Este prompt contém a checklist completa e instrui o modelo a preenchê-la.
103
- final_prompt = f"""### Instruction:
104
  Você é um auditor de metrologia a preencher um relatório de conformidade. Com base no 'Contexto do Documento' fornecido, preencha cada item da 'Checklist de Análise' abaixo. Se uma informação não for encontrada no contexto, escreva 'Não encontrado'.
105
 
106
  **Contexto do Documento:**
@@ -143,22 +141,30 @@ Você é um auditor de metrologia a preencher um relatório de conformidade. Com
143
 
144
  ### Response:
145
  """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
146
 
147
- input_ids = generator_tokenizer(final_prompt, return_tensors="pt").input_ids
148
- outputs = generator_model.generate(
149
- input_ids,
150
- max_new_tokens=1024, # Aumentado para relatórios detalhados
151
- do_sample=False,
152
- pad_token_id=generator_tokenizer.eos_token_id
153
- )
154
- final_report = generator_tokenizer.decode(outputs[0], skip_special_tokens=True)
155
-
156
- # Limpa a resposta para remover o prompt inicial
157
- if "### Response:" in final_report:
158
- final_report = final_report.split("### Response:")[1].strip()
159
-
160
- progress(1, desc="Análise concluída.")
161
- return final_report
162
 
163
 
164
  # --- 4. Interface Gráfica (Simplificada para o novo fluxo) ---
@@ -166,7 +172,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as interface:
166
  knowledge_state = gr.State()
167
  gr.Markdown(
168
  """
169
- # 🤖 Agente de Análise de Conformidade Metrológica (v12 - Robusto)
170
  **1. Carregue um documento**: Envie um certificado de calibração (`.pdf` ou `.txt`).
171
  **2. Processe o documento**: Clique no botão para criar a base de conhecimento.
172
  **3. Inicie a Análise**: Dê uma tarefa ao agente (ex: "Analisar conformidade deste certificado") e clique em "Iniciar Análise".
@@ -184,11 +190,12 @@ with gr.Blocks(theme=gr.themes.Soft()) as interface:
184
  submit_button = gr.Button("Iniciar Análise", variant="primary")
185
 
186
  with gr.Row():
187
- report_box = gr.Textbox(label="Relatório Final de Análise", lines=20, max_lines=50)
188
 
 
189
  process_button.click(fn=process_files, inputs=[file_uploader], outputs=[knowledge_state, status_box])
190
  submit_button.click(fn=generate_compliance_report, inputs=[task_box, knowledge_state], outputs=[report_box])
191
 
192
  # --- 5. Lançamento do App ---
193
  if __name__ == "__main__":
194
- interface.launch()
 
72
 
73
 
74
  # --- 3. O CÉREBRO DA ANÁLISE: generate_compliance_report ---
75
+ def generate_compliance_report(task, knowledge_state, progress=gr.Progress()):
76
  """
77
+ Esta função orquestra o processo de RAG com melhor feedback e tratamento de erros.
 
78
  """
79
+ try:
80
+ if not task:
81
+ return "Por favor, forneça uma tarefa de análise."
82
+ if not knowledge_state or not knowledge_state[0] or knowledge_state[1] is None:
83
+ return "⚠️ A base de conhecimento está vazia. Por favor, processe alguns ficheiros primeiro."
84
 
85
+ knowledge_base, knowledge_base_embeddings = knowledge_state
86
+
87
+ progress(0, desc="A iniciar análise...")
88
+
89
+ # Passo 1: Recuperação Ampla do Contexto
90
+ progress(0.1, desc="A recuperar contexto relevante do documento...")
91
+ search_query = "Informações completas do certificado de calibração"
92
+ question_embedding = retriever_model.encode(search_query, convert_to_tensor=True)
93
+ cosine_scores = util.cos_sim(question_embedding, knowledge_base_embeddings)
94
+ top_k = min(15, len(knowledge_base))
95
+ top_results = torch.topk(cosine_scores, k=top_k, dim=-1)
96
+ retrieved_context = "\n\n---\n\n".join([knowledge_base[i] for i in top_results.indices[0]])
97
+
98
+ progress(0.4, desc="Contexto recuperado. A gerar o relatório com o modelo de IA (pode demorar)...")
99
+
100
+ # Passo 2: Geração com "Super-Prompt"
101
+ final_prompt = f"""### Instruction:
 
 
102
  Você é um auditor de metrologia a preencher um relatório de conformidade. Com base no 'Contexto do Documento' fornecido, preencha cada item da 'Checklist de Análise' abaixo. Se uma informação não for encontrada no contexto, escreva 'Não encontrado'.
103
 
104
  **Contexto do Documento:**
 
141
 
142
  ### Response:
143
  """
144
+ input_ids = generator_tokenizer(final_prompt, return_tensors="pt").input_ids
145
+
146
+ # Parâmetros de geração otimizados
147
+ outputs = generator_model.generate(
148
+ input_ids,
149
+ max_new_tokens=800, # Reduzido para maior eficiência
150
+ do_sample=False,
151
+ pad_token_id=generator_tokenizer.eos_token_id
152
+ )
153
+
154
+ progress(0.9, desc="A formatar o relatório final...")
155
+ final_report = generator_tokenizer.decode(outputs[0], skip_special_tokens=True)
156
+
157
+ # Limpa a resposta para remover o prompt inicial
158
+ if "### Response:" in final_report:
159
+ final_report = final_report.split("### Response:")[1].strip()
160
+
161
+ progress(1, desc="Análise concluída.")
162
+ return final_report
163
 
164
+ except Exception as e:
165
+ # Tratamento de erros para retornar uma mensagem clara ao utilizador
166
+ print(f"Ocorreu um erro durante a geração do relatório: {e}")
167
+ return f"### ⚠️ Ocorreu um erro durante a análise.\n\n**Causa provável:** O modelo de IA pode ter excedido os limites de memória ou tempo. Por favor, tente novamente com um documento mais simples ou verifique os logs para mais detalhes.\n\n**Detalhes do Erro:** {str(e)}"
 
 
 
 
 
 
 
 
 
 
 
168
 
169
 
170
  # --- 4. Interface Gráfica (Simplificada para o novo fluxo) ---
 
172
  knowledge_state = gr.State()
173
  gr.Markdown(
174
  """
175
+ # 🤖 Agente de Análise de Conformidade Metrológica (v14 - Robusto)
176
  **1. Carregue um documento**: Envie um certificado de calibração (`.pdf` ou `.txt`).
177
  **2. Processe o documento**: Clique no botão para criar a base de conhecimento.
178
  **3. Inicie a Análise**: Dê uma tarefa ao agente (ex: "Analisar conformidade deste certificado") e clique em "Iniciar Análise".
 
190
  submit_button = gr.Button("Iniciar Análise", variant="primary")
191
 
192
  with gr.Row():
193
+ report_box = gr.Markdown(label="Relatório Final de Análise")
194
 
195
+ # A chamada de click continua a mesma, pois o gr.Progress é gerido dentro da função
196
  process_button.click(fn=process_files, inputs=[file_uploader], outputs=[knowledge_state, status_box])
197
  submit_button.click(fn=generate_compliance_report, inputs=[task_box, knowledge_state], outputs=[report_box])
198
 
199
  # --- 5. Lançamento do App ---
200
  if __name__ == "__main__":
201
+ interface.launch()