Spaces:
Running
Running
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}") | |