Sebbe33 commited on
Commit
7feb9fa
·
verified ·
1 Parent(s): 5bdde65

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +88 -0
app.py ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import openai
3
+
4
+ from langchain.chat_models import ChatOpenAI
5
+ from langchain.chains import RetrievalQA
6
+ from langchain.embeddings.openai import OpenAIEmbeddings
7
+ from langchain.vectorstores import FAISS
8
+ from langchain.text_splitter import CharacterTextSplitter
9
+ from langchain.document_loaders import PyPDFLoader
10
+
11
+ st.title("📄 PDF Q&A mit OpenAI (LangChain)")
12
+
13
+ # -------------------------------
14
+ # Seitenleiste: API-Key eingeben
15
+ # -------------------------------
16
+ with st.sidebar:
17
+ openai_api_key = st.text_input("OpenAI API Key", type="password")
18
+
19
+ # -------------------------------
20
+ # PDF hochladen
21
+ # -------------------------------
22
+ uploaded_file = st.file_uploader("Lade eine PDF-Datei hoch", type=["pdf"])
23
+
24
+ # -------------------------------
25
+ # Eingabefeld für Fragen
26
+ # -------------------------------
27
+ question = st.text_input(
28
+ label="Frage zum Dokument",
29
+ placeholder="Worum geht es in diesem Dokument?",
30
+ disabled=not uploaded_file
31
+ )
32
+
33
+ # -------------------------------
34
+ # Hinweis, falls kein API-Key
35
+ # -------------------------------
36
+ if uploaded_file and question and not openai_api_key:
37
+ st.info("Bitte zuerst deinen OpenAI API Key eingeben, um fortzufahren.")
38
+ st.stop()
39
+
40
+ # -------------------------------
41
+ # Verarbeite die PDF und beantworte die Frage
42
+ # -------------------------------
43
+ if uploaded_file and question and openai_api_key:
44
+ try:
45
+ # 1) PDF laden mit PyPDFLoader
46
+ loader = PyPDFLoader(uploaded_file)
47
+
48
+ # 2) Text in Chunks aufteilen
49
+ # Du kannst hier nach Bedarf den CharacterTextSplitter anpassen,
50
+ # z. B. chunk_size oder chunk_overlap ändern.
51
+ text_splitter = CharacterTextSplitter(
52
+ separator="\n",
53
+ chunk_size=1000,
54
+ chunk_overlap=100,
55
+ length_function=len
56
+ )
57
+
58
+ # load_and_split() übernimmt das Laden und direkte Splitten in Dokumente:
59
+ documents = loader.load_and_split(text_splitter=text_splitter)
60
+
61
+ # 3) Erstelle Embeddings und Vector Store (FAISS)
62
+ embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)
63
+ vectorstore = FAISS.from_documents(documents, embeddings)
64
+ retriever = vectorstore.as_retriever()
65
+
66
+ # 4) Erstelle Retrieval-Kette mit LLM
67
+ llm = ChatOpenAI(
68
+ temperature=0,
69
+ model_name="gpt-3.5-turbo",
70
+ openai_api_key=openai_api_key
71
+ )
72
+
73
+ qa_chain = RetrievalQA.from_chain_type(
74
+ llm=llm,
75
+ chain_type="stuff", # Simplest "Stuff" Chain
76
+ retriever=retriever
77
+ )
78
+
79
+ # 5) Frage stellen und Antwort bekommen
80
+ with st.spinner("Suche relevante Textstellen und generiere Antwort..."):
81
+ answer = qa_chain.run(question)
82
+
83
+ # 6) Ausgabe
84
+ st.write("### Antwort:")
85
+ st.write(answer)
86
+
87
+ except Exception as e:
88
+ st.error(f"Fehler beim Verarbeiten der PDF: {e}")