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

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

文章目录

  • 如何使用渐变块创建自定义聊天机器人
  • 一、介绍
  • 二、参考示例
    • 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.mfbz.cn/a/564662.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FloodFill算法简介(用BFS、DFS算法解决)

FloodFill算法中文名:洪水灌溉 FloodFill通常是这样一类问题,如下图: 负数表示凹陷的土地,正数表示凸起的土地,发洪水/下雨会淹没凹陷的地方 通常会问这几种问题: 1.被淹没的区域有几块 2.被淹没的最大…

java的单元测试和反射

单元测试 就是针对最小的功能单元,编写测试代码对其进行正确性测试 Junit单元测试框架: 可以用来对方法进行测试 有点: 可以灵活的编写测试代码,可以针对某个方法进行测试,也支持一键完成对全部方法的自动发测试&a…

Linux中grep详解

一、grep基本介绍 全拼:Global search REgular expression and Print out the line. 从grep的全称中可以了解到,grep是一个可以利用”正则表达式”进行”全局搜索”的工具,grep会在文本文件中按照指定的正则进行全局搜索,并将搜索出的行打印出…

基于工程车辆/物流车辆/消防车辆远程通信的车队管理解决方案

交通运输对全球经济至关重要,特别是长途卡车在现今的供应链中发挥着重要作用。目前,货运物流面临许多挑战,包括不断上升的燃料价格和排放污染等问题。由于重型卡车的尺寸和载重量大,这意味着它们产生更多的二氧化碳排放足迹。在国…

java 溯本求源之基础(十八)之Monitoring--jmc

1.JMC概述 JMC全称Java Mission Control,集成了多个功能强大的组件,其中最核心的两部分是管理控制台和Java Flight Recorder。管理控制台允许开发者实时监控应用的运行状态,捕捉各种性能指标;而Java Flight Recorder则提供了一种高…

SQLite的DBSTAT 虚拟表(三十六)

返回:SQLite—系列文章目录 上一篇:SQLite运行时可加载扩展(三十五) 下一篇:SQLite—系列文章目录 1. 概述 DBSTAT 虚拟表是一个只读的同名虚拟表,返回 有关用于存储内容的磁盘空间量的信息 的 SQLite 数据库。 示例用例…

陈奂仁联手 The Sandbox 推出“Hamsterz Doodles”人物化身系列

全新人物化身系列结合艺术与实用性 开创元宇宙新篇章 著名亚洲唱作歌手兼香港电影金像奖得主陈奂仁携手 The Sandbox,兴奋地宣布推出新的元宇宙人物化身系列 —— Hamsterz Doodles 仓鼠涂鸦。 陈奂仁在 The Sandbox 推出 Hamsterz Doodles 系列,将艺术与…

3i平台体验性能加持,13600KF+B760M+撼与科技A770 TITAN装机体验

在2022年,intel重启显卡线,带来了多款性价比十分不错的显卡。而近段时间,又有传言说intel第二代产品e即将面世,甚至已经有数款Battlemage GPU曝光,让不少intel忠实粉丝直呼期待,或许在今年年底,…

【新知实验室 - TRTC 实践】音视频互动 Demo、即时通信 IM 服务搭建

一、TRTC 初识 TRTC 是什么 TRTC(Tencent RTC)腾讯实时音视频,源自于 QQ 音视频团队,是基于 QQ 音视频多年来的音视频技术积累,位于腾讯云的 RTC 云服务。TRTC 支持腾讯会议、企业微信直播、微信视频号、腾讯云课堂、…

AI大模型探索之路-实战篇2:基于CVP架构-企业级知识库实战落地

目录 前言 一、概述 二、本地知识库需求分析 1. 知识库场景分析 2. 知识库应用特点 3. 知识库核心功能 三、本地知识库架构设计 1. RAG架构分析 2. 大模型方案选型 3. 应用技术架构选型 4. 向量数据库选型 5. 模型选型 三、本地知识库RAG评估 四、本地知识库代码落地 1. 文件…

leetcode最大间距(桶排序+Python)

虽然直接排完序,再求最大差值更快,这里我们还是学一下桶排序。 桶排序主要维护一个bucket,初始bucket【i】 0,遍历nums,当i存在时,令bucket【i】 1,表示存在。遍历完nums,bucket中有…

【点云语义分割】弱监督点云语义分割-双教师指导的对比学习

Weakly Supervised Learning for Point Cloud Semantic Segmentation With Dual Teacher 摘要: 为了增强特征学习能力,我们在这项工作中引入了双教师指导的对比学习框架,用于弱监督点云语义分割。双教师框架可以减少子网络耦合,促…

Java web应用性能分析之服务端慢[网络慢]

Java web应用性能分析之服务端慢,如果是网络原因引起的服务端慢,经常会被忽略,很多时候我们第一时间不会去排查网络原因。出现这种情况也很正常,因为应用的外部网络都是超100M的大宽带服务器,而内部则是千兆网卡或者万…

SpringCloud 与 Dubbo 的区别详解

一、Spring Cloud 和 Dubbo 的概述 1.1 SpringCloud 简介 SpringCloud 是一个用于构建云原生应用的框架集合,它为开发者提供了一套完整的工具链,用于快速搭建分布式系统。SpringCloud 基于 SpringBoot 开发,具有如下特点: 提供…

mysql常见语法操作笔记

1. 数据库的基本操作 1.1. MYSQL登录与退出 D:\phpstudy_pro\Extensions\MySQL5.7.26\bin 输入 mysql -uroot -proot -h127.0.0.1 退出的三种方法 mysql > exit; mysql > quit; mysql > \q; 1.2. MYSQL数据库的一些解释 注意:数据库就相当于文件夹 …

类和对象(2)——封装(封装的概念、包、staic)

前言 面向对象程序三大特性:封装、继承、多态。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节。 一、什么是封装 1.1 概念 将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节&…

CXL论文阅读笔记整理(持续更新)

CXL 介绍 An Introduction to the Compute Express LinkTM (CXLTM) Interconnect arXiv Paper 对CXL技术进行介绍,包括CXL 1.0、CXL 2.0、CXL 3.0,对各规范的提升做介绍。整理了现有的CXL实现方法,延迟测试结果,对未来发展进行…

三分钟带你读懂面向对象的三大特征:封装,继承,多态

很多小伙伴在学面向对象的时候觉得非常抽象,尤其是对于面向对象的三大特征:封装,继承,多态不理解,那这期文章呢,九九就给大家安排,三分种带你迅速掌握封装,继承,多态。 …

17.基础乐理-调式、自然大调式(C大调、D大调。。。)

调式: 若干个音,按照某种规则排列起来,就是调式,调式是一个非常大,非常抽象的概念,调式这两个字是一个统称,当明确了 若干个音 到底有几个音,某种规则到底是什么规则之后&#xff0c…

刚拿到的《HarmonyOS应用开发者高级认证》,全网整理的题目,将近300题,100%通过

刚拿到《HarmonyOS应用开发者高级认证》,现在把题目和答案分享一下,这些题目是我根据其他网站整理的,宁滥勿缺,有个别题目是重复的,抽半天时间看一下,应该是稳过的。当然建议还是先跟着文档学一下鸿蒙或者看…
最新文章