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

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

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

前言

本系列文章主要介绍WEB界面工具Gradio。Gradio是Hugging Face发布的简易webui开发框架,它基于FastAPI和svelte,可以使用机器学习模型、python函数或API开发多功能界面和部署人工智能模型,是当前热门的非常易于展示机器学习大语言模型LLM及扩散模型DM的WebUI框架。
本系列文章分为前置概念、安装运行与部署、Gradio高级特性、基础功能实战和高级功能实战五部分。第一部分前置概念:先介绍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的多种高级特性,包括三种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结合、组件Chatbot及消息格式ChatMessage、使用Blocks创建Chatbot、Chatbot的特殊Events、使用Agents和Tools智能代理工具、通过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” 来回应任何输入。以下是使用Blocks创建此功能的代码:

import gradio as gr
import random
import timewith 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_historymsg.submit(respond, [msg, chatbot], [msg, chatbot])demo.launch()

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

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

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

11.4.2 立即响应和流式传输

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

import gradio as gr
import random
import timewith 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'] += charactertime.sleep(0.05)yield historymsg.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关键字的函数转换为流式输出界面,并且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"])

11.4.4 添加点赞或点踩操作

gr.Chatbot组件默认支持点赞和点踩,可以用过事件.like触发点赞或点踩后的操作,这里我们只打印出被点赞或点踩消息的索引、内容和是否点赞,如下所示:

def print_like_dislike(x: gr.LikeData):print(x.index, x.value, x.liked)
...
chatbot.like(print_like_dislike, None, None, like_user_message=True)

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

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"]})print(message)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"] += charactertime.sleep(0.05)yield historywith 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。打开浏览器,上传文件并输入一段信息后,运行界面如下:
在这里插入图片描述在后台可以看到打印的message格式:

{'text': 'test multimodal textbox', 'files': ['/tmp/gradio/439c333fbe1cde660c82dd81000e1e59b08121367a652b85efdd6e2e22ebb2d8/DeepSeek_V3.pdf']}

在点赞和点踩之后,会在后台输出以下信息:

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.mzph.cn/web/66460.shtml

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

相关文章

STM32 FreeRTOS内存管理简介

在使用 FreeRTOS 创建任务、队列、信号量等对象时,通常都有动态创建和静态创建的方式。动态方式提供了更灵活的内存管理,而静态方式则更注重内存的静态分配和控制。 如果是1的,那么标准 C 库 malloc() 和 free() 函数有时可用于此目的&#…

【Linux系统编程】—— 深度解析进程等待与终止:系统高效运行的关键

文章目录 进程创建再次认识fork()函数fork()函数返回值 写时拷贝fork常规⽤法以及调用失败的原因 进程终⽌进程终止对应的三种情况进程常⻅退出⽅法_exit函数exit函数return退出 进程等待进程等待的必要性进程等待的⽅法 进程创建 再次认识fork()函数 fork函数初识&#xff1…

国产编辑器EverEdit -重复行

1 重复行 1.1 应用场景 在代码或文本编辑过程中, 经常需要快速复制当前行,比如,给对象的多个属性进行赋值。传统的做法是:选中行-> 复制-> 插入新行-> 粘贴,该操作有4个步骤,非常繁琐。 那有没…

NiceFish(美人鱼)

前端有 3 个版本: 浏览器环境移动端环境Electron 环境 服务端有 2 个版本: SpringBoot 版本(已实现基于 Apache Shiro 的 RBAC 权限控制)SpringCloud 版本 1.主要依赖 名称版本描述Angular16.2.0Angular 核心库。PrimeNG16.2…

华为ENSP:STP和链路聚合的管理与配置

这里将不再过度阐述STP和链路聚合的理论知识,不清楚的同学可以去观看Cisco文章中的理论知识 理论知识https://blog.csdn.net/2301_76341691/article/details/145166547?fromshareblogdetail&sharetypeblogdetail&sharerId145166547&sharereferPC&…

dl学习笔记:(4)简单神经网络

(1)单层正向回归网络 bx1x2z100-0.2110-0.05101-0.051110.1 接下来我们用代码实现这组线性回归数据 import torch x torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]], dtype torch.float32) z torch.tensor([-0.2, -0.05, -0.05, 0.1]) w torch.…

三、华为交换机 Hybrid

一、Hybrid功能 Hybrid口既可以连接普通终端的接入链路(类似于Access接口),又可以连接交换机间的干道链路(类似于Trunk接口)。它允许多个VLAN的帧通过,并可以在出接口方向将某些VLAN帧的标签剥掉&#xff0…

Tensor 基本操作1 | PyTorch 深度学习实战

目录 创建 Tensor常用操作unsqueezesqueezeSoftmax代码1代码2代码3 argmaxitem 创建 Tensor 使用 Torch 接口创建 Tensor import torch参考:https://pytorch.org/tutorials/beginner/basics/tensorqs_tutorial.html 常用操作 unsqueeze 将多维数组解套&#xf…

Grafana系列之面板接入Prometheus Alertmanager

关于Grafana的仪表板Dashboard,以及面板Panel,参考Grafana系列之Dashboard。可以直接在面板上创建Alert,即所谓的Grafana Alert,参考Grafana系列之Grafana Alert。除了Grafana Alert外,面板也可接入Prometheus Alertma…

Windows 上安装 MongoDB 的 zip 包

博主介绍: 大家好,我是想成为Super的Yuperman,互联网宇宙厂经验,17年医疗健康行业的码拉松奔跑者,曾担任技术专家、架构师、研发总监负责和主导多个应用架构。 近期专注: RPA应用研究,主流厂商产…

LeetCode 2266.统计打字方案数:排列组合

【LetMeFly】2266.统计打字方案数:排列组合 力扣题目链接:https://leetcode.cn/problems/count-number-of-texts/ Alice 在给 Bob 用手机打字。数字到字母的 对应 如下图所示。 为了 打出 一个字母,Alice 需要 按 对应字母 i 次&#xff0c…

PTA乙级1001~1005【c++】

首先讲解一下PTA乙级在哪里。PTA乙级题其实就是PAT (Basic Level) Practice &#xff08;中文&#xff09; 1001 害死人不偿命的(3n1)猜想 #include<iostream> using namespace std;int main() {int cnt 0;int n;cin >> n;while(n ! 1){cnt ;if (n & 1){n …

渗透笔记1

第一天 工具&#xff1a;cs cobalt strike 4.9 / msf kali &#xff08;自带 Ubuntu&#xff09; cs cobalt strike 4.9&#xff1a;server-client server部署在云服务器上&#xff0c;client分别在各地&#xff0c;与server相连接&#xff1b;连接上后就可以共享上线主机。…

用Python实现SVM搭建金融反诈模型(含调试运行)

1.概述 信用卡盗刷一般发生在持卡人信息被不法分子窃取后&#xff0c;复制卡片进行消费或信用卡被他人冒领后激活并消费等情况下。一旦发生信用卡盗刷&#xff0c;持卡人和银行都会遭受一定的经济损失。本节要运用支持向量机分类算法搭建一个金融反欺诈模型。 2.数据集 使用…

HunyuanVideo 文生视频模型实践

HunyuanVideo 文生视频模型实践 flyfish 运行 HunyuanVideo 模型使用文本生成视频的推荐配置&#xff08;batch size 1&#xff09;&#xff1a; 模型分辨率(height/width/frame)峰值显存HunyuanVideo720px1280px129f60GHunyuanVideo544px960px129f45G 本项目适用于使用 N…

第6章 ThreadGroup详细讲解(Java高并发编程详解:多线程与系统设计)

1.ThreadGroup 与 Thread 在Java程序中&#xff0c; 默认情况下&#xff0c; 新的线程都会被加入到main线程所在的group中&#xff0c; main线程的group名字同线程名。如同线程存在父子关系一样&#xff0c; Thread Group同样也存在父子关系。图6-1就很好地说明了父子thread、父…

Python编程与在线医疗平台数据挖掘与数据应用交互性研究

一、引言 1.1 研究背景与意义 在互联网技术飞速发展的当下,在线医疗平台如雨后春笋般涌现,为人们的就医方式带来了重大变革。这些平台打破了传统医疗服务在时间和空间上的限制,使患者能够更加便捷地获取医疗资源。据相关报告显示,中国基于互联网的医疗保健行业已进入新的…

Linux网络_套接字_UDP网络_TCP网络

一.UDP网络 1.socket()创建套接字 #include<sys/socket.h> int socket(int domain, int type, int protocol);domain (地址族): AF_INET网络 AF_UNIX本地 AF_INET&#xff1a;IPv4 地址族&#xff0c;适用于 IPv4 协议。用于网络通信AF_INET6&#xff1a;IPv6 地址族&a…

1 行命令引发的 Go 应用崩溃

一、前言 不久前&#xff0c;阿里云 ARMS 团队、编译器团队、MSE 团队携手合作&#xff0c;共同发布并开源了 Go 语言的编译时自动插桩技术。该技术以其零侵入的特性&#xff0c;为 Go 应用提供了与 Java 监控能力相媲美的解决方案。开发者只需将 go build 替换为新编译命令 o…

Flink(十):DataStream API (七) 状态

1. 状态的定义 在 Apache Flink 中&#xff0c;状态&#xff08;State&#xff09; 是指在数据流处理过程中需要持久化和追踪的中间数据&#xff0c;它允许 Flink 在处理事件时保持上下文信息&#xff0c;从而支持复杂的流式计算任务&#xff0c;如聚合、窗口计算、联接等。状…