mckplus commited on
Commit
3198de9
1 Parent(s): 9e589ff

Create DocuChat.py

Browse files
Files changed (1) hide show
  1. DocuChat.py +61 -0
DocuChat.py ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import re
3
+ from langchain.chains import RetrievalQA
4
+ from langchain.llms import OpenAI
5
+ from langchain.document_loaders import PyPDFLoader
6
+ from langchain.text_splitter import CharacterTextSplitter
7
+ from langchain.embeddings import OpenAIEmbeddings
8
+ from langchain.vectorstores import Chroma
9
+ import panel as pn
10
+ pn.extension()
11
+
12
+ # Set global sizing mode
13
+ pn.config.sizing_mode = 'stretch_width'
14
+
15
+ # Panel extension
16
+ pn.extension('chatbox', template="bootstrap")
17
+
18
+ file_input = pn.widgets.FileInput(height=45)
19
+ openaikey = pn.widgets.PasswordInput(value="", placeholder="Enter your OpenAI API Key here...", height=45)
20
+ ChatBox = pn.widgets.ChatBox(height=300, primary_name="User", allow_input=True)
21
+
22
+ def remove_empty_lines(text):
23
+ lines = re.split(r'\r\n|\r|\n', text)
24
+ return '\n'.join([line.strip() for line in lines if line.strip()])
25
+
26
+ def qa(file, query):
27
+ loader = PyPDFLoader(file)
28
+ documents = loader.load()
29
+ text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
30
+ texts = text_splitter.split_documents(documents)
31
+ embeddings = OpenAIEmbeddings()
32
+ db = Chroma.from_documents(texts, embeddings)
33
+ retriever = db.as_retriever(search_type="similarity", search_kwargs={"k": 3})
34
+ qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff", retriever=retriever, return_source_documents=True)
35
+ result = qa({"query": query})
36
+ return result['result']
37
+
38
+ def qa_result(event):
39
+ # Check if the event was triggered by a new user input
40
+ if len(event.new) > len(event.old):
41
+ os.environ["OPENAI_API_KEY"] = openaikey.value
42
+ if file_input.value is not None:
43
+ file_input.save("/.cache/temp.pdf")
44
+ prompt_text = remove_empty_lines(event.new[-1][ChatBox.primary_name])
45
+ print("Prompt text:", prompt_text) # Debugging print statement
46
+ if prompt_text:
47
+ result = qa(file="/.cache/temp.pdf", query=prompt_text)
48
+ print("Result:", result) # Debugging print statement
49
+ # Append the AI's response to the chatbox
50
+ ChatBox.value.append({"AI": result})
51
+
52
+ ChatBox.param.watch(qa_result, 'value')
53
+
54
+ layout = pn.Column(
55
+ pn.pane.Markdown("""
56
+ # DocuChat
57
+ AI-Powered Query Engine for Document Insights (powered by LangChain & OpenAI)
58
+ ...
59
+ """),
60
+ pn.Row(file_input, openaikey), ChatBox
61
+ ).servable()