oschan77 commited on
Commit
0c5037d
1 Parent(s): d04120d

Init upload

Browse files
Files changed (2) hide show
  1. app.py +129 -0
  2. requirements.txt +5 -0
app.py ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import random
3
+ import time
4
+
5
+ import gradio as gr
6
+
7
+ from langchain import LLMChain, PromptTemplate
8
+ from langchain.agents import initialize_agent
9
+ from langchain.chains import RetrievalQA
10
+ from langchain.document_loaders import TextLoader
11
+ from langchain.embeddings.openai import OpenAIEmbeddings
12
+ from langchain.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate
13
+ from langchain.text_splitter import RecursiveCharacterTextSplitter
14
+ from langchain.vectorstores import Chroma
15
+ from langchain.chat_models import ChatOpenAI
16
+
17
+ # Defining a QA bot class
18
+ class QAbot():
19
+ def __init__(self):
20
+ self.setup_openai_api_key()
21
+ self.load_documents()
22
+ self.setup_embeddings()
23
+ self.setup_store()
24
+ self.setup_prompt()
25
+ self.setup_llm()
26
+ self.setup_qa()
27
+
28
+ def setup_openai_api_key(self):
29
+ os.environ['OPENAI_API_KEY'] = os.environ['API_KEY']
30
+
31
+ # Load documents and split them into chunks using RecursiveCharacterTextSplitter
32
+ def load_documents(self):
33
+ loader = TextLoader('profile.txt')
34
+ documents = loader.load()
35
+ text_splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=200, length_function=len)
36
+ self.docs = text_splitter.split_documents(documents)
37
+
38
+ # Setup embeddings using OpenAIEmbeddings
39
+ def setup_embeddings(self):
40
+ self.embeddings = OpenAIEmbeddings()
41
+
42
+ # Setup vectorstore. If a directory already exists, load from it. Else, create a new one.
43
+ def setup_store(self):
44
+ persist_path = 'vector_db'
45
+ if os.path.isdir(persist_path):
46
+ self.store = Chroma.from_documents(self.docs, self.embeddings, collection_name='profile', persist_directory=persist_path)
47
+ else:
48
+ self.store = Chroma(persist_directory=persist_path, embedding_function=self.embeddings)
49
+
50
+ # Setup chat prompt template for the QAbot
51
+ def setup_prompt(self):
52
+ self.prompt = ChatPromptTemplate(
53
+ input_variables=['context', 'question'],
54
+ output_parser=None,
55
+ partial_variables={},
56
+ messages=[
57
+ SystemMessagePromptTemplate(
58
+ prompt=PromptTemplate(
59
+ input_variables=['context'],
60
+ output_parser=None,
61
+ partial_variables={},
62
+ template="Act as Oscar Chan, who is a machine learning engineer with 3 years of experience implementing machine learning solutions. \nYou, as Oscar Chan, are now talking to your interviewers in a machine learning engineer job interview. \nNever call yourself or or answer questions as an AI language model. \nUse the following pieces of context to answer the users question. \nIf you don't know the answer, just say that you don't know, don't try to make up an answer.\n----------------\n{context}",
63
+ template_format='f-string',
64
+ validate_template=True),
65
+ additional_kwargs={}
66
+ ),
67
+ HumanMessagePromptTemplate(
68
+ prompt=PromptTemplate(
69
+ input_variables=['question'],
70
+ output_parser=None,
71
+ partial_variables={},
72
+ template='{question}',
73
+ template_format='f-string',
74
+ validate_template=True
75
+ ),
76
+ additional_kwargs={}
77
+ )
78
+ ]
79
+ )
80
+
81
+ def setup_llm(self):
82
+ self.llm = ChatOpenAI(temperature=0.3, model="gpt-3.5-turbo", verbose=False)
83
+
84
+ # Setup the QA system using RetrievalQA, language model and prompt template
85
+ def setup_qa(self):
86
+ doc_retriever = self.store.as_retriever()
87
+ self.qa = RetrievalQA.from_chain_type(
88
+ llm=self.llm,
89
+ chain_type="stuff",
90
+ retriever=doc_retriever,
91
+ verbose=False,
92
+ chain_type_kwargs={"prompt": self.prompt},
93
+ )
94
+
95
+ # Answer a user query
96
+ def answer(self, query):
97
+ response = self.qa.run(query)
98
+ return response
99
+
100
+
101
+ def main():
102
+ with gr.Blocks() as app:
103
+ qa_bot = QAbot()
104
+ chatbot = gr.Chatbot()
105
+ msg = gr.Textbox()
106
+ clear = gr.Button('Clear')
107
+
108
+ def user(user_message, history):
109
+ return '', history + [[user_message, None]]
110
+
111
+ def bot(history):
112
+ bot_message = qa_bot.answer(history[-1][0])
113
+ history[-1][1] = ''
114
+ for character in bot_message:
115
+ history[-1][1] += character
116
+ time.sleep(0.03)
117
+ yield history
118
+
119
+ msg.submit(user, [msg, chatbot], [msg, chatbot], queue=False).then(
120
+ bot, chatbot, chatbot
121
+ )
122
+
123
+ clear.click(lambda: None, None, chatbot, queue=False)
124
+
125
+ app.queue()
126
+ app.launch()
127
+
128
+ if __name__ == "__main__":
129
+ main()
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ openai
2
+ langchain
3
+ chromadb
4
+ tiktoken
5
+ gradio