File size: 3,125 Bytes
892f4c0
 
 
 
 
 
 
 
76c1eb0
 
892f4c0
4b62a43
 
 
892f4c0
13977d9
79ab819
2ca54f8
79ab819
76c1eb0
 
 
 
 
 
 
79ab819
 
2ca54f8
79ab819
 
4b62a43
 
 
 
 
 
79ab819
4b62a43
79ab819
 
76c1eb0
79ab819
76c1eb0
 
 
 
 
 
 
79ab819
 
 
 
 
 
 
 
 
 
 
 
 
2ca54f8
79ab819
 
 
2ca54f8
 
52b4bc3
 
 
aea3c48
 
 
 
 
 
13977d9
 
 
 
892f4c0
13977d9
892f4c0
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
import streamlit as st
import os
from langchain.chains import RetrievalQA, ConversationalRetrievalChain
from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain_community.vectorstores import Qdrant

from langchain.memory import ConversationBufferMemory
from langchain.document_loaders import TextLoader
from tempfile import NamedTemporaryFile

import re
def main():
# Initialize the Streamlit app
    st.title('Dokument-basiertes Q&A System')

# API Key input securely, API KEY defined in settings
#   api_key = st.text_input("Enter your OpenAI API key:", type="password")
#    if api_key:
#        os.environ["OPENAI_API_KEY"] = api_key
#        st.success("API Key has been set!")

    

# File uploader
    uploaded_file = st.file_uploader("Dokument hochladen", type=['txt'])
    if uploaded_file is not None:
# Read and process the document
        with NamedTemporaryFile(delete=False) as f:
            f.write(uploaded_file.getbuffer())
            loader =  TextLoader(f.name, encoding="utf-8")
            data = loader.load()

        
        text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
        data = text_splitter.split_documents(data)

    # Create vector store
        
        embeddings = OpenAIEmbeddings()
        #vectorstore = FAISS.from_documents(data, embedding=embeddings)
        vectorstore = Qdrant.from_documents(
            data,
            embeddings,
            location=":memory:",  # Local mode with in-memory storage only
            collection_name="my_documents",
    )
    # Create conversation chain
        llm = ChatOpenAI(temperature=0.3, model_name="gpt-4-turbo")
        memory = ConversationBufferMemory(
            memory_key='chat_history', return_messages=True, output_key='answer')
        conversation_chain = ConversationalRetrievalChain.from_llm(
            llm=llm,
            chain_type="stuff",
            retriever=vectorstore.as_retriever(),
            memory=memory,
            return_source_documents=True
        )

    # Question input
        query = st.text_input("Frag deinen Dokumenten!")
        if query:
            result = conversation_chain({"question": query})
            answer = result["answer"]
            st.write("Antwort:", answer)
            st.write("Quellen:")
            for i in result["source_documents"]:
                res = re.search(r'^[^\n]*', i.page_content)
                st.write(i.page_content[res.span()[0]:res.span()[1]])
        # Optionally display source text snippets
        #    if st.checkbox("Show source text snippets"):
        #        st.write("Source documents:")
        #        for i in result["source_documents"]:
        #            res = re.search(r'^[^\n]*', i.page_content)
        #            st.write(i.page_content[res.span()[0]:res.span()[1]])


if __name__ == "__main__":
    main()
# Initialize the Streamlit app
# st.title('Document-Based Q&A System')