如何使用渐变块创建自定义聊天机器人

news2024/11/17 5:55:54

如何使用渐变块创建自定义聊天机器人

文章目录

  • 如何使用渐变块创建自定义聊天机器人
  • 一、介绍
  • 二、参考示例
    • 1、一个简单的聊天机器人演示
    • 2、将流式传输添加到您的聊天机器人
    • 3、喜欢/不喜欢聊天消息
    • 4、添加 Markdown、图像、音频或视频

一、介绍

**重要提示:**如果您刚刚开始,我们建议您使用gr.ChatInterface创建聊天机器人 - 它是一种高级抽象,可以快速创建漂亮的聊天机器人应用程序,通常只需一行代码。在这里相关信息。

本教程将展示如何使用 Gradio 的低级 Blocks API 从头开始​​制作聊天机器人 UI。这将使您能够完全控制您的聊天机器人用户界面。首先,您将创建一个简单的聊天机器人来显示文本,第二个聊天机器人用于流文本响应,最后创建一个也可以处理媒体文件的聊天机器人。我们创建的聊天机器人界面将如下所示:
在这里插入图片描述

**先决条件:**我们将使用该类gradio.Blocks来构建我们的聊天机器人演示。如果您还不熟悉,可以先阅读《块指南》 。另请确保您使用的是最新版本的 Gradio pip install --upgrade gradio:。

二、参考示例

1、一个简单的聊天机器人演示

让我们从重新创建上面的简单演示开始。您可能已经注意到,我们的机器人只是对任何输入随机响应“你好吗?”、“我爱你”或“我很饿”。以下是使用 Gradio 创建此内容的代码:

import gradio as gr
import random
import time

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

    def respond(message, chat_history):
        bot_message = random.choice(["How are you?", "I love you", "I'm very hungry"])
        chat_history.append((message, bot_message))
        time.sleep(2)
        return "", chat_history

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

这里有三个 Gradio 组件:

  • A Chatbot,其值存储对话的整个历史记录,作为用户和机器人之间的响应对列表。
  • 用户可以在其中Textbox键入消息,然后按 Enter/提交以触发聊天机器人响应
  • ClearButton用于清除文本框和整个聊天机器人历史记录的按钮
    我们有一个函数respond(),它接收聊天机器人的整个历史记录,附加一条随机消息,等待 1 秒,然后返回更新的聊天历史记录。该respond()函数返回时还会清除文本框。

当然,在实践中,您可以替换respond()为自己的更复杂的函数,该函数可能会调用预训练的模型或 API,以生成响应。
在这里插入图片描述

2、将流式传输添加到您的聊天机器人

我们可以通过多种方法来改善上述聊天机器人的用户体验。首先,我们可以流式传输响应,这样用户就不必等待很长时间才能生成消息。其次,我们可以让用户消息立即出现在聊天历史记录中,同时生成聊天机器人的响应。这是实现这一目标的代码:

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()
demo.launch()

您会注意到,当用户提交消息时,我们现在将三个事件事件链接.then()在一起:

  1. 第一种方法user()使用用户消息更新聊天机器人并清除输入字段。此方法还使输入字段成为非交互式,以便用户在聊天机器人响应时无法发送其他消息。因为我们希望这种情况立即发生,所以我们设置了queue=False,如果启用它,它将跳过任何队列。聊天机器人的历史记录附加有(user_message, None),None表示机器人尚未响应。

  2. 第二种方法,bot()使用机器人的响应更新聊天机器人历史记录。我们不创建新消息,而是None用机器人的响应替换之前创建的消息。最后,我们逐个字符地构建消息以及yield正在构建的中间输出。 Gradio 会自动将带有该yield关键字的任何函数转换为流式输出接口。

  3. 第三种方法使输入字段再次交互,以便用户可以向机器人发送另一条消息。

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

最后,我们通过运行启用队列demo.queue(),这是流中间输出所必需的。您可以通过滚动到本页顶部的演示来尝试改进的聊天机器人。

3、喜欢/不喜欢聊天消息

创建 后gr.Chatbot,您可以添加用户喜欢或不喜欢消息的功能。如果您希望用户对机器人的响应进行投票或标记不适当的结果,这可能会很有用。

要将此功能添加到您的聊天机器人,只需将一个.like()事件附加到您的聊天机器人即可。具有该.like()事件的聊天机器人将自动在每条机器人消息旁边显示一个“竖起大拇指”图标和一个“竖起大拇指”图标。

该.like()方法要求您传入一个函数,当用户单击这些图标时调用该函数。在您的函数中,您应该有一个类型为 的参数gr.LikeData。 Gradio 将自动向该参数提供一个包含喜欢或不喜欢的消息信息的对象。以下是如何让用户喜欢或不喜欢聊天消息的简单示例:

import gradio as gr

def greet(history, input):
    return history + [(input, "Hello, " + input)]

def vote(data: gr.LikeData):
    if data.liked:
        print("You upvoted this response: " + data.value)
    else:
        print("You downvoted this response: " + data.value)
    

with gr.Blocks() as demo:
    chatbot = gr.Chatbot()
    textbox = gr.Textbox()
    textbox.submit(greet, [chatbot, textbox], [chatbot])
    chatbot.like(vote, None, None)  # Adding this line causes the like/dislike icons to appear in your chatbot
    
demo.launch()

4、添加 Markdown、图像、音频或视频

该gr.Chatbot组件支持 Markdown 的子集,包括粗体、斜体和代码。例如,我们可以编写一个函数来响应用户的消息,并用粗体显示“ That’s Cool!”, 像这样:

def bot(history):
    response = "**That's cool!**"
    history[-1][1] = response
    return history

此外,它还可以处理媒体文件,例如图像、音频和视频。您可以使用该MultimodalTextbox组件轻松地将所有类型的媒体文件上传到聊天机器人。要传入媒体文件,我们必须将文件作为两个字符串的元组传入,如下所示:(filepath, alt_text)。是alt_text可选的,因此您也可以只传递带有单个元素的元组(filepath,),如下所示:

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

将它们放在一起,我们可以创建一个带有多模式文本框的多模式聊天机器人,供用户提交文本和媒体文件。其余代码看起来与以前几乎相同:

import gradio as gr
import os
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(((x,), None))
    if message["text"] is not None:
        history.append((message["text"], None))
    return history, gr.MultimodalTextbox(value=None, interactive=False)

def bot(history):
    response = "**That's cool!**"
    history[-1][1] = ""
    for character in response:
        history[-1][1] += character
        time.sleep(0.05)
        yield history

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

    chat_input = gr.MultimodalTextbox(interactive=True, file_types=["image"], placeholder="Enter message or upload file...", show_label=False)

    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)

demo.queue()
demo.launch()

你就完成了!这就是为聊天机器人模型构建界面所需的全部代码。最后,我们将在指南的最后提供一些在 Spaces 上运行的聊天机器人的链接,以便您了解其他可能的功能:
project-baize/Baize-7B:一个风格化的聊天机器人,允许您停止生成以及重新生成响应。
MAGAer13/mPLUG-Owl:一种多模式聊天机器人,允许您对响应进行赞成和反对。

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

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

相关文章

《你想活出怎样的人生》上映,AOC带你打开宫崎骏的动画世界大门!

摘要:宫崎骏式美学,每一帧都是治愈! 近日,宫崎骏新作《你想活出怎样的人生》正式公映。苍鹭与少年的冒险、奇幻瑰丽的场景、爱与成长的主题,让观众们收获到满满的爱与感动。宫崎骏总能以细腻的画面、温柔的音乐&#…

LeetCode - 面试题 08.06. 汉诺塔问题

目录 题目链接 解题思路 解题代码 题目链接 LeetCode - 面试题 08.06. 汉诺塔问题 解题思路 假设 n 1,只有一个盘子,很简单,直接把它从 A 中拿出来,移到 C 上; 如果 n 2 呢?这时候我们就要借助 B 了,因…

select实现echo服务器的并发

select实现echo服务器的并发 代码实现 #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <stdlib.h> #include <arpa/inet.h> #include <sys/select.h> #include <sys/time.h…

14. Spring AOP(二)实现原理

源码位置&#xff1a;spring_aop 上一篇文章中我们主要学习了AOP的思想和Spring AOP使用&#xff0c;本文讲的是Spring是如何实现AOP的&#xff0c;Spring AOP是基于动态代理来实现AOP的&#xff0c;在将动态代理之前先来了解一下什么是代理模式。 1. 代理模式 在现实中就有许…

【算法刷题 | 回溯思想 07】4.18(全排列、全排列 ||)

文章目录 11.全排列11.1题目11.2解法&#xff1a;回溯11.2.1回溯思路&#xff08;1&#xff09;函数返回值以及参数&#xff08;2&#xff09;函数返回值&#xff08;3&#xff09;遍历过程 11.2.2代码实现 12.全排列 ||12.1题目12.2解法&#xff1a;回溯12.2.1回溯思路12.2.3代…

教师编制可以跨市调动吗

在教育的广阔天地中&#xff0c;我们常常面临各种职业发展的选择。作为一名教师&#xff0c;是否能够实现跨市调动&#xff0c;这不仅是一个职业发展的问题&#xff0c;更关系到个人生活和职业规划的诸多方面。今天&#xff0c;我们就来探讨一下&#xff0c;拥有编制身份的教师…

2024免费专为Mac用户设计的清理和优化工具CleanMyMac X

CleanMyMac X是一款专为Mac用户设计的清理和优化工具。以下是对CleanMyMac X的详细介绍&#xff1a; 一、主要功能 系统清理&#xff1a;CleanMyMac X能够智能扫描Mac的磁盘空间&#xff0c;识别并清理各种垃圾文件&#xff0c;这些垃圾文件包括重复文件、无用的语言安装包、i…

模拟信号的离散化

本文介绍模拟信号的离散化。 1.采样定理 定义&#xff1a;若想重建输入的模拟信号&#xff0c;采样频率必须大于等于输入模拟信号最高频率的2倍&#xff0c;即&#xff1a; 其中&#xff0c;为采样频率&#xff0c;为输入模拟信号最高频率 否则&#xff0c;信号会发生混叠 2…

攻防世界---misc---easycap

1.下载附件是一个流量包&#xff0c;拿到wireshark中分析 2.查看分级协议 3.过滤data 4.追踪tcp流 5.得到flag

EUV光刻机机密文件被盗 | 百能云芯

4月22日消息&#xff0c;据法国媒体LeMagIT报道&#xff0c;日本光学技术领导厂商 Hoya Corporation&#xff08;豪雅&#xff09;最近遭遇了勒索软件的攻击&#xff0c;其总部和多个业务部门的IT系统遭受波及。据称超过 170 万份内部文件流失&#xff0c;其包括EUV掩模坯料和光…

根据表格该列数据的长度动态变化该列的宽度;

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、代码前言 在使用elementui的表格将数据展示出来时,我们想根据表格该列数据的长度动态变化该列的宽度; 1.看了一下elementui文档有一个 width 的属性,可用它来修改对应列。 2.那么我们需要拿到该列的所有数据去比较…

为何3D动画工作室偏爱使用在线渲染农场?

随着市场需求的不断增长和生产挑战的加剧&#xff0c;3D动画工作室面临着前所未有的压力。为了有效应对这些挑战&#xff0c;众多工作室选择了使用网络渲染农场。这种选择使他们能够借助网络渲染农场的强大渲染能力和高度灵活的资源配置&#xff0c;以此优化他们的工作流程&…

JAVA学习笔记27(异常)

1.异常 ​ *异常(Exception) ​ *快捷键 ctrl alt t 选中try - catch ​ *如果进行了异常处理&#xff0c;那么即使出现了异常&#xff0c;程序可以继续执行 1.1 基本概念 ​ *在Java语言中&#xff0c;将程序执行中发生的不正常情况称为"异常"(开发过程中的语…

Spring Boot 自动装配执行流程

Spring Boot 自动装配执行流程 Spring Boot 自动装配执行流程如下&#xff1a; Spring Boot 启动时会创建一个 SpringApplication实例&#xff0c;该实例存储了应用相关信息&#xff0c;它负责启动并运行应用。实例化 SpringApplication 时&#xff0c;会自动装载META-INF/spr…

HarmonyOS ArkUI滚动类组件-List、ListItem

List 是很常用的滚动类容器组件之一&#xff0c;它按照水平或者竖直方向线性排列子组件&#xff0c; List 的子组件必须是 ListItem &#xff0c;它的宽度默认充满 List 的宽度。 List定义介绍 interface ListInterface {(value?: { initialIndex?: number; space?: numbe…

隐藏表头和最高层级的复选框

隐藏表头和最高层级的复选框 <!-- 表格 --><el-tableref"tableRef"v-loading"tableLoading"default-expand-allclass"flex-1 !h-auto"row-key"regionId":header-cell-class-name"selectionClass":row-class-name&q…

HarmonyOS ArkUI实战开发-窗口模块(Window)

窗口模块用于在同一物理屏幕上&#xff0c;提供多个应用界面显示、交互的机制。 对应用开发者而言&#xff0c;窗口模块提供了界面显示和交互能力。对于终端用户而言&#xff0c;窗口模块提供了控制应用界面的方式。对于操作系统而言&#xff0c;窗口模块提供了不同应用界面的…

深度学习500问——Chapter08:目标检测(3)

文章目录 8.2.7 DetNet 8.2.8 CBNet 8.2.7 DetNet DetNet是发表在ECCV2018的论文&#xff0c;出发点是现有的检测任务backbone都是从分类任务衍生而来的&#xff0c;因此作者想针对检测专用的backbone做一些讨论和研究而设计了DetNet&#xff0c;思路比较新奇。 1. Introduct…

ROS机器人实战,对标古月老师HRMRP机器人(一)——机器人总体方案设计

咳咳&#xff01;这个是自己的毕业设计&#xff0c;内容比较多就拆开发。设计实现了一款SLAM移动机器人&#xff0c;加机械臂完成视觉识别抓取的&#xff0c;同时还有语音识别控制、QT上位机控制、Web网页控制。前几年看古月老师的视频&#xff0c;看到古月老师设计的HRMRP&…