rag_trescal / app.py
DHEIVER's picture
Update app.py
bf0034d verified
raw
history blame
5.4 kB
import gradio as gr
import torch
from sentence_transformers import SentenceTransformer, util
from transformers import T5ForConditionalGeneration, T5Tokenizer
# --- 1. Carregamento dos Modelos (faça isso apenas uma vez) ---
# Esta parte não muda. Usaremos os mesmos modelos eficientes.
# Modelo para criar embeddings (vetores) a partir do texto
print("Carregando o modelo de recuperação (Sentence Transformer)...")
retriever_model = SentenceTransformer('all-MiniLM-L6-v2')
# Modelo para gerar as respostas (um T5 do Hugging Face)
print("Carregando o modelo de geração (Flan-T5)...")
generator_tokenizer = T5Tokenizer.from_pretrained('google/flan-t5-base')
generator_model = T5ForConditionalGeneration.from_pretrained('google/flan-t5-base')
print("Modelos carregados com sucesso!")
# --- 2. Base de Conhecimento: DADOS DOS CERTIFICADOS DE CALIBRAÇÃO ---
# Esta é a principal modificação.
# Cada string representa os dados essenciais de um certificado de calibração.
# Em um sistema real, isso viria de um banco de dados ou da leitura de PDFs.
knowledge_base = [
"Certificado ID: CAL-2023-001. Instrumento TAG: PI-101 (Manômetro de Pressão). Data da Calibração: 15/01/2023. Próxima Calibração: 15/01/2024. Resultado: APROVADO. Incerteza da medição: 0.05 bar. Padrão utilizado: Fluke 754 (ID: P-05). Técnico: Ana Oliveira.",
"Certificado ID: CAL-2023-002. Instrumento TAG: TT-205 (Transmissor de Temperatura). Data da Calibração: 20/02/2023. Próxima Calibração: 20/08/2023. Resultado: REPROVADO 'como encontrado', APROVADO 'como deixado' após ajuste. Tolerância: ±0.1°C. Observação: Encontrado desvio de +0.3°C no ponto de 100°C.",
"Certificado ID: CAL-2023-003. Instrumento TAG: FV-300 (Válvula de Controle). Data do Teste: 05/03/2023. Próximo Teste: 05/03/2025. Procedimento: POP-123-Rev02. Resultado: APROVADO. Observação: Histerese de 1.5% encontrada, dentro do limite de 2.0%.",
"Certificado ID: CAL-2023-004. Instrumento TAG: BAL-01 (Balança Analítica). Data da Calibração: 10/04/2023. Próxima Calibração: 10/04/2024. Resultado: APROVADO. Incerteza da medição: ±0.001g. Padrões de massa com rastreabilidade à RBC/Inmetro.",
"Certificado ID: CAL-2023-005. Instrumento TAG: PI-102 (Manômetro de Pressão de reserva). Data da Calibração: 18/01/2023. Próxima Calibração: 18/01/2024. Resultado: APROVADO. Técnico: Carlos Pereira. O instrumento estava armazenado e foi calibrado antes do uso potencial."
]
# --- 3. Pré-processamento da Base de Conhecimento ---
# Esta parte não muda. Convertemos nossa nova base de conhecimento em vetores.
print("Processando a base de conhecimento (certificados)...")
knowledge_base_embeddings = retriever_model.encode(knowledge_base, convert_to_tensor=True)
print("Base de conhecimento pronta!")
# --- 4. A Função Principal do RAG ---
# Esta função é agnóstica ao domínio, então não precisa de alterações.
def answer_question(question):
"""
Esta função recebe uma pergunta, encontra o certificado mais relevante na base de conhecimento
e gera uma resposta baseada nos dados daquele certificado.
"""
# Etapa de Recuperação (Retrieval)
question_embedding = retriever_model.encode(question, convert_to_tensor=True)
cosine_scores = util.cos_sim(question_embedding, knowledge_base_embeddings)
best_doc_index = torch.argmax(cosine_scores)
retrieved_context = knowledge_base[best_doc_index]
# Log para depuração, para vermos qual certificado foi recuperado.
print(f"\n--- Nova Pergunta de Auditoria ---")
print(f"Pergunta: {question}")
print(f"Certificado Recuperado (Contexto): {retrieved_context}")
# Etapa de Geração (Generation)
prompt = f"""
Contexto: {retrieved_context}
Pergunta: {question}
Com base estritamente no contexto do certificado fornecido, responda à pergunta do auditor.
Resposta:
"""
input_ids = generator_tokenizer(prompt, return_tensors="pt").input_ids
outputs = generator_model.generate(
input_ids,
max_length=150,
num_beams=5,
early_stopping=True
)
answer = generator_tokenizer.decode(outputs[0], skip_special_tokens=True)
return answer
# --- 5. Criação da Interface com Gradio ---
# Modificamos o título e a descrição para a nossa nova aplicação.
interface = gr.Interface(
fn=answer_question,
inputs=gr.Textbox(
lines=3,
placeholder="Faça uma pergunta sobre um certificado ou instrumento...\nEx: Qual o resultado do manômetro PI-101?\nQuando vence a calibração do TT-205?\nQuem calibrou a balança BAL-01?",
label="Pergunta do Auditor"
),
outputs=gr.Textbox(label="Resposta Baseada no Certificado"),
title="🤖 RAG - Auditor de Certificados de Calibração",
description="Este sistema usa RAG para responder perguntas sobre certificados de calibração. Pergunte sobre o status, datas, técnicos ou resultados de um instrumento específico (PI-101, TT-205, FV-300, BAL-01).",
examples=[
["Qual foi o resultado da calibração do PI-101?"],
["Quando é a próxima calibração do transmissor TT-205?"],
["Qual a incerteza da balança BAL-01?"],
["Houve alguma observação no certificado da válvula FV-300?"]
]
)
# --- 6. Lançamento do App ---
if __name__ == "__main__":
interface.launch()