GradGPT / app.py
Ammar2k's picture
Update app.py
dc11607
import os
import docx2txt
from dotenv import load_dotenv
from langchain.chat_models import ChatOpenAI
from langchain.schema import (
SystemMessage,
HumanMessage,
AIMessage
)
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.callbacks.base import BaseCallbackHandler
import streamlit as st
load_dotenv()
class StreamHandler(BaseCallbackHandler):
def __init__(self, container, initial_text=""):
self.container = container
self.text = initial_text
def on_llm_new_token(self, token: str, **kwargs) -> None:
self.text += token
self.container.markdown(self.text)
def init_gpt(gpt_model, stream_handler):
global llm
llm = ChatOpenAI(
temperature=0.3,
model=gpt_model,
streaming=True,
callbacks=[stream_handler]
)
embeddings = OpenAIEmbeddings()
def generate_content(query, knowledge_base):
# relevant_docs = db_chroma.similarity_search(query)
system_prompt = f"""You are a professional writer of motivational letters.\
You will be given a content from a knowledge base below, delimited by triple \
backticks. Your job is to use knowledge from this data and write a \
motivational letter for graduate school application. Only write content \
using data from the knowledgebase, do not claim facts from outside of it. \
Make the letter very personal with regards to the knowledge base.
Knowledge Base: ```{knowledge_base}```
"""
# system_message = SystemMessage(content=system_prompt)
# human_message = HumanMessage(content=query[-1]['content'])
# message = [system_message, human_message]
messages = [SystemMessage(content=system_prompt)]
for i in range(len(query)):
if i % 2 == 0:
temp_query = HumanMessage(content=query[i]['content'])
else:
temp_query = AIMessage(content=query[i]['content'])
messages.append(temp_query)
response = llm(messages)
return response.content
def main():
st.title("GradGPT πŸ€–")
st.header("ChatGPT Powered Motivational Letter writer")
uploaded_file = st.file_uploader("Upload a word file", type="docx")
knowledge_base = ""
if uploaded_file is not None:
# extract text from word file
knowledge_base = docx2txt.process(uploaded_file)
# load_into_chroma(call_transcript)
if "messages" not in st.session_state:
st.session_state.messages = []
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
if prompt := st.chat_input("Enter your queries here."):
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)
with st.chat_message("assistant"):
# message_placeholder = st.empty()
stream_handler = StreamHandler(st.empty())
init_gpt("gpt-3.5-turbo-16k", stream_handler)
content = generate_content(
st.session_state.messages, knowledge_base
)
st.session_state.messages.append(
{"role": "assistant", "content": content}
)
# message_placeholder.markdown(content)
with st.sidebar:
# remove last 2 messages
if st.button("remove previous message"):
if len(st.session_state.messages) >= 2:
st.session_state.messages = st.session_state.messages[:-2]
if __name__ == '__main__':
main()