Finish-him's picture
Update 0.01
39b42ed verified
raw
history blame
3.04 kB
import os
import gradio as gr
from langchain_community.document_loaders import PyPDFDirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.llms import HuggingFaceHub
# --- PASSO 1: CARREGAR OS DOCUMENTOS ---
# Carrega todos os arquivos .pdf da pasta 'data'
loader = PyPDFDirectoryLoader("data")
documents = loader.load()
# --- PASSO 2: PROCESSAR E DIVIDIR O TEXTO ---
# Divide os documentos em pedaços menores (chunks) para facilitar a busca
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=150)
docs = text_splitter.split_documents(documents)
# --- PASSO 3: CRIAR EMBEDDINGS E O BANCO DE DADOS VETORIAL ---
# Escolhe um modelo de embedding do Hugging Face. Este é ótimo para textos em português.
model_name = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
embeddings = HuggingFaceEmbeddings(model_name=model_name)
# Cria o banco de dados vetorial (FAISS) a partir dos pedaços de texto e dos embeddings
# Isso cria um "índice" que permite buscar os trechos mais relevantes rapidamente
db = FAISS.from_documents(docs, embeddings)
# --- PASSO 4: CONFIGURAR O MODELO DE LINGUAGEM (LLM) E A CADEIA DE BUSCA ---
# Configura o acesso ao LLM do Hugging Face.
# O token será lido automaticamente do segredo que você configurou no Space.
repo_id = "mistralai/Mixtral-8x7B-Instruct-v0.1" # Um modelo poderoso
llm = HuggingFaceHub(
repo_id=repo_id,
model_kwargs={"temperature": 0.1, "max_new_tokens": 512, "max_length": 4096}
)
# Cria a "cadeia" (chain) de RetrievalQA. É aqui que a mágica acontece.
# Ele conecta o LLM com o banco de dados vetorial.
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=db.as_retriever(search_kwargs={"k": 3}), # Busca os 3 trechos mais relevantes
return_source_documents=True
)
# --- PASSO 5: CRIAR A INTERFACE COM O GRADIO ---
# Define a função que será chamada pela interface
def process_query(query):
result = qa_chain({"query": query})
# Retorna a resposta e, opcionalmente, as fontes que usou para responder
return result['result']
# Cria a interface web
with gr.Blocks() as demo:
gr.Markdown("# Assistente de Análise do Contrato DETRAN-RJ")
gr.Markdown("Faça uma pergunta sobre os documentos do contrato e o assistente buscará a resposta.")
inp = gr.Textbox(label="Qual a sua pergunta?", placeholder="Ex: Qual o valor total do contrato?")
out = gr.Textbox(label="Resposta")
inp.submit(process_query, inputs=inp, outputs=out)
# Adiciona alguns exemplos de perguntas
gr.Examples(
examples=[
"Qual o objeto do contrato?",
"Qual o valor total do contrato?",
"Quem é o gestor do contrato?",
"Qual o prazo de vigência do contrato?",
],
inputs=inp
)
# Lança a aplicação
demo.launch()