luansouza4444 commited on
Commit
ccdd1cb
·
verified ·
1 Parent(s): a35e3d3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +29 -17
app.py CHANGED
@@ -6,8 +6,7 @@ Automatically generated by Colab.
6
  Original file is located at
7
  https://colab.research.google.com/drive/1PhcQoTZvxdPQe6E1HMx_Nl4Zs_tY7J_y
8
  """
9
-
10
-
11
 
12
  import gradio as gr
13
  import os
@@ -18,6 +17,7 @@ from langchain.embeddings import HuggingFaceEmbeddings
18
  from langchain.vectorstores import FAISS
19
  from langchain.text_splitter import RecursiveCharacterTextSplitter
20
  from langchain.chains import RetrievalQA
 
21
  import tempfile
22
  import numpy as np
23
  from sklearn.metrics.pairwise import cosine_similarity
@@ -29,18 +29,28 @@ 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
- # Inicialização
33
- embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
34
  qa_chain = None
35
  processed_file = None
36
 
37
- # 🔁 Carrega automaticamente o legisMiner.pdf ao iniciar
 
 
 
 
 
 
 
38
  def load_default_pdf():
39
  global qa_chain, processed_file
40
  try:
41
  loader = PyPDFLoader("LegisMiner.pdf")
42
  documents = loader.load()
43
 
 
 
 
44
  text_splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=300)
45
  docs = text_splitter.split_documents(documents)
46
 
@@ -49,8 +59,8 @@ def load_default_pdf():
49
  llm = ChatOpenAI(
50
  openai_api_key=OPENROUTER_API_KEY,
51
  openai_api_base="https://openrouter.ai/api/v1",
52
- model="mistralai/mistral-7b-instruct:free",
53
- temperature=0.7
54
  )
55
 
56
  qa_chain = RetrievalQA.from_chain_type(
@@ -60,7 +70,7 @@ def load_default_pdf():
60
  )
61
 
62
  processed_file = "LegisMiner.pdf"
63
- print("✅ LegisMiner.pdf carregado automaticamente.")
64
  except Exception as e:
65
  print(f"❌ Erro ao carregar LegisMiner.pdf automaticamente: {e}")
66
 
@@ -99,6 +109,9 @@ def process_pdf(file):
99
  loader = PyPDFLoader(pdf_path)
100
  documents = loader.load()
101
 
 
 
 
102
  text_splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=300)
103
  docs = text_splitter.split_documents(documents)
104
 
@@ -107,8 +120,8 @@ def process_pdf(file):
107
  llm = ChatOpenAI(
108
  openai_api_key=OPENROUTER_API_KEY,
109
  openai_api_base="https://openrouter.ai/api/v1",
110
- model="mistralai/mistral-7b-instruct:free",
111
- temperature=0.7
112
  )
113
 
114
  qa_chain = RetrievalQA.from_chain_type(
@@ -130,13 +143,12 @@ def ask_question(question):
130
  return "⚠️ Por favor, carregue um PDF primeiro", "", {}
131
 
132
  try:
133
- # Prompt especializado: Analista de Normas Regulatórias de Mineração
134
  system_prompt = (
135
- "Você é um Analista Técnico em Normas Regulatórias de Mineração do Brasil. "
136
- "Responda exclusivamente com base nas normas e informações contidas no PDF LegisMiner.pdf. "
137
- "Seja direto, preciso e fundamente suas respostas com base no conteúdo técnico disponível. "
138
- "Se a resposta não estiver no documento, diga claramente que a informação não está disponível."
139
-
140
  )
141
 
142
  resposta = qa_chain.invoke({
@@ -144,7 +156,7 @@ def ask_question(question):
144
  })
145
 
146
  sources = "\n\n".join(
147
- [f"📄 Fonte {i+1}:\n{doc.page_content[:500]}..."
148
  for i, doc in enumerate(resposta['source_documents'])]
149
  )
150
 
 
6
  Original file is located at
7
  https://colab.research.google.com/drive/1PhcQoTZvxdPQe6E1HMx_Nl4Zs_tY7J_y
8
  """
9
+ # Autor: Luan Alysson de Souza
 
10
 
11
  import gradio as gr
12
  import os
 
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
  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
 
 
59
  llm = ChatOpenAI(
60
  openai_api_key=OPENROUTER_API_KEY,
61
  openai_api_base="https://openrouter.ai/api/v1",
62
+ model="meta-llama/llama-3-8b-instruct:free",
63
+ temperature=0.3
64
  )
65
 
66
  qa_chain = RetrievalQA.from_chain_type(
 
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
  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
 
 
120
  llm = ChatOpenAI(
121
  openai_api_key=OPENROUTER_API_KEY,
122
  openai_api_base="https://openrouter.ai/api/v1",
123
+ model="meta-llama/llama-3-8b-instruct:free",
124
+ temperature=0.3
125
  )
126
 
127
  qa_chain = RetrievalQA.from_chain_type(
 
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
  })
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