danielspba commited on
Commit
8c4d9eb
·
verified ·
1 Parent(s): fe9808b

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +65 -0
app.py ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from dotenv import load_dotenv
3
+ import gradio as gr
4
+ from langchain.chat_models import ChatOpenAI
5
+ from langchain.document_loaders import PyPDFLoader
6
+ from langchain.text_splitter import RecursiveCharacterTextSplitter
7
+ from langchain.embeddings import HuggingFaceEmbeddings
8
+ from langchain.vectorstores import FAISS
9
+ from langchain.chains import RetrievalQA
10
+
11
+ # Carrega variáveis de ambiente
12
+ load_dotenv()
13
+ api_key = os.getenv("OPENROUTER_API_KEY")
14
+
15
+ # Inicializa LLM
16
+ llm = ChatOpenAI(
17
+ openai_api_base="https://openrouter.ai/api/v1",
18
+ openai_api_key=api_key,
19
+ model="deepseek/deepseek-r1-zero:free"
20
+ )
21
+
22
+ def processar_pdf(pdf_file, pergunta):
23
+ # Usa diretamente o caminho fornecido pelo Gradio
24
+ pdf_path = pdf_file.name
25
+
26
+ # Carrega e divide o PDF
27
+ loader = PyPDFLoader(pdf_path)
28
+ documents = loader.load()
29
+ splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
30
+ docs = splitter.split_documents(documents)
31
+
32
+ # Embeddings e índice
33
+ embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
34
+ vectorstore = FAISS.from_documents(docs, embeddings)
35
+
36
+ # Cadeia QA
37
+ qa_chain = RetrievalQA.from_chain_type(
38
+ llm=llm,
39
+ retriever=vectorstore.as_retriever(),
40
+ return_source_documents=True
41
+ )
42
+
43
+ # Resposta
44
+ resposta = qa_chain.invoke({"query": pergunta})
45
+ result = resposta["result"]
46
+ fontes = "\n\n".join([f"Fonte {i+1}: {doc.page_content[:300]}..." for i, doc in enumerate(resposta["source_documents"])])
47
+ return result, fontes
48
+
49
+ # Interface Gradio
50
+ interface = gr.Interface(
51
+ fn=processar_pdf,
52
+ inputs=[
53
+ gr.File(label="Envie um PDF"),
54
+ gr.Textbox(label="Sua pergunta", placeholder="Ex: Qual a duração do curso?")
55
+ ],
56
+ outputs=[
57
+ gr.Textbox(label="Resposta"),
58
+ gr.Textbox(label="Fontes utilizadas")
59
+ ],
60
+ title="Chat com PDF (LangChain)",
61
+ description="Carregue um PDF e faça perguntas sobre ele. Powered by LangChain + Hugging Face Embeddings"
62
+ )
63
+
64
+ if __name__ == "__main__":
65
+ interface.launch()