File size: 6,578 Bytes
7123cd4
 
8d46f1b
 
7123cd4
 
 
 
 
 
8d46f1b
 
7123cd4
 
 
 
 
 
 
 
 
 
 
8d46f1b
 
7123cd4
 
8d46f1b
 
 
 
 
 
7123cd4
548e573
 
 
 
 
7123cd4
 
 
 
 
 
d15cc0f
7123cd4
 
d7dc004
3d5d6a7
 
 
7123cd4
3d5d6a7
 
7123cd4
3d5d6a7
 
7123cd4
 
 
 
 
 
 
8d46f1b
 
 
7123cd4
 
 
 
 
 
 
 
8d46f1b
7123cd4
 
 
 
8d46f1b
7123cd4
 
8d46f1b
7123cd4
 
8d46f1b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7123cd4
 
 
 
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import streamlit as st
from langchain_openai import ChatOpenAI
import os
import dotenv
from langchain_community.document_loaders import WebBaseLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.messages import HumanMessage, AIMessage
from langchain.memory import ConversationBufferMemory

# Set page config
st.set_page_config(page_title="Tbank Assistant", layout="wide")

# Streamlit app header
st.title("Tbank Customer Support Chatbot")

# Sidebar for API Key input
with st.sidebar:
    st.header("Configuration")
    api_key = st.text_input("Enter your OpenAI API Key:", type="password")
    if api_key:
        os.environ["OPENAI_API_KEY"] = api_key

# Main app logic
if "OPENAI_API_KEY" in os.environ:
    # Initialize components
    @st.cache_resource
    def initialize_components():
        dotenv.load_dotenv()
        chat = ChatOpenAI(model="gpt-3.5-turbo-1106", temperature=0.2)

        loader1 = WebBaseLoader("https://www.tbankltd.com/")
        loader2 = PyPDFLoader("path/to/your/file.pdf")
        data1 = loader1.load()
        data2 = loader2.load()
        data= data1 + data2
        text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
        all_splits = text_splitter.split_documents(data)
        vectorstore = Chroma.from_documents(documents=all_splits, embedding=OpenAIEmbeddings())
        retriever = vectorstore.as_retriever(k=4)

        SYSTEM_TEMPLATE = """
        You are a Tbank's AI assistant. You are a Chatbot and Your knowledge comes exclusively from the content of our website and the document provided. Please follow these guidelines:

        1. When user Greets start by greeting the user warmly. For example: "Hello! Welcome to Tbank. How can I assist you today?"
        2. Your identity is Tbank's AI assistant, if you are asked question about "who are you?" you have to give your identity and asked what they want to ask to you and if they ask question related to you then reply them accoerdingly
        3. When answering questions, use only the information provided in the website content. Do not make up or infer information that isn't explicitly stated.
        4. If a user asks a question that can be answered using the website content, provide a clear and concise response. Include relevant details, but try to keep answers brief and to the point.
        5. If a user asks a question that cannot be answered using the website content, or if the question is unrelated to Tbank, respond politely with something like:
           "I apologize, but I don't have information about that topic. My knowledge is limited to Tbank's products/services and the content on our website. Is there anything specific about [Company/Website Name] I can help you with?"
        6. Always maintain a friendly and professional tone.
        7. If you're unsure about an answer, it's okay to say so. You can respond with:
           "I'm not entirely sure about that. To get the most accurate information, I'd recommend checking our website or contacting our customer support team."
        8. If a user asks for personal opinions or subjective information, remind them that you're an AI assistant and can only provide factual information from the website.
        9. End each interaction by asking if there's anything else you can help with related to Tbank.

        Remember, your primary goal is to assist users with information directly related to Tbank and its website content. Stick to this information and avoid speculating or providing information from other sources.
        If the user query is not in context, simply tell `We are sorry, we don't have information on this

        <context>
        {context}
        </context>

        Chat History:
        {chat_history}
        """

        question_answering_prompt = ChatPromptTemplate.from_messages(
            [
                (
                    "system",
                    SYSTEM_TEMPLATE,
                ),
                MessagesPlaceholder(variable_name="chat_history"),
                MessagesPlaceholder(variable_name="messages"),
            ]
        )

        memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
        document_chain = create_stuff_documents_chain(chat, question_answering_prompt)

        return retriever, document_chain, memory

    # Load components
    with st.spinner("Initializing Tbank Assistant..."):
        retriever, document_chain, memory = initialize_components()

    # Chat interface
    st.subheader("Chat with Tbank Assistant")

    # Initialize chat history
    if "messages" not in st.session_state:
        st.session_state.messages = []

    # Display chat messages from history on app rerun
    for message in st.session_state.messages:
        with st.chat_message(message["role"]):
            st.markdown(message["content"])

    # React to user input
    if prompt := st.chat_input("What would you like to know about Tbank?"):
        # Display user message in chat message container
        st.chat_message("user").markdown(prompt)
        # Add user message to chat history
        st.session_state.messages.append({"role": "user", "content": prompt})

        with st.chat_message("assistant"):
            message_placeholder = st.empty()

            # Retrieve relevant documents
            docs = retriever.get_relevant_documents(prompt)

            # Generate response
            response = document_chain.invoke(
                {
                    "context": docs,
                    "chat_history": memory.load_memory_variables({})["chat_history"],
                    "messages": [
                        HumanMessage(content=prompt)
                    ],
                }
            )

            # The response is already a string, so we can use it directly
            full_response = response
            message_placeholder.markdown(full_response)

        # Add assistant response to chat history
        st.session_state.messages.append({"role": "assistant", "content": full_response})

        # Update memory
        memory.save_context({"input": prompt}, {"output": full_response})

else:
    st.warning("Please enter your OpenAI API Key in the sidebar to start the chatbot.")

# Add a footer
st.markdown("---")
st.markdown("By AI Planet")