Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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(
|
76 |
"""
|
77 |
-
Esta função orquestra
|
78 |
-
'super-prompt' para gerar o relatório de conformidade completo de uma só vez.
|
79 |
"""
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
|
|
84 |
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
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 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
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 (
|
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.
|
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()
|