Finish-him's picture
Update app.py
97201c8 verified
import gradio as gr
import os
from langchain_community.document_loaders import PyPDFDirectoryLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.llms import HuggingFaceHub
# --- PASSO 0: VERIFICAR E CRIAR A PASTA 'data' ---
if not os.path.exists("data"):
os.makedirs("data")
# --- PASSO 1: CARREGAR OS DOCUMENTOS ---
loader = PyPDFDirectoryLoader("data")
documents = loader.load()
# --- PASSO 2: PROCESSAR E DIVIDIR O TEXTO ---
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 ---
model_name = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
embeddings = HuggingFaceEmbeddings(model_name=model_name)
db = FAISS.from_documents(docs, embeddings)
# --- PASSO 4: CONFIGURAR O MODELO DE LINGUAGEM (LLM) ---
repo_id = "mistralai/Mixtral-8x7B-Instruct-v0.1"
llm = HuggingFaceHub(
repo_id=repo_id,
model_kwargs={"temperature": 0.2, "max_new_tokens": 1024}
)
# --- PASSO 5: CRIAR A CADEIA DE BUSCA (NOVA API) ---
system_prompt = (
"Você é um assistente especializado em análise de contratos do DETRAN-RJ. "
"Use o contexto fornecido para responder à pergunta de forma precisa e concisa. "
"Se você não souber a resposta, diga que não sabe. "
"Contexto: {context}"
)
prompt = ChatPromptTemplate.from_messages([
("system", system_prompt),
("human", "{input}"),
])
question_answer_chain = create_stuff_documents_chain(llm, prompt)
qa_chain = create_retrieval_chain(
db.as_retriever(search_kwargs={"k": 3}),
question_answer_chain
)
# --- PASSO 6: CRIAR A INTERFACE COM O GRADIO ---
def process_query(query):
try:
result = qa_chain.invoke({"input": query})
answer = result.get('answer', 'Não foi possível encontrar uma resposta.')
return answer
except Exception as e:
print(f"Erro: {e}")
return f"Ocorreu um erro ao processar sua pergunta: {str(e)}"
with gr.Blocks(theme=gr.themes.Soft()) 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 nos arquivos.")
with gr.Row():
inp = gr.Textbox(label="Qual a sua pergunta?", placeholder="Ex: Qual o valor total do contrato?", scale=4)
btn = gr.Button("Enviar", variant="primary", scale=1)
out = gr.Markdown(label="Resposta")
btn.click(fn=process_query, inputs=inp, outputs=out)
inp.submit(fn=process_query, inputs=inp, outputs=out)
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?",
"Qual a empresa contratada?",
],
inputs=inp
)
demo.launch()