Spaces:
Runtime error
Runtime error
| 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() | |