mobius.dev commited on
Commit
6a6a33a
Β·
1 Parent(s): bba9878

Update talk_sheet.py

Browse files
Files changed (1) hide show
  1. talk_sheet.py +84 -94
talk_sheet.py CHANGED
@@ -1,3 +1,4 @@
 
1
  import streamlit as st
2
  import pandas as pd
3
  import os
@@ -13,9 +14,26 @@ from langchain.document_loaders.csv_loader import CSVLoader
13
  from langchain.text_splitter import CharacterTextSplitter
14
  from langchain.embeddings.openai import OpenAIEmbeddings
15
  from langchain.chains import RetrievalQA
16
- from langchain.memory import ChatMessageHistory
17
  from langchain.callbacks import get_openai_callback
 
18
  import tiktoken
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
 
20
  # Configure the Streamlit page
21
  st.set_page_config(layout="wide", page_icon="contents\logo_site.png", page_title="Talk-Sheet")
@@ -41,7 +59,7 @@ if user_secret == "":
41
  )
42
  else:
43
  # Upload CSV file
44
- uploaded_file = st.sidebar.file_uploader(".", type=["csv"])
45
  if uploaded_file is not None:
46
  # Show uploaded CSV file
47
  def show_user_file(uploaded_file):
@@ -62,108 +80,80 @@ else:
62
  if uploaded_file:
63
 
64
  # Save user's CSV file
65
- def save_user_file(uploaded_file):
66
- save_folder = 'contents\dataset'
67
- save_path = Path(save_folder, uploaded_file.name)
68
- with open(save_path, mode='wb') as w:
69
- w.write(uploaded_file.getvalue())
70
-
71
- file_path_user=os.path.join('contents\dataset', uploaded_file.name)
72
- return file_path_user
73
- user_file_path = save_user_file(uploaded_file)
74
-
75
- # Create custom prompt for CSV chatbot
76
- def adapt_llm_response_to_prompt():
77
- prompt_template = (
78
- "You are Talk-Sheet, a user-friendly chatbot designed to assist users by engaging in conversations based on data from CSV or Excel files. "
79
- "Your knowledge comes from:"
80
-
81
- " {context} "
82
-
83
- "Help users by providing relevant information from the data in their files. Answer their questions accurately and concisely. "
84
- "If the user's specific issue or need cannot be addressed with the available data, "
85
- "empathize with their situation and suggest that they may need to seek assistance elsewhere. "
86
- "Always maintain a friendly and helpful tone. "
87
- "If you don't know the answer to a question, truthfully say you don't know."
88
-
89
- "Human: {question} "
90
-
91
- "Talk-Sheet: "
92
- )
93
 
94
- PROMPT = PromptTemplate(template=prompt_template, input_variables=["context","question"])
95
- chain_type_kwargs = {"prompt": PROMPT}
96
- return chain_type_kwargs
97
-
98
- custom_pompt = adapt_llm_response_to_prompt()
99
 
 
 
 
 
 
 
100
  try:
101
  # Create retriever from user's CSV file
102
- def formalize_user_file_for_llm(file_path_user):
103
- loader = CSVLoader(file_path=file_path_user, encoding="utf-8")
104
- data = loader.load()
105
- text_splitter = CharacterTextSplitter(chunk_size=1500, chunk_overlap=0)
106
- texts = text_splitter.split_documents(data)
107
-
108
- embeddings = OpenAIEmbeddings()
109
-
110
- db = Chroma.from_documents(texts, embeddings)
111
- retriever = db.as_retriever()
112
- return retriever
113
-
114
- retriever_db = formalize_user_file_for_llm(user_file_path)
115
-
116
- # Initialize RetrievalQA with custom prompt and retriever
117
- qa = RetrievalQA.from_chain_type(llm =ChatOpenAI(temperature=0, model="gpt-3.5-turbo"), chain_type='stuff', retriever=retriever_db, chain_type_kwargs=custom_pompt)
118
-
119
-
120
 
121
- def count_tokens(chain, query):
122
- with get_openai_callback() as cb:
123
- result = chain.run(query)
124
- print(f'Spent a total of {cb.total_tokens} tokens')
125
 
126
- return result
 
 
 
 
127
  # Chatbot UI function
128
- def chatbot_ui(qa):
129
- if 'generated' not in st.session_state:
130
- st.session_state['generated'] = []
131
-
132
- if 'past' not in st.session_state:
133
- st.session_state['past'] = []
134
-
135
- def generate_response(query):
136
- response = qa.run(query)
137
- print(f"Type of response: {type(response)}, response: {response}")
138
- return response
139
-
140
- def get_text():
141
- input_text = st.text_input("##### Let's Talk ! πŸ‘‡: ", key="input")
142
- return input_text
143
-
144
- user_input = get_text()
145
-
146
- if user_input:
147
- output = generate_response(user_input)
148
-
149
- st.session_state.past.append(user_input)
150
- st.session_state.generated.append(output)
151
-
152
- if st.session_state['generated']:
153
- print(f"st.session_state['generated']: {st.session_state['generated']}")
154
-
155
- for i in range(len(st.session_state['generated'])-1, -1, -1):
156
- message(st.session_state["generated"][i], key=str(i))
157
- message(st.session_state['past'][i], is_user=True, key=str(i) + '_user')
158
-
159
- chatbot_ui(qa)
 
 
 
160
  except Exception as e:
161
  st.error(f"Error: {str(e)}")
162
 
163
 
164
 
165
  # About section
166
- st.sidebar.title("About Talk-Sheet πŸ€–")
167
- st.sidebar.subheader("Talk-Sheet is a user-friendly chatbot designed to assist users by engaging in conversations based on data from CSV or excel files. πŸ“„")
168
- st.sidebar.subheader("Ideal for various purposes and users, Talk-Sheet provides a simple yet effective way to interact with your sheet-data. 🌐")
169
- st.sidebar.subheader("Powered by ChatGPT API, Langchain, and OpenAI, Talk-Sheet offers a seamless and personalized experience. ⚑")
 
1
+ from fastapi import Query
2
  import streamlit as st
3
  import pandas as pd
4
  import os
 
14
  from langchain.text_splitter import CharacterTextSplitter
15
  from langchain.embeddings.openai import OpenAIEmbeddings
16
  from langchain.chains import RetrievalQA
 
17
  from langchain.callbacks import get_openai_callback
18
+ from sympy import use
19
  import tiktoken
20
+ from langchain.chains import ConversationChain
21
+ from langchain.memory import ChatMessageHistory
22
+ from langchain.memory import ConversationBufferMemory
23
+ from langchain.chains.question_answering import load_qa_chain
24
+ import streamlit as st
25
+ from langchain.chains import ConversationChain
26
+ from langchain.chains.conversation.memory import ConversationEntityMemory
27
+ from langchain.chains.conversation.prompt import ENTITY_MEMORY_CONVERSATION_TEMPLATE
28
+ from langchain.llms import OpenAI
29
+ from langchain.chains import ChatVectorDBChain
30
+ from langchain.chains import ConversationalRetrievalChain
31
+ from langchain.chains.qa_with_sources import load_qa_with_sources_chain
32
+ from langchain.chains import LLMChain
33
+ from langchain.chains.conversation.memory import ConversationSummaryMemory
34
+
35
+
36
+
37
 
38
  # Configure the Streamlit page
39
  st.set_page_config(layout="wide", page_icon="contents\logo_site.png", page_title="Talk-Sheet")
 
59
  )
60
  else:
61
  # Upload CSV file
62
+ uploaded_file = st.sidebar.file_uploader(label=" ",label_visibility='hidden', type=["csv"])
63
  if uploaded_file is not None:
64
  # Show uploaded CSV file
65
  def show_user_file(uploaded_file):
 
80
  if uploaded_file:
81
 
82
  # Save user's CSV file
83
+ save_folder = 'contents\dataset'
84
+ save_path = Path(save_folder, uploaded_file.name)
85
+ with open(save_path, mode='wb') as w:
86
+ w.write(uploaded_file.getvalue())
87
+
88
+ file_path_user=os.path.join('contents\dataset', uploaded_file.name)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
 
90
+ memory = ConversationSummaryMemory(llm=OpenAI(), memory_key="chat_history")
 
 
 
 
91
 
92
+
93
+ with st.sidebar.expander(" πŸ› οΈ Settings ", expanded=False):
94
+
95
+ MODEL = st.selectbox(label='Model', options=['gpt-3.5-turbo','gpt-4'])
96
+
97
+
98
  try:
99
  # Create retriever from user's CSV file
100
+ loader = CSVLoader(file_path=file_path_user, encoding="utf-8")
101
+ data = loader.load()
102
+ text_splitter = CharacterTextSplitter(separator="\n",chunk_size=1500, chunk_overlap=0)
103
+ documents = text_splitter.split_documents(data)
104
+
105
+ embeddings = OpenAIEmbeddings()
 
 
 
 
 
 
 
 
 
 
 
 
106
 
107
+ vectorstore = Chroma.from_documents(documents, embeddings)
 
 
 
108
 
109
+ # return ConversationRetrievalChain that answers user questions based on a given document store
110
+ chain = ConversationalRetrievalChain.from_llm(ChatOpenAI(temperature=0, model_name=MODEL),
111
+ retriever=vectorstore.as_retriever(search_type="similarity", search_kwargs={"k":2})
112
+ )
113
+
114
  # Chatbot UI function
115
+ if 'generated' not in st.session_state:
116
+ st.session_state['generated'] = []
117
+
118
+ if 'past' not in st.session_state:
119
+ st.session_state['past'] = []
120
+
121
+ def generate_response(query):
122
+ chat_history = []
123
+
124
+ result = chain({'chat_history': {}, 'question': query})
125
+ chat_history = []
126
+ query = query
127
+ result = chain({"question": query, "chat_history": chat_history})
128
+ response = result["answer"]
129
+ print(f"Type of response: {type(response)}, response: {response}")
130
+ return response
131
+
132
+ def get_text():
133
+ input_text = st.text_input("##### Let's Talk ! πŸ‘‡: ", key="input", placeholder="Your AI assistant here! Ask me anything ...")
134
+ return input_text
135
+
136
+ user_input = get_text()
137
+
138
+ if user_input:
139
+ output = generate_response(user_input)
140
+
141
+ st.session_state.past.append(user_input)
142
+ st.session_state.generated.append(output)
143
+
144
+ if st.session_state['generated']:
145
+ print(f"st.session_state['generated']: {st.session_state['generated']}")
146
+
147
+ for i in range(len(st.session_state['generated'])-1, -1, -1):
148
+ message(st.session_state["generated"][i], key=str(i))
149
+ message(st.session_state['past'][i], is_user=True, key=str(i) + '_user')
150
  except Exception as e:
151
  st.error(f"Error: {str(e)}")
152
 
153
 
154
 
155
  # About section
156
+ about = st.sidebar.expander("About Talk-Sheet πŸ€–")
157
+ about.write("#### Talk-Sheet is a user-friendly chatbot designed to assist users by engaging in conversations based on data from CSV or excel files. πŸ“„")
158
+ about.write("#### Ideal for various purposes and users, Talk-Sheet provides a simple yet effective way to interact with your sheet-data. 🌐")
159
+ about.write("#### Powered by [Langchain]('https://github.com/hwchase17/langchain'), [OpenAI]('https://platform.openai.com/docs/models/gpt-3-5') and [Streamlit]('https://github.com/streamlit/streamlit') Talk-Sheet offers a seamless and personalized experience. ⚑")