import os from langchain.text_splitter import CharacterTextSplitter from langchain.document_loaders import TextLoader, DirectoryLoader from langchain.embeddings import CohereEmbeddings from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.llms import OpenAI from langchain.llms import Cohere from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate import streamlit as st def retrieve(query,llm,retriever): template = """ Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.Use only the document for your answer and you may summarize the answer in 50 words to make it look better. {context} Question: {question} """ # create the chain to answer questions qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever, chain_type_kwargs={ "prompt": PromptTemplate( template=template, input_variables=["context", "question"],)}) return(qa_chain.run(query)) def main(): # Main title of the application st.title("Q&A BOT") if 'counter' not in st.session_state: st.session_state['counter'] = 0 with st.sidebar: with st.form('Cohere/OpenAI'): mod = st.radio('Choose OpenAI/Cohere', ('OpenAI', 'Cohere')) api_key = st.text_input('Enter API key', type="password") # model = st.radio('Choose Company', ('ArtisanAppetite foods', 'BMW','Titan Watches')) submitted = st.form_submit_button("Submit") if api_key: if(mod=='OpenAI'): os.environ["OPENAI_API_KEY"] = api_key llm = OpenAI(temperature=0.7, verbose=True) embeddings = OpenAIEmbeddings() elif(mod=='Cohere'): os.environ["COHERE_API_KEY"] = api_key llm = Cohere(temperature=0.7, verbose=True) embeddings = CohereEmbeddings() uploaded_file = st.file_uploader("Upload a file to ingest", type=["txt"]) if uploaded_file is not None: file_path = uploaded_file.name print(file_path) # this is a necessary step to read the file content and save it # in the webservers location file_contents = uploaded_file.read() save_path = uploaded_file.name with open(save_path, "wb") as f: f.write(file_contents) print(save_path) loader = TextLoader(save_path,autodetect_encoding=True) documents = loader.load() text_splitter = CharacterTextSplitter(chunk_size=1000) #Splitting the text and creating chunks docs = text_splitter.split_documents(documents) persist_directory = save_path[:-4] vectordb = Chroma.from_documents(documents=docs, embedding=embeddings, persist_directory=persist_directory) # persiste the db to disk vectordb.persist() retriever = vectordb.as_retriever(search_kwargs={"k": 3}) st.session_state['counter'] += 1 if st.session_state['counter'] > 0: query = st.text_input("Query: ", "", key="input") result_display = st.empty() if query is not None and query != "": # create a retriever result = retrieve(query,llm,retriever) # Text area for editing the generated response result_display.text_area("Result:", value=result, height=500) elif (not api_key): st.info("Please add configuration details in left panel") st.stop() if __name__ == "__main__": main()