大模型WebUI:Gradio全解11——Chatbots:融合大模型的多模态聊天机器人(2)

devtools/2025/1/12 20:53:30/

大模型WebUI:Gradio全解11——Chatbots:融合大模型的聊天机器人(2)

  • 前言
  • 本篇摘要
  • 11. Chatbot:融合大模型的多模态聊天机器人
    • 11.2 使用流行的LLM库和API
      • 11.2.1 Llama Index
      • 11.2.2 LangChain
      • 11.2.3 OpenAI
        • 1. 基本用法
        • 2. 语音聊天
        • 3. Twilio凭据
        • 4. 自定义Interface
      • 11.2.4 Hugging Face transformers
      • 11.2.5 SambaNova
      • 11.2.6 Hyperbolic
      • 11.2.7 Anthropic Claude
    • 参考文献

前言

本系列文章主要介绍WEB界面工具Gradio。Gradio是Hugging Face发布的简易webui开发框架,它基于FastAPI和svelte,便于开发多功能界面和部署人工智能模型,是当前热门的非常易于开发和展示机器学习大语言模型LLM及扩散模型DM的UI框架。本系列文章分为前置概念和实战演练两部分。前置概念先介绍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 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:融合大模型的多模态聊天机器人(上)》
  19. 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(下)》
  20. 《Gradio全解系列12——Data Science And Plots:数据科学与绘图》
  21. 《Gradio全解13——Streaming:数据流(上)》
  22. 《Gradio全解13——Streaming:数据流(下)》

本篇摘要

本篇介绍如何使用Gradio创建聊天机器人,主要内容包括gr.ChatInterface快速创建Chatbot、与流行LLM库及API结合、使用Agents和Tools智能代理工具、使用Blocks创建Chatbot、Chatbot的特殊Events、通过Gradio应用创建Discord Bot/Slack Bot/Website Widget。

11. Chatbot:融合大模型的多模态聊天机器人

本章介绍如何使用Gradio创建聊天机器人。聊天机器人是大型语言模型(LLMs)的一个流行应用,通过Gradio,我们可以轻松构建LLM演示并与其它用户分享,或者自己使用直观的聊天机器人界面进行开发尝试。本章主要内容包括gr.ChatInterface快速创建Chatbot、与流行LLM库及API结合、使用Agents和Tools智能代理工具、使用Blocks创建Chatbot、Chatbot的特殊Events、通过Gradio应用创建Discord Bot/Slack Bot/Website Widget。

11.2 使用流行的LLM库和API

在本节中,我们将通过几个示例展示如何将gr.ChatInterface与流行的LLM库和API提供商一起使用,将涵盖以下库和API提供商:

  • Llama Index
  • LangChain
  • OpenAI
  • Hugging Face transformers
  • SambaNova
  • Hyperbolic
  • Anthropic’s Claude

大部分LLM库和提供商都存在社区维护的集成库,这使得启动Gradio应用程序更加容易。我们将在下面的适当部分中引用这些库,下面逐一介绍它们的用法。

11.2.1 Llama Index

让我们从在OpenAI上使用llama-index开始,构建一个RAG聊天机器人。该机器人可以在任意文本或 PDF文件上运行,并且可以在不到30行代码中演示和分享它。此示例需要OpenAI密钥(请继续阅读以获取免费的开源等效方案!),代码如下:

# This is a simple RAG chatbot built on top of Llama Index and Gradio. It allows you to upload any text or PDF files and ask questions about them!
# Before running this, make sure you have exported your OpenAI API key as an environment variable:
# export OPENAI_API_KEY="your-openai-api-key"from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
import gradio as grdef answer(message, history):files = []for msg in history:if msg['role'] == "user" and isinstance(msg['content'], tuple):files.append(msg['content'][0])for file in message["files"]:files.append(file)documents = SimpleDirectoryReader(input_files=files).load_data()index = VectorStoreIndex.from_documents(documents)query_engine = index.as_query_engine()return str(query_engine.query(message["text"]))demo = gr.ChatInterface(answer,type="messages",title="Llama Index RAG Chatbot",description="Upload any text or pdf files and ask questions about them!",textbox=gr.MultimodalTextbox(file_types=[".pdf", ".txt"]),multimodal=True
)demo.launch()

运行界面如下:
在这里插入图片描述
注意:

  1. 需要安装包llama_index,受限于未知原因,有些代码作者难以运行出结果,请读者将重点放在理解代码,下同;
  2. 如果未设置OPENAI_API_KEY,提交文档后,会在后台报错:Original error:No API key found for OpenAI。OPENAI_API_KEY获取地址:https://platform.openai.com/account/api-keys,使用OPENAI、Google或Microsoft注册账号登录后,创建某组织(可随意填写)并跳过邀请成员后,即可获得。然后在运行环境中键入命令:export OPENAI_API_KEY=“your-openai-api-key”;
  3. 如果设置后还遇到401认证错误,可能是因为OpenAI API客户端无法从环境变量中获取API令牌。此时可以将其保存到Python会话中,或者在代码界面运行:
import os
os.environ["OPENAI_API_KEY"] = ""

11.2.2 LangChain

以下是一个在OpenAI上使用langchain构建通用聊天机器人的示例。与之前一样,此示例需要OpenAI 密钥。

# This is a simple general-purpose chatbot built on top of LangChain and Gradio.
# Before running this, make sure you have exported your OpenAI API key as an environment variable:
# export OPENAI_API_KEY="your-openai-api-key"from langchain_openai import ChatOpenAI
from langchain.schema import AIMessage, HumanMessage
import gradio as grmodel = ChatOpenAI(model="gpt-4o-mini")def predict(message, history):history_langchain_format = []for msg in history:if msg['role'] == "user":history_langchain_format.append(HumanMessage(content=msg['content']))elif msg['role'] == "assistant":history_langchain_format.append(AIMessage(content=msg['content']))history_langchain_format.append(HumanMessage(content=message))gpt_response = model.invoke(history_langchain_format)return gpt_response.contentdemo = gr.ChatInterface(predict,type="messages"
)demo.launch()

运行界面如下:
在这里插入图片描述
提示:本例需安装langchain_openailangchain。另外,对于快速原型设计,社区维护的langchain-gradio仓库使得在LangChain上构建聊天机器人变得更加容易。

11.2.3 OpenAI

当然我们也可以直接使用openai库,但对于快速原型设计,openai-gradio库使得在OpenAI模型上构建聊天机器人更加容易。openai-gradio是一个 Python包,它使开发者能够非常轻松地创建由OpenAI API驱动的机器学习应用程序。

1. 基本用法

使用以下命令安装openai-gradio:

pip install openai-gradio

同样需要设置OPENAI_API_KEY,然后就可以通过几行代码完成聊天机器人程序:

import gradio as gr
import openai_gradiogr.load(name='gpt-4-turbo',src=openai_gradio.registry,
).launch()

运行后就可以看到连接到OpenAI模型的Gradio界面:
在这里插入图片描述
底层原理:openai-gradio Python库有两个依赖项:openai和gradio,它定义了一个“注册”函数 openai_gradio.registry,该函数接收一个模型名称并返回一个Gradio应用。

2. 语音聊天

OpenAI-Gradio还支持语音聊天功能。我们可以通过以下两种方式启用该功能:

  1. 使用实时模型:
import gradio as gr
import openai_gradiogr.load(name='gpt-4o-realtime-preview-2024-10-01',src=openai_gradio.registry
).launch()
  1. 显式地使用任意实时模型:
import gradio as gr
import openai_gradiogr.load(name='gpt-4o-mini-realtime-preview-2024-12-17',src=openai_gradio.registry,enable_voice=True
).launch()

这将创建一个基于WebRTC的界面,允许与AI模型进行实时语音对话。

3. Twilio凭据

为了实现语音聊天功能,除了OPENAI_API_KEY,还需要Twilio凭据(WebRTC语音聊天所需):

export TWILIO_ACCOUNT_SID=<your Twilio account SID>
export TWILIO_AUTH_TOKEN=<your Twilio auth token>

我们可以通过以下方式获取Twilio的凭证:

  1. 在 Twilio 上创建一个免费账户,地址:https://www.twilio.com/en-us;
  2. 在 Twilio 控制台中获取 Account SID 和 Auth Token。
    如果没有Twilio凭证,语音聊天功能仍然可以工作,但在某些网络环境中可能会遇到连接问题。
4. 自定义Interface

一旦我们可以通过OpenAI端点创建一个Gradio用户界面,就可以通过设置自己的输入和输出组件或任何其他gr.Interface参数来自定义它。演示代码如下:

import gradio as gr
import openai_gradiogr.load(name='gpt-4-turbo',src=openai_gradio.registry,title='OpenAI-Gradio Integration',description="Chat with GPT-4-turbo model.",examples=["Explain quantum gravity to a 5-year old.", "How many R are there in the word Strawberry?"]
).launch()

运行截图如下:
在这里插入图片描述
或者将加载的Interface组合到更大的Gradio Web用户界面中,例如:

import gradio as gr
import openai_gradiowith gr.Blocks() as demo:with gr.Tab("GPT-4-turbo"):gr.load('gpt-4-turbo', src=openai_gradio.registry)with gr.Tab("GPT-3.5-turbo"):gr.load('gpt-3.5-turbo', src=openai_gradio.registry)demo.launch()

OpenAI支持的所有聊天API模型都与该集成兼容。有关可用模型及其详细信息的完整列表,请参阅 OpenAI模型文档:https://platform.openai.com/docs/models。

11.2.4 Hugging Face transformers

在许多情况下,我们可能希望在本地运行聊天机器人。以下是使用Hugging Face transformers库和 SmolLM2-135M-Instruct模型的等效示例:

from transformers import AutoModelForCausalLM, AutoTokenizer
import gradio as grcheckpoint = "HuggingFaceTB/SmolLM2-135M-Instruct"
device = "cpu"  # "cuda" or "cpu"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForCausalLM.from_pretrained(checkpoint).to(device)def predict(message, history):history.append({"role": "user", "content": message})input_text = tokenizer.apply_chat_template(history, tokenize=False)inputs = tokenizer.encode(input_text, return_tensors="pt").to(device)  outputs = model.generate(inputs, max_new_tokens=100, temperature=0.2, top_p=0.9, do_sample=True)decoded = tokenizer.decode(outputs[0])response = decoded.split("<|im_start|>assistant\n")[-1].split("<|im_end|>")[0]return responsedemo = gr.ChatInterface(predict, type="messages")demo.launch()

运行截图如下:

11.2.5 SambaNova

SambaNova Cloud API提供了对全精度开源模型(例如Llama系列)的访问权限。以下是一个围绕SambaNova API构建Gradio应用的示例(注意这里需要设置SAMBANOVA_API_KEY,申请地址:https://sambanova.ai/):

# This is a simple general-purpose chatbot built on top of SambaNova API. 
# Before running this, make sure you have exported your SambaNova API key as an environment variable:
# export SAMBANOVA_API_KEY="your-sambanova-api-key"import os
import gradio as gr
from openai import OpenAIapi_key = os.getenv("SAMBANOVA_API_KEY")client = OpenAI(base_url="https://api.sambanova.ai/v1/",api_key=api_key,
)def predict(message, history):history.append({"role": "user", "content": message})stream = client.chat.completions.create(messages=history, model="Meta-Llama-3.1-70B-Instruct-8k", stream=True)chunks = []for chunk in stream:chunks.append(chunk.choices[0].delta.content or "")yield "".join(chunks)demo = gr.ChatInterface(predict, type="messages")demo.launch()

提示:对于快速原型设计,sambanova-gradio库使得在SambaNova模型上构建聊天机器人变得更加容易。

11.2.6 Hyperbolic

Hyperbolic AI API提供了对许多开源模型(例如Llama系列)的访问权限。以下是一个通过SambaNova API构建Gradio应用的示例(这里同样需要设置HYPERBOLIC_API_KEY):

# This is a simple general-purpose chatbot built on top of Hyperbolic API. 
# Before running this, make sure you have exported your Hyperbolic API key as an environment variable:
# export HYPERBOLIC_API_KEY="your-hyperbolic-api-key"import os
import gradio as gr
from openai import OpenAIapi_key = os.getenv("HYPERBOLIC_API_KEY")client = OpenAI(base_url="https://api.hyperbolic.xyz/v1/",api_key=api_key,
)def predict(message, history):history.append({"role": "user", "content": message})stream = client.chat.completions.create(messages=history, model="gpt-4o-mini", stream=True)chunks = []for chunk in stream:chunks.append(chunk.choices[0].delta.content or "")yield "".join(chunks)demo = gr.ChatInterface(predict, type="messages")demo.launch()

提示:对于快速原型设计,hyperbolic-gradio库使得在Hyperbolic模型上构建聊天机器人变得更加容易。

11.2.7 Anthropic Claude

Anthropic的Claude模型也可以通过API使用。以下是一个基于Anthropic API构建的简单20个问题风格的游戏示例:

# This is a simple 20 questions-style game built on top of the Anthropic API.
# Before running this, make sure you have exported your Anthropic API key as an environment variable:
# export ANTHROPIC_API_KEY="your-anthropic-api-key"import anthropic
import gradio as grclient = anthropic.Anthropic()def predict(message, history):keys_to_keep = ["role", "content"]history = [{k: d[k] for k in keys_to_keep if k in d} for d in history]history.append({"role": "user", "content": message})if len(history) > 20:history.append({"role": "user", "content": "DONE"})output = client.messages.create(messages=history,  model="claude-3-5-sonnet-20241022",max_tokens=1000,system="You are guessing an object that the user is thinking of. You can ask 10 yes/no questions. Keep asking questions until the user says DONE")return {"role": "assistant","content": output.content[0].text,  "options": [{"value": "Yes"}, {"value": "No"}]}placeholder = """
<center><h1>10 Questions</h1><br>Think of a person, place, or thing. I'll ask you 10 yes/no questions to try and guess it.
</center>
"""demo = gr.ChatInterface(predict,examples=["Start!"],chatbot=gr.Chatbot(placeholder=placeholder),type="messages"
)demo.launch()

参考文献

  1. Gradio - guides - Additional Features
  2. openai-gradio

http://www.ppmy.cn/devtools/149544.html

相关文章

notebook主目录及pip镜像源修改

目录 一、notebook主目录修改二、pip镜像源修改 一、notebook主目录修改 在使用Jupyter Notebook进行数据分析时&#xff0c;生成的.ipynb文件默认会保存在Jupyter的主目录中。通常情况下&#xff0c;系统会将Jupyter的主目录设置为系统的文档目录&#xff0c;而文档目录通常位…

Spring Boot整合SSE实时通信

服务器发送事件&#xff08;Server-Sent Events, SSE&#xff09;是一种让网页实时更新的技术。想象一下&#xff0c;您正在浏览一个网页&#xff0c;而这个网页需要在有新信息时自动更新&#xff0c;比如新闻网站的最新消息、社交媒体的通知或股票市场的价格变动。SSE使得这种…

2025年入职/转行网络安全,该如何规划?网络安全职业规划

网络安全是一个日益增长的行业&#xff0c;对于打算进入或转行进入该领域的人来说&#xff0c;制定一个清晰且系统的职业规划非常重要。2025年&#xff0c;网络安全领域将继续发展并面临新的挑战&#xff0c;包括不断变化的技术、法规要求以及日益复杂的威胁环境。以下是一个关…

计算机网络-数据链路层(交换机相关知识)

2.5交换机 2.5.1集线器和交换机的区别 使用集线器和双绞线的星型网络 使用集线器的以太网在逻辑上仍然是一个总线网&#xff0c;在各站共享总线资源&#xff0c;使用的还是CSMA/CD协议&#xff1b; 集线器只工作在物理层&#xff0c;他的每个接口仅简单的转发bit&#xff0c;…

二次雷达的详细介绍及代码示例

一、二次雷达的工作原理 二次雷达&#xff0c;又称空管雷达信标系统&#xff08;Air Traffic Control Radar Beacon System&#xff0c;ATCRBS&#xff09;&#xff0c;是一种无线电电子测位和辨认系统。它由地面询问雷达和飞机上的应答雷达&#xff08;又称雷达信标&#xff0…

C#调用MyLibxl来生成EXCEL的订货清单

在进销存里,基本上都有销售订单, 而这些订单的格式更是五花八门的。 一般情况用EXCEL的文件就可以表达出来,然后再通过打印EXCEL文件,就完成了整个订单的生成了。 下面就来生成如下面所示的销售收据: 接着需要编写下面这段代码: using MyLibxl; using MyLib.Libxl; u…

【Linux】UOS统信服务器本地yum源搭建实践

目录 ​编辑 一、下载镜像 二、服务器配置yum 一、下载镜像 镜像下载地址&#xff1a;https://www.chinauos.com/resource/download-server 二、服务器配置yum mkdir -p /yum/local mount -o loop /home/iso/uos-server-20-1060a-amd64.iso /yum/local/ 安装并配置httpd …

创建基本的 Electron 应用项目的详细步骤

创建一个基本的 Electron 应用项目的详细步骤。我们将从安装 Node.js 开始&#xff0c;然后创建项目文件夹并初始化 Electron 项目。 1. 安装 Node.js 首先&#xff0c;确保你已经安装了 Node.js 和 npm。你可以在终端中运行以下命令来检查是否已经安装&#xff1a; node -v…