luansouza4444 commited on
Commit
d54e468
·
verified ·
1 Parent(s): ff6e6ed

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +7 -22
app.py CHANGED
@@ -17,7 +17,6 @@ from langchain.embeddings import HuggingFaceEmbeddings
17
  from langchain.vectorstores import FAISS
18
  from langchain.text_splitter import RecursiveCharacterTextSplitter
19
  from langchain.chains import RetrievalQA
20
- from langchain.schema import Document
21
  import tempfile
22
  import numpy as np
23
  from sklearn.metrics.pairwise import cosine_similarity
@@ -29,28 +28,18 @@ OPENROUTER_API_KEY = os.getenv("ROUTER_API_KEY")
29
  if not OPENROUTER_API_KEY:
30
  raise ValueError("❌ A variável de ambiente ROUTER_API_KEY não está definida. Verifique o arquivo .env.")
31
 
32
- # 🔍 Embeddings mais robustos
33
  embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
34
  qa_chain = None
35
  processed_file = None
36
 
37
- # ✅ Trecho manualmente injetado com a tabela crítica de fator de segurança
38
- fator_seg_texto = """
39
- Art. 23. Cabe ao profissional legalmente habilitado calcular os Fatores de Segurança para as barragens de mineração,
40
- sendo exigido valor igual ou superior a 1,30 para resistência de pico (condição não drenada, global ou local).
41
- § 3º Quando o Fator de Segurança estiver abaixo dos valores mínimos, o empreendedor deve interromper imediatamente
42
- o lançamento de efluentes e notificar a ANM.
43
- """
44
-
45
  def load_default_pdf():
46
  global qa_chain, processed_file
47
  try:
48
  loader = PyPDFLoader("LegisMiner.pdf")
49
  documents = loader.load()
50
 
51
- # ➕ Adiciona o trecho crítico manualmente como documento extra
52
- documents.append(Document(page_content=fator_seg_texto, metadata={"source": "manual_injection"}))
53
-
54
  text_splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=300)
55
  docs = text_splitter.split_documents(documents)
56
 
@@ -70,7 +59,7 @@ def load_default_pdf():
70
  )
71
 
72
  processed_file = "LegisMiner.pdf"
73
- print("✅ LegisMiner.pdf carregado automaticamente com trecho crítico injetado.")
74
  except Exception as e:
75
  print(f"❌ Erro ao carregar LegisMiner.pdf automaticamente: {e}")
76
 
@@ -109,9 +98,6 @@ def process_pdf(file):
109
  loader = PyPDFLoader(pdf_path)
110
  documents = loader.load()
111
 
112
- # ➕ Adiciona também na troca manual o trecho crítico
113
- documents.append(Document(page_content=fator_seg_texto, metadata={"source": "manual_injection"}))
114
-
115
  text_splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=300)
116
  docs = text_splitter.split_documents(documents)
117
 
@@ -143,12 +129,10 @@ def ask_question(question):
143
  return "⚠️ Por favor, carregue um PDF primeiro", "", {}
144
 
145
  try:
146
- # 🎯 Prompt especializado
147
  system_prompt = (
148
  "Você é um Analista Técnico Especialista em Normas Regulatórias de Mineração do Brasil. "
149
- "Responda exclusivamente com base no conteúdo do PDF LegisMiner.pdf. "
150
- "Explique de forma objetiva, técnica e clara. "
151
- "Se a resposta não estiver disponível no documento, informe isso ao usuário."
152
  )
153
 
154
  resposta = qa_chain.invoke({
@@ -156,7 +140,7 @@ def ask_question(question):
156
  })
157
 
158
  sources = "\n\n".join(
159
- [f"📄 Fonte {i+1}:\n{doc.page_content[:500]}..."
160
  for i, doc in enumerate(resposta['source_documents'])]
161
  )
162
 
@@ -215,3 +199,4 @@ load_default_pdf()
215
  # Compartilhamento opcional no Colab ou Hugging Face
216
  share = True if 'COLAB_JUPYTER_TRANSPORT' in os.environ else False
217
  demo.launch(share=share, debug=False)
 
 
17
  from langchain.vectorstores import FAISS
18
  from langchain.text_splitter import RecursiveCharacterTextSplitter
19
  from langchain.chains import RetrievalQA
 
20
  import tempfile
21
  import numpy as np
22
  from sklearn.metrics.pairwise import cosine_similarity
 
28
  if not OPENROUTER_API_KEY:
29
  raise ValueError("❌ A variável de ambiente ROUTER_API_KEY não está definida. Verifique o arquivo .env.")
30
 
31
+ # Embedding robusto
32
  embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
33
  qa_chain = None
34
  processed_file = None
35
 
36
+ # ✅ Carrega o PDF fixo automaticamente
 
 
 
 
 
 
 
37
  def load_default_pdf():
38
  global qa_chain, processed_file
39
  try:
40
  loader = PyPDFLoader("LegisMiner.pdf")
41
  documents = loader.load()
42
 
 
 
 
43
  text_splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=300)
44
  docs = text_splitter.split_documents(documents)
45
 
 
59
  )
60
 
61
  processed_file = "LegisMiner.pdf"
62
+ print("✅ LegisMiner.pdf carregado automaticamente.")
63
  except Exception as e:
64
  print(f"❌ Erro ao carregar LegisMiner.pdf automaticamente: {e}")
65
 
 
98
  loader = PyPDFLoader(pdf_path)
99
  documents = loader.load()
100
 
 
 
 
101
  text_splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=300)
102
  docs = text_splitter.split_documents(documents)
103
 
 
129
  return "⚠️ Por favor, carregue um PDF primeiro", "", {}
130
 
131
  try:
 
132
  system_prompt = (
133
  "Você é um Analista Técnico Especialista em Normas Regulatórias de Mineração do Brasil. "
134
+ "Responda com base apenas no conteúdo técnico do documento LegisMiner.pdf. "
135
+ "Seja direto, técnico e objetivo. Se não houver informação no documento, informe isso."
 
136
  )
137
 
138
  resposta = qa_chain.invoke({
 
140
  })
141
 
142
  sources = "\n\n".join(
143
+ [f"📄 Fonte {i+1}:\n{doc.page_content[:500]}..."
144
  for i, doc in enumerate(resposta['source_documents'])]
145
  )
146
 
 
199
  # Compartilhamento opcional no Colab ou Hugging Face
200
  share = True if 'COLAB_JUPYTER_TRANSPORT' in os.environ else False
201
  demo.launch(share=share, debug=False)
202
+