大模型UI:Gradio全解11——Chatbot:融合大模型的聊天机器人(4)

news2025/1/17 5:18:11

大模型UI:Gradio全解11——Chatbot:融合大模型的聊天机器人(4)

  • 前言
  • 本篇摘要
  • 11. Chatbot:融合大模型的多模态聊天机器人
    • 11.4 使用Blocks创建自定义聊天机器人
      • 11.4.1 简单聊天机器人演示
      • 11.4.2 流式传输Chatbot
      • 11.4.3 添加Markdown、Images、Audio或Videos
    • 参考文献

前言

本系列文章主要介绍WEB界面工具Gradio。Gradio是Hugging Face发布的简易webui开发框架,它基于FastAPI和svelte,便于开发多功能界面和部署人工智能模型,是当前热门的非常易于开发和展示机器学习大语言模型LLM及扩散模型DM的UI框架。本系列文章分为前置概念和实战演练两部分。前置概念先介绍Gradio的详细技术架构、历史、应用场景、与其他框架Gradio/NiceGui/StreamLit/Dash/PyWebIO的区别,然后详细介绍了著名的资源网站Hugging Face,因为Gradio演示中经常用到Hugging Face的models及某些场景需要部署在spaces,这里包括三类资源models/datasets/spaces的使用、六类工具库transformers/diffusers/datasets/PEFT/accelerate/optimum实战。实战演练部分先讲解了多种不同的安装、运行和部署方式,安装包括Linux/Win/Mac三类系统安装,运行包括普通方式和热重载方式,部署包括本地部署、HuggingFace托管、FastAPI挂载和Gradio-Lite浏览器集成;然后按照先整体再细节的逻辑,讲解Gradio的多种高级特性,包括三种Gradio Clients(python/javascript/curl)、Gradio Tools、Gradio的模块架构和环境变量等,方便读者对Gradio整体把握;最后深入细节,也是本系列文章的核心,先实践基础功能Interface、Blocks和Additional Features,再详解高级功能Chatbots、Data Science And Plots和Streaming。本系列文章讲解细致,涵盖Gradio大部分组件和功能,代码均可运行并附有大量运行截图,方便读者理解,Gradio一定会成为每个技术人员实现奇思妙想的最称手工具。

本系列文章目录如下:

  1. 《Gradio全解1——Gradio简介》
  2. 《Gradio全解1——Gradio的安装与运行》
  3. 《Gradio全解2——剖析Hugging Face:详解三类资源models/datasets/spaces》
  4. 《Gradio全解3——剖析Hugging Face:实战六类工具库transformers/diffusers/datasets/PEFT/accelerate/optimum》
  5. 《Gradio全解4——Gradio的3+1种部署方式实践》
  6. 《Gradio全解4——浏览器集成Gradio-Lite》
  7. 《Gradio全解5——Gradio Client:python客户端》
  8. 《Gradio全解5——Gradio Client:javascript客户端》
  9. 《Gradio全解5——Gradio Client:curl客户端》
  10. 《Gradio全解6——Gradio Tools:将Gradio用于LLM Agents》
  11. 《Gradio全解7——Gradio库的模块架构和环境变量》
  12. 《Gradio全解8——Interface:高级抽象界面类(上)》
  13. 《Gradio全解8——Interface:高级抽象界面类(下)》
  14. 《Gradio全解9——Blocks:底层区块类(上)》
  15. 《Gradio全解9——Blocks:底层区块类(下)》
  16. 《Gradio全解10——Additional Features:补充特性(上)》
  17. 《Gradio全解10——Additional Features:补充特性(下)》
  18. 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(1)》
  19. 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(2)》
  20. 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(3)》
  21. 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(4)》
  22. 《Gradio全解系列12——Data Science And Plots:数据科学与绘图》
  23. 《Gradio全解13——Streaming:数据流(上)》
  24. 《Gradio全解13——Streaming:数据流(下)》

本篇摘要

本篇介绍如何使用Gradio创建聊天机器人,主要内容包括gr.ChatInterface快速创建Chatbot、与流行LLM库及API结合、使用Agents和Tools智能代理工具、使用Blocks创建Chatbot、Chatbot的特殊Events、通过Gradio应用创建Discord Bot/Slack Bot/Website Widget。

11. Chatbot:融合大模型的多模态聊天机器人

本章介绍如何使用Gradio创建聊天机器人。聊天机器人是大型语言模型(LLMs)的一个流行应用,通过Gradio,我们可以轻松构建LLM演示并与其它用户分享,或者自己使用直观的聊天机器人界面进行开发尝试。本章主要内容包括gr.ChatInterface快速创建Chatbot、与流行LLM库及API结合、组件Chatbot及消息格式ChatMessage、使用Blocks创建Chatbot、Chatbot的特殊Events、使用Agents和Tools智能代理工具、通过Gradio应用创建Discord Bot/Slack Bot/Website Widget。

11.4 使用Blocks创建自定义聊天机器人

重要提示:如果是初学者,建议使用gr.ChatInterface来创建聊天机器人——这是一个高级抽象,通常只需一行代码,就可以快速创建漂亮的聊天机器人应用程序,请读者参照本章第一节和第二节内容。

有了上一节的知识储备后,本节就可以展示如何使用Gradio的底层Blocks API从头开始构建聊天机器人用户界面,这将使你能够完全控制聊天机器人UI。我们将首先创建一个简单的聊天机器人来显示文本,然后创建一个可以流式传输文本响应的聊天机器人,最后创建一个能够处理媒体文件的聊天机器人。

前提条件:我们将使用gradio.Blocks类来构建我们的聊天机器人演示。如果读者还不熟悉它,可以先阅读《Blocks:底层区块类》。此外,请确保使用最新版本Gradio:pip install --upgrade gradio。

11.4.1 简单聊天机器人演示

让我们从创建简单演示开始,机器人只是随机响应"How are you?"、"Today is a great day"或 “I’m very hungry” 来回应任何输入。以下是使用Gradio创建此功能的代码:

import gradio as gr
import random
import time

with gr.Blocks() as demo:
    chatbot = gr.Chatbot(type="messages")
    msg = gr.Textbox()
    clear = gr.ClearButton([msg, chatbot])

    def respond(message, chat_history):
        bot_message = random.choice(["How are you?", "Today is a great day", "I'm very hungry"])
        chat_history.append({"role": "user", "content": message})
        chat_history.append({"role": "assistant", "content": bot_message})
        time.sleep(2)
        return "", chat_history

    msg.submit(respond, [msg, chatbot], [msg, chatbot])

demo.launch()

运行界面如下:
在这里插入图片描述
这里使用了三个Gradio组件:

  • Chatbot:它的值存储了整个对话的历史记录,作为用户和机器人之间响应对的列表;
  • Textbox:用户可以在其中输入消息,然后按回车/提交以触发聊天机器人的响应;
  • ClearButton:用于清除文本框和整个聊天机器人历史记录的按钮。

我们有一个函数respond(),它接收聊天机器人的整个历史记录,附加一条随机消息,等待2秒钟后返回更新后的聊天历史记录。respond()函数在返回时还会清除文本框。当然在实际应用中,可以将respond()替换为自己的更复杂的函数,该函数可能会调用预训练模型或API来生成响应。

11.4.2 流式传输Chatbot

我们可以通过几种方式改进上述聊天机器人的用户体验:首先,我们可以使用流式传输响应,这样用户在生成消息时不必等待太长时间;其次,我们可以在生成聊天机器人的响应时,让用户的消息立即显示在聊天历史记录中。以下是实现此功能的代码:

import gradio as gr
import random
import time

with gr.Blocks() as demo:
    chatbot = gr.Chatbot(type="messages")
    msg = gr.Textbox()
    clear = gr.Button("Clear")

    def user(user_message, history: list):
        return "", history + [{"role": "user", "content": user_message}]

    def bot(history: list):
        bot_message = random.choice(["How are you?", "I love you", "I'm very hungry"])
        history.append({"role": "assistant", "content": ""})
        for character in bot_message:
            history[-1]['content'] += 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.launch()

运行界面如下:
在这里插入图片描述
请注意,此时的消息是流式输出的。另外,当用户提交消息时,通过.then()链式调用两个事件:

  • 第一个方法user():使用用户消息更新聊天机器人并清空输入框。因为我们希望立即执行此操作,所以设置queue=False,这将跳过任何已启用的队列,聊天机器人的历史记录会附加 {“role”: “user”, “content”: user_message}。
  • 第二个方法bot():用机器人的响应更新聊天历史记录。最后我们逐字符构建消息,并在构建过程中生成中间输出。Gradio会自动将任何带有yield关键字的函数转换为流式输出界面。

当然在实际应用中,我们可以将bot()替换为自己更复杂的函数,该函数可能会调用预训练模型或API来生成响应。

11.4.3 添加Markdown、Images、Audio或Videos

gr.Chatbot组件支持部分Markdown 语法,包括加粗、斜体和代码。例如,我们可以编写一个函数,用加粗的That’s cool! 来响应用户的消息,如下所示:

def bot(history):
    response = {"role": "assistant", "content": "**That's cool!**"}
    history.append(response)
    return history

此外,它还可以处理媒体文件,例如图片、音频和视频。我们可以使用MultimodalTextbox组件轻松上传所有类型的媒体文件到chatbot,还可以通过传递sources参数进一步自定义MultimodalTextbox,该参数是一个启用的来源列表。要传递媒体文件,我们必须将文件作为字典传递,其中path键指向本地文件,alt_text键是可选的,因此可以只传递一个包含单个元素的元组{“path”: “filepath”},如下所示:

def add_message(history, message):
    for x in message["files"]:
        history.append({"role": "user", "content": {"path": x}})
    if message["text"] is not None:
        history.append({"role": "user", "content": message["text"]})
    return history, gr.MultimodalTextbox(value=None, interactive=False, file_types=["image"], sources=["upload", "microphone"])

将这些结合起来,我们可以创建一个多模态聊天机器人,使用多模态文本框让用户提交文本和媒体文件。其余的代码看起来与之前几乎相同:

import gradio as gr
import time

# Chatbot demo with multimodal input (text, markdown, LaTeX, code blocks, image, audio, & video). Plus shows support for streaming text.

def print_like_dislike(x: gr.LikeData):
    print(x.index, x.value, x.liked)

def add_message(history, message):
    for x in message["files"]:
        history.append({"role": "user", "content": {"path": x}})
    if message["text"] is not None:
        history.append({"role": "user", "content": message["text"]})
    return history, gr.MultimodalTextbox(value=None, interactive=False)

def bot(history: list):
    response = "**That's cool!**"
    history.append({"role": "assistant", "content": ""})
    for character in response:
        history[-1]["content"] += character
        time.sleep(0.05)
        yield history

with gr.Blocks() as demo:
    chatbot = gr.Chatbot(elem_id="chatbot", bubble_full_width=False, type="messages")

    chat_input = gr.MultimodalTextbox(
        interactive=True,
        file_count="multiple",
        placeholder="Enter message or upload file...",
        show_label=False,
        sources=["microphone", "upload"],
    )

    chat_msg = chat_input.submit(
        add_message, [chatbot, chat_input], [chatbot, chat_input]
    )
    bot_msg = chat_msg.then(bot, chatbot, chatbot, api_name="bot_response")
    bot_msg.then(lambda: gr.MultimodalTextbox(interactive=True), None, [chat_input])

    chatbot.like(print_like_dislike, None, None, like_user_message=True)

demo.launch()

上传文件并输入一段信息后,运行界面如下:
在这里插入图片描述在后台通过命令运行:python XXX.py,在点赞和点踩之后,会在后台输出以下信息:

0 [{'component': 'file', 'value': {'path': '/tmp/gradio/439c333fbe1cde660c82dd81000e1e59b08121367a652b85efdd6e2e22ebb2d8/DeepSeek_V3.pdf', 'url': 'http://127.0.0.1:7862/gradio_api/file=/tmp/gradio/439c333fbe1cde660c82dd81000e1e59b08121367a652b85efdd6e2e22ebb2d8/DeepSeek_V3.pdf', 'size': None, 'orig_name': None, 'mime_type': 'application/pdf', 'is_stream': False, 'meta': {'_type': 'gradio.FileData'}}, 'alt_text': None, 'constructor_args': {}, 'props': {}}, 'test multimodal textbox.'] True
2 ["**That's cool!**"] False

以上就是为聊天机器人模型构建界面所需的全部代码。最后,我们将在指南的结尾提供一些运行在Spaces上的聊天机器人链接,以便你了解其他可能的功能:

  • project-baize/Baize-7B:一个风格化的聊天机器人,可以停止生成或重新生成响应;
  • MAGAer13/mPLUG-Owl:一个多模态聊天机器人,可以对响应进行点赞和点踩。

参考文献

  1. Gradio - guides - Chatbots

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2277865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring官网构建Springboot工程

注意:基于Idea的 Spring Initializr 快速构建 SpringBoot 工程时需要联网。 1.进入SpringBoot官网 Spring | Home 点击QUICKSTART 点击start.spring.io进入spring initializr 2.选择依赖 3.生成工程 下载好后解压用IDEAD导入即可。

【Hive】海量数据存储利器之Hive库原理初探

文章目录 一、背景二、数据仓库2.1 数据仓库概念2.2 数据仓库分层架构2.2.1 数仓分层思想和标准2.2.2 阿里巴巴数仓3层架构2.2.3 ETL和ELT2.2.4 为什么要分层 2.3 数据仓库特征2.3.1 面向主题性2.3.2 集成性2.3.3 非易失性2.3.4 时变性 三、hive库3.1 hive概述3.2 hive架构3.2.…

【MySQL实战】mysql_exporter+Prometheus+Grafana

要在Prometheus和Grafana中监控MySQL数据库,如下图: 可以使用mysql_exporter。 以下是一些步骤来设置和配置这个监控环境: 1. 安装和配置Prometheus: - 下载和安装Prometheus。 - 在prometheus.yml中配置MySQL通过添加以下内…

脚本化挂在物理盘、nfs、yum、pg数据库、nginx(已上传脚本)

文章目录 前言一、什么是脚本化安装二、使用步骤1.物理磁盘脚本挂载(离线)2.yum脚本化安装(离线)3.nfs脚本化安装(离线)4.pg数据库脚本化安装(离线)5.nginx脚本化安装(离…

k8s物料清单工具——KubeClarity

介绍 KubeClarity是一个用于检测和管理容器镜像和文件系统的软件清单(SBOM)和漏洞的工具。它扫描运行时的K8s集群和CI/CD流水线,以增强软件供应链安全性。 安装 添加 helm 仓库 helm repo add kubeclarity https://openclarity.github.io…

citrix netscaler13.1 重写负载均衡响应头(基础版)

在 Citrix NetScaler 13.1 中,Rewrite Actions 用于对负载均衡响应进行修改,包括替换、删除和插入 HTTP 响应头。这些操作可以通过自定义策略来完成,帮助你根据需求调整请求内容。以下是三种常见的操作: 1. Replace (替换响应头)…

Linux Centos 安装Jenkins到服务

一、前言 假设你已经下载了jenkins.war 安装了对应的jdk,下面我们来安装jenkins,以服务的形式安装。 二、安装 1)将jenkins.war拷贝到合适的位置,我的位置 /u01/jenkins/ ,位置你自己选。 2)创建系统用户…

网安——计算机网络基础

一、计算机网络概述 1、Internet网相关概念及发展 网络(Network)有若干结点(Node)和连接这些结点的链路(link)所组成,在网络中的结点可以是计算机、集线器、交换机或路由器等多个网络还可以通…

Xcode 正则表达式实现查找替换

在软件开发过程中,查找和替换文本是一项常见的任务。正则表达式(Regular Expressions)是一种强大的工具,可以帮助我们在复杂的文本中进行精确的匹配和替换。Xcode 作为一款流行的开发工具,提供了对正则表达式的支持。本…

数据结构9——二叉搜索树

🥇1.二叉搜索树的概念 二叉搜索树(Binary Search Tree,BST)又称二叉排序树或二叉查找树,其要么是一棵空树,要么具有以下性质: ①:左子树上所有节点的值都小于根节点; ②:右子树上所有节点的值都…

leetcode刷题记录(四十八)——128. 最长连续序列

(一)问题描述 128. 最长连续序列 - 力扣(LeetCode)128. 最长连续序列 - 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复…

c语言——【linux】多进程编程 【进程的创建,相关shell指令,进程状态切换,回收资源,守护进程等】

1.思维导图 2.进程的创建 函数原型:pid_t fork(void); 功能描述:以当前进程为父进程,创建一个子进程 进程链和进程扇的创建 3.多进程具体使用 3.1进程替换 exec 函数一族 int execl(const char *path, const char *arg, ... /* (char *) N…

在服务器上增加新网段IP的路由配置

在服务器上增加新网段IP的路由配置 前提条件步骤一:检查当前路由表步骤二:添加新路由步骤三:验证新路由步骤四:持久化路由配置脚本示例结论在网络管理中,路由配置是一项基本且重要的任务。它决定了数据包在网络中的传输路径。本文将详细介绍如何在服务器上增加新的路由配置…

国产fpga nvme ip高速存储方案设计

国产高速存储方案主要是使用nvme ip实现高速存储方案,nvme ip采用纯verilog语言实现,用户拿到nvme ip使用起来也很简单。 先看看效果如 zu7eg板子,这个芯片支持pcie3.0 x4. zynq 7045板子只支持pcie 2.0 x4 速度测试,测试nvme …

浅谈云计算14 | 云存储技术

云存储技术 一、云计算网络存储技术基础1.1 网络存储的基本概念1.2云存储系统结构模型1.1.1 存储层1.1.2 基础管理层1.1.3 应用接口层1.1.4 访问层 1.2 网络存储技术分类 二、云计算网络存储技术特点2.1 超大规模与高可扩展性2.1.1 存储规模优势2.1.2 动态扩展机制 2.2 高可用性…

[操作系统] 深入理解约翰·冯·诺伊曼体系

约翰冯诺依曼(John von Neumann,1903年12月28日—1957年2月8日),原名诺伊曼亚诺什拉约什(Neumann Jnos Lajos),出生于匈牙利的美国籍犹太人数学家,20世纪最重要的数学家之一&#xf…

ElasticSearch上

安装ElasticSearch Lucene:Java语言的搜索引擎类库,易扩展;高性能(基于倒排索引)Elasticsearch基于Lucene,支持分布式,可水平扩展;提供Restful接口,可被任何语言调用Ela…

Qt应用之MDI(多文档设计)

qt creator 版本6.8.0 MinGW 64bit 由此模块可以扩展成设计一个qt文本编辑器。 界面如下 部分功能展示如下 新建文件 打开文件 mdi模式、级联模式和平铺模式 界面和程序构建过程。 1.如图所需.cpp和.h文件 2.mainwindow.ui和tformdoc.ui界面布局如下 不懂什么是Action如何…

【博主推荐】VUE常见问题及解决方案

文章目录 1.找不到模块“../views/index.vue”或其相应的类型声明。ts(2307)2.当改变 Vue 实例中的数据时,视图没有相应地更新3.在某些复杂的异步操作或者多个数据交互场景下,数据绑定的更新在时间上出现延迟4.父组件无法将数据正确地传递给子组件&#…

【Apache Doris】周FAQ集锦:第 29 期

引言 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目! 在这个栏目中,每周将筛选社区反馈的热门问题和话题,重点回答并进行深入探讨。旨在为广大用户和开发者分享有关 Apache Doris 的常见问题。 通过这个每周 FAQ 栏目,希望帮助社…