Gradio全解8——ChatInterfaceChatbot:聊天界面類與聊天機器人(3)——ChatInterface的多模態功能與附加輸入輸出

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;幫助快速定位并解決問題…