from langchain.document_loaders import DirectoryLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.chat_models import ChatOpenAI from langchain.retrievers.multi_query import MultiQueryRetriever import dotenv from langchain.indexes import VectorstoreIndexCreator from langchain.chains.question_answering import load_qa_chain from langchain.llms import OpenAI from langchain.prompts import PromptTemplate from langchain.chat_models import ChatOpenAI from langchain.schema import AIMessage, HumanMessage, SystemMessage import gradio as gr dotenv.load_dotenv() system_message = """You are the helpful assistant helping users with agricoulture questions. If you don't know the answer, just say that you don't know, don't try to make up an answer. """ prompt_template = """Use the following pieces of context to answer the question at the end. Context: {context} Question: {question} Answer: """ PROMPT = PromptTemplate( template=prompt_template, input_variables=["context", "question"] ) loader = DirectoryLoader("./documents", glob="**/*.txt", show_progress=True) docs = loader.load() text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0) texts = text_splitter.split_documents(docs) embeddings = OpenAIEmbeddings() docsearch = Chroma.from_documents(texts, embeddings).as_retriever() chat = ChatOpenAI(temperature=0.1) with gr.Blocks() as demo: chatbot = gr.Chatbot() msg = gr.Textbox() clear = gr.ClearButton([msg, chatbot]) def respond(message, chat_history): messages = [ SystemMessage(content=system_message), ] result_docs = docsearch.get_relevant_documents(message) human_message = None human_message = HumanMessage( content=PROMPT.format(context=result_docs[:4], question=message) ) messages.append(human_message) result = chat(messages) bot_message = result.content chat_history.append((message, bot_message)) return "", chat_history msg.submit(respond, [msg, chatbot], [msg, chatbot]) if __name__ == "__main__": demo.launch()