Finish-him commited on
Commit
7a3f8ea
·
verified ·
1 Parent(s): 0ef31de

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +14 -30
app.py CHANGED
@@ -1,63 +1,52 @@
1
- import os
2
  import gradio as gr
3
  from langchain_community.document_loaders import PyPDFDirectoryLoader
4
  from langchain_text_splitters import RecursiveCharacterTextSplitter
5
  from langchain_community.embeddings import HuggingFaceEmbeddings
6
  from langchain_community.vectorstores import FAISS
7
- from langchain.chains import RetrievalQA # Esta linha foi corrigida implicitamente pela estrutura do Langchain
8
  from langchain_community.llms import HuggingFaceHub
9
 
10
  # --- PASSO 1: CARREGAR OS DOCUMENTOS ---
11
- # Carrega todos os arquivos .pdf da pasta 'data'
12
  loader = PyPDFDirectoryLoader("data")
13
  documents = loader.load()
14
 
15
  # --- PASSO 2: PROCESSAR E DIVIDIR O TEXTO ---
16
- # Divide os documentos em pedaços menores (chunks) para facilitar a busca
17
  text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=150)
18
  docs = text_splitter.split_documents(documents)
19
 
20
  # --- PASSO 3: CRIAR EMBEDDINGS E O BANCO DE DADOS VETORIAL ---
21
- # Escolhe um modelo de embedding do Hugging Face. Este é ótimo para textos em português.
22
  model_name = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
23
  embeddings = HuggingFaceEmbeddings(model_name=model_name)
24
-
25
- # Cria o banco de dados vetorial (FAISS) a partir dos pedaços de texto e dos embeddings
26
- # Isso cria um "índice" que permite buscar os trechos mais relevantes rapidamente
27
  db = FAISS.from_documents(docs, embeddings)
28
 
29
  # --- PASSO 4: CONFIGURAR O MODELO DE LINGUAGEM (LLM) E A CADEIA DE BUSCA ---
30
- # Configura o acesso ao LLM do Hugging Face.
31
- # O token será lido automaticamente do segredo que você configurou no Space.
32
- repo_id = "mistralai/Mixtral-8x7B-Instruct-v0.1" # Um modelo poderoso
33
  llm = HuggingFaceHub(
34
  repo_id=repo_id,
35
- model_kwargs={"temperature": 0.1, "max_new_tokens": 1024} # Aumentei um pouco para respostas mais completas
36
  )
37
 
38
- # Cria a "cadeia" (chain) de RetrievalQA. É aqui que a mágica acontece.
39
- # Ele conecta o LLM com o banco de dados vetorial.
40
  qa_chain = RetrievalQA.from_chain_type(
41
  llm=llm,
42
  chain_type="stuff",
43
- retriever=db.as_retriever(search_kwargs={"k": 3}), # Busca os 3 trechos mais relevantes
44
- return_source_documents=False # Simplificado para retornar apenas o texto final
45
  )
46
 
47
  # --- PASSO 5: CRIAR A INTERFACE COM O GRADIO ---
48
- # Define a função que será chamada pela interface
49
  def process_query(query):
50
- # O LangChain pode retornar textos com formatação estranha ou avisos.
51
- # Vamos limpar a resposta para mostrar apenas o resultado principal.
52
  try:
53
- result = qa_chain.invoke(query) # Usando .invoke() que é a forma mais moderna
 
 
54
  answer = result.get('result', 'Não foi possível encontrar uma resposta.')
55
  return answer
56
  except Exception as e:
57
- print(e) # Imprime o erro nos logs para depuração
58
  return "Ocorreu um erro ao processar sua pergunta. Verifique os logs do Space."
59
 
60
- # Cria a interface web
61
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
62
  gr.Markdown("# 🤖 Assistente de Análise do Contrato DETRAN-RJ")
63
  gr.Markdown("Faça uma pergunta sobre os documentos do contrato e o assistente buscará a resposta nos arquivos.")
@@ -68,10 +57,9 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
68
 
69
  out = gr.Markdown(label="Resposta")
70
 
71
- btn.click(process_query, inputs=inp, outputs=out)
72
- inp.submit(process_query, inputs=inp, outputs=out) # Permite usar Enter
73
 
74
- # Adiciona alguns exemplos de perguntas
75
  gr.Examples(
76
  examples=[
77
  "Qual o objeto do contrato?",
@@ -80,11 +68,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
80
  "Qual o prazo de vigência do contrato?",
81
  "Qual a empresa contratada?",
82
  ],
83
- inputs=inp,
84
- outputs=out,
85
- fn=process_query,
86
- cache_examples=False # Evita erros de cache com exemplos
87
  )
88
 
89
- # Lança a aplicação
90
  demo.launch()
 
 
1
  import gradio as gr
2
  from langchain_community.document_loaders import PyPDFDirectoryLoader
3
  from langchain_text_splitters import RecursiveCharacterTextSplitter
4
  from langchain_community.embeddings import HuggingFaceEmbeddings
5
  from langchain_community.vectorstores import FAISS
6
+ from langchain.chains import RetrievalQA
7
  from langchain_community.llms import HuggingFaceHub
8
 
9
  # --- PASSO 1: CARREGAR OS DOCUMENTOS ---
 
10
  loader = PyPDFDirectoryLoader("data")
11
  documents = loader.load()
12
 
13
  # --- PASSO 2: PROCESSAR E DIVIDIR O TEXTO ---
 
14
  text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=150)
15
  docs = text_splitter.split_documents(documents)
16
 
17
  # --- PASSO 3: CRIAR EMBEDDINGS E O BANCO DE DADOS VETORIAL ---
 
18
  model_name = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
19
  embeddings = HuggingFaceEmbeddings(model_name=model_name)
 
 
 
20
  db = FAISS.from_documents(docs, embeddings)
21
 
22
  # --- PASSO 4: CONFIGURAR O MODELO DE LINGUAGEM (LLM) E A CADEIA DE BUSCA ---
23
+ repo_id = "mistralai/Mixtral-8x7B-Instruct-v0.1"
 
 
24
  llm = HuggingFaceHub(
25
  repo_id=repo_id,
26
+ model_kwargs={"temperature": 0.2, "max_new_tokens": 1024}
27
  )
28
 
29
+ # A linha abaixo é a que estava causando o erro.
30
+ # A classe 'RetrievalQA' está de fato no pacote principal 'langchain'.
31
  qa_chain = RetrievalQA.from_chain_type(
32
  llm=llm,
33
  chain_type="stuff",
34
+ retriever=db.as_retriever(search_kwargs={"k": 3}),
35
+ return_source_documents=False
36
  )
37
 
38
  # --- PASSO 5: CRIAR A INTERFACE COM O GRADIO ---
 
39
  def process_query(query):
 
 
40
  try:
41
+ # Usando o método .invoke(), que é a forma moderna de chamar a chain
42
+ result = qa_chain.invoke(query)
43
+ # Limpando a resposta para extrair apenas o texto principal
44
  answer = result.get('result', 'Não foi possível encontrar uma resposta.')
45
  return answer
46
  except Exception as e:
47
+ print(e) # Imprime o erro nos logs para depuração
48
  return "Ocorreu um erro ao processar sua pergunta. Verifique os logs do Space."
49
 
 
50
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
51
  gr.Markdown("# 🤖 Assistente de Análise do Contrato DETRAN-RJ")
52
  gr.Markdown("Faça uma pergunta sobre os documentos do contrato e o assistente buscará a resposta nos arquivos.")
 
57
 
58
  out = gr.Markdown(label="Resposta")
59
 
60
+ btn.click(fn=process_query, inputs=inp, outputs=out)
61
+ inp.submit(fn=process_query, inputs=inp, outputs=out)
62
 
 
63
  gr.Examples(
64
  examples=[
65
  "Qual o objeto do contrato?",
 
68
  "Qual o prazo de vigência do contrato?",
69
  "Qual a empresa contratada?",
70
  ],
71
+ inputs=inp
 
 
 
72
  )
73
 
 
74
  demo.launch()