From ed5178acd3c9bba710410b1ee6c009b4c314a0e6 Mon Sep 17 00:00:00 2001 From: Dawood Khan Date: Thu, 29 Jun 2023 11:11:38 -0400 Subject: [PATCH] Revert "Remove chatbot_streaming from guide" (#4730) * Revert "remove chatbot_streaming from guide (#4729)" This reverts commit 21c0198da1b075526732ebca38ef0c883a96dc4b. * bring back streaming demo --- demo/chatbot_streaming/run.ipynb | 1 + demo/chatbot_streaming/run.py | 28 +++++++++++++++++++ .../07_other-tutorials/creating-a-chatbot.md | 23 ++++++++++++++- 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 demo/chatbot_streaming/run.ipynb create mode 100644 demo/chatbot_streaming/run.py diff --git a/demo/chatbot_streaming/run.ipynb b/demo/chatbot_streaming/run.ipynb new file mode 100644 index 0000000000..72a22daacc --- /dev/null +++ b/demo/chatbot_streaming/run.ipynb @@ -0,0 +1 @@ +{"cells": [{"cell_type": "markdown", "id": 302934307671667531413257853548643485645, "metadata": {}, "source": ["# Gradio Demo: chatbot_streaming"]}, {"cell_type": "code", "execution_count": null, "id": 272996653310673477252411125948039410165, "metadata": {}, "outputs": [], "source": ["!pip install -q gradio "]}, {"cell_type": "code", "execution_count": null, "id": 288918539441861185822528903084949547379, "metadata": {}, "outputs": [], "source": ["import gradio as gr\n", "import random\n", "import time\n", "\n", "with gr.Blocks() as demo:\n", " chatbot = gr.Chatbot()\n", " msg = gr.Textbox()\n", " clear = gr.Button(\"Clear\")\n", "\n", " def user(user_message, history):\n", " return \"\", history + [[user_message, None]]\n", "\n", " def bot(history):\n", " bot_message = random.choice([\"How are you?\", \"I love you\", \"I'm very hungry\"])\n", " history[-1][1] = \"\"\n", " for character in bot_message:\n", " history[-1][1] += character\n", " time.sleep(0.05)\n", " yield history\n", "\n", " msg.submit(user, [msg, chatbot], [msg, chatbot], queue=False).then(\n", " bot, chatbot, chatbot\n", " )\n", " clear.click(lambda: None, None, chatbot, queue=False)\n", " \n", "demo.queue()\n", "if __name__ == \"__main__\":\n", " demo.launch()\n"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/demo/chatbot_streaming/run.py b/demo/chatbot_streaming/run.py new file mode 100644 index 0000000000..3c55971512 --- /dev/null +++ b/demo/chatbot_streaming/run.py @@ -0,0 +1,28 @@ +import gradio as gr +import random +import time + +with gr.Blocks() as demo: + chatbot = gr.Chatbot() + msg = gr.Textbox() + clear = gr.Button("Clear") + + def user(user_message, history): + return "", history + [[user_message, None]] + + def bot(history): + bot_message = random.choice(["How are you?", "I love you", "I'm very hungry"]) + history[-1][1] = "" + for character in bot_message: + history[-1][1] += character + time.sleep(0.05) + yield history + + msg.submit(user, [msg, chatbot], [msg, chatbot], queue=False).then( + bot, chatbot, chatbot + ) + clear.click(lambda: None, None, chatbot, queue=False) + +demo.queue() +if __name__ == "__main__": + demo.launch() diff --git a/guides/07_other-tutorials/creating-a-chatbot.md b/guides/07_other-tutorials/creating-a-chatbot.md index 7a8b7a42b4..ddff13c86e 100644 --- a/guides/07_other-tutorials/creating-a-chatbot.md +++ b/guides/07_other-tutorials/creating-a-chatbot.md @@ -9,7 +9,9 @@ Chatbots are widely used in natural language processing (NLP) research and indus Using `gradio`, you can easily build a demo of your chatbot model and share that with your users, or try it yourself using an intuitive chatbot GUI. -This tutorial will show how to make two kinds of chatbot UIs with Gradio: first a simple one to display text, and then a chatbot that can handle media files as well. +This tutorial will show how to make several kinds of chatbot UIs with Gradio: first a simple one to display text, second one to stream text responses, and finally a chatbot that can handle media files as well. The chatbot interface that we create will look something like this: + +$demo_chatbot_streaming **Prerequisite**: We'll be using the `gradio.Blocks` class to build our Chatbot demo. You can [read the Guide to Blocks first](https://gradio.app/quickstart/#blocks-more-flexibility-and-control) if you are not already familiar with it. Also please make sure you are using the **latest version** version of Gradio: `pip install --upgrade gradio`. @@ -33,6 +35,25 @@ Of course, in practice, you would replace `respond()` with your own more complex $demo_chatbot_simple +## Add Streaming to your Chatbot + +There are several ways we can improve the user experience of the chatbot above. First, we can stream responses so the user doesn't have to wait as long for a message to be generated. Second, we can have the user message appear immediately in the chat history, while the chatbot's response is being generated. Here's the code to achieve that: + +$code_chatbot_streaming + + +You'll notice that when a user submits their message, we now *chain* three event events with `.then()`: + +1. The first method `user()` updates the chatbot with the user message and clears the input field. This method also makes the input field non interactive so that the user can't send another message while the chatbot is responding. Because we want this to happen instantly, we set `queue=False`, which would skip any queue had it been enabled. The chatbot's history is appended with `(user_message, None)`, the `None` signifying that the bot has not responded. + +2. The second method, `bot()` updates the chatbot history with the bot's response. Instead of creating a new message, we just replace the previously-created `None` message with the bot's response. Finally, we construct the message character by character and `yield` the intermediate outputs as they are being constructed. Gradio automatically turns any function with the `yield` keyword [into a streaming output interface](/key-features/#iterative-outputs). + +3. The third method makes the input field interactive again so that users can send another message to the bot. + +Of course, in practice, you would replace `bot()` with your own more complex function, which might call a pretrained model or an API, to generate a response. + +Finally, we enable queuing by running `demo.queue()`, which is required for streaming intermediate outputs. You can try the improved chatbot by scrolling to the demo at the top of this page. + ## Adding Markdown, Images, Audio, or Videos The `gr.Chatbot` component supports a subset of markdown including bold, italics, and code. For example, we could write a function that responds to a user's message, with a bold **That's cool!**, like this: