Finish-him commited on
Commit
b3bf3da
·
verified ·
1 Parent(s): 5a1b3fd

app.py and requirements.txt

Browse files
Files changed (2) hide show
  1. app.py.txt +76 -0
  2. requirements.txt +6 -0
app.py.txt ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import gradio as gr
3
+ from langchain.document_loaders import PyPDFDirectoryLoader
4
+ from langchain.text_splitter import RecursiveCharacterTextSplitter
5
+ from langchain.embeddings import HuggingFaceEmbeddings
6
+ from langchain.vectorstores import FAISS
7
+ from langchain.chains import RetrievalQA
8
+ from langchain.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": 512, "max_length": 4096}
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=True
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
+ result = qa_chain({"query": query})
51
+ # Retorna a resposta e, opcionalmente, as fontes que usou para responder
52
+ return result['result']
53
+
54
+ # Cria a interface web
55
+ with gr.Blocks() as demo:
56
+ gr.Markdown("# Assistente de Análise do Contrato DETRAN-RJ")
57
+ gr.Markdown("Faça uma pergunta sobre os documentos do contrato e o assistente buscará a resposta.")
58
+
59
+ inp = gr.Textbox(label="Qual a sua pergunta?", placeholder="Ex: Qual o valor total do contrato?")
60
+ out = gr.Textbox(label="Resposta")
61
+
62
+ inp.submit(process_query, inputs=inp, outputs=out)
63
+
64
+ # Adiciona alguns exemplos de perguntas
65
+ gr.Examples(
66
+ examples=[
67
+ "Qual o objeto do contrato?",
68
+ "Qual o valor total do contrato?",
69
+ "Quem é o gestor do contrato?",
70
+ "Qual o prazo de vigência do contrato?",
71
+ ],
72
+ inputs=inp
73
+ )
74
+
75
+ # Lança a aplicação
76
+ demo.launch()
requirements.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ gradio
2
+ langchain
3
+ sentence-transformers
4
+ faiss-cpu
5
+ pypdf
6
+ huggingface_hub