Gradio全解8——ChatInterface&Chatbot:聊天界面类与聊天机器人(3)——ChatInterface的多模态功能与附加输入输出

    • 8.3 ChatInterface的多模态功能与附加输入输出
      • 8.3.1 多模态功能
        • 1. 设置multimodal和fn参数
        • 2. 传入MultimodalTextbox组件及构造参数
        • 3. 提交文件数示例
      • 8.3.2 additional_inputs:附加输入
        • 1. 定义并渲染组件示例
        • 2. 先定义后渲染组件示例
      • 8.3.3 additional_outputs:附加输出

本章目录如下:

  1. 《ChatInterface&Chatbot:聊天界面类与聊天机器人(1)——ChatInterface类示例与构造参数》
  2. 《ChatInterface&Chatbot:聊天界面类与聊天机器人(2)——ChatInterface的自定义函数和界面》
  3. 《ChatInterface&Chatbot:聊天界面类与聊天机器人(3)——ChatInterface的多模态功能与附加输入输出》
  4. 《ChatInterface&Chatbot:聊天界面类与聊天机器人(4)——返回复杂响应与直接修改Chatbot值》
  5. 《ChatInterface&Chatbot:聊天界面类与聊天机器人(5)——通过API加载、聊天历史和用户反馈》
  6. 《ChatInterface&Chatbot:聊天界面类与聊天机器人(6)——gr.ChatInterface与流行LLM库和API结合》
  7. 《ChatInterface&Chatbot:聊天界面类与聊天机器人(7)——组件gr.Chatbot及gr.ChatMessage》
  8. 《ChatInterface&Chatbot:聊天界面类与聊天机器人(8)——组件Chatbot的特殊Events》
  9. 《ChatInterface&Chatbot:聊天界面类与聊天机器人(9)——使用Blocks创建自定义聊天机器人》
  10. 《ChatInterface&Chatbot:聊天界面类与聊天机器人(10)——使用显示思考和引用构建UI》

8.3 ChatInterface的多模态功能与附加输入输出

ChatInterface同样支持文件、音频、视频上传的多模态功能,并且可添加额外的输入和输出。

8.3.1 多模态功能

支持多模态功能需要设置参数multimodal,同时改变函数fn的参数结构,并需传入组件MultimodalTextbox实例。

1. 设置multimodal和fn参数

我们可能希望为聊天界面添加多模态功能,比如上传图像或文件并可询问相关问题。这时可以向gr.ChatInterface类传递一个参数multimodal=True,使聊天机器人具备多模态功能,此时聊天函数fn的特征会略有变化,如下所述:

  • 函数的第一个参数message应接受一个字典,该字典由文本和上传文件组成,格式如下:
{"text": "user input", "files": ["updated_file_1_path.ext","updated_file_2_path.ext", ...]
}
  • 聊天函数的第二个参数history将保持与之前相同的OpenAI样式的字典格式。但如果历史记录中包含上传的文件,content键的值将不再是字符串,而是包含文件路径的单元素元组,因此每个文件将作为历史记录中的一条单独消息。在上传两个文件并提问后,历史记录可能如下所示:
[{"role": "user", "content": ("cat1.png")},{"role": "user", "content": ("cat2.png")},{"role": "user", "content": "What's the difference between these two images?"},
]

设置multimodal=True时,聊天函数的返回类型不会改变(即在最简单的情况下,仍应返回一个字符串值)。我们将在后续返回复杂响应中讨论更复杂的情况,例如返回文件。

2. 传入MultimodalTextbox组件及构造参数

当自定义多模态聊天界面时,textbox参数应该传递MultimodalTextbox的实例,其参数说明如下:

  • value:类型为str | dict[str, str | list] | Callable | None,默认为None,表示显示在MultimodalTextbox中的默认值。可以是一个字符串值,或者一个字典形式的对象,例如:{"text": "sample text", "files": [{path: "files/file.jpg", orig_name: "file.jpg", url: "http://image_url.jpg", size: 100}]}。如果是一个可调用对象(函数),则每当应用加载时都会调用该函数来设置组件的初始值。
  • sources:类型为list[Literal['upload', 'microphone']] | Literal['upload', 'microphone'] | None,默认为None。指定允许的输入来源列表。"upload"会创建一个按钮,用户可以通过点击上传或拖放文件;“microphone"会创建一个麦克风输入。如果为None,则默认值会设为"upload”。
  • file_count:类型为Literal['single', 'multiple', 'directory'],默认为“single”单个文件,“multiple"可上传多个文件,如果设置为"directory”,用户将上传所选目录中的所有文件。在"multiple"或"directory"的情况下,返回类型将是文件列表。
  • file_types:类型为list[str] | None,默认为None。"file"允许上传任何文件,"image"仅允许上传图片文件,"audio"仅允许上传音频文件,"video"仅允许上传视频文件,“text” 仅允许上传文本文件。

读者可根据自己需要设置,更多参数请参照官方文档。

3. 提交文件数示例

以下是一个提交文件数示例,展示了如何设置和自定义多模态聊天函数及聊天界面:

import gradio as gr
def count_images(message, history):num_images = len(message["files"]) # 本次上传文件history_images = 0for message in history: # 历史文件if isinstance(message["content"], tuple):history_images += 1return f"You just uploaded {num_images} images, total uploaded: {history_images+num_images}"demo = gr.ChatInterface(fn=count_images, type="messages", examples=[{"text": "No files", "files": []}], multimodal=True,textbox=gr.MultimodalTextbox(file_count="multiple", file_types=["image"])
)
demo.launch()

运行界面如图8-5:
在这里插入图片描述

图8-5

从示例中可以看到,通过组件gr.MultimodalTextbox(),我们可以同时上传多个图像、音频、视频类文件并可配有文字说明。处理函数count_images两个入参的格式已发生变化,函数中做了相应处理,请仔细观察区别。

8.3.2 additional_inputs:附加输入

附加输入输出功能为聊天函数添加额外的输入或输出,以便实现更复杂和定制化的功能。ChatInterface类支持additional_inputs参数,它在聊天函数中添加额外的输入,并通过聊天界面向用户展示这些输入。例如添加一个用于系统提示的文本框,或者设置一个响应中令牌数量的滑块。关于additional_inputs,在Interface的5.2.4节已讲过,可作为参考,此处稍有不同,请注意区分。

1. 定义并渲染组件示例

additional_inputs参数接受一个组件或组件列表,可以直接传递组件实例,或者使用它们的字符串快捷方式(例如使用 “textbox” 而不是gr.Textbox())。如果传递组件实例,并且尚未被渲染,那么组件将出现在聊天机器人下方的gr.Accordion()中。以下是一个完整的示例:

import gradio as gr
import time
def echo(message, history, system_prompt, tokens):response = f"System prompt: {system_prompt}\n Message: {message}."for i in range(min(len(response), int(tokens))):time.sleep(0.05)yield response[: i + 1]
demo = gr.ChatInterface(echo,type="messages",additional_inputs=[gr.Textbox("You are helpful AI.", label="System Prompt"),gr.Slider(10, 100),],
)
demo.launch()

运行界面如图8-6:
在这里插入图片描述

图8-6

2. 先定义后渲染组件示例

如果传递给additional_inputs的组件已经在父级gr.Blocks()中渲染过,那么它们不会在折叠面板中重新渲染,这为设置输入组件的布局提供了灵活性。在下面的示例中,我们将gr.Textbox()放置在聊天机器人界面的顶部,同时将滑块保留在下方(注意render的设置):

with gr.Blocks() as demo:system_prompt = gr.Textbox("You are helpful AI.", label="System Prompt")slider = gr.Slider(10, 100, render=False)gr.ChatInterface(echo, additional_inputs=[system_prompt, slider], type="messages")

拖动滑条并输入信息,运行界面如图8-7:
在这里插入图片描述

图8-7

我们还可以为附加输入添加示例值,将示例值的列表传递给examples参数,其中每个内部列表代表一个样本,示例将以表格形式呈现在聊天界面下方。每个内部列表的长度应为1 + len(additional_inputs),其第一个元素应为聊天消息的示例值,随后的每个元素应为额外输入的示例值,按顺序排列。

如需要创建自定义程度更高的内容,最好使用低级的gr.Blocks()构建聊天机器人界面,8.8节会单独讲述使用Blocks创建聊天机器人界面。

8.3.3 additional_outputs:附加输出

与接受附加输入到聊天函数中的方式相同,我们还可以返回附加输出。只需将组件列表传递给gr.ChatInterface中的additional_outputs参数,并从聊天函数中为每个组件返回额外的值。以下是一个提取代码并将其输出到单独的gr.Code组件中的示例:

import gradio as gr
python_code = """
def fib(n):if n <= 0:return 0elif n == 1:return 1else:return fib(n-1) + fib(n-2)
"""
js_code = """
function fib(n) {if (n <= 0) return 0;if (n === 1) return 1;return fib(n - 1) + fib(n - 2);
}
"""
def chat(message, history):if "python" in message.lower():return "Type Python or JavaScript to see the code.", gr.Code(language="python", value=python_code)elif "javascript" in message.lower():return "Type Python or JavaScript to see the code.", gr.Code(language="javascript", value=js_code)else:return "Please ask about Python or JavaScript.", Nonewith gr.Blocks() as demo:code = gr.Code(render=False)with gr.Row():with gr.Column():gr.Markdown("<center><h1>Write Python or JavaScript</h1></center>")gr.ChatInterface(chat,examples=["Python", "JavaScript"],additional_outputs=[code],type="messages")with gr.Column():gr.Markdown("<center><h1>Code Artifacts</h1></center>")code.render()
demo.launch()

运行界面如图8-8:
在这里插入图片描述

图8-8

函数chat返回响应和示例代码,响应显示在聊天输出框,而示例代码显示在附加输出的code中。
注意:与附加输入的情况不同,传递给additional_outputs的组件必须在gr.Blocks上下文中预先定义——它们不会自动渲染。如果需要在gr.ChatInterface之后渲染它们,可以在首次定义时设置render=False,然后在gr.Blocks()中需要显示时的适当部分调用组件的方法.render()重新渲染。

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

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

相关文章

php算法-- 关联数组使用,优化sip账号去重

文章目录1 变量定义2. 核心特性code1 变量定义 类型&#xff1a;嵌套的关联数组&#xff08;Nested Associative Array&#xff09;外层结构&#xff1a;[中继ID > 账号列表]键 (Key)&#xff1a;中继ID&#xff08;字符串或整型&#xff09;值 (Value)&#xff1a;索引数组…

LLM 多语言数据集

多语言数据感觉主要还是fineweb和fineweb2, 其他数据都是主要针对特定语种比较多 101 Billion Arabic Words Dataset ClusterlabAi/101_billion_arabic_words_dataset 数据主要从e Common Crawl WET 中提取&#xff0c;并采用了创新的技术来进行去重和筛选&#xff0c;主要解决…

【HarmonyOS Next之旅】DevEco Studio使用指南(三十六) -> 配置构建(三)

目录 1 -> 定制HAR多目标构建产物 1.1 -> 定义产物的deviceType 1.2 -> 定义C工程依赖的.so文件 1.3 -> 定义产物的资源 2 -> 配置APP多目标构建产物 2.1 -> 定义产物的APP包名和供应商名称 2.2 -> 定义product的bundleName 2.3 -> 定义produc…

数据赋能(340)——技术平台——共享平台

概述重要性如下&#xff1a;提高数据利用效率&#xff1a;数据共享平台能够将分散在各部门的数据进行集中管理&#xff0c;促进数据流通和共享&#xff0c;避免数据孤岛现象&#xff0c;从而提高数据利用效率。促进决策科学化&#xff1a;通过共享平台&#xff0c;各部门可以获…

开闭原则在C++中的实现

开闭原则&#xff08;Open/Closed Principle&#xff0c;简称 OCP&#xff09;是面向对象设计中的一个重要原则&#xff0c;属于“SOLID”原则之一。它的核心思想是&#xff1a;“软件实体&#xff08;如类、模块、函数等&#xff09;应该对扩展开放&#xff0c;对修改关闭。”…

C语言:*p++与p++有何区别

1. 指针基础练习&#xff1a;演示p、p和(*p)的区别核心目的&#xff1a;区分指针自增与指针指向值自增的不同逻辑&#xff0c;理解运算符优先级对指针操作的影响。#include <stdio.h>void arr1() {int arr[] {11,13,15,17,19};int *p arr;printf("结果1&#xff1…

【设计】设计一个web版的数据库管理平台后端(之二)

在之前&#xff0c;我写过一篇【设计】设计一个web版的数据库管理平台后端精要 的文章&#xff0c;文章讲了一个web版数据库管理平台的实现思路及主要代码。 最近&#xff0c;我看了下Mybatis的源码&#xff0c;觉得Mybatis的分层架构挺好&#xff0c;所以想到了完善下web版数据…

Visual tudio 各版本下 C++ 开发的核心区别与实践指南

C语言的发展经历了数十年的演进&#xff0c;从 C98 到现代的 C20/23&#xff0c;语言本身发生了巨大的变革。与此同时&#xff0c;Visual Studio 作为主流的 C 开发环境之一&#xff0c;其编译器对各个 C 标准的支持程度也随版本不断演进&#xff0c;直接影响着开发者的编程方式…

怎样让阿里云服务器(centos)有界面

要让阿里云服务器 CentOS 有图形界面&#xff0c;可以按照以下步骤进行操作&#xff1a;登录服务器&#xff1a;使用 SSH 客户端工具&#xff0c;通过 IP 地址和账号登录到阿里云服务器。更新系统软件源&#xff1a;输入命令sudo yum update&#xff0c;更新系统软件源&#xf…

Qt 异步编程模式与应用

在现代软件开发中&#xff0c;异步编程已成为提升应用性能和响应性的关键技术。Qt 作为一个强大的跨平台框架&#xff0c;提供了多种异步编程模式&#xff0c;包括信号槽机制、事件循环、线程池、异步 I/O 等。本文将深入探讨 Qt 异步编程的各种模式及其应用场景&#xff0c;帮…

面试150 数字范围按位与

思路 只要 left < right&#xff0c;说明两者在某些低位上存在不同&#xff0c;为了找到它们的公共前缀&#xff08;高位相同部分&#xff09;&#xff0c;不断将 left 和 right 同时右移&#xff08;即除以2&#xff09;&#xff0c;直到它们相等&#xff0c;记录右移的次数…

数据库HB OB mysql ck startrocks, ES存储特点,以及应用场景

这些数据库和存储引擎主要有:HB(HBase)、OB(OceanBase)、MySQL、ClickHouse(CK)、StarRocks、Elasticsearch(ES),下面分别介绍它们的存储特点以及典型应用场景。 1. HBase (HB) 存储特点 分布式、面向列的NoSQL数据库 采用HDFS存储,数据以表、row key、列族、时间戳…

Java技术栈/面试题合集(17)-Git篇

场景 Java入门、进阶、强化、扩展、知识体系完善等知识点学习、性能优化、源码分析专栏分享: Java入门、进阶、强化、扩展、知识体系完善等知识点学习、性能优化、源码分析专栏分享_java高级进阶-CSDN博客 通过对面试题进行系统的复习可以对Java体系的知识点进行查漏补缺。…

破局与重构:King’s LIMS 引领电子行业实验室智能化转型

在全球化高新技术竞争白热化背景下&#xff0c;电子行业正经历从规模导向扩张向质量效益跃升的战略转型。终端用户对产品性能的极致化追求、行业质量合规标准的持续迭代升级&#xff0c;以及检测数据的指数级增长&#xff0c;共同形成"需求牵引供给、供给创造需求"的…

暑期算法训练.9

目录 43 .力扣75 颜色分类 43.1 题目解析&#xff1a; 43.2 算法思路&#xff1a; 43.3 代码演示&#xff1a; 43.4 总结反思&#xff1a; 44. 力扣 912 排序数组 44.1 题目解析&#xff1a; 44.2 算法思路&#xff1a; 44.3 代码演示&#xff1a; ​编辑 44.4 总结反…

2.安装CUDA详细步骤(含安装截图)

2.安装CUDA 第一步&#xff1a;安装anaconda 注意&#xff1a;安装CUDA之前需要安装好anaconda&#xff0c;详见安装anaconda详细步骤&#xff08;含安装截图&#xff09; 文章目录2.安装CUDA2.0 CUDA是什么&#xff0c;为什么要安装它&#xff1f;2.1 验证计算机是否安装CUDA2…

Triton IR

Triton IR语法 Triton IR的语句遵从MLIR Dialect的语法定义规范&#xff0c;示例如下&#xff1a; %3 tt.splat %1 : i32 -> tensor<1024xi32> loc(#loc5) 其中&#xff1a; %0&#xff1a;右边expression的结果值的名字&#xff08;Value的name&#xff09; tt…

掌握JavaScript函数封装与作用域

JavaScript 基础 - 第4天笔记理解封装的意义&#xff0c;能够通过函数的声明实现逻辑的封装&#xff0c;知道对象数据类型的特征&#xff0c;结合数学对象实现简单计算功能。理解函数的封装的特征掌握函数声明的语法理解什么是函数的返回值知道并能使用常见的内置函数函数理解函…

Datawhale AI 夏令营—科大讯飞AI大赛(大模型技术)—让大模型理解表格数据(列车信息表)

目录 一、本次赛事目标&#xff1a;让大模型理解表格数据&#xff08;列车信息表&#xff09; 二、分析赛题、对问题进行建模 赛事背景 赛题解读 数据分析与探索 赛题要点与难点 解题思考过程 三、Baseline方案 Baseline概况 Baseline运行步骤 Baseline文件概况 Ba…

SSH连接失败排查与解决教程: Connection refused

前言 当使用云服务器&#xff08;如阿里云、腾讯云、AWS 等&#xff09;时&#xff0c;尝试在本地PC端使用图形化工具如 FinalShell、XShell可能会遇到 SSH 连接失败的问题。本文列举 SSH 连接失败的常见原因&#xff0c;并提供对应解决方案&#xff0c;帮助快速定位并解决问题…