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