File size: 4,184 Bytes
c9ba277
 
 
e0df169
 
c9ba277
 
 
 
 
 
 
e0df169
 
 
c9ba277
e0df169
 
c9ba277
e0df169
c9ba277
e0df169
 
 
 
 
 
c9ba277
 
e0df169
c9ba277
e0df169
c9ba277
e0df169
c9ba277
 
e0df169
c9ba277
 
e0df169
c9ba277
 
e0df169
e0dfb45
c9ba277
e0df169
c9ba277
 
e0df169
c9ba277
e0df169
 
c9ba277
 
 
e0df169
c9ba277
 
e0df169
c9ba277
 
 
e0df169
 
 
c9ba277
 
 
 
e0df169
76a43a5
 
e0df169
c9ba277
e0df169
c9ba277
e0df169
c9ba277
e0df169
 
 
 
 
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
import streamlit as st
from llm_functions import load_data, split_text, initialize_llm, generate_questions, create_retrieval_qa_chain

# Initialization of session states
# Since Streamlit always reruns the script when a widget changes, we need to initialize the session states
if 'questions' not in st.session_state:
    st.session_state['questions'] = 'empty'
    st.session_state['seperated_question_list'] = 'empty'
    st.session_state['questions_to_answers'] = 'empty'
    st.session_state['submitted'] = 'empty'

with st.container():
    st.markdown("""# LabSoft Study Buddy  
                """)
    st.divider()

# Get user's OpenAI API Key
openai_api_key = st.text_input(label="OpenAI API Key ",  placeholder="Ex: sk-2twmA8tfCb8un4...", key="openai_api_key_input", help="How to get an OpenAI API Key: https://www.howtogeek.com/885918/how-to-get-an-openai-api-key/")

# Container for markdown text
with st.container():
    st.markdown("""Make sure you've entered your OpenAI API Key. 
                Don't have an API key yet? 
                Read [this](https://medium.com/@joristechtalk/how-to-get-an-openai-api-key-for-chatgpt-fd2cf6a436c5) article on how to get an API key.""")
    
# Let user upload a file
uploaded_file = st.file_uploader("Upload your study material", type=['pdf'])

if uploaded_file is not None:
    # Check whether user entered an API key
    if not openai_api_key:
        st.error("Please enter your OpenAI API Key")
    else:
        # Load data from PDF
        text_from_pdf = load_data(uploaded_file)

        # Split text for question generation
        documents_for_question_gen = split_text(text_from_pdf, chunk_size=10000, chunk_overlap=200)

        # Split text for question answering
        documents_for_question_answering = split_text(text_from_pdf, chunk_size=500, chunk_overlap=200)

        # Initialize large language model for question generation
        llm_question_gen = initialize_llm(openai_api_key=openai_api_key, model="gpt-3.5-turbo", temperature=0.4)

        # Initialize large language model for question answering
        llm_question_answering = initialize_llm(openai_api_key=openai_api_key, model="gpt-3.5-turbo", temperature=0.1)

        # Create questions if they have not yet been generated
        if st.session_state['questions'] == 'empty':
            with st.spinner("Generating questions..."):
                # Assign the generated questions to the session state. This way, the questions are only generated once.
                st.session_state['questions'] = generate_questions(llm=llm_question_gen, chain_type="refine", documents=documents_for_question_gen)

        if st.session_state['questions'] != 'empty':
            # Show questions on screen. You could use st.code for easy copy-pasting.
            st.info(st.session_state['questions'])

            # Split questions into a list
            st.session_state['questions_list'] = st.session_state['questions'].split('\n')

            with st.form(key='my_form'):
                # Create a list of questions that have to be answered
                st.session_state['questions_to_answers'] = st.multiselect(label="Select questions to answer", options=st.session_state['questions_list'])
                submitted = st.form_submit_button('Generate answers')
                if submitted:
                    st.session_state['submitted'] = True

            if st.session_state['submitted']:
            # Initialize the Retrieval QA Chain
                print(documents_for_question_answering)

                with st.spinner("Generating answers..."):
                    generate_answer_chain = create_retrieval_qa_chain(openai_api_key=openai_api_key, documents=documents_for_question_answering, llm=llm_question_answering)
                    # For each question, generate an answer
                    for question in st.session_state['questions_to_answers']:
                        # Generate answer
                        answer = generate_answer_chain.run(question)
                        # Show answer on screen
                        st.write(f"Question: {question}")
                        st.info(f"Answer: {answer}")