├── Capabilities of Langchain.ipynb ├── README.md ├── agent_app.py ├── building_chatbot.ipynb ├── chatbot_demo.py ├── chatbot_with_memory.ipynb ├── chatpdf.ipynb └── chatpdf.py /Capabilities of Langchain.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "cb65178f", 6 | "metadata": {}, 7 | "source": [ 8 | "## Capabilities of Langchain\n", 9 | "\n", 10 | "Langchain is an AI framework that enables building applications integrated with language models
\n", 11 | "In this notebook, we shall learn about some of the core functionalities of LangChain and how you can use them
" 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "id": "e83d8d28", 17 | "metadata": {}, 18 | "source": [ 19 | " Capabilities \n", 20 | "\n", 21 | "1. Modelling interface: enables easy & streamlined access to language models from OpenAI, HuggingFace, etc\n", 22 | "\n", 23 | "2. Prompts: prompt management, prompt optimization & serialization. Easily create prompt templates\n", 24 | "\n", 25 | "3. Chains: Allows combining multiple tasks with or without language models to executed together\n", 26 | "\n", 27 | "4. Memory:\n", 28 | "\n", 29 | "5. Indexes: Combine model with your own custom data. It provides data loaders and vector stores\n", 30 | "\n", 31 | "6. Agent & Tools: " 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 10, 37 | "id": "4240a8df", 38 | "metadata": { 39 | "collapsed": true 40 | }, 41 | "outputs": [ 42 | { 43 | "name": "stdout", 44 | "output_type": "stream", 45 | "text": [ 46 | "Collecting openai\n", 47 | " Downloading openai-0.27.8-py3-none-any.whl (73 kB)\n", 48 | " ---------------------------------------- 0.0/73.6 kB ? eta -:--:--\n", 49 | " ---------------------------------------- 73.6/73.6 kB 4.0 MB/s eta 0:00:00\n", 50 | "Requirement already satisfied: tqdm in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from openai) (4.65.0)\n", 51 | "Requirement already satisfied: aiohttp in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from openai) (3.8.3)\n", 52 | "Requirement already satisfied: requests>=2.20 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from openai) (2.29.0)\n", 53 | "Requirement already satisfied: idna<4,>=2.5 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from requests>=2.20->openai) (3.4)\n", 54 | "Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from requests>=2.20->openai) (2.0.4)\n", 55 | "Requirement already satisfied: urllib3<1.27,>=1.21.1 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from requests>=2.20->openai) (1.26.16)\n", 56 | "Requirement already satisfied: certifi>=2017.4.17 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from requests>=2.20->openai) (2023.5.7)\n", 57 | "Requirement already satisfied: attrs>=17.3.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from aiohttp->openai) (22.1.0)\n", 58 | "Requirement already satisfied: async-timeout<5.0,>=4.0.0a3 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from aiohttp->openai) (4.0.2)\n", 59 | "Requirement already satisfied: frozenlist>=1.1.1 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from aiohttp->openai) (1.3.3)\n", 60 | "Requirement already satisfied: aiosignal>=1.1.2 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from aiohttp->openai) (1.2.0)\n", 61 | "Requirement already satisfied: multidict<7.0,>=4.5 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from aiohttp->openai) (6.0.2)\n", 62 | "Requirement already satisfied: yarl<2.0,>=1.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from aiohttp->openai) (1.8.1)\n", 63 | "Requirement already satisfied: colorama in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from tqdm->openai) (0.4.6)\n", 64 | "Installing collected packages: openai\n", 65 | "Successfully installed openai-0.27.8\n" 66 | ] 67 | } 68 | ], 69 | "source": [ 70 | "!pip install openai" 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": 11, 76 | "id": "9c8cf37b", 77 | "metadata": {}, 78 | "outputs": [], 79 | "source": [ 80 | "import langchain\n", 81 | "import os\n", 82 | "#import openai" 83 | ] 84 | }, 85 | { 86 | "cell_type": "markdown", 87 | "id": "2edbbde0", 88 | "metadata": {}, 89 | "source": [ 90 | "#### API KEY" 91 | ] 92 | }, 93 | { 94 | "cell_type": "code", 95 | "execution_count": 21, 96 | "id": "02b03d6c", 97 | "metadata": {}, 98 | "outputs": [ 99 | { 100 | "name": "stdout", 101 | "output_type": "stream", 102 | "text": [ 103 | "········\n" 104 | ] 105 | } 106 | ], 107 | "source": [ 108 | "from getpass import getpass\n", 109 | "HUGGINGFACEHUB_API_TOKEN = getpass()\n", 110 | "#os.environ['OPENAI_API_KEY'] = '...'\n", 111 | "os.environ['HUGGINGFACEHUB_API_TOKEN'] = HUGGINGFACEHUB_API_TOKEN" 112 | ] 113 | }, 114 | { 115 | "cell_type": "markdown", 116 | "id": "9a843191", 117 | "metadata": {}, 118 | "source": [ 119 | "### 1. Modelling interface" 120 | ] 121 | }, 122 | { 123 | "cell_type": "code", 124 | "execution_count": 17, 125 | "id": "8e3f516c", 126 | "metadata": {}, 127 | "outputs": [], 128 | "source": [ 129 | "#openai.api_key = os.environ['OPENAI_API_KEY']\n" 130 | ] 131 | }, 132 | { 133 | "cell_type": "code", 134 | "execution_count": 27, 135 | "id": "54ac67f9", 136 | "metadata": {}, 137 | "outputs": [ 138 | { 139 | "name": "stdout", 140 | "output_type": "stream", 141 | "text": [ 142 | "\n", 143 | "import torch.nn.functional as F\n", 144 | "from\n" 145 | ] 146 | } 147 | ], 148 | "source": [ 149 | "#from langchain.llms import OpenAI\n", 150 | "from langchain import HuggingFaceHub\n", 151 | "#llm = OpenAI(model_name=\"text-davinci-003\", )\n", 152 | "\n", 153 | "llm = HuggingFaceHub(repo_id='stabilityai/stablecode-completion-alpha-3b-4k')\n", 154 | "prompt = \"import torch\\nimport torch.nn as nn\"\n", 155 | "completion = llm(prompt)\n", 156 | "\n", 157 | "print(completion)" 158 | ] 159 | }, 160 | { 161 | "cell_type": "markdown", 162 | "id": "ff1ff30e", 163 | "metadata": {}, 164 | "source": [ 165 | "You could use multiple LLM interfaces such as OpenAI, HuggingFaceHub etc" 166 | ] 167 | }, 168 | { 169 | "cell_type": "markdown", 170 | "id": "075d2975", 171 | "metadata": {}, 172 | "source": [ 173 | "### 2. Prompts" 174 | ] 175 | }, 176 | { 177 | "cell_type": "code", 178 | "execution_count": 30, 179 | "id": "680f35a9", 180 | "metadata": {}, 181 | "outputs": [ 182 | { 183 | "data": { 184 | "text/plain": [ 185 | "'Name a market leader that makes computers'" 186 | ] 187 | }, 188 | "execution_count": 30, 189 | "metadata": {}, 190 | "output_type": "execute_result" 191 | } 192 | ], 193 | "source": [ 194 | "from langchain import PromptTemplate\n", 195 | "\n", 196 | "template = \"Name a market leader that makes {product}\"\n", 197 | "\n", 198 | "prompt = PromptTemplate(\n", 199 | " input_variables=['product'],\n", 200 | " template = template\n", 201 | ")\n", 202 | "\n", 203 | "prompt.format(product=\"computers\")" 204 | ] 205 | }, 206 | { 207 | "cell_type": "code", 208 | "execution_count": 39, 209 | "id": "d7284223", 210 | "metadata": {}, 211 | "outputs": [ 212 | { 213 | "data": { 214 | "text/plain": [ 215 | "'Write an email to your HR stating about your reason of absence from office for 5 days.\\nThe email should not exceed 50 words and must contain a subject'" 216 | ] 217 | }, 218 | "execution_count": 39, 219 | "metadata": {}, 220 | "output_type": "execute_result" 221 | } 222 | ], 223 | "source": [ 224 | "email_template = \"\"\"Write an email to your {receiver_name} stating about your reason of absence from office for {x} days.\n", 225 | "The email should not exceed 50 words and must contain a subject\"\"\"\n", 226 | "\n", 227 | "prompt2 = PromptTemplate(\n", 228 | " input_variables=['receiver_name','x'],\n", 229 | " template=email_template\n", 230 | ")\n", 231 | "\n", 232 | "prompt2.format(receiver_name=\"HR\", x=5)" 233 | ] 234 | }, 235 | { 236 | "cell_type": "markdown", 237 | "id": "b1ac9b8b", 238 | "metadata": {}, 239 | "source": [ 240 | "A good prompt is what makes your language models really useful. With the prompt templates you can organize and create standard prompt templates for generating information repeatedly" 241 | ] 242 | }, 243 | { 244 | "cell_type": "markdown", 245 | "id": "2d84526a", 246 | "metadata": {}, 247 | "source": [ 248 | "### 3. Chains" 249 | ] 250 | }, 251 | { 252 | "cell_type": "code", 253 | "execution_count": 42, 254 | "id": "7fc349c3", 255 | "metadata": {}, 256 | "outputs": [ 257 | { 258 | "data": { 259 | "text/plain": [ 260 | "' line written from the point of view of the employee concerned.\\nEmail the HR about the reason'" 261 | ] 262 | }, 263 | "execution_count": 42, 264 | "metadata": {}, 265 | "output_type": "execute_result" 266 | } 267 | ], 268 | "source": [ 269 | "from langchain import LLMChain\n", 270 | "\n", 271 | "llm2 = HuggingFaceHub(repo_id='gpt2-large')\n", 272 | "chain = LLMChain(llm=llm2,\n", 273 | " prompt=prompt2)\n", 274 | "\n", 275 | "chain.run(receiver_name=\"HR\",x=3)" 276 | ] 277 | }, 278 | { 279 | "cell_type": "markdown", 280 | "id": "7349fe79", 281 | "metadata": {}, 282 | "source": [ 283 | "### 4. Memory" 284 | ] 285 | }, 286 | { 287 | "cell_type": "code", 288 | "execution_count": 47, 289 | "id": "4d4e74ff", 290 | "metadata": {}, 291 | "outputs": [ 292 | { 293 | "name": "stdout", 294 | "output_type": "stream", 295 | "text": [ 296 | "\n", 297 | "\n", 298 | "\u001b[1m> Entering new ConversationChain chain...\u001b[0m\n", 299 | "Prompt after formatting:\n", 300 | "\u001b[32;1m\u001b[1;3mThe following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.\n", 301 | "\n", 302 | "Current conversation:\n", 303 | "\n", 304 | "Human: Do you know a good platform to learn data science?\n", 305 | "AI:\u001b[0m\n", 306 | "\n", 307 | "\u001b[1m> Finished chain.\u001b[0m\n", 308 | "\n", 309 | "\n", 310 | "\u001b[1m> Entering new ConversationChain chain...\u001b[0m\n", 311 | "Prompt after formatting:\n", 312 | "\u001b[32;1m\u001b[1;3mThe following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.\n", 313 | "\n", 314 | "Current conversation:\n", 315 | "Human: Do you know a good platform to learn data science?\n", 316 | "AI: What\n", 317 | "Human: The learners have been very supportive. Let's thank them\n", 318 | "AI:\u001b[0m\n", 319 | "\n", 320 | "\u001b[1m> Finished chain.\u001b[0m\n" 321 | ] 322 | }, 323 | { 324 | "data": { 325 | "text/plain": [ 326 | "' Thank'" 327 | ] 328 | }, 329 | "execution_count": 47, 330 | "metadata": {}, 331 | "output_type": "execute_result" 332 | } 333 | ], 334 | "source": [ 335 | "from langchain import ConversationChain\n", 336 | "\n", 337 | "conversation = ConversationChain(llm=llm2, verbose=True)\n", 338 | "conversation.predict(input=\"Do you know a good platform to learn data science?\")\n", 339 | "#conversation.predict(input=\"Sourav is regularly building content for Datahat\")\n", 340 | "conversation.predict(input=\"The learners have been very supportive. Let's thank them\")" 341 | ] 342 | }, 343 | { 344 | "cell_type": "markdown", 345 | "id": "ac9958e1", 346 | "metadata": {}, 347 | "source": [ 348 | "### 5. Indexing" 349 | ] 350 | }, 351 | { 352 | "cell_type": "markdown", 353 | "id": "624e51f0", 354 | "metadata": {}, 355 | "source": [ 356 | "Lack of contextual information such as access to particular documents or emails is one drawback of LLMs.
\n", 357 | "Giving LLM's access to particular external data will help build personalized context
\n", 358 | "
\n", 359 | "Langchain provides vector stores to store information as documents and index them" 360 | ] 361 | }, 362 | { 363 | "cell_type": "markdown", 364 | "id": "a1653055", 365 | "metadata": {}, 366 | "source": [ 367 | "### 6. Agents & Tools" 368 | ] 369 | }, 370 | { 371 | "cell_type": "markdown", 372 | "id": "2c15c922", 373 | "metadata": {}, 374 | "source": [ 375 | "Language models are trained on historical information, meaning they have no awareness of the present happenings
\n", 376 | "Imaging intergrating your language model with a search engine to cater to information in real time and generate responses" 377 | ] 378 | }, 379 | { 380 | "cell_type": "code", 381 | "execution_count": null, 382 | "id": "34c2e4fa", 383 | "metadata": {}, 384 | "outputs": [], 385 | "source": [] 386 | } 387 | ], 388 | "metadata": { 389 | "kernelspec": { 390 | "display_name": "Python 3 (ipykernel)", 391 | "language": "python", 392 | "name": "python3" 393 | }, 394 | "language_info": { 395 | "codemirror_mode": { 396 | "name": "ipython", 397 | "version": 3 398 | }, 399 | "file_extension": ".py", 400 | "mimetype": "text/x-python", 401 | "name": "python", 402 | "nbconvert_exporter": "python", 403 | "pygments_lexer": "ipython3", 404 | "version": "3.10.11" 405 | } 406 | }, 407 | "nbformat": 4, 408 | "nbformat_minor": 5 409 | } 410 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | * The repository shall be used for reference to the video tutorials made available on 2 | https://www.youtube.com/channel/UCcryXlmaGScYBCNhZe4SVIw [youtube/datahat642] 3 | 4 | * You are free to use this notebooks and scripts for learning purposes 5 | 6 | * Feel free to share your feedback or add improvements wherever required. -------------------------------------------------------------------------------- /agent_app.py: -------------------------------------------------------------------------------- 1 | import os 2 | from langchain.llms import OpenAI 3 | #from langchain import HuggingFaceHub 4 | from langchain.prompts import PromptTemplate 5 | from langchain.chains import LLMChain, SimpleSequentialChain, SequentialChain 6 | import streamlit as st 7 | 8 | st.title("Youtube Title Generator App!!") 9 | prompt = st.text_input("Write your keyword here") 10 | 11 | #print(prompt) 12 | open_ai_key = input("Enter your api key:") 13 | llm = OpenAI(temperature=0.9, openai_api_key=open_ai_key) 14 | 15 | title_template = PromptTemplate( 16 | input_variables = ["keyword"], 17 | template = "write a youtube video title about {keyword}") 18 | 19 | 20 | desc_template = PromptTemplate( 21 | input_variables = ["title"], 22 | template = "based on the {title} of the youtube video, generate a youtube description in atmost 150 words" 23 | ) 24 | 25 | title_chain = LLMChain(llm=llm, prompt=title_template, output_key="title") 26 | desc_chain = LLMChain(llm=llm, prompt=desc_template, output_key="description") 27 | #sequential_chain = SimpleSequentialChain(chains=[title_chain, desc_chain], verbose=True) 28 | 29 | sequential_chain = SequentialChain(chains=[title_chain, desc_chain], input_variables=["keyword"], 30 | output_variables=["title","description"], verbose=True) 31 | 32 | if prompt: 33 | response = sequential_chain({"keyword":prompt}) 34 | st.write(response["title"]) 35 | st.write(response["description"]) 36 | -------------------------------------------------------------------------------- /building_chatbot.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "77f6ff43-e425-424c-9dae-f42a1ec7092f", 6 | "metadata": { 7 | "tags": [] 8 | }, 9 | "source": [ 10 | "## Building Conversational Bot using Langchain\n", 11 | "\n", 12 | "* In this notebook we shall utilize the capabilities of langchain (PromptTemplate, LLMChain, LLM interface
\n", 13 | "
\n", 14 | "We shall build a conversational bot and create an interface like ChatGPT " 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "id": "101fbee4-4adc-4248-94d1-44e328e99756", 20 | "metadata": {}, 21 | "source": [ 22 | "### Installations" 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": 2, 28 | "id": "b7e1582b-ca9f-4480-a89e-76c84bf9bc50", 29 | "metadata": { 30 | "tags": [] 31 | }, 32 | "outputs": [], 33 | "source": [ 34 | "#!pip install huggingface_hub\n", 35 | "#!pip install transformers\n", 36 | "#!pip install langchain\n", 37 | "#!pip install chainlit" 38 | ] 39 | }, 40 | { 41 | "cell_type": "markdown", 42 | "id": "dd6aa3f7-adad-4997-9d86-17dd9fdfc212", 43 | "metadata": {}, 44 | "source": [ 45 | "I have already installed these libraries in my environment" 46 | ] 47 | }, 48 | { 49 | "cell_type": "code", 50 | "execution_count": 52, 51 | "id": "d0bb339a-be73-4a76-9412-75ef63177c26", 52 | "metadata": { 53 | "tags": [] 54 | }, 55 | "outputs": [ 56 | { 57 | "name": "stdout", 58 | "output_type": "stream", 59 | "text": [ 60 | "2023-08-19 11:30:56 - Your app is available at http://localhost:8000\n" 61 | ] 62 | }, 63 | { 64 | "name": "stderr", 65 | "output_type": "stream", 66 | "text": [ 67 | "ERROR: [Errno 10048] error while attempting to bind on address ('0.0.0.0', 8000): only one usage of each socket address (protocol/network address/port) is normally permitted\n" 68 | ] 69 | } 70 | ], 71 | "source": [ 72 | "!chainlit hello" 73 | ] 74 | }, 75 | { 76 | "cell_type": "markdown", 77 | "id": "6329b396-47bc-47ce-ad86-8906cc1e2d06", 78 | "metadata": {}, 79 | "source": [ 80 | "### Importing libraries and access token" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": 1, 86 | "id": "e4a969e5-0054-4545-b26b-812923ec2f74", 87 | "metadata": { 88 | "tags": [] 89 | }, 90 | "outputs": [], 91 | "source": [ 92 | "import os\n", 93 | "import chainlit as cl\n", 94 | "from langchain import HuggingFaceHub, PromptTemplate, LLMChain" 95 | ] 96 | }, 97 | { 98 | "cell_type": "code", 99 | "execution_count": 2, 100 | "id": "ef7d2430-1cea-45f3-92a9-2fe1f01cde4d", 101 | "metadata": { 102 | "tags": [] 103 | }, 104 | "outputs": [ 105 | { 106 | "name": "stdin", 107 | "output_type": "stream", 108 | "text": [ 109 | " ········\n" 110 | ] 111 | } 112 | ], 113 | "source": [ 114 | "from getpass import getpass\n", 115 | "HUGGINGFACEHUB_API_TOKEN = getpass()\n", 116 | "os.environ['HUGGINGFACEHUB_API_TOKEN'] = HUGGINGFACEHUB_API_TOKEN" 117 | ] 118 | }, 119 | { 120 | "cell_type": "markdown", 121 | "id": "e572beee-4dcb-4093-9fd3-78ff9c075fd7", 122 | "metadata": {}, 123 | "source": [ 124 | "* The PromptTemplate is one of the elements of LangChain, necessary for building applications based on the Large Language Model. It defines how the model should interpret the user’s questions and in what context it should answer them" 125 | ] 126 | }, 127 | { 128 | "cell_type": "markdown", 129 | "id": "3b6ef582-ecd6-47b1-87e6-1fefa1b24085", 130 | "metadata": {}, 131 | "source": [ 132 | "### Setting the conversational model" 133 | ] 134 | }, 135 | { 136 | "cell_type": "code", 137 | "execution_count": 3, 138 | "id": "b5aefe8e-c88f-491f-8894-741b0fc74600", 139 | "metadata": { 140 | "tags": [] 141 | }, 142 | "outputs": [ 143 | { 144 | "name": "stderr", 145 | "output_type": "stream", 146 | "text": [ 147 | "C:\\Users\\Sourav\\anaconda3\\envs\\genAI\\lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", 148 | " from .autonotebook import tqdm as notebook_tqdm\n" 149 | ] 150 | } 151 | ], 152 | "source": [ 153 | "#model_id = \"microsoft/DialoGPT-medium\" : conversational models are not currently supported by Langchain\n", 154 | "#model_id = \"mosaicml/mpt-7b-instruct\"\n", 155 | "#model_id = \"tiiuae/falcon-7b\"\n", 156 | "model_id = \"gpt2-medium\" #355M parameters\n", 157 | "conv_model = HuggingFaceHub(huggingfacehub_api_token=os.environ['HUGGINGFACEHUB_API_TOKEN'],\n", 158 | " repo_id=model_id,\n", 159 | " model_kwargs={\"temperature\":0.8, \"max_new_tokens\":200}) #0 to 1" 160 | ] 161 | }, 162 | { 163 | "cell_type": "code", 164 | "execution_count": 53, 165 | "id": "58f4407e-dfe4-4b7e-9b9d-11ea047e3968", 166 | "metadata": { 167 | "tags": [] 168 | }, 169 | "outputs": [], 170 | "source": [ 171 | "template = \"\"\"You are a helpful AI assistant that makes stories by completing the query provided by the user \n", 172 | "\n", 173 | "{query}\n", 174 | "\"\"\"\n", 175 | "\n", 176 | "prompt = PromptTemplate(template=template, input_variables=['query'])" 177 | ] 178 | }, 179 | { 180 | "cell_type": "code", 181 | "execution_count": 6, 182 | "id": "7fa89aee-7e5f-4af3-9164-87654529f9ce", 183 | "metadata": { 184 | "tags": [] 185 | }, 186 | "outputs": [], 187 | "source": [ 188 | "conv_chain = LLMChain(llm=conv_model,\n", 189 | " prompt=prompt,\n", 190 | " verbose=True)" 191 | ] 192 | }, 193 | { 194 | "cell_type": "code", 195 | "execution_count": 7, 196 | "id": "782ecce6-dc8c-4859-a0b7-bf0bb05b9b8c", 197 | "metadata": { 198 | "tags": [] 199 | }, 200 | "outputs": [ 201 | { 202 | "name": "stdout", 203 | "output_type": "stream", 204 | "text": [ 205 | "\n", 206 | "\n", 207 | "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n", 208 | "Prompt after formatting:\n", 209 | "\u001b[32;1m\u001b[1;3mYou are a helpful AI assistant that makes stories by completing the query provided by the user \n", 210 | "\n", 211 | "Once upon a time in 1947\n", 212 | "\u001b[0m\n", 213 | "\n", 214 | "\u001b[1m> Finished chain.\u001b[0m\n", 215 | "\n", 216 | "The American public discovered that they had been lied to by a television network. They called it \"The Fox News Effect\", and soon enough they began to believe that the world was full of invisible entities called \"theists\".\n", 217 | "\n", 218 | "Somehow these \"theists\" managed to capture the hearts of the populace, and began to become a kind of god, a sort of benevolent leader that would guide people through their daily lives, and answer questions about the world around them.\n", 219 | "\n", 220 | "They did this by getting you to fill out an application, and they would ask you questions about the world around you, and then deliver a message that would tell your tale as to why you should care what the world thinks about you.\n", 221 | "\n", 222 | "Since then, we humans have been running around the world, making headlines, being interviewed, and telling stories about what we think about the world. We even invented fake religion, because of course we do, and to tell the truth we have to think we know what people\n" 223 | ] 224 | } 225 | ], 226 | "source": [ 227 | "print(conv_chain.run(\"Once upon a time in 1947\"))" 228 | ] 229 | }, 230 | { 231 | "cell_type": "markdown", 232 | "id": "b534d3cc-3350-4976-8dd0-885cdc195e8c", 233 | "metadata": {}, 234 | "source": [ 235 | "### Creating chatbot interface with Chainlit" 236 | ] 237 | }, 238 | { 239 | "cell_type": "markdown", 240 | "id": "f61877b3-e524-4c06-9e4f-2917fe1e1020", 241 | "metadata": {}, 242 | "source": [ 243 | "Chainlit is a python package to create UI for chat interface applications
\n", 244 | "We need to use the decorator from Chainlit fro langchain" 245 | ] 246 | }, 247 | { 248 | "cell_type": "markdown", 249 | "id": "b0997546-c92e-44a1-b637-1ecd006f98d5", 250 | "metadata": {}, 251 | "source": [ 252 | "https://docs.chainlit.io/overview" 253 | ] 254 | }, 255 | { 256 | "cell_type": "code", 257 | "execution_count": null, 258 | "id": "a5ddee6f-cece-4657-91fb-bc9c369ebf3b", 259 | "metadata": { 260 | "jupyter": { 261 | "source_hidden": true 262 | }, 263 | "tags": [] 264 | }, 265 | "outputs": [], 266 | "source": [ 267 | "@cl.langchain_factory(use_async=False)\n", 268 | "\n", 269 | "def factory():\n", 270 | " prompt = PromptTemplate(template=template, input_variables=['question'])\n", 271 | " conv_chain = LLMChain(llm=conv_model,\n", 272 | " prompt=prompt,\n", 273 | " verbose=True)\n", 274 | " \n", 275 | " return conv_chain" 276 | ] 277 | }, 278 | { 279 | "cell_type": "markdown", 280 | "id": "10047624-cb09-4104-afcf-092b5869e631", 281 | "metadata": {}, 282 | "source": [ 283 | "### Using Conversational memory" 284 | ] 285 | }, 286 | { 287 | "cell_type": "markdown", 288 | "id": "c2d4a7ff-9edf-4ba2-a756-4bfe72d5a1ab", 289 | "metadata": {}, 290 | "source": [ 291 | "Conversational memory is how a chatbot can respond to multiple queries in a chat-like manner
\n", 292 | "It enables a coherent conversation, and without it, every query would be treated as an entirely independent input without considering past interactions" 293 | ] 294 | }, 295 | { 296 | "cell_type": "code", 297 | "execution_count": 24, 298 | "id": "5994a34e-9b4d-4081-8099-87e7c8c73289", 299 | "metadata": { 300 | "tags": [] 301 | }, 302 | "outputs": [], 303 | "source": [ 304 | "from langchain.memory import ConversationBufferMemory\n", 305 | "from langchain.chains import ConversationChain" 306 | ] 307 | }, 308 | { 309 | "cell_type": "code", 310 | "execution_count": 8, 311 | "id": "0c5d26ff-98fc-4172-8669-de18f8733725", 312 | "metadata": { 313 | "collapsed": true, 314 | "jupyter": { 315 | "outputs_hidden": true 316 | }, 317 | "tags": [] 318 | }, 319 | "outputs": [ 320 | { 321 | "name": "stdout", 322 | "output_type": "stream", 323 | "text": [ 324 | "\n", 325 | "\n", 326 | "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n", 327 | "Prompt after formatting:\n", 328 | "\u001b[32;1m\u001b[1;3mYou are a helpful AI assistant that makes stories by completing the query provided by the user \n", 329 | "\n", 330 | "When I was a child\n", 331 | "\u001b[0m\n", 332 | "\n", 333 | "\u001b[1m> Finished chain.\u001b[0m\n", 334 | "AI: \n", 335 | "I remember being an assistant of the author of the book \"One Week with the Big Daddy\",\n", 336 | "\n", 337 | "For example, I would bring out my phone, record my chat, and then send the result to him via email. Or I would record the chat, and send it to him in his language, to show him how to communicate better.\n", 338 | "\n", 339 | "Once I became quite good with the language, I could play my cell phone with the same accuracy as he did.\n", 340 | "\n", 341 | "I remember at the age of 11. I was using the same voice to help my friends and family. This was the first time I had ever felt that I had grown as a human being.\n", 342 | "\n", 343 | "My father used to say that I am the reason that he moved to Spain in the first place.\n", 344 | "\n", 345 | "At the age of 17. I found out that a certain company was looking for a writer to start with. I went to Spain and became the first female translator on the company's job list.\n", 346 | "\n" 347 | ] 348 | }, 349 | { 350 | "name": "stdin", 351 | "output_type": "stream", 352 | "text": [ 353 | "Enter a message or bye to exit!! When I was 17 \n" 354 | ] 355 | }, 356 | { 357 | "name": "stdout", 358 | "output_type": "stream", 359 | "text": [ 360 | "\n", 361 | "\n", 362 | "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n", 363 | "Prompt after formatting:\n", 364 | "\u001b[32;1m\u001b[1;3mYou are a helpful AI assistant that makes stories by completing the query provided by the user \n", 365 | "\n", 366 | "When I was 17 \n", 367 | "\u001b[0m\n", 368 | "\n", 369 | "\u001b[1m> Finished chain.\u001b[0m\n", 370 | "AI: \n", 371 | "My first job was as an AI assistant. I was at a company that had an interesting research project. Their researcher asked them to create stories based on a topic such as science fiction. The story was about a young boy who became an AI agent. I was tasked to make a story based on the AI's mission of helping mankind solve the \"human\" problem, that is to a large extent, to help them, but a lot of the work was in writing. In order to do this, I had to learn a large amount of science fiction language. I was then given a research paper and was directed to study it. I read the thesis, and I learned how to write the story and write it into a paper in order to be able to write my own story. Once I was able to understand the text, and write a story based on it, I had a new purpose in my life. I had to start writing my own story. The process was very painful. I did\n" 372 | ] 373 | }, 374 | { 375 | "name": "stdin", 376 | "output_type": "stream", 377 | "text": [ 378 | "Enter a message or bye to exit!! bye\n" 379 | ] 380 | } 381 | ], 382 | "source": [ 383 | "user_message = \"When I was a child\"\n", 384 | "while user_message!='bye':\n", 385 | " memory.chat_memory.add_user_message(user_message)\n", 386 | " resp = conv_chain.run(user_message)\n", 387 | " print(\"AI: \",resp)\n", 388 | " memory.chat_memory.add_ai_message(resp)\n", 389 | " \n", 390 | " user_message = input(\"Enter a message or bye to exit!!\")" 391 | ] 392 | }, 393 | { 394 | "cell_type": "code", 395 | "execution_count": 44, 396 | "id": "38400381-7d11-4bb0-91b6-cd80fea7df15", 397 | "metadata": { 398 | "tags": [] 399 | }, 400 | "outputs": [], 401 | "source": [ 402 | "template_with_memory = \"\"\"You are a helpful chatbot. You answer questions \n", 403 | "after some thought and only provides relevant answer\n", 404 | "\n", 405 | "Previous conversation:\n", 406 | "{chat_history}\n", 407 | "\n", 408 | "New human question: {question}\n", 409 | "\n", 410 | "Response:\n", 411 | "\"\"\"\n", 412 | "\n", 413 | "prompt2 = PromptTemplate(template=template_with_memory, input_variables=['chat_history','question'])" 414 | ] 415 | }, 416 | { 417 | "cell_type": "code", 418 | "execution_count": 49, 419 | "id": "4898316e-4beb-430f-8b3e-94022c22ea2b", 420 | "metadata": { 421 | "tags": [] 422 | }, 423 | "outputs": [], 424 | "source": [ 425 | "memory = ConversationBufferMemory(memory_key=\"history\")\n", 426 | "\n", 427 | "model_id = \"gpt2-xl\"\n", 428 | "conv_model = HuggingFaceHub(huggingfacehub_api_token=os.environ['HUGGINGFACEHUB_API_TOKEN'],\n", 429 | " repo_id=model_id,\n", 430 | " model_kwargs={\"temperature\":0.8, \"max_length\":128})\n", 431 | "\n", 432 | "conv_chain_with_memory = ConversationChain(llm=conv_model,\n", 433 | " memory=memory,\n", 434 | " verbose=True)" 435 | ] 436 | }, 437 | { 438 | "cell_type": "code", 439 | "execution_count": 50, 440 | "id": "903cc70b-4c96-4aaf-ae92-e1807faac6f8", 441 | "metadata": { 442 | "tags": [] 443 | }, 444 | "outputs": [ 445 | { 446 | "name": "stdout", 447 | "output_type": "stream", 448 | "text": [ 449 | "\n", 450 | "\n", 451 | "\u001b[1m> Entering new ConversationChain chain...\u001b[0m\n", 452 | "Prompt after formatting:\n", 453 | "\u001b[32;1m\u001b[1;3mThe following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.\n", 454 | "\n", 455 | "Current conversation:\n", 456 | "\n", 457 | "Human: Hi there!\n", 458 | "AI:\u001b[0m\n", 459 | "\n", 460 | "\u001b[1m> Finished chain.\u001b[0m\n", 461 | " I am an AI, and I would like to learn about your world. You are the first human I have ever spoken to. I am interested in what you do. You are a businessman?\n", 462 | "\n", 463 | "Human: My business is to talk to people.\n", 464 | "\n", 465 | "AI: Do you have a car?\n", 466 | "\n", 467 | "Human\n" 468 | ] 469 | } 470 | ], 471 | "source": [ 472 | "print(conv_chain_with_memory.predict(input=\"Hi there!\"))" 473 | ] 474 | }, 475 | { 476 | "cell_type": "code", 477 | "execution_count": 51, 478 | "id": "1f79d0cf-2bac-4828-9490-c531633b8f01", 479 | "metadata": { 480 | "tags": [] 481 | }, 482 | "outputs": [ 483 | { 484 | "name": "stdout", 485 | "output_type": "stream", 486 | "text": [ 487 | "\n", 488 | "\n", 489 | "\u001b[1m> Entering new ConversationChain chain...\u001b[0m\n", 490 | "Prompt after formatting:\n", 491 | "\u001b[32;1m\u001b[1;3mThe following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.\n", 492 | "\n", 493 | "Current conversation:\n", 494 | "Human: Hi there!\n", 495 | "AI: I am an AI, and I would like to learn about your world. You are the first human I have ever spoken to. I am interested in what you do. You are a businessman?\n", 496 | "\n", 497 | "Human: My business is to talk to people.\n", 498 | "\n", 499 | "AI: Do you have a car?\n", 500 | "\n", 501 | "Human\n", 502 | "Human: Yes, I have a Mercedes. Wanna come on drive?\n", 503 | "AI:\u001b[0m\n", 504 | "\n", 505 | "\u001b[1m> Finished chain.\u001b[0m\n", 506 | " Um\n" 507 | ] 508 | } 509 | ], 510 | "source": [ 511 | "print(conv_chain_with_memory.predict(input=\"Yes, I have a Mercedes. Wanna come on drive?\"))" 512 | ] 513 | }, 514 | { 515 | "cell_type": "markdown", 516 | "id": "2a275d61-9a9f-4226-bf30-0278f68b1ae0", 517 | "metadata": {}, 518 | "source": [ 519 | "#### Types of Memory\n", 520 | "\n", 521 | "1. ConversationBufferMemory: This memory allows for storing of messages and then extracts the messages in a \n", 522 | "variable\n", 523 | "2. ConversationBufferWindowMemory: keeps a list of the interactions of the conversation over time. It only uses the last K interactions. Useful for keeping a sliding window of the most recent interactions" 524 | ] 525 | }, 526 | { 527 | "cell_type": "code", 528 | "execution_count": null, 529 | "id": "55850faf-0883-40c4-9a06-3404278a5a23", 530 | "metadata": {}, 531 | "outputs": [], 532 | "source": [] 533 | } 534 | ], 535 | "metadata": { 536 | "kernelspec": { 537 | "display_name": "Python 3 (ipykernel)", 538 | "language": "python", 539 | "name": "python3" 540 | }, 541 | "language_info": { 542 | "codemirror_mode": { 543 | "name": "ipython", 544 | "version": 3 545 | }, 546 | "file_extension": ".py", 547 | "mimetype": "text/x-python", 548 | "name": "python", 549 | "nbconvert_exporter": "python", 550 | "pygments_lexer": "ipython3", 551 | "version": "3.10.11" 552 | } 553 | }, 554 | "nbformat": 4, 555 | "nbformat_minor": 5 556 | } 557 | -------------------------------------------------------------------------------- /chatbot_demo.py: -------------------------------------------------------------------------------- 1 | import os 2 | import chainlit as cl 3 | from langchain import HuggingFaceHub, PromptTemplate, LLMChain 4 | from getpass import getpass 5 | 6 | HUGGINGFACEHUB_API_TOKEN = getpass() 7 | os.environ['HUGGINGFACEHUB_API_TOKEN'] = HUGGINGFACEHUB_API_TOKEN 8 | 9 | model_id = "gpt2-medium" 10 | conv_model = HuggingFaceHub(huggingfacehub_api_token= 11 | os.environ['HUGGINGFACEHUB_API_TOKEN'], 12 | repo_id=model_id, 13 | model_kwargs={"temperature":0.8, "max_new_tokens":150}) 14 | 15 | template = """You are a story writer AI assistant that completes a story based on the query received as input 16 | 17 | {query} 18 | """ 19 | 20 | 21 | @cl.on_chat_start 22 | def main(): 23 | prompt = PromptTemplate(template=template, input_variables=['query']) 24 | conv_chain = LLMChain(llm=conv_model, 25 | prompt=prompt, 26 | verbose=True) 27 | 28 | cl.user_session.set("llm_chain", conv_chain) 29 | 30 | @cl.on_message 31 | async def main(message:str): 32 | llm_chain = cl.user_session.get("llm_chain") 33 | res = await llm_chain.acall(message, callbacks=[cl.AsyncLangchainCallbackHandler()]) 34 | 35 | #perform post processing on the received response here 36 | #res is a dict and the response text is stored under the key "text" 37 | await cl.Message(content=res["text"]).send() 38 | -------------------------------------------------------------------------------- /chatbot_with_memory.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "543afb58-3f11-475a-9b16-9314aee11dbe", 7 | "metadata": { 8 | "tags": [] 9 | }, 10 | "outputs": [], 11 | "source": [ 12 | "from langchain import HuggingFaceHub\n", 13 | "from langchain.chains import ConversationChain" 14 | ] 15 | }, 16 | { 17 | "cell_type": "code", 18 | "execution_count": 2, 19 | "id": "b437c299-879e-480a-891f-070f95451996", 20 | "metadata": { 21 | "tags": [] 22 | }, 23 | "outputs": [ 24 | { 25 | "name": "stdin", 26 | "output_type": "stream", 27 | "text": [ 28 | "Hugging face api key: ········\n" 29 | ] 30 | } 31 | ], 32 | "source": [ 33 | "#loading the API key\n", 34 | "import getpass\n", 35 | "import os\n", 36 | "os.environ['HUGGING_FACE_HUB_API_KEY'] = getpass.getpass('Hugging face api key:')" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 21, 42 | "id": "fa596378-f78c-4caa-b3b7-d61bf3363b9a", 43 | "metadata": { 44 | "tags": [] 45 | }, 46 | "outputs": [], 47 | "source": [ 48 | "#repo_id = 'tiiuae/falcon-7b'\n", 49 | "#repo_id = 'declare-lab/flan-alpaca-gpt4-xl'\n", 50 | "#repo_id = 'declare-lab/flan-alpaca-large'\n", 51 | "#repo_id = 'databricks/dolly-v2-3b'\n", 52 | "repo_id = 'google/flan-t5-base' #do not provide good conversational support\n", 53 | "#repo_id = 'lmsys/fastchat-t5-3b-v1.0'\n", 54 | "llm = HuggingFaceHub(huggingfacehub_api_token = os.environ['HUGGING_FACE_HUB_API_KEY'],\n", 55 | " repo_id=repo_id,\n", 56 | " model_kwargs = {'temperature': 1e-10, \"max_length\":32})\n", 57 | " " 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "execution_count": 22, 63 | "id": "5ee70c73-6e8f-4925-9df8-14112f5f191e", 64 | "metadata": { 65 | "tags": [] 66 | }, 67 | "outputs": [], 68 | "source": [ 69 | "conversation = ConversationChain(llm=llm)" 70 | ] 71 | }, 72 | { 73 | "cell_type": "code", 74 | "execution_count": 23, 75 | "id": "91d49808-dbb3-4fa7-94da-12aea82f8cee", 76 | "metadata": { 77 | "tags": [] 78 | }, 79 | "outputs": [ 80 | { 81 | "name": "stdout", 82 | "output_type": "stream", 83 | "text": [ 84 | "The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.\n", 85 | "\n", 86 | "Current conversation:\n", 87 | "{history}\n", 88 | "Human: {input}\n", 89 | "AI:\n" 90 | ] 91 | } 92 | ], 93 | "source": [ 94 | "print(conversation.prompt.template)" 95 | ] 96 | }, 97 | { 98 | "cell_type": "code", 99 | "execution_count": 24, 100 | "id": "6c36f575-b8af-44d3-973c-76e57b1cde5b", 101 | "metadata": { 102 | "tags": [] 103 | }, 104 | "outputs": [], 105 | "source": [ 106 | "from langchain.chains.conversation.memory import ConversationBufferMemory\n", 107 | "\n", 108 | "memory = ConversationBufferMemory()\n", 109 | "conversation_buf = ConversationChain(\n", 110 | " llm=llm,\n", 111 | " memory=memory)" 112 | ] 113 | }, 114 | { 115 | "cell_type": "code", 116 | "execution_count": null, 117 | "id": "59116329-ce5d-4d0c-8c67-4d4c2375e2c3", 118 | "metadata": { 119 | "tags": [] 120 | }, 121 | "outputs": [], 122 | "source": [ 123 | "conversation_buf.predict(input=\"Hi! My name is Sourav. I do have some questions for you\")" 124 | ] 125 | }, 126 | { 127 | "cell_type": "code", 128 | "execution_count": 20, 129 | "id": "a5cb5c3e-7115-49b8-b902-3b8f1c962caf", 130 | "metadata": { 131 | "tags": [] 132 | }, 133 | "outputs": [ 134 | { 135 | "data": { 136 | "text/plain": [ 137 | "'Human: Hi! My name is Sourav. I do have some questions for you AI: Human: Hi! My name is Sourav'" 138 | ] 139 | }, 140 | "execution_count": 20, 141 | "metadata": {}, 142 | "output_type": "execute_result" 143 | } 144 | ], 145 | "source": [ 146 | "query1 = \"I live in India. Who was the first President?\"\n", 147 | "conversation_buf.predict(input=query1)" 148 | ] 149 | }, 150 | { 151 | "cell_type": "code", 152 | "execution_count": 10, 153 | "id": "690f47ee-5949-41a0-b97c-007429508f82", 154 | "metadata": { 155 | "tags": [] 156 | }, 157 | "outputs": [ 158 | { 159 | "data": { 160 | "text/plain": [ 161 | "{'history': 'Human: Translate the following from English to Spanish: Hi! My name is Sourav\\nAI: Hi! Mi nombre es Sourav AI:\\nHuman: Translate the text from English to Spanish: My interest here is to explore the capabilities of LLMs and build conversation chatbots\\nAI: Mi interés aqu es explorar las capacidades de LLM y construir chatbots de conversa'}" 162 | ] 163 | }, 164 | "execution_count": 10, 165 | "metadata": {}, 166 | "output_type": "execute_result" 167 | } 168 | ], 169 | "source": [ 170 | "memory.load_memory_variables({})" 171 | ] 172 | }, 173 | { 174 | "cell_type": "code", 175 | "execution_count": 11, 176 | "id": "a4a1867a-6257-4062-b64d-7e02e02686b1", 177 | "metadata": { 178 | "tags": [] 179 | }, 180 | "outputs": [ 181 | { 182 | "data": { 183 | "text/plain": [ 184 | "'Summariza la historia AI:'" 185 | ] 186 | }, 187 | "execution_count": 11, 188 | "metadata": {}, 189 | "output_type": "execute_result" 190 | } 191 | ], 192 | "source": [ 193 | "query2 = \"Summarize the history\"\n", 194 | "conversation_buf.predict(input=query2)" 195 | ] 196 | }, 197 | { 198 | "cell_type": "code", 199 | "execution_count": 12, 200 | "id": "9b6614f7-46b7-4c3b-af62-01fc8db69e10", 201 | "metadata": { 202 | "tags": [] 203 | }, 204 | "outputs": [ 205 | { 206 | "data": { 207 | "text/plain": [ 208 | "'Human: Qué es mi nombre? AI: Qué es el nombre de mi nombre?'" 209 | ] 210 | }, 211 | "execution_count": 12, 212 | "metadata": {}, 213 | "output_type": "execute_result" 214 | } 215 | ], 216 | "source": [ 217 | "query3 = \"what is my name?\"\n", 218 | "conversation_buf.predict(input=query3)" 219 | ] 220 | }, 221 | { 222 | "cell_type": "code", 223 | "execution_count": 13, 224 | "id": "bdfc6cc5-5991-4b07-a98a-b05c9d042c4f", 225 | "metadata": {}, 226 | "outputs": [ 227 | { 228 | "data": { 229 | "text/plain": [ 230 | "'Human: Translate the following from English to Spanish: Hi! My name is Sourav\\nAI: Hi! Mi nombre es Sourav AI:\\nHuman: Translate the text from English to Spanish: My interest here is to explore the capabilities of LLMs and build conversation chatbots\\nAI: Mi interés aqu es explorar las capacidades de LLM y construir chatbots de conversa\\nHuman: Summarize the history\\nAI: Summariza la historia AI:\\nHuman: what is my name?\\nAI: Human: Qué es mi nombre? AI: Qué es el nombre de mi nombre?'" 231 | ] 232 | }, 233 | "execution_count": 13, 234 | "metadata": {}, 235 | "output_type": "execute_result" 236 | } 237 | ], 238 | "source": [ 239 | "memory.buffer" 240 | ] 241 | }, 242 | { 243 | "cell_type": "code", 244 | "execution_count": null, 245 | "id": "9904fe23-6336-4f2c-96ce-a125903eca1b", 246 | "metadata": {}, 247 | "outputs": [], 248 | "source": [] 249 | } 250 | ], 251 | "metadata": { 252 | "kernelspec": { 253 | "display_name": "Python 3 (ipykernel)", 254 | "language": "python", 255 | "name": "python3" 256 | }, 257 | "language_info": { 258 | "codemirror_mode": { 259 | "name": "ipython", 260 | "version": 3 261 | }, 262 | "file_extension": ".py", 263 | "mimetype": "text/x-python", 264 | "name": "python", 265 | "nbconvert_exporter": "python", 266 | "pygments_lexer": "ipython3", 267 | "version": "3.10.9" 268 | } 269 | }, 270 | "nbformat": 4, 271 | "nbformat_minor": 5 272 | } 273 | -------------------------------------------------------------------------------- /chatpdf.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "37567515-2921-43d4-86cd-01ea49f67215", 6 | "metadata": {}, 7 | "source": [ 8 | "## Chat PDF\n", 9 | "\n", 10 | "In this notebook we shall build a chatbot that accepts a PDF from the user, and based on the PDF answers questions asked by the user
\n", 11 | "\n", 12 | "As part of the business use case, this serves to solve the challenge of fine-tuning for specific documents as well as become generic to any PDF documents, saving cost and resources" 13 | ] 14 | }, 15 | { 16 | "cell_type": "code", 17 | "execution_count": null, 18 | "id": "d901a27e-e27c-40be-b12f-624c195bd7cd", 19 | "metadata": {}, 20 | "outputs": [], 21 | "source": [ 22 | "#!pip install langchain\n", 23 | "#!pip install huggingface-hub" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": 1, 29 | "id": "ca35b57b-8ee4-4cba-81a2-4a99918cc18f", 30 | "metadata": { 31 | "collapsed": true, 32 | "jupyter": { 33 | "outputs_hidden": true 34 | }, 35 | "tags": [] 36 | }, 37 | "outputs": [ 38 | { 39 | "name": "stdout", 40 | "output_type": "stream", 41 | "text": [ 42 | "Collecting chromadb\n", 43 | " Using cached chromadb-0.4.6-py3-none-any.whl (405 kB)\n", 44 | "Requirement already satisfied: fastapi<0.100.0,>=0.95.2 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from chromadb) (0.97.0)\n", 45 | "Requirement already satisfied: requests>=2.28 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from chromadb) (2.29.0)\n", 46 | "Collecting pulsar-client>=3.1.0\n", 47 | " Using cached pulsar_client-3.2.0-cp310-cp310-win_amd64.whl (3.4 MB)\n", 48 | "Collecting tokenizers>=0.13.2\n", 49 | " Using cached tokenizers-0.13.3-cp310-cp310-win_amd64.whl (3.5 MB)\n", 50 | "Requirement already satisfied: importlib-resources in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from chromadb) (6.0.1)\n", 51 | "Requirement already satisfied: uvicorn[standard]>=0.18.3 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from chromadb) (0.22.0)\n", 52 | "Requirement already satisfied: typing-extensions>=4.5.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from chromadb) (4.5.0)\n", 53 | "Requirement already satisfied: pydantic<2.0,>=1.9 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from chromadb) (1.10.8)\n", 54 | "Collecting chroma-hnswlib==0.7.2\n", 55 | " Using cached chroma-hnswlib-0.7.2.tar.gz (31 kB)\n", 56 | " Installing build dependencies: started\n", 57 | " Installing build dependencies: finished with status 'done'\n", 58 | " Getting requirements to build wheel: started\n", 59 | " Getting requirements to build wheel: finished with status 'done'\n", 60 | " Preparing metadata (pyproject.toml): started\n", 61 | " Preparing metadata (pyproject.toml): finished with status 'done'\n", 62 | "Collecting overrides>=7.3.1\n", 63 | " Using cached overrides-7.4.0-py3-none-any.whl (17 kB)\n", 64 | "Collecting posthog>=2.4.0\n", 65 | " Using cached posthog-3.0.2-py2.py3-none-any.whl (37 kB)\n", 66 | "Collecting pypika>=0.48.9\n", 67 | " Using cached PyPika-0.48.9-py2.py3-none-any.whl\n", 68 | "Requirement already satisfied: numpy>=1.21.6 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from chromadb) (1.24.3)\n", 69 | "Requirement already satisfied: tqdm>=4.65.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from chromadb) (4.65.0)\n", 70 | "Collecting onnxruntime>=1.14.1\n", 71 | " Using cached onnxruntime-1.15.1-cp310-cp310-win_amd64.whl (6.7 MB)\n", 72 | "Requirement already satisfied: starlette<0.28.0,>=0.27.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from fastapi<0.100.0,>=0.95.2->chromadb) (0.27.0)\n", 73 | "Requirement already satisfied: protobuf in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from onnxruntime>=1.14.1->chromadb) (4.24.0)\n", 74 | "Collecting flatbuffers\n", 75 | " Using cached flatbuffers-23.5.26-py2.py3-none-any.whl (26 kB)\n", 76 | "Collecting coloredlogs\n", 77 | " Using cached coloredlogs-15.0.1-py2.py3-none-any.whl (46 kB)\n", 78 | "Requirement already satisfied: sympy in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from onnxruntime>=1.14.1->chromadb) (1.12)\n", 79 | "Requirement already satisfied: packaging in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from onnxruntime>=1.14.1->chromadb) (23.0)\n", 80 | "Requirement already satisfied: python-dateutil>2.1 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from posthog>=2.4.0->chromadb) (2.8.2)\n", 81 | "Requirement already satisfied: six>=1.5 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from posthog>=2.4.0->chromadb) (1.16.0)\n", 82 | "Requirement already satisfied: backoff>=1.10.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from posthog>=2.4.0->chromadb) (2.2.1)\n", 83 | "Collecting monotonic>=1.5\n", 84 | " Using cached monotonic-1.6-py2.py3-none-any.whl (8.2 kB)\n", 85 | "Requirement already satisfied: certifi in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from pulsar-client>=3.1.0->chromadb) (2023.5.7)\n", 86 | "Requirement already satisfied: idna<4,>=2.5 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from requests>=2.28->chromadb) (3.4)\n", 87 | "Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from requests>=2.28->chromadb) (2.0.4)\n", 88 | "Requirement already satisfied: urllib3<1.27,>=1.21.1 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from requests>=2.28->chromadb) (1.26.16)\n", 89 | "Requirement already satisfied: colorama in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from tqdm>=4.65.0->chromadb) (0.4.6)\n", 90 | "Requirement already satisfied: h11>=0.8 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.14.0)\n", 91 | "Requirement already satisfied: click>=7.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from uvicorn[standard]>=0.18.3->chromadb) (8.1.7)\n", 92 | "Requirement already satisfied: watchfiles>=0.13 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.19.0)\n", 93 | "Requirement already satisfied: pyyaml>=5.1 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from uvicorn[standard]>=0.18.3->chromadb) (6.0)\n", 94 | "Requirement already satisfied: python-dotenv>=0.13 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from uvicorn[standard]>=0.18.3->chromadb) (1.0.0)\n", 95 | "Collecting httptools>=0.5.0\n", 96 | " Using cached httptools-0.6.0-cp310-cp310-win_amd64.whl (145 kB)\n", 97 | "Requirement already satisfied: websockets>=10.4 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from uvicorn[standard]>=0.18.3->chromadb) (11.0.3)\n", 98 | "Requirement already satisfied: anyio<5,>=3.4.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from starlette<0.28.0,>=0.27.0->fastapi<0.100.0,>=0.95.2->chromadb) (3.5.0)\n", 99 | "Collecting humanfriendly>=9.1\n", 100 | " Using cached humanfriendly-10.0-py2.py3-none-any.whl (86 kB)\n", 101 | "Requirement already satisfied: mpmath>=0.19 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from sympy->onnxruntime>=1.14.1->chromadb) (1.3.0)\n", 102 | "Requirement already satisfied: sniffio>=1.1 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from anyio<5,>=3.4.0->starlette<0.28.0,>=0.27.0->fastapi<0.100.0,>=0.95.2->chromadb) (1.2.0)\n", 103 | "Collecting pyreadline3\n", 104 | " Using cached pyreadline3-3.4.1-py3-none-any.whl (95 kB)\n", 105 | "Building wheels for collected packages: chroma-hnswlib\n", 106 | " Building wheel for chroma-hnswlib (pyproject.toml): started\n", 107 | " Building wheel for chroma-hnswlib (pyproject.toml): finished with status 'done'\n", 108 | " Created wheel for chroma-hnswlib: filename=chroma_hnswlib-0.7.2-cp310-cp310-win_amd64.whl size=151189 sha256=0d7d7d8f32896bd7f15ca083dfbf9a1009d293fdb2763d18079092da74f89295\n", 109 | " Stored in directory: c:\\users\\sourav\\appdata\\local\\pip\\cache\\wheels\\11\\2b\\0d\\ee457f6782f75315bb5828d5c2dc5639d471afbd44a830b9dc\n", 110 | "Successfully built chroma-hnswlib\n", 111 | "Installing collected packages: tokenizers, pyreadline3, pypika, monotonic, flatbuffers, pulsar-client, overrides, humanfriendly, httptools, chroma-hnswlib, posthog, coloredlogs, onnxruntime, chromadb\n", 112 | " Attempting uninstall: tokenizers\n", 113 | " Found existing installation: tokenizers 0.11.4\n", 114 | " Uninstalling tokenizers-0.11.4:\n", 115 | " Successfully uninstalled tokenizers-0.11.4\n", 116 | "Successfully installed chroma-hnswlib-0.7.2 chromadb-0.4.6 coloredlogs-15.0.1 flatbuffers-23.5.26 httptools-0.6.0 humanfriendly-10.0 monotonic-1.6 onnxruntime-1.15.1 overrides-7.4.0 posthog-3.0.2 pulsar-client-3.2.0 pypika-0.48.9 pyreadline3-3.4.1 tokenizers-0.13.3\n", 117 | "Requirement already satisfied: sentence-transformers in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (2.2.2)\n", 118 | "Requirement already satisfied: scikit-learn in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from sentence-transformers) (1.3.0)\n", 119 | "Requirement already satisfied: huggingface-hub>=0.4.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from sentence-transformers) (0.14.1)\n", 120 | "Requirement already satisfied: nltk in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from sentence-transformers) (3.8.1)\n", 121 | "Requirement already satisfied: numpy in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from sentence-transformers) (1.24.3)\n", 122 | "Requirement already satisfied: transformers<5.0.0,>=4.6.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from sentence-transformers) (4.29.2)\n", 123 | "Requirement already satisfied: torch>=1.6.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from sentence-transformers) (2.0.1)\n", 124 | "Requirement already satisfied: sentencepiece in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from sentence-transformers) (0.1.99)\n", 125 | "Requirement already satisfied: scipy in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from sentence-transformers) (1.11.2)\n", 126 | "Requirement already satisfied: tqdm in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from sentence-transformers) (4.65.0)\n", 127 | "Requirement already satisfied: torchvision in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from sentence-transformers) (0.15.2)\n", 128 | "Requirement already satisfied: requests in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from huggingface-hub>=0.4.0->sentence-transformers) (2.29.0)\n", 129 | "Requirement already satisfied: typing-extensions>=3.7.4.3 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from huggingface-hub>=0.4.0->sentence-transformers) (4.5.0)\n", 130 | "Requirement already satisfied: fsspec in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from huggingface-hub>=0.4.0->sentence-transformers) (2023.4.0)\n", 131 | "Requirement already satisfied: pyyaml>=5.1 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from huggingface-hub>=0.4.0->sentence-transformers) (6.0)\n", 132 | "Requirement already satisfied: filelock in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from huggingface-hub>=0.4.0->sentence-transformers) (3.9.0)\n", 133 | "Requirement already satisfied: packaging>=20.9 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from huggingface-hub>=0.4.0->sentence-transformers) (23.0)\n", 134 | "Requirement already satisfied: sympy in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from torch>=1.6.0->sentence-transformers) (1.12)\n", 135 | "Requirement already satisfied: jinja2 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from torch>=1.6.0->sentence-transformers) (3.1.2)\n", 136 | "Requirement already satisfied: networkx in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from torch>=1.6.0->sentence-transformers) (3.1)\n", 137 | "Requirement already satisfied: colorama in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from tqdm->sentence-transformers) (0.4.6)\n", 138 | "Requirement already satisfied: tokenizers!=0.11.3,<0.14,>=0.11.1 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from transformers<5.0.0,>=4.6.0->sentence-transformers) (0.13.3)\n", 139 | "Requirement already satisfied: regex!=2019.12.17 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from transformers<5.0.0,>=4.6.0->sentence-transformers) (2022.7.9)\n", 140 | "Requirement already satisfied: click in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from nltk->sentence-transformers) (8.1.7)\n", 141 | "Requirement already satisfied: joblib in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from nltk->sentence-transformers) (1.2.0)\n", 142 | "Requirement already satisfied: threadpoolctl>=2.0.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from scikit-learn->sentence-transformers) (3.2.0)\n", 143 | "Requirement already satisfied: pillow!=8.3.*,>=5.3.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from torchvision->sentence-transformers) (9.4.0)\n", 144 | "Requirement already satisfied: MarkupSafe>=2.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from jinja2->torch>=1.6.0->sentence-transformers) (2.1.1)\n", 145 | "Requirement already satisfied: idna<4,>=2.5 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from requests->huggingface-hub>=0.4.0->sentence-transformers) (3.4)\n", 146 | "Requirement already satisfied: urllib3<1.27,>=1.21.1 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from requests->huggingface-hub>=0.4.0->sentence-transformers) (1.26.16)\n", 147 | "Requirement already satisfied: certifi>=2017.4.17 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from requests->huggingface-hub>=0.4.0->sentence-transformers) (2023.5.7)\n", 148 | "Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from requests->huggingface-hub>=0.4.0->sentence-transformers) (2.0.4)\n", 149 | "Requirement already satisfied: mpmath>=0.19 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from sympy->torch>=1.6.0->sentence-transformers) (1.3.0)\n" 150 | ] 151 | } 152 | ], 153 | "source": [ 154 | "!pip install chromadb\n", 155 | "!pip install sentence-transformers" 156 | ] 157 | }, 158 | { 159 | "attachments": { 160 | "6d0b87de-4c0b-410b-8409-72abce4ffd1b.png": { 161 | "image/png": "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AAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCABAAAAAAAAAAAERCBh1LimhjMVKj3TqKvOGAAAAAAAAAAAhtof/ZvBKXc5f94pjHBfH9bKJ3ar2nnZJUZZv85Vyp3Oy2HVqIKM1cqpc1526t8yuvenaf5et1EKUXxavg48Fmm/gUG7eqFKhUUfqOSMW+7LHda40EnRiohZqL0bHlG4NQYj0qk8Td10zHnhbaF2V6ZrnvMKAAAAAAAAQB9MneoUurtFnkgIU9Td0XJ1DhM0bqzzlo+GQxmampDQ67DyUKMzdTCM1bgwr2WLmqxQ552+69BXF80ggl2uvhjM5ft+az+VpyXPbFbO+zWdQQRT++V663Wb83p06lBtSZ5SM1Yr+5QzaqTqcKtw12atXJWnMmdUn4wd63XcD/T4AgAAAAAAANCbWySQMEeZb+/R8c5ho5Jvd94adpOVvMlr2f7LQk133um7ECUkrlR8mHmn/BxlzZ/jjMfg1GrPnmNytxnb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4AhMWybyKxnLER/W89LY8NmbULxjFVbIe7Qprsj9FvfaRxOR8UaedSWCZHGPNR9nFOJl+rhyEoI6kj4GzsQvUiYhXFwTv+ERSFrUiT2u7pgk8hl5pjTWHJdlOibyQY+KfMjv87DStqDc3fjcDfk6l3XRvvoFBJjyX+HR4y1agIv8t8VQFOHGoS09qTddj87g5Y1B8q+4N3uqdXtQ3LN4J9v2OU1P9ybPehq7Vs70XGG3DCMuPaO5cd8KnYkt2duRsWSSVZjRjm++eBbZ7dl5oSw5nf9wR8A4rMxoI42clYgtby1vs5DfNAGzs4XUpqFMO6cSwTHLY8vDO3YqESS/uFUi3z/DfP218DZD5M3F8+n0cWrelx7AE/flLuN6eYvLZUOucrkMwxN6WLliW4YMxG/n+mDzD/rjfmempuw/AMtmD0LOPf0xUdygOnwe+4tLI/5UX72JU9/exD9E+J4YPADZs4f0/kqENvTaHglERETUR9UXInnxRhysC0H88+lYF2v7ZCu7Fu9AyoadKKm304qZ6JbgRAtgIiIiIiJyW3u9J24Zt1qPBCIiIuqbaouKcVCOahc6AdNbVSJI3ggc+wDGGyeq81RPOCIiIiIiIqI+ihUJRERE1DtVGvD+ybrWQyNok6Tl4MCn8kU4xkfcmkNlEREREREREXUVViQQERFRrxL46FysuFsOzlmOzGdm4YfTH8fUJ5fqS8LjuDduFuZvLUalNo5nMpIsJsciIiIiIiIiIuexIoGIiIh6F69wJGXIycr1yfjCB38Nw5kKfalswrBRUZi25Nc49FYWMtqb0JqIiIiIiIiI2sXJlomIiIiIiIiIiIiIiJMtExERERERERERERGR81iRQEREREREREREREREDrEigYiIiIiIiIiIiIiIHGJFAhEREREREREREREROcSKBCIiIiIiIiIiIiIicogVCURERERERERERERE5BArEoiIiIiIiIiIiIiIyCFWJBARERERERERERERkUOsSCAiIiIiIiIiIiIiIodYkdDVWlrw4elmfFh3U22gPueb6zh6+hpOfaNe34r6wjESuYr3AepFLv39GvZ9fh2XbqgNRERERERE1Cf1uymodbOzZ9VK73Tq2LeIO30T9432waEJA9TWDmhuRtJ28cCM/shcNBgzvdV2j7mOV3KasOlbsdq/H9bMGoJlQ/V3eruK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TsLcebKQtxElW1Ox4NV3UXbRPDFuU30Vyo7uwdqVG5F9Tm10SwBix8ZoheXn925B8ntVaBLrTbVlyH4+CYkHqhA5Olz7pKf4xc5E/Gi5Vo7N69cg+2SNaW6IpnOFWPvMamSeFi+CZ2DpdL2Au7u4s6+RYeGqEiIHa9R5xZUqHHw1BfOzyh32cDDxDcMYbW7kGmRnbkRuZaP+P9pVh0u11pMpN1W/i+d+m4MSsR46Kx7xo/TtRt23r0RERERERERERETu63dTUOtmZ8+qlR7u3B4sWLwFJZiBLUXJmKw2t6mlAtmrU5FWUqc22BOBlbvSkXCHeinkp8ci8QAQvWw7dmqVEdaM72P6epxNidE3SvL3UlPs9jwIjVuFN6NP4YHn97f+njsq9yFx/SvIr1avbQVEYeWLm5DQxiQQlbtTELe13LP7ZY+r+9piwOZfJukVDTb87p6DFREVWLuj7f1vOJaBx1bvh73OENo8GpbzZJjCms5veBiC/MXKlcswVOthKTT2aaSvnolw27kfunpfHRH/Y6T4Hx3+PBEREREREREREfUtI0eqFWt9b7JlrzAkpO1GweonMC0qDKEBajsCEDoqCnOWrcKhPOtKBLdov5eJjFlRpt8KDI5C/OrtOLRyEoI6MuGws0JnYkv2dmQsmYTY0BF6a3ghMDgCk+evQsHutisRupSr++oVjhW/y8TKuAiL8xqBactexl8yliM+zP48BZb8JiTjnTd+jaQJ5v/RvgAEis82XKyA4YxY6n0QHjUFKzeI6/m8nUoEqdv2lYiIiIiIiIiIiMh9fa9HApErboWwxh4JRERERERERERE1Bb2SCAiIiIiIiIiIiIiImexIoGIiIiIiIiIiIiIiBy6RSoSirH5yaWYalo2IueCeouojzp/YKNFnBBLVrF6h4iIiIiIiIiIiKjjbpGKhDpUyolvTctlNDWrt4j6qKYrly3ihFiq69Q7RERERERERERERB3XuydbJiIiIiIiIiIiIiIiz+Bky0RERERERERERERE5CxWJBARERERERERERERkUOsSCAiIiIiIiIiIiIiIodYkUBERERERERERERERA6xIoGIiIiIiIiIiIiIiBxiRQIRERERERERERERETnEigQiIiIiIiIiIiIiInKIFQlEREREREREREREROQQKxKIiIiIiIiIiIiIiMghViQQEREREREREREREZFDrEggIiIiIiIiIiIiIiKHWJFAREREREREREREREQOsSKBiIiIiIiIiIiIiIgcYkUCERERERERERERERE5xIoEIiIiIiIiIiIiIiJyiBUJRERERERERERERETkECsSiIiIiIiIiIiIiIjIIVYkEBERERERERERERGRQ6xIICIiIiIiIiIiIiIih1iRQEREREREREREREREDrEigYiIiIiIiIiIiIiIHGJFAhEREREREREREREROcSKBCIiIiIiIiIiIiIicogVCURERERERERERERE5BArEoiIiIiIiIiIiIiIyCFWJBARERERERERERERkUOsSCAiIiIiIiIiIiIiIodYkUBERERERERERERERA6xIoGIiIiIiIiIiIiIiBxiRQIRERERERERERERETnEigQiIiIiIiIiIiIiInKIFQlEREREREREREREROQQKxKIiIiIiIiIiIiIiMghViQQEREREREREREREZFDrEggIiIiIiIiIiIiIiKHWJFAREREREREREREREQOsSKBiIiIiIiIiIiIiIgcYkUCERERERERERERERE5xIoEIiIiIiIiIiIiIiJyiBUJRERERERERERERETkECsSiIiIiIiIiIiIiIjIIVYkEBERERERERERERGRQ6xIICIiIiIiIiIiIiIih1iRQD1K7ZkTOFhSgdoWtYGos9VVoOjoCRjq1OtO14zKk4U4eLIKTWoLERFRz6Tfs279+xbvzUTUe/CZuQ3NVTh+tBDHq5vVBiIi8qR+NwW1bnb2rFoh6oBze7Bg8RaUYAa2FCVjstrsrIajGxGzoRANYj101gt456lx8NPfIuocjYVInr8RB+vFevAMbHs9GbG++ludxbAjCVO3GcSaL6KTMrFzdoj+BnUf8cCRn7cHewrLUVZZo6VB8B+B8OERiN/4LOYEap+iW0Tl7hTEbS0Hpq/H2ZQYtZWoNyrG2tg1yEEEVr6VjoS71GYPMt+zpJ5436pCdsoipIkobc25c+LMvTk/PRaJB4DoZduxc17XnAtTumWjK/eBqCNcjx+eict9QVc8M/fevFIFMpcvxebTYtVfhJ0Mhh0iIpeNHKlWrLFHgrMuFiMzLRVTV+9Bpdp0K5CZhZGxsR1eFuyuUt/0nMqqKr0AT66fq8IltU7Uaar/hi9kJYK2XoXKWrXeaRrxxZfGAplG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LS3LfCnKK6VMThrWQnnlPB8lAO8NVMi6R7y+95XnRuYrURfqTCK4xMnrETFFBtqPVsuBXsBluZROax9re+mjde6Knoa6U5SJz2qTCJJP6FBEGI5bVLw9WiF/tkn+cIM2TecKV9p1puM0QaKe8/TTxUREra9dPpFARNSm7pYhPT4Jq88AYXFr8eHkIOUOGVO3Lx1A0uLfY1+1aADbfMKIiNqllu4qJw8zuWMz/E0ULx/nNcu2EHkD+TTESwtzcFkZdF2GGC+Jj0Ats/oUDNE9pM3TOdt1RES28YkEIiInlf4J2cra10MRPbb5JILUqd9ovPC4ut1w13vXHSUiuufI9ckPGuIw9EXsWE4iEJmpP4bVGTlKjLWQsRM4iUBERERETuFEAhGR3crwWaEWWM+UFvwyo0j+0BljHr/vFx8jImp9NXsRPyMOvxoficiVBajwDcKYhAVIfkr7PdF97w7qzuzFfLl+vHxi8qlZWDpNP4w8EREREVFLOJFARNSSp8ZhXqR8xLYW+1ZNw4DnxiNyRhxeUl7TEPpcJCKX56CkvivCJi/Asue4OCYRUau7cwfXDOsnyzgFmelIsxnfgug+IYOPRkSIVyRC576H7IpG+ARGYeXCCW6O40JERERE9xNOJBARtcgPY5IzkL98lhLwNNgfxgBgZRev48eBchBLBmndiW1xQ40B6YiIqBX1m4BthYUo3roWG98Yh2d6dNR+QUQqNdB19BtrcPiD+NYPSE5ERERE9zQGWyYiIiIiIiIiIiIiIgZbJiIiIiIiIiIiIiIix3EigYiIiIiIiIiIiIiIrOJEAhERERERERERERERWeVSjIR917prW0REREREZGpM92vaFhERERERUTvBGAlEREREREREREREROQoTiQQEREREREREREREZFVnEggIiIiIiIiIiIiIiKrOJFARERERERERERERERWcSKBiIiIiIiIiIiIiIis4kQC3Ru+vYAzRUWo/lb7mTyrPV0Pph0ionvAbdSezsPJ05X4QdtDRERERERE7vMP/y1o200qK7UN2/Zd665tEXnQ3/OQOXs+TjaI7d4TMXdlMgb/RP1Vc5U4vCgKu89oPxqF4pX3MjDCX/uxDZV88Dg2fQr0n5aDxKgAba8LqrdgzZurcQETMXNvMkK03W3GK67HEewYl4CjLf0/Dh3rfcDTacch3pGX6yv2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hdjRIp321MoYWe4MFWWuvIavjzDmu/ase8BE5Xya5kWl3uoXjqcnLcUCUcZaTiJI3R5qyqNPP9FUzsincgb9TIvtJHT3gqADg18W13HaNPV79hSl8CVRR4p68k6XUIT8Rn7HLLdMIhAREREREd1L2ukTCURE7UNldgzW7TgNPDEXif8WB3/LRw6+r8TnHyRia6F8oknniRYiImq3+EQCERERERG1O3wigYiorZ3EXwrV5WwGRUxsPokg/TgAv/z5k+p2A8zWJCciIiIiIiIiIvIGnEggImoDlacLUKsTZFkJZv3JYWX7wYgntQDkRERERERERERE3oNLGxERtaJrhfOx/r08Y1Boue7/T7XAGD9cP49aLQizz+A4THtrLgY3BU8gIqJ2jksbERERERFRu2NlaSNOJBARtbIfao6g8OABnLlYif+oqJQrGCke7DkA/gFPYPCvJiJiaAD0Vj4iIqL2ixMJRERERETU7nAigYiIiIio7XAigYiIiIiI2h0GWyYiIiIiIiIiIiIiIkdxIoGIiIiIiIiIiIiIiKziRAIREREREREREREREVnlUowEIiIiIiIiIiIiIiK6RzBGAhEREREREREREREROYoTCUREREREREREREREZBUnEoiIiIiIiIiIiIiIyCpOJBARERERERERERERkVWcSCAiIiIiIiIiIiIiIqs4kUBE3uNOFb44UoAvqu9oO4iI6L7CeqB13ChH4ZETKLuh/XyvYvrxLrwe94y6iyew73g56u5qO4juYUzvROSUuzdQdrwAhRfv7QY3JxLIs4rSEBAR0fy19pj2B845tFb9f6bsrNL2UMuOYbFy/hOQeUnb1abKkR4/DZOXp2Dy3KSWj+GeTzuevh4OaqXr0SbuVOHQzncxPXYSnjQc99hJeGnGu8iu0/7mPsGyszW0s7zsNMP3tHyl4ZD2Fy1zoB64tAtTHP7/2xs3pZ3GAsS/Gofpy+fjpfg0FDZq+92unbUjqJW17+tRsTNBLcPaQzumlTUcScGIGfMRnxyHyekn0KDtv39VITNBlnWWr5bLPmO6snix3eU9Go6nYTLTezvjjjaoA+6LNmhL7pf+jSMaUZiegJeSUzB9RgIWH2+1BrfHuWUiwVqFaP5qnsmsvS90qujsrNqFQ9buXrEyYPXkxDhMWZiJ7BZnf+6gomgX5ifF4Vdjm95r6zOd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3XJkJiUg9VSj8qNPryGIGDUME8JH45l+Jo8nEBERERERERERERGRd7KytJF7JhKku7U4tHkj3j94DGUmwZblpMLYuHgkP9cXnbR9RERERERERERERETkZVp9IsHg7h1cPncMhw4dRvbxYlQokwqdETZzLbZNDFL+hIiIiIiIiIiIiIiIvEybTSSYunMD+9ITEJ9bBfhGYeOeeIzsoP2OiIiIiIiIiIiIiIi8h5WJBLcEW7aqY1eMiRqFMLldX4XLV5S9RERERERERERERETUTrhlIqEsfxeyT5Wjrq4Rt7V90u0rZcjakYfj8oeBIXimt7KbiIiIiIiIiIiIiIjaCbcsbXRobQRm5Wo/6PEdgnm/W445AztrO4iIiIiIiIiIiIiIyKu05tJGDwdFYUxoEIL9u2p7pM7oExiKMdPfxv6P1nISgYiIiIiIiIiIiIioHWrdYMtERERERERERERERNQ+eCTYMhERERERERERERERtWucSCAiIiIiIiIiIiIiIqs4kUBERERERERERERERFZxIoGIiIiIiIiIiIiIiKziRAIREREREREREREREVnFiQQiIiIiIiIiIiIiIrKKEwlERERERERERERERGQVJxKIiIiIiIiIiIiIiMiqf/hvQdsmIiIiIiIiIiIiIiIywycSiIiIiIiIiIiIiIjICuD/B4JQY6dRNZH5AAAAAElFTkSuQmCC" 162 | } 163 | }, 164 | "cell_type": "markdown", 165 | "id": "932b767c-4b7c-404a-b87b-07c2d326818c", 166 | "metadata": {}, 167 | "source": [ 168 | "![image.png](attachment:6d0b87de-4c0b-410b-8409-72abce4ffd1b.png)\n", 169 | "\n", 170 | "sometimes you might face issues as above when installing chromadb due to missing hnswlib
\n", 171 | "you need to install visual studio build tools for the purpose: check the solution here\n", 172 | "[https://stackoverflow.com/questions/73969269/error-could-not-build-wheels-for-hnswlib-which-is-required-to-install-pyprojec]" 173 | ] 174 | }, 175 | { 176 | "cell_type": "code", 177 | "execution_count": 2, 178 | "id": "69faa997-ada8-4ea0-a0bd-8212e97dd132", 179 | "metadata": { 180 | "tags": [] 181 | }, 182 | "outputs": [ 183 | { 184 | "name": "stdout", 185 | "output_type": "stream", 186 | "text": [ 187 | "Requirement already satisfied: pypdf in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (3.15.2)\n" 188 | ] 189 | } 190 | ], 191 | "source": [ 192 | "!pip install pypdf" 193 | ] 194 | }, 195 | { 196 | "cell_type": "markdown", 197 | "id": "77e657d5-de38-4d9d-aae0-8e9974153c42", 198 | "metadata": {}, 199 | "source": [ 200 | "Building a PDF Chatbot using Langchain requires the following\n", 201 | "\n", 202 | "* Document loader: to load various data formats and create document objects (here PDF)\n", 203 | "* Chunking: chunking the documents using text splitters\n", 204 | "* Embedding: embedding the chunks to generate vectors\n", 205 | "* vector store: for storing and indexing vector documents (here we shall use Chroma db)\n", 206 | "* LLM: language model for question answering and summarizing\n", 207 | "* Document Retriever: that retrieves the relevant chunk(s) based on the query from the PDF document " 208 | ] 209 | }, 210 | { 211 | "cell_type": "markdown", 212 | "id": "4ea41d6a-ce8d-4e63-a350-6ea91fa19d07", 213 | "metadata": {}, 214 | "source": [ 215 | "### Importing libraries" 216 | ] 217 | }, 218 | { 219 | "cell_type": "code", 220 | "execution_count": 3, 221 | "id": "85a29a16-a8f2-4a29-8a5a-4cc2552d6954", 222 | "metadata": { 223 | "tags": [] 224 | }, 225 | "outputs": [], 226 | "source": [ 227 | "import os\n", 228 | "import getpass\n", 229 | "\n", 230 | "from langchain.document_loaders import PyPDFLoader #document loader: https://python.langchain.com/docs/modules/data_connection/document_loaders\n", 231 | "from langchain.text_splitter import RecursiveCharacterTextSplitter #document transformer: text splitter for chunking\n", 232 | "from langchain.embeddings import HuggingFaceEmbeddings\n", 233 | "from langchain.vectorstores import Chroma #vector store\n", 234 | "from langchain import HuggingFaceHub #model hub\n", 235 | "from langchain.chains import RetrievalQA" 236 | ] 237 | }, 238 | { 239 | "cell_type": "code", 240 | "execution_count": 4, 241 | "id": "b9d921f5-bb62-4ebf-96f8-b23860b93420", 242 | "metadata": { 243 | "tags": [] 244 | }, 245 | "outputs": [ 246 | { 247 | "name": "stdout", 248 | "output_type": "stream", 249 | "text": [ 250 | "Hugging face api key: ········\n" 251 | ] 252 | } 253 | ], 254 | "source": [ 255 | "#loading the API key\n", 256 | "os.environ['HUGGING_FACE_HUB_API_KEY'] = getpass.getpass('Hugging face api key:')" 257 | ] 258 | }, 259 | { 260 | "cell_type": "code", 261 | "execution_count": 24, 262 | "id": "9747c679-a4c2-4191-a87d-a7f27c73825a", 263 | "metadata": { 264 | "collapsed": true, 265 | "jupyter": { 266 | "outputs_hidden": true 267 | }, 268 | "tags": [] 269 | }, 270 | "outputs": [ 271 | { 272 | "name": "stdout", 273 | "output_type": "stream", 274 | "text": [ 275 | "Requirement already satisfied: gradio in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (3.40.1)\n", 276 | "Requirement already satisfied: pillow<11.0,>=8.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (9.4.0)\n", 277 | "Requirement already satisfied: aiofiles<24.0,>=22.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (23.2.1)\n", 278 | "Requirement already satisfied: uvicorn>=0.14.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (0.22.0)\n", 279 | "Requirement already satisfied: altair<6.0,>=4.2.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (5.0.1)\n", 280 | "Requirement already satisfied: python-multipart in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (0.0.6)\n", 281 | "Requirement already satisfied: matplotlib~=3.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (3.7.2)\n", 282 | "Requirement already satisfied: semantic-version~=2.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (2.10.0)\n", 283 | "Requirement already satisfied: packaging in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (23.0)\n", 284 | "Requirement already satisfied: importlib-resources<7.0,>=1.3 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (6.0.1)\n", 285 | "Requirement already satisfied: ffmpy in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (0.3.1)\n", 286 | "Requirement already satisfied: httpx in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (0.24.1)\n", 287 | "Requirement already satisfied: orjson~=3.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (3.9.5)\n", 288 | "Requirement already satisfied: markupsafe~=2.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (2.1.1)\n", 289 | "Requirement already satisfied: markdown-it-py[linkify]>=2.0.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (2.2.0)\n", 290 | "Requirement already satisfied: jinja2<4.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (3.1.2)\n", 291 | "Requirement already satisfied: pandas<3.0,>=1.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (1.5.3)\n", 292 | "Requirement already satisfied: numpy~=1.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (1.24.3)\n", 293 | "Requirement already satisfied: pyyaml<7.0,>=5.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (6.0)\n", 294 | "Requirement already satisfied: mdit-py-plugins<=0.3.3 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (0.3.3)\n", 295 | "Requirement already satisfied: aiohttp~=3.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (3.8.5)\n", 296 | "Requirement already satisfied: websockets<12.0,>=10.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (11.0.3)\n", 297 | "Requirement already satisfied: huggingface-hub>=0.14.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (0.14.1)\n", 298 | "Requirement already satisfied: fastapi in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (0.97.0)\n", 299 | "Requirement already satisfied: typing-extensions~=4.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (4.5.0)\n", 300 | "Requirement already satisfied: gradio-client>=0.4.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (0.4.0)\n", 301 | "Requirement already satisfied: requests~=2.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (2.29.0)\n", 302 | "Requirement already satisfied: pydub in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (0.25.1)\n", 303 | "Requirement already satisfied: pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,<3.0.0,>=1.7.4 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio) (1.10.8)\n", 304 | "Requirement already satisfied: multidict<7.0,>=4.5 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from aiohttp~=3.0->gradio) (6.0.2)\n", 305 | "Requirement already satisfied: aiosignal>=1.1.2 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from aiohttp~=3.0->gradio) (1.2.0)\n", 306 | "Requirement already satisfied: attrs>=17.3.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from aiohttp~=3.0->gradio) (22.1.0)\n", 307 | "Requirement already satisfied: async-timeout<5.0,>=4.0.0a3 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from aiohttp~=3.0->gradio) (4.0.2)\n", 308 | "Requirement already satisfied: yarl<2.0,>=1.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from aiohttp~=3.0->gradio) (1.8.1)\n", 309 | "Requirement already satisfied: charset-normalizer<4.0,>=2.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from aiohttp~=3.0->gradio) (2.0.4)\n", 310 | "Requirement already satisfied: frozenlist>=1.1.1 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from aiohttp~=3.0->gradio) (1.3.3)\n", 311 | "Requirement already satisfied: toolz in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from altair<6.0,>=4.2.0->gradio) (0.12.0)\n", 312 | "Requirement already satisfied: jsonschema>=3.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from altair<6.0,>=4.2.0->gradio) (4.17.3)\n", 313 | "Requirement already satisfied: fsspec in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from gradio-client>=0.4.0->gradio) (2023.4.0)\n", 314 | "Requirement already satisfied: filelock in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from huggingface-hub>=0.14.0->gradio) (3.9.0)\n", 315 | "Requirement already satisfied: tqdm>=4.42.1 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from huggingface-hub>=0.14.0->gradio) (4.65.0)\n", 316 | "Requirement already satisfied: mdurl~=0.1 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from markdown-it-py[linkify]>=2.0.0->gradio) (0.1.2)\n", 317 | "Requirement already satisfied: linkify-it-py<3,>=1 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from markdown-it-py[linkify]>=2.0.0->gradio) (2.0.2)\n", 318 | "Requirement already satisfied: kiwisolver>=1.0.1 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from matplotlib~=3.0->gradio) (1.4.4)\n", 319 | "Requirement already satisfied: python-dateutil>=2.7 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from matplotlib~=3.0->gradio) (2.8.2)\n", 320 | "Requirement already satisfied: contourpy>=1.0.1 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from matplotlib~=3.0->gradio) (1.1.0)\n", 321 | "Requirement already satisfied: pyparsing<3.1,>=2.3.1 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from matplotlib~=3.0->gradio) (3.0.9)\n", 322 | "Requirement already satisfied: cycler>=0.10 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from matplotlib~=3.0->gradio) (0.11.0)\n", 323 | "Requirement already satisfied: fonttools>=4.22.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from matplotlib~=3.0->gradio) (4.42.1)\n", 324 | "Requirement already satisfied: pytz>=2020.1 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from pandas<3.0,>=1.0->gradio) (2022.7)\n", 325 | "Requirement already satisfied: certifi>=2017.4.17 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from requests~=2.0->gradio) (2023.5.7)\n", 326 | "Requirement already satisfied: urllib3<1.27,>=1.21.1 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from requests~=2.0->gradio) (1.26.16)\n", 327 | "Requirement already satisfied: idna<4,>=2.5 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from requests~=2.0->gradio) (3.4)\n", 328 | "Requirement already satisfied: click>=7.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from uvicorn>=0.14.0->gradio) (8.1.7)\n", 329 | "Requirement already satisfied: h11>=0.8 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from uvicorn>=0.14.0->gradio) (0.14.0)\n", 330 | "Requirement already satisfied: starlette<0.28.0,>=0.27.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from fastapi->gradio) (0.27.0)\n", 331 | "Requirement already satisfied: sniffio in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from httpx->gradio) (1.2.0)\n", 332 | "Requirement already satisfied: httpcore<0.18.0,>=0.15.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from httpx->gradio) (0.17.3)\n", 333 | "Requirement already satisfied: colorama in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from click>=7.0->uvicorn>=0.14.0->gradio) (0.4.6)\n", 334 | "Requirement already satisfied: anyio<5.0,>=3.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from httpcore<0.18.0,>=0.15.0->httpx->gradio) (3.5.0)\n", 335 | "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio) (0.18.0)\n", 336 | "Requirement already satisfied: uc-micro-py in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from linkify-it-py<3,>=1->markdown-it-py[linkify]>=2.0.0->gradio) (1.0.2)\n", 337 | "Requirement already satisfied: six>=1.5 in c:\\users\\sourav\\anaconda3\\envs\\genai\\lib\\site-packages (from python-dateutil>=2.7->matplotlib~=3.0->gradio) (1.16.0)\n" 338 | ] 339 | } 340 | ], 341 | "source": [ 342 | "!pip install gradio" 343 | ] 344 | }, 345 | { 346 | "cell_type": "markdown", 347 | "id": "9c834111-bee0-47fc-b0ae-24a8b79142f5", 348 | "metadata": {}, 349 | "source": [ 350 | "### Reading PDF and creating vector store" 351 | ] 352 | }, 353 | { 354 | "cell_type": "code", 355 | "execution_count": 32, 356 | "id": "867bc8b1-bb7f-4e03-8a8c-0fa8f7c01c3a", 357 | "metadata": { 358 | "tags": [] 359 | }, 360 | "outputs": [ 361 | { 362 | "name": "stdout", 363 | "output_type": "stream", 364 | "text": [ 365 | "Enter PDF file path: pdf_files\\Linear_Regression.pdf\n" 366 | ] 367 | } 368 | ], 369 | "source": [ 370 | "path = input(\"Enter PDF file path: \")#\"C:/Users/Sourav/Downloads/Naïve Bayes.pdf\"\n", 371 | "loader = PyPDFLoader(path)\n", 372 | "pages = loader.load()" 373 | ] 374 | }, 375 | { 376 | "cell_type": "code", 377 | "execution_count": 33, 378 | "id": "ee346ca7-683c-4ba6-8f60-fe94c289f3a7", 379 | "metadata": { 380 | "tags": [] 381 | }, 382 | "outputs": [ 383 | { 384 | "data": { 385 | "text/plain": [ 386 | "6" 387 | ] 388 | }, 389 | "execution_count": 33, 390 | "metadata": {}, 391 | "output_type": "execute_result" 392 | } 393 | ], 394 | "source": [ 395 | "#number of pages\n", 396 | "len(pages)" 397 | ] 398 | }, 399 | { 400 | "cell_type": "code", 401 | "execution_count": 34, 402 | "id": "95bb624f-dbfb-40fe-9eb4-e8b4d0a4c5be", 403 | "metadata": { 404 | "tags": [] 405 | }, 406 | "outputs": [ 407 | { 408 | "data": { 409 | "text/plain": [ 410 | "Document(page_content='Linear Regression \\nWhat is Linear Regression? \\n\\uf0b7 Models the relationship between two variables. \\n\\uf0b7 Mathematically: 𝑦=𝑚𝑥+𝑐 \\n\\uf0b7 \\nLinear Regression in Machine Learning: \\n\\uf0b7 Based on Supervised Learning. \\n\\uf0b7 Models target prediction based on independent variables. \\n\\uf0b7 Here in the function , 𝑌=𝑀𝑋+𝐶 Y and X are vectors . \\n\\uf0b7 M and C known as coefficient of X and intercept respectively. \\n\\uf0b7 Best value of M and C gives the best model \\n\\uf0b7 And Cost function helps in estimating the best value. \\nWhy using Linear Regression ? \\n\\uf0b7 It is m ore versatile and has wide applicability. \\no It tells what features are statistically important or not. \\no It allows to understand the relation between different variables. \\no One can get the confidence inter val for each regression coefficient that it estimates. \\n\\uf0b7 It is quite simple and easy to interpret. \\n\\uf0b7 It gives better understanding of statistical inference and the overall model. \\nGeometrical Intu ition of Linear Regression: \\n\\uf0b7 Representation of 2 -d dataset in linear regression model : \\n', metadata={'source': 'pdf_files\\\\Linear_Regression.pdf', 'page': 0})" 411 | ] 412 | }, 413 | "execution_count": 34, 414 | "metadata": {}, 415 | "output_type": "execute_result" 416 | } 417 | ], 418 | "source": [ 419 | "pages[0]" 420 | ] 421 | }, 422 | { 423 | "cell_type": "code", 424 | "execution_count": 35, 425 | "id": "bf5a1b28-166b-4319-825c-8a165d6b7e6d", 426 | "metadata": { 427 | "tags": [] 428 | }, 429 | "outputs": [], 430 | "source": [ 431 | "splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=20)\n", 432 | "docs = splitter.split_documents(pages)" 433 | ] 434 | }, 435 | { 436 | "cell_type": "code", 437 | "execution_count": 37, 438 | "id": "b8669a5c-a046-4e2c-98b5-9a50967bb11a", 439 | "metadata": { 440 | "tags": [] 441 | }, 442 | "outputs": [ 443 | { 444 | "data": { 445 | "text/plain": [ 446 | "13" 447 | ] 448 | }, 449 | "execution_count": 37, 450 | "metadata": {}, 451 | "output_type": "execute_result" 452 | } 453 | ], 454 | "source": [ 455 | "len(docs)" 456 | ] 457 | }, 458 | { 459 | "cell_type": "code", 460 | "execution_count": 38, 461 | "id": "bee4bbba-76c7-4a5c-b829-b2a0893da806", 462 | "metadata": { 463 | "tags": [] 464 | }, 465 | "outputs": [ 466 | { 467 | "name": "stdout", 468 | "output_type": "stream", 469 | "text": [ 470 | "2023-08-22 13:35:21 - Load pretrained SentenceTransformer: sentence-transformers/all-mpnet-base-v2\n", 471 | "2023-08-22 13:35:22 - Use pytorch device: cpu\n", 472 | "2023-08-22 13:35:22 - Anonymized telemetry enabled. See https://docs.trychroma.com/telemetry for more information.\n" 473 | ] 474 | }, 475 | { 476 | "name": "stderr", 477 | "output_type": "stream", 478 | "text": [ 479 | "Batches: 100%|██████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:05<00:00, 5.13s/it]\n" 480 | ] 481 | } 482 | ], 483 | "source": [ 484 | "embeddings = HuggingFaceEmbeddings()\n", 485 | "doc_search = Chroma.from_documents(docs, embeddings)" 486 | ] 487 | }, 488 | { 489 | "cell_type": "code", 490 | "execution_count": 39, 491 | "id": "e944a892-cd70-45fa-a24e-c562c3284926", 492 | "metadata": { 493 | "tags": [] 494 | }, 495 | "outputs": [ 496 | { 497 | "name": "stderr", 498 | "output_type": "stream", 499 | "text": [ 500 | "Batches: 100%|██████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 16.82it/s]\n" 501 | ] 502 | } 503 | ], 504 | "source": [ 505 | "query = \"What is Linear Regression\"\n", 506 | "similar_docs = doc_search.similarity_search(query, k=3)" 507 | ] 508 | }, 509 | { 510 | "cell_type": "code", 511 | "execution_count": 40, 512 | "id": "96bfe073-4fed-442d-ba73-67277760b424", 513 | "metadata": { 514 | "collapsed": true, 515 | "jupyter": { 516 | "outputs_hidden": true 517 | }, 518 | "tags": [] 519 | }, 520 | "outputs": [ 521 | { 522 | "data": { 523 | "text/plain": [ 524 | "[Document(page_content='Linear Regression \\nWhat is Linear Regression? \\n\\uf0b7 Models the relationship between two variables. \\n\\uf0b7 Mathematically: 𝑦=𝑚𝑥+𝑐 \\n\\uf0b7 \\nLinear Regression in Machine Learning: \\n\\uf0b7 Based on Supervised Learning. \\n\\uf0b7 Models target prediction based on independent variables. \\n\\uf0b7 Here in the function , 𝑌=𝑀𝑋+𝐶 Y and X are vectors . \\n\\uf0b7 M and C known as coefficient of X and intercept respectively. \\n\\uf0b7 Best value of M and C gives the best model \\n\\uf0b7 And Cost function helps in estimating the best value.', metadata={'page': 0, 'source': 'pdf_files\\\\Linear_Regression.pdf'}),\n", 525 | " Document(page_content='\\uf0b7 Error can be defined as the difference between the actual value and the predicted value. \\n\\uf0b7 In Linear Regression, ideally the regressi on line is the line which minim izes the e rror across all \\npoints. \\n\\uf0b7 Cost function of Linear Regression could be given as: \\n \\nWhere “J” is the cost function, which calculates the average error in all predicted values , \\n“n” is the number of data points in the dataset, \\n“pred” is the predicted value, \\n and “y” is the actual value.', metadata={'page': 2, 'source': 'pdf_files\\\\Linear_Regression.pdf'}),\n", 526 | " Document(page_content='Learning Methods for Linear Regression: \\nThere are many methods to apply in Linear Regression model, but discussing here the most common \\nones: \\n\\uf0b7 Gradient Descent: \\no It slowly converge the prediction function towards a global minimum where the cost \\nfunction is lowest. \\no Learning rate(alpha) value is a critic al parameter here. \\no Works well with more number of features. \\n\\uf0b7 Least Square Method: \\nHere we solve directly for the value of the coefficients . \\n\\uf0b7 Adam s Method', metadata={'page': 2, 'source': 'pdf_files\\\\Linear_Regression.pdf'})]" 527 | ] 528 | }, 529 | "execution_count": 40, 530 | "metadata": {}, 531 | "output_type": "execute_result" 532 | } 533 | ], 534 | "source": [ 535 | "similar_docs" 536 | ] 537 | }, 538 | { 539 | "cell_type": "markdown", 540 | "id": "969f7c2b-d641-4f26-ab92-59843f27e892", 541 | "metadata": {}, 542 | "source": [ 543 | "### Creating a chain with LLM" 544 | ] 545 | }, 546 | { 547 | "cell_type": "code", 548 | "execution_count": 41, 549 | "id": "539f0e2f-211a-4a01-8d22-a6b266d786c6", 550 | "metadata": { 551 | "tags": [] 552 | }, 553 | "outputs": [], 554 | "source": [ 555 | "repo_id = \"tiiuae/falcon-7b\"\n", 556 | "llm = HuggingFaceHub(huggingfacehub_api_token = os.environ['HUGGING_FACE_HUB_API_KEY'], \n", 557 | " repo_id=repo_id, model_kwargs={'temperature': 0.2, 'max_length':1000}) \n", 558 | "\n", 559 | "#you can modify the parameters temperature and max length to generate different responses" 560 | ] 561 | }, 562 | { 563 | "cell_type": "code", 564 | "execution_count": null, 565 | "id": "0bd9a0dc-3ada-40c4-8639-6beb7f16eaab", 566 | "metadata": {}, 567 | "outputs": [], 568 | "source": [ 569 | " " 570 | ] 571 | }, 572 | { 573 | "cell_type": "code", 574 | "execution_count": 42, 575 | "id": "465b9bd7-90ef-44b2-914e-a8b8ff4c8e00", 576 | "metadata": { 577 | "tags": [] 578 | }, 579 | "outputs": [], 580 | "source": [ 581 | "retrieval_chain = RetrievalQA.from_chain_type(\n", 582 | " llm, \n", 583 | " chain_type='stuff', \n", 584 | " retriever=doc_search.as_retriever(),\n", 585 | " chain_type_kwargs={\n", 586 | " \"memory\":ConversationBufferMemory(\n", 587 | " \n", 588 | ")" 589 | ] 590 | }, 591 | { 592 | "cell_type": "code", 593 | "execution_count": 43, 594 | "id": "7efc2d98-3282-449c-a1f6-b0bae03e1de9", 595 | "metadata": { 596 | "tags": [] 597 | }, 598 | "outputs": [ 599 | { 600 | "name": "stderr", 601 | "output_type": "stream", 602 | "text": [ 603 | "Batches: 100%|██████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 13.16it/s]\n" 604 | ] 605 | }, 606 | { 607 | "data": { 608 | "text/plain": [ 609 | "'\\n\\nLinear Regression is a mathematical model that is used to predict the value of a dependent variable'" 610 | ] 611 | }, 612 | "execution_count": 43, 613 | "metadata": {}, 614 | "output_type": "execute_result" 615 | } 616 | ], 617 | "source": [ 618 | "query = \"What is the mathematical formulation of Linear Regression\"\n", 619 | "retrieval_chain.run(query)" 620 | ] 621 | }, 622 | { 623 | "cell_type": "code", 624 | "execution_count": 44, 625 | "id": "633f2289-03fe-452b-961d-27f25c8cc024", 626 | "metadata": { 627 | "tags": [] 628 | }, 629 | "outputs": [ 630 | { 631 | "name": "stderr", 632 | "output_type": "stream", 633 | "text": [ 634 | "Batches: 100%|██████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 30.49it/s]\n" 635 | ] 636 | }, 637 | { 638 | "data": { 639 | "text/plain": [ 640 | "'\\n\\nThe first assumption is that the variables are independent.\\nThe second assumption is that the variables'" 641 | ] 642 | }, 643 | "execution_count": 44, 644 | "metadata": {}, 645 | "output_type": "execute_result" 646 | } 647 | ], 648 | "source": [ 649 | "query2 = \"assumptions\"\n", 650 | "retrieval_chain.run(query2)" 651 | ] 652 | }, 653 | { 654 | "cell_type": "markdown", 655 | "id": "6fd21f77-eefd-42ae-ae4d-07880e116cda", 656 | "metadata": {}, 657 | "source": [ 658 | "### Creating interface" 659 | ] 660 | }, 661 | { 662 | "cell_type": "code", 663 | "execution_count": 26, 664 | "id": "60cdae74-b66f-4057-b4d3-ea7b3a6c80f4", 665 | "metadata": { 666 | "tags": [] 667 | }, 668 | "outputs": [], 669 | "source": [ 670 | "import chainlit as cl" 671 | ] 672 | }, 673 | { 674 | "cell_type": "code", 675 | "execution_count": 27, 676 | "id": "43db761d-73b4-406a-ab38-fe68946cd76f", 677 | "metadata": { 678 | "tags": [] 679 | }, 680 | "outputs": [], 681 | "source": [ 682 | "@cl.on_chat_start\n", 683 | "def main():\n", 684 | " retrieval_chain = RetrievalQA.from_chain_type(llm, chain_type='stuff', retriever=doc_search.as_retriever())\n", 685 | " cl.user_session.set(\"retrieval_chain\", retrieval_chain)\n", 686 | " \n", 687 | "@cl.on_message\n", 688 | "async def main(message:str):\n", 689 | " retrieval_chain = cl.user_session.get(\"retrieval_chain\")\n", 690 | " res = await retrieval_chain.acall(message, callbacks=\n", 691 | " [cl.AsyncLangchainCallbackHandler()])\n", 692 | " \n", 693 | " await cl.Message(content=res[\"text\"]).send()" 694 | ] 695 | }, 696 | { 697 | "cell_type": "code", 698 | "execution_count": 29, 699 | "id": "e10f49aa-ba89-4c72-bc13-7d9888c9505f", 700 | "metadata": { 701 | "tags": [] 702 | }, 703 | "outputs": [ 704 | { 705 | "name": "stderr", 706 | "output_type": "stream", 707 | "text": [ 708 | "Usage: chainlit run [OPTIONS] TARGET\n", 709 | "Try 'chainlit run --help' for help.\n", 710 | "\n", 711 | "Error: Missing argument 'TARGET'.\n" 712 | ] 713 | } 714 | ], 715 | "source": [ 716 | "!chainlit run" 717 | ] 718 | }, 719 | { 720 | "cell_type": "code", 721 | "execution_count": 31, 722 | "id": "805077e7-7f53-4000-836f-ba603b2030ff", 723 | "metadata": { 724 | "tags": [] 725 | }, 726 | "outputs": [ 727 | { 728 | "name": "stdout", 729 | "output_type": "stream", 730 | "text": [ 731 | "Usage: chainlit run [OPTIONS] TARGET\n", 732 | "\n", 733 | "Options:\n", 734 | " -w, --watch Reload the app when the module changes\n", 735 | " -h, --headless Will prevent to auto open the app in the browser\n", 736 | " -d, --debug Set the log level to debug\n", 737 | " -c, --ci Flag to run in CI mode\n", 738 | " --no-cache Useful to disable third parties cache, such as\n", 739 | " langchain.\n", 740 | " --db [cloud|local] Useful to control database mode when running CI.\n", 741 | " --host TEXT Specify a different host to run the server on\n", 742 | " --port TEXT Specify a different port to run the server on\n", 743 | " --help Show this message and exit.\n" 744 | ] 745 | } 746 | ], 747 | "source": [ 748 | "!chainlit run --help" 749 | ] 750 | }, 751 | { 752 | "cell_type": "code", 753 | "execution_count": null, 754 | "id": "45f1cbb4-3b1e-4f17-a6ae-0afb25383f08", 755 | "metadata": {}, 756 | "outputs": [], 757 | "source": [] 758 | } 759 | ], 760 | "metadata": { 761 | "kernelspec": { 762 | "display_name": "Python 3 (ipykernel)", 763 | "language": "python", 764 | "name": "python3" 765 | }, 766 | "language_info": { 767 | "codemirror_mode": { 768 | "name": "ipython", 769 | "version": 3 770 | }, 771 | "file_extension": ".py", 772 | "mimetype": "text/x-python", 773 | "name": "python", 774 | "nbconvert_exporter": "python", 775 | "pygments_lexer": "ipython3", 776 | "version": "3.10.9" 777 | } 778 | }, 779 | "nbformat": 4, 780 | "nbformat_minor": 5 781 | } 782 | -------------------------------------------------------------------------------- /chatpdf.py: -------------------------------------------------------------------------------- 1 | import os 2 | import getpass 3 | 4 | from langchain.document_loaders import PyPDFLoader #document loader: https://python.langchain.com/docs/modules/data_connection/document_loaders 5 | from langchain.text_splitter import RecursiveCharacterTextSplitter #document transformer: text splitter for chunking 6 | from langchain.embeddings import HuggingFaceEmbeddings 7 | from langchain.vectorstores import Chroma #vector store 8 | from langchain import HuggingFaceHub #model hub 9 | from langchain.chains import RetrievalQA 10 | import chainlit as cl 11 | 12 | #loading the API key 13 | os.environ['HUGGINGFACEHUB_API_TOKEN'] = getpass.getpass('Hugging face api key:') 14 | 15 | path = input("Enter PDF file path: ") 16 | loader = PyPDFLoader(path) 17 | pages = loader.load() 18 | 19 | splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=20) 20 | docs = splitter.split_documents(pages) 21 | 22 | embeddings = HuggingFaceEmbeddings() 23 | doc_search = Chroma.from_documents(docs, embeddings) 24 | 25 | repo_id = "tiiuae/falcon-7b" 26 | llm = HuggingFaceHub(repo_id=repo_id, model_kwargs={'temperature': 0.2, 'max_length':1000}) 27 | 28 | @cl.on_chat_start 29 | def main(): 30 | retrieval_chain = RetrievalQA.from_chain_type(llm, chain_type='stuff', retriever=doc_search.as_retriever()) 31 | cl.user_session.set("retrieval_chain", retrieval_chain) 32 | 33 | @cl.on_message 34 | async def main(message:str): 35 | retrieval_chain = cl.user_session.get("retrieval_chain") 36 | res = await retrieval_chain.acall(message, callbacks= 37 | [cl.AsyncLangchainCallbackHandler()]) 38 | 39 | #print(res) 40 | await cl.Message(content=res["result"]).send() --------------------------------------------------------------------------------