File size: 2,976 Bytes
7feb9fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fe30b11
7feb9fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import streamlit as st
import openai

from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.text_splitter import CharacterTextSplitter
from langchain.document_loaders import PyPDFLoader

st.title("📄 PDF Q&A mit OpenAI (LangChain)")

# -------------------------------
# Seitenleiste: API-Key eingeben
# -------------------------------
with st.sidebar:
    openai_api_key = st.text_input("OpenAI API Key", type="password")

# -------------------------------
# PDF hochladen
# -------------------------------
uploaded_file = st.file_uploader("Lade eine PDF-Datei hoch", type=["pdf"])

# -------------------------------
# Eingabefeld für Fragen
# -------------------------------
question = st.text_input(
    label="Frage zum Dokument",
    placeholder="Worum geht es in diesem Dokument?",
    disabled=not uploaded_file
)

# -------------------------------
# Hinweis, falls kein API-Key
# -------------------------------
if uploaded_file and question and not openai_api_key:
    st.info("Bitte zuerst deinen OpenAI API Key eingeben, um fortzufahren.")
    st.stop()

# -------------------------------
# Verarbeite die PDF und beantworte die Frage
# -------------------------------
if uploaded_file and question and openai_api_key:
    try:
        # 1) PDF laden mit PyPDFLoader
        loader = PyPDFLoader(uploaded_file)
        
        # 2) Text in Chunks aufteilen
        #    Du kannst hier nach Bedarf den CharacterTextSplitter anpassen,
        #    z. B. chunk_size oder chunk_overlap ändern.
        text_splitter = CharacterTextSplitter(
            separator="\n",
            chunk_size=1000,
            chunk_overlap=100,
            length_function=len
        )
        
        # load_and_split() übernimmt das Laden und direkte Splitten in Dokumente:
        documents = loader.load_and_split(text_splitter=text_splitter)
        
        # 3) Erstelle Embeddings und Vector Store (FAISS)
        embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)
        vectorstore = FAISS.from_documents(documents, embeddings)
        retriever = vectorstore.as_retriever()
        
        # 4) Erstelle Retrieval-Kette mit LLM
        llm = ChatOpenAI(
            temperature=0,
            model_name="gpt-4o-mini",
            openai_api_key=openai_api_key
        )
        
        qa_chain = RetrievalQA.from_chain_type(
            llm=llm,
            chain_type="stuff",       # Simplest "Stuff" Chain
            retriever=retriever
        )
        
        # 5) Frage stellen und Antwort bekommen
        with st.spinner("Suche relevante Textstellen und generiere Antwort..."):
            answer = qa_chain.run(question)
        
        # 6) Ausgabe
        st.write("### Antwort:")
        st.write(answer)

    except Exception as e:
        st.error(f"Fehler beim Verarbeiten der PDF: {e}")