Finish-him commited on
Commit
39b42ed
·
verified ·
1 Parent(s): 24b6585

Update 0.01

Browse files
Files changed (1) hide show
  1. app.py +75 -75
app.py CHANGED
@@ -1,76 +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()
 
1
+ import os
2
+ import gradio as gr
3
+ from langchain_community.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()