Dobin Yim commited on
Commit
ff8d88e
1 Parent(s): d7657ea
.chainlit/config.toml ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [project]
2
+ # Whether to enable telemetry (default: true). No personal data is collected.
3
+ enable_telemetry = true
4
+
5
+
6
+ # List of environment variables to be provided by each user to use the app.
7
+ user_env = []
8
+
9
+ # Duration (in seconds) during which the session is saved when the connection is lost
10
+ session_timeout = 3600
11
+
12
+ # Enable third parties caching (e.g LangChain cache)
13
+ cache = false
14
+
15
+ # Authorized origins
16
+ allow_origins = ["*"]
17
+
18
+ # Follow symlink for asset mount (see https://github.com/Chainlit/chainlit/issues/317)
19
+ # follow_symlink = false
20
+
21
+ [features]
22
+ # Process and display HTML in messages. This can be a security risk (see https://stackoverflow.com/questions/19603097/why-is-it-dangerous-to-render-user-generated-html-or-javascript)
23
+ unsafe_allow_html = false
24
+
25
+ # Process and display mathematical expressions. This can clash with "$" characters in messages.
26
+ latex = false
27
+
28
+ # Automatically tag threads with the current chat profile (if a chat profile is used)
29
+ auto_tag_thread = true
30
+
31
+ # Authorize users to spontaneously upload files with messages
32
+ [features.spontaneous_file_upload]
33
+ enabled = true
34
+ accept = ["*/*"]
35
+ max_files = 20
36
+ max_size_mb = 500
37
+
38
+ [features.audio]
39
+ # Threshold for audio recording
40
+ min_decibels = -45
41
+ # Delay for the user to start speaking in MS
42
+ initial_silence_timeout = 3000
43
+ # Delay for the user to continue speaking in MS. If the user stops speaking for this duration, the recording will stop.
44
+ silence_timeout = 1500
45
+ # Above this duration (MS), the recording will forcefully stop.
46
+ max_duration = 15000
47
+ # Duration of the audio chunks in MS
48
+ chunk_duration = 1000
49
+ # Sample rate of the audio
50
+ sample_rate = 44100
51
+
52
+ [UI]
53
+ # Name of the assistant.
54
+ name = "Assistant"
55
+
56
+ # Description of the assistant. This is used for HTML tags.
57
+ # description = ""
58
+
59
+ # Large size content are by default collapsed for a cleaner ui
60
+ default_collapse_content = true
61
+
62
+ # Hide the chain of thought details from the user in the UI.
63
+ hide_cot = false
64
+
65
+ # Link to your github repo. This will add a github button in the UI's header.
66
+ # github = ""
67
+
68
+ # Specify a CSS file that can be used to customize the user interface.
69
+ # The CSS file can be served from the public directory or via an external link.
70
+ # custom_css = "/public/test.css"
71
+
72
+ # Specify a Javascript file that can be used to customize the user interface.
73
+ # The Javascript file can be served from the public directory.
74
+ # custom_js = "/public/test.js"
75
+
76
+ # Specify a custom font url.
77
+ # custom_font = "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700&display=swap"
78
+
79
+ # Specify a custom meta image url.
80
+ # custom_meta_image_url = "https://chainlit-cloud.s3.eu-west-3.amazonaws.com/logo/chainlit_banner.png"
81
+
82
+ # Specify a custom build directory for the frontend.
83
+ # This can be used to customize the frontend code.
84
+ # Be careful: If this is a relative path, it should not start with a slash.
85
+ # custom_build = "./public/build"
86
+
87
+ [UI.theme]
88
+ default = "dark"
89
+ #layout = "wide"
90
+ #font_family = "Inter, sans-serif"
91
+ # Override default MUI light theme. (Check theme.ts)
92
+ [UI.theme.light]
93
+ #background = "#FAFAFA"
94
+ #paper = "#FFFFFF"
95
+
96
+ [UI.theme.light.primary]
97
+ #main = "#F80061"
98
+ #dark = "#980039"
99
+ #light = "#FFE7EB"
100
+ [UI.theme.light.text]
101
+ #primary = "#212121"
102
+ #secondary = "#616161"
103
+
104
+ # Override default MUI dark theme. (Check theme.ts)
105
+ [UI.theme.dark]
106
+ #background = "#FAFAFA"
107
+ #paper = "#FFFFFF"
108
+
109
+ [UI.theme.dark.primary]
110
+ #main = "#F80061"
111
+ #dark = "#980039"
112
+ #light = "#FFE7EB"
113
+ [UI.theme.dark.text]
114
+ #primary = "#EEEEEE"
115
+ #secondary = "#BDBDBD"
116
+
117
+ [meta]
118
+ generated_by = "1.1.302"
.chainlit/translations/en-US.json ADDED
@@ -0,0 +1,229 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "components": {
3
+ "atoms": {
4
+ "buttons": {
5
+ "userButton": {
6
+ "menu": {
7
+ "settings": "Settings",
8
+ "settingsKey": "S",
9
+ "APIKeys": "API Keys",
10
+ "logout": "Logout"
11
+ }
12
+ }
13
+ }
14
+ },
15
+ "molecules": {
16
+ "newChatButton": {
17
+ "newChat": "New Chat"
18
+ },
19
+ "tasklist": {
20
+ "TaskList": {
21
+ "title": "\ud83d\uddd2\ufe0f Task List",
22
+ "loading": "Loading...",
23
+ "error": "An error occurred"
24
+ }
25
+ },
26
+ "attachments": {
27
+ "cancelUpload": "Cancel upload",
28
+ "removeAttachment": "Remove attachment"
29
+ },
30
+ "newChatDialog": {
31
+ "createNewChat": "Create new chat?",
32
+ "clearChat": "This will clear the current messages and start a new chat.",
33
+ "cancel": "Cancel",
34
+ "confirm": "Confirm"
35
+ },
36
+ "settingsModal": {
37
+ "settings": "Settings",
38
+ "expandMessages": "Expand Messages",
39
+ "hideChainOfThought": "Hide Chain of Thought",
40
+ "darkMode": "Dark Mode"
41
+ },
42
+ "detailsButton": {
43
+ "using": "Using",
44
+ "used": "Used"
45
+ },
46
+ "auth": {
47
+ "authLogin": {
48
+ "title": "Login to access the app.",
49
+ "form": {
50
+ "email": "Email address",
51
+ "password": "Password",
52
+ "noAccount": "Don't have an account?",
53
+ "alreadyHaveAccount": "Already have an account?",
54
+ "signup": "Sign Up",
55
+ "signin": "Sign In",
56
+ "or": "OR",
57
+ "continue": "Continue",
58
+ "forgotPassword": "Forgot password?",
59
+ "passwordMustContain": "Your password must contain:",
60
+ "emailRequired": "email is a required field",
61
+ "passwordRequired": "password is a required field"
62
+ },
63
+ "error": {
64
+ "default": "Unable to sign in.",
65
+ "signin": "Try signing in with a different account.",
66
+ "oauthsignin": "Try signing in with a different account.",
67
+ "redirect_uri_mismatch": "The redirect URI is not matching the oauth app configuration.",
68
+ "oauthcallbackerror": "Try signing in with a different account.",
69
+ "oauthcreateaccount": "Try signing in with a different account.",
70
+ "emailcreateaccount": "Try signing in with a different account.",
71
+ "callback": "Try signing in with a different account.",
72
+ "oauthaccountnotlinked": "To confirm your identity, sign in with the same account you used originally.",
73
+ "emailsignin": "The e-mail could not be sent.",
74
+ "emailverify": "Please verify your email, a new email has been sent.",
75
+ "credentialssignin": "Sign in failed. Check the details you provided are correct.",
76
+ "sessionrequired": "Please sign in to access this page."
77
+ }
78
+ },
79
+ "authVerifyEmail": {
80
+ "almostThere": "You're almost there! We've sent an email to ",
81
+ "verifyEmailLink": "Please click on the link in that email to complete your signup.",
82
+ "didNotReceive": "Can't find the email?",
83
+ "resendEmail": "Resend email",
84
+ "goBack": "Go Back",
85
+ "emailSent": "Email sent successfully.",
86
+ "verifyEmail": "Verify your email address"
87
+ },
88
+ "providerButton": {
89
+ "continue": "Continue with {{provider}}",
90
+ "signup": "Sign up with {{provider}}"
91
+ },
92
+ "authResetPassword": {
93
+ "newPasswordRequired": "New password is a required field",
94
+ "passwordsMustMatch": "Passwords must match",
95
+ "confirmPasswordRequired": "Confirm password is a required field",
96
+ "newPassword": "New password",
97
+ "confirmPassword": "Confirm password",
98
+ "resetPassword": "Reset Password"
99
+ },
100
+ "authForgotPassword": {
101
+ "email": "Email address",
102
+ "emailRequired": "email is a required field",
103
+ "emailSent": "Please check the email address {{email}} for instructions to reset your password.",
104
+ "enterEmail": "Enter your email address and we will send you instructions to reset your password.",
105
+ "resendEmail": "Resend email",
106
+ "continue": "Continue",
107
+ "goBack": "Go Back"
108
+ }
109
+ }
110
+ },
111
+ "organisms": {
112
+ "chat": {
113
+ "history": {
114
+ "index": {
115
+ "showHistory": "Show history",
116
+ "lastInputs": "Last Inputs",
117
+ "noInputs": "Such empty...",
118
+ "loading": "Loading..."
119
+ }
120
+ },
121
+ "inputBox": {
122
+ "input": {
123
+ "placeholder": "Type your message here..."
124
+ },
125
+ "speechButton": {
126
+ "start": "Start recording",
127
+ "stop": "Stop recording"
128
+ },
129
+ "SubmitButton": {
130
+ "sendMessage": "Send message",
131
+ "stopTask": "Stop Task"
132
+ },
133
+ "UploadButton": {
134
+ "attachFiles": "Attach files"
135
+ },
136
+ "waterMark": {
137
+ "text": "Built with"
138
+ }
139
+ },
140
+ "Messages": {
141
+ "index": {
142
+ "running": "Running",
143
+ "executedSuccessfully": "executed successfully",
144
+ "failed": "failed",
145
+ "feedbackUpdated": "Feedback updated",
146
+ "updating": "Updating"
147
+ }
148
+ },
149
+ "dropScreen": {
150
+ "dropYourFilesHere": "Drop your files here"
151
+ },
152
+ "index": {
153
+ "failedToUpload": "Failed to upload",
154
+ "cancelledUploadOf": "Cancelled upload of",
155
+ "couldNotReachServer": "Could not reach the server",
156
+ "continuingChat": "Continuing previous chat"
157
+ },
158
+ "settings": {
159
+ "settingsPanel": "Settings panel",
160
+ "reset": "Reset",
161
+ "cancel": "Cancel",
162
+ "confirm": "Confirm"
163
+ }
164
+ },
165
+ "threadHistory": {
166
+ "sidebar": {
167
+ "filters": {
168
+ "FeedbackSelect": {
169
+ "feedbackAll": "Feedback: All",
170
+ "feedbackPositive": "Feedback: Positive",
171
+ "feedbackNegative": "Feedback: Negative"
172
+ },
173
+ "SearchBar": {
174
+ "search": "Search"
175
+ }
176
+ },
177
+ "DeleteThreadButton": {
178
+ "confirmMessage": "This will delete the thread as well as it's messages and elements.",
179
+ "cancel": "Cancel",
180
+ "confirm": "Confirm",
181
+ "deletingChat": "Deleting chat",
182
+ "chatDeleted": "Chat deleted"
183
+ },
184
+ "index": {
185
+ "pastChats": "Past Chats"
186
+ },
187
+ "ThreadList": {
188
+ "empty": "Empty...",
189
+ "today": "Today",
190
+ "yesterday": "Yesterday",
191
+ "previous7days": "Previous 7 days",
192
+ "previous30days": "Previous 30 days"
193
+ },
194
+ "TriggerButton": {
195
+ "closeSidebar": "Close sidebar",
196
+ "openSidebar": "Open sidebar"
197
+ }
198
+ },
199
+ "Thread": {
200
+ "backToChat": "Go back to chat",
201
+ "chatCreatedOn": "This chat was created on"
202
+ }
203
+ },
204
+ "header": {
205
+ "chat": "Chat",
206
+ "readme": "Readme"
207
+ }
208
+ }
209
+ },
210
+ "hooks": {
211
+ "useLLMProviders": {
212
+ "failedToFetchProviders": "Failed to fetch providers:"
213
+ }
214
+ },
215
+ "pages": {
216
+ "Design": {},
217
+ "Env": {
218
+ "savedSuccessfully": "Saved successfully",
219
+ "requiredApiKeys": "Required API Keys",
220
+ "requiredApiKeysInfo": "To use this app, the following API keys are required. The keys are stored on your device's local storage."
221
+ },
222
+ "Page": {
223
+ "notPartOfProject": "You are not part of this project."
224
+ },
225
+ "ResumeButton": {
226
+ "resumeChat": "Resume Chat"
227
+ }
228
+ }
229
+ }
AirBnB10Q.pdf ADDED
Binary file (596 kB). View file
 
README.md CHANGED
@@ -8,4 +8,7 @@ pinned: false
8
  license: mit
9
  ---
10
 
 
 
 
11
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
8
  license: mit
9
  ---
10
 
11
+ # Midterm
12
+ - Simple RAG using Chainlit, LangChain, Qdrant, and Openai
13
+
14
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
__pycache__/midterm.cpython-311.pyc ADDED
Binary file (4.96 kB). View file
 
chainlit.md ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ # Midterm
2
+
3
+ - A simple RAG using LangChain, Qdrant Vector DB, and OpenAI LLM
midterm.py ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from dotenv import load_dotenv
3
+ import openai
4
+ import chainlit as cl
5
+ from langchain_community.document_loaders import PyMuPDFLoader
6
+ from operator import itemgetter
7
+ from langchain.text_splitter import RecursiveCharacterTextSplitter
8
+ from langchain.schema.output_parser import StrOutputParser
9
+ from langchain.schema.runnable import RunnablePassthrough
10
+ from langchain.schema.runnable.config import RunnableConfig
11
+ from langchain import hub
12
+ from langchain_community.vectorstores import Qdrant
13
+ from langchain.prompts import ChatPromptTemplate
14
+ from langchain_openai import OpenAIEmbeddings
15
+ from langchain_openai import ChatOpenAI
16
+ import json
17
+
18
+ load_dotenv()
19
+
20
+ OPENAI_API_KEY = os.environ["OPENAI_API_KEY"]
21
+ openai.api_key = OPENAI_API_KEY
22
+
23
+ # Load PDF
24
+ loader = PyMuPDFLoader("AirBnB10Q.pdf")
25
+ documents = loader.load()
26
+
27
+ # Split Document
28
+ text_splitter = RecursiveCharacterTextSplitter(
29
+ chunk_size=300,
30
+ chunk_overlap=50
31
+ )
32
+ documents = text_splitter.split_documents(documents)
33
+
34
+ # Load OpenAI Embeddings
35
+ embeddings = OpenAIEmbeddings(model="text-embedding-ada-002")
36
+
37
+ # Load Qdrant Vector Store
38
+ qdrant_vector_store = Qdrant.from_documents(
39
+ documents,
40
+ embeddings,
41
+ location=":memory:",
42
+ collection_name="AirBnB10Q"
43
+ )
44
+ retriever = qdrant_vector_store.as_retriever()
45
+
46
+ # Pull LangChain QA Prompt Template
47
+ retrieval_qa_prompt = hub.pull("langchain-ai/retrieval-qa-chat")
48
+
49
+ template = """Answer the question based only on the following context. If you cannot answer the question with the context, please respond with 'I don't know':
50
+
51
+ Context:
52
+ {context}
53
+
54
+ Question:
55
+ {query}
56
+ """
57
+
58
+ rag_prompt = ChatPromptTemplate.from_template(template)
59
+ qa_llm = ChatOpenAI(model_name="gpt-4o", temperature=0)
60
+
61
+ @cl.on_chat_start
62
+ async def start_chat():
63
+ """
64
+ This function will be called at the start of every user session.
65
+
66
+ We will build our LCEL RAG chain here, and store it in the user session.
67
+
68
+ The user session is a dictionary that is unique to each user session, and is stored in the memory of the server.
69
+ """
70
+
71
+ ### BUILD LCEL RAG CHAIN THAT ONLY RETURNS TEXT
72
+ lcel_rag_chain = (
73
+ {"context": itemgetter("query") | retriever, "query": itemgetter("query")}
74
+ | rag_prompt | qa_llm
75
+ )
76
+
77
+ cl.user_session.set("lcel_rag_chain", lcel_rag_chain)
78
+
79
+ @cl.on_message
80
+ async def main(message: cl.Message):
81
+ """
82
+ This function will be called every time a message is recieved from a session.
83
+
84
+ We will use the LCEL RAG chain to generate a response to the user query.
85
+
86
+ The LCEL RAG chain is stored in the user session, and is unique to each user session - this is why we can access it here.
87
+ """
88
+ lcel_rag_chain = cl.user_session.get("lcel_rag_chain")
89
+
90
+ msg = cl.Message(content="")
91
+
92
+ async for chunk in lcel_rag_chain.astream(
93
+ {"query": message.content},
94
+ config=RunnableConfig(callbacks=[cl.LangchainCallbackHandler()]),
95
+ ):
96
+ if isinstance(chunk, dict) and 'content' in chunk:
97
+ await msg.stream_token(chunk['content'])
98
+ elif hasattr(chunk, 'content'):
99
+ await msg.stream_token(chunk.content)
100
+ elif isinstance(chunk, str):
101
+ await msg.stream_token(chunk)
102
+
103
+ await msg.send()
requirements.txt ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ chainlit==1.1.302
2
+ langchain==0.2.5
3
+ langchain_community==0.2.5
4
+ langchain_core==0.2.9
5
+ langchain-openai==1.3.5
6
+ langchain_text_splitters==0.2.1
7
+ python-dotenv==1.0.1
8
+ langchainhub==0.1.20
9
+ openai==1.35.3
10
+ qdrant-client==1.9.2