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

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

  • 前言
  • 本篇摘要
  • 11. Chatbot:融合大模型的多模态聊天机器人
    • 11.6 为LLM Agent构建UI
      • 11.6.1 使用transformers.agents
      • 11.6.2 使用Langchain agents
      • 11.6.3 使用显式思考的Gemini 2.0 Flash Thinking API
    • 参考文献

前言

本系列文章主要介绍WEB界面工具Gradio。Gradio是Hugging Face发布的简易webui开发框架,它基于FastAPI和svelte,可以使用机器学习模型、python函数或API开发多功能界面和部署人工智能模型,是当前热门的非常易于展示机器学习大语言模型LLM及扩散模型DM的WebUI框架。
本系列文章分为前置概念、安装运行与部署、Gradio高级特性、基础功能实战和高级功能实战五部分。第一部分前置概念:先介绍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的多种高级特性,包括三种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:融合大模型的多模态聊天机器人(1)》
  19. 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(2)》
  20. 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(3)》
  21. 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(4)》
  22. 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(5)》
  23. 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(6)》
  24. 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(7)》
  25. 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(8)》
  26. 《Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(9)》
  27. 《Gradio全解系列12——Data Science And Plots:数据科学与绘图》
  28. 《Gradio全解13——Streaming:数据流(上)》
  29. 《Gradio全解13——Streaming:数据流(下)》

本篇摘要

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

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

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

11.6 为LLM Agent构建UI

Gradio的Chatbot组件可以原生显示中间思考和工具使用情况(参考metadata用法),这使得它非常适合为LLM Agent和思维链(Chain-of-Thought, CoT)演示创建UI用户界面,本节将向你展示如何实现这一点。
本节使用两种代理工具来构建UI,一种使用transformers.agents,另一种使用Langchain agents,最后使用显示思考的LLM构建UI。

11.6.1 使用transformers.agents

我们将创建一个简单的Gradio应用程序代理,该代理可以使用文本生成图像的工具。提示:请确保你先阅读了transformers代理文档,地址:https://huggingface.co/docs/transformers/en/agents。

我们将从导入transformers和gradio中的必要类开始,代码如下:

import gradio as gr
from dataclasses import asdict
from transformers import Tool, ReactCodeAgent  # type: ignore
from transformers.agents import stream_to_gradio, HfApiEngine  # type: ignore# Import tool from Hub
image_generation_tool = Tool.from_space(  # type: ignorespace_id="black-forest-labs/FLUX.1-schnell",name="image_generator",description="Generates an image following your prompt. Returns a PIL Image.",api_name="/infer",
)llm_engine = HfApiEngine("Qwen/Qwen2.5-Coder-32B-Instruct")
# Initialize the agent with both tools and engine
agent = ReactCodeAgent(tools=[image_generation_tool], llm_engine=llm_engine)# Building UI
def interact_with_agent(prompt, history):messages = []yield messagesfor msg in stream_to_gradio(agent, prompt):messages.append(asdict(msg))  # type: ignoreyield messagesyield messagesdemo = gr.ChatInterface(interact_with_agent,chatbot= gr.Chatbot(label="Agent",type="messages",avatar_images=(None,"https://em-content.zobj.net/source/twitter/53/robot-face_1f916.png",),),examples=[["Generate an image of an astronaut riding an alligator"],["I am writing a children's book for my daughter. Can you help me with some illustrations?"],],type="messages",
)if __name__ == "__main__":demo.launch()

运行截图如下:
在这里插入图片描述
作者在本地运行时会报JSON解析错误:JSONDecodeError: Expecting value: line 1 column 1 (char 0),解决办法无从查找,请读者使用Hugging Face的演示:https://huggingface.co/spaces/gradio/agent_chatbot。
从输出可以看到思考、工具调用和最终结果的调用过程,正是ReactCodeAgent代理的推理执行过程。

11.6.2 使用Langchain agents

我们将为一个可以访问搜索引擎的Langchain agents创建一个用户界面,将从导入库和设置Langchain agents开始。请注意,你需要一个包含以下环境变量的.env文件或将它们设置到运行环境中:SERPAPI_API_KEY=“”、HF_TOKEN=““和OPENAI_API_KEY=””。
演示代码如下:

from langchain import hub
from langchain.agents import AgentExecutor, create_openai_tools_agent, load_tools
from langchain_openai import ChatOpenAI
from gradio import ChatMessage
import gradio as gr
from dotenv import load_dotenvload_dotenv()model = ChatOpenAI(temperature=0, streaming=True)tools = load_tools(["serpapi"])# Get the prompt to use - you can modify this!
prompt = hub.pull("hwchase17/openai-tools-agent")
# print(prompt.messages) -- to see the prompt
agent = create_openai_tools_agent(model.with_config({"tags": ["agent_llm"]}), tools, prompt
)
agent_executor = AgentExecutor(agent=agent, tools=tools).with_config({"run_name": "Agent"}
)

然后创建Gradio UI:

async def interact_with_langchain_agent(prompt, messages):messages.append(ChatMessage(role="user", content=prompt))yield messagesasync for chunk in agent_executor.astream({"input": prompt}):if "steps" in chunk:for step in chunk["steps"]:messages.append(ChatMessage(role="assistant", content=step.action.log,metadata={"title": f"🛠️ Used tool {step.action.tool}"}))yield messagesif "output" in chunk:messages.append(ChatMessage(role="assistant", content=chunk["output"]))yield messageswith gr.Blocks() as demo:gr.Markdown("# Chat with a LangChain Agent 🦜⛓️ and see its thoughts 💭")chatbot = gr.Chatbot(type="messages",label="Agent",avatar_images=(None,"https://em-content.zobj.net/source/twitter/141/parrot_1f99c.png",),)input = gr.Textbox(lines=1, label="Chat Message")input.submit(interact_with_langchain_agent, [input_2, chatbot_2], [chatbot_2])demo.launch()

运行界面如下:
在这里插入图片描述
不能运行的读者可以在Hugging Face上查看完整演示:https://huggingface.co/spaces/gradio/langchain-agent。

11.6.3 使用显式思考的Gemini 2.0 Flash Thinking API

Gradio的Chatbot组件借助metadata可以原生显示一个思考型LLM的中间思考过程,这使得它非常适合创建展示AI模型在生成响应时如何“思考”的用户界面。以下将向你展示如何构建一个实时显示Gemini AI思考过程的聊天机器人。

让我们创建一个完整的聊天机器人,实时显示其思考和响应。我们将使用Google的Gemini API来访问 Gemini 2.0 Flash Thinking LLM,并使用Gradio构建用户界面。

我们将从导入库和设置 Gemini 客户端开始。当然需要先获取一个 Google Gemini API密钥,代码如下:

import gradio as gr
from gradio import ChatMessage
from typing import Iterator
import google.generativeai as genaigenai.configure(api_key="your-gemini-api-key")
model = genai.GenerativeModel("gemini-2.0-flash-thinking-exp-1219")

First, let’s set up our streaming function that handles the model’s output:

def stream_gemini_response(user_message: str, messages: list) -> Iterator[list]:"""Streams both thoughts and responses from the Gemini model."""# Initialize response from Geminiresponse = model.generate_content(user_message, stream=True)# Initialize buffersthought_buffer = ""response_buffer = ""thinking_complete = False# Add initial thinking messagemessages.append(ChatMessage(role="assistant",content="",metadata={"title": "⏳Thinking: *The thoughts produced by the Gemini2.0 Flash model are experimental"}))for chunk in response:parts = chunk.candidates[0].content.partscurrent_chunk = parts[0].textif len(parts) == 2 and not thinking_complete:# Complete thought and start responsethought_buffer += current_chunkmessages[-1] = ChatMessage(role="assistant",content=thought_buffer,metadata={"title": "⏳Thinking: *The thoughts produced by the Gemini2.0 Flash model are experimental"})# Add response messagemessages.append(ChatMessage(role="assistant",content=parts[1].text))thinking_complete = Trueelif thinking_complete:# Continue streaming responseresponse_buffer += current_chunkmessages[-1] = ChatMessage(role="assistant",content=response_buffer)else:# Continue streaming thoughtsthought_buffer += current_chunkmessages[-1] = ChatMessage(role="assistant",content=thought_buffer,metadata={"title": "⏳Thinking: *The thoughts produced by the Gemini2.0 Flash model are experimental"})yield messages

然后创建Gradio界面:

with gr.Blocks() as demo:gr.Markdown("# Chat with Gemini 2.0 Flash and See its Thoughts 💭")chatbot = gr.Chatbot(type="messages",label="Gemini2.0 'Thinking' Chatbot",render_markdown=True,)input_box = gr.Textbox(lines=1,label="Chat Message",placeholder="Type your message here and press Enter...")# Set up event handlersmsg_store = gr.State("")  # Store for preserving user messageinput_box.submit(lambda msg: (msg, msg, ""),  # Store message and clear inputinputs=[input_box],outputs=[msg_store, input_box, input_box],queue=False).then(user_message,  # Add user message to chatinputs=[msg_store, chatbot],outputs=[input_box, chatbot],queue=False).then(stream_gemini_response,  # Generate and stream responseinputs=[msg_store, chatbot],outputs=chatbot)demo.launch()

这将创建一个具有以下功能的聊天机器人:

  • 在可折叠部分中显示模型的思考过程;
  • 实时流式传输思考过程和最终响应;
  • 保持清晰的聊天记录。

完成!现在我们拥有了一个不仅能实时响应用户,还能展示其思考过程的聊天机器人,从而创建更加透明和引人入胜的交互体验。查看完整的Gemini 2.0 Flash Thinking演示地址:https://huggingface.co/spaces/ysharma/Gemini2-Flash-Thinking。

参考文献

  1. Gradio - guides - Chatbots

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

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

相关文章

springboot基于前后端分离的摄影知识网站

Spring Boot 基于前后端分离的摄影知识网站 一、项目概述 Spring Boot 基于前后端分离的摄影知识网站,是一个专为摄影爱好者、专业摄影师打造的知识共享与交流平台。借助 Spring Boot 强大的后端架构搭建能力,结合前端独立开发的灵活性,整合…

VD:生成a2l文件

目录 前言Simulink合并地址 ASAP2 editor 前言 我之前的方法都是通过Simulink模型生成代码的过程中顺便就把a2l文件生成出来了,这时的a2l文件还没有地址,所以紧接着会去通过elf文件更新地址,一直以为这是固定的流程和方法,今天无…

物联网与前沿技术融合分析

【前言】 在科技发展的滚滚浪潮中,物联网作为连接物理世界与数字世界的桥梁,正日益凸显其关键作用。近年来,物联网与其他前沿技术的融合不断催生新的应用场景与创新模式,为各个领域带来了深刻变革。 物联网与人工智能的深度融合&…

【VRChat · 改模】Unity2019、2022的版本选择哪个如何决策,功能有何区别;

总览 1.Unity2019、2022的版本的选择 2.Unity添加着色器教程 一、Unity2019、2022的版本的选择 1.Unity2019 和 Unity2022 的区别,VRChat SDK 为何要区分两个版本 我是外行,最开始以为的是,2019 和 2022 的变化是基于这个模型本身的。 也…

Elasticsearch 和arkime 安装

安装一定要注意版本号,不然使用不了 这里Ubuntu使用ubuntu-20.04.6-desktop-amd64.iso elasticsearch这里使用Elasticsearch 7.17.5 | Elastic arkime这里使用wget https://s3.amazonaws.com/files.molo.ch/builds/ubuntu-20.04/arkime_3.4.2-1_amd64.deb 大家想…

【王树森搜素引擎技术】相关性03:文本匹配(TF-IDF、BM25、词距)

链路上的相关性模型 召回海选 打分量:数万模型:文本匹配分数线性模型或双塔BERT模型 粗排 打分量:数千模型:双塔BERT,或单塔BERT模型(交叉) 精排 打分量:数百模型:单塔B…

庄小焱——2024年博文总结与展望

摘要 大家好,我是庄小焱。岁末回首,2024 年是我在个人成长、博客创作以及生活平衡方面收获颇丰的一年。这一年的经历如同璀璨星辰,照亮了我前行的道路,也为未来的发展奠定了坚实基础。 1. 个人成长与突破 在 2024 年&#xff0c…

GraphRAG: Auto Prompt Tuning 实践

GraphRAG 的 Auto Prompt Tuning 功能是一个强大的工具,用于优化知识图谱的生成过程。以下是对该功能的详细介绍和分析: 自动提示调优(Auto Prompt Tuning) 1. 概念 GraphRAG 的自动提示调优功能旨在为特定领域的知识图谱生成创…

MySQL下载安装DataGrip可视化工具

目录 WinMySQL下载安装步骤MySQL配置添加环境变量 Mac下载安装配置环境变量 DataGrip可视化工具以Win为例了。Mac忘记截图了。步骤都一样 Win MySQL下载 官网: https://www.mysql.com/ 直接进下载界面: https://downloads.mysql.com/archives/installe…

ASP.NET Core - 配置系统之配置提供程序

ASP.NET Core - 配置系统之配置提供程序 3. 配置提供程序3.1 文件配置提供程序3.1.1 JSON配置提供程序3.1.2 XML配置提供程序3.1.3 INI配置提供程序 3.2 环境变量配置提供程序3.3 命令行配置提供程序3.4 内存配置提供程序3.5 配置加载顺序 3.6 默认配置来源 3. 配置提供程序 前…

网络安全 | 什么是正向代理和反向代理?

关注:CodingTechWork 引言 在现代网络架构中,代理服务器扮演着重要的角色。它们在客户端和服务器之间充当中介,帮助管理、保护和优化数据流。根据代理的工作方向和用途,代理服务器可分为正向代理和反向代理。本文将深入探讨这两种…

回归预测 | MATLAB实TCN时间卷积神经网络多输入单输出回归预测

效果一览 基本介绍 回归预测 | MATLAB实TCN时间卷积神经网络多输入单输出回归预测 …………训练集误差指标………… 1.均方差(MSE):166116.6814 2.根均方差(RMSE):407.5741 3.平均绝对误差(MAE):302.5888 4.平均相对…

JavaScript 日期对象、DOM节点操作

日期对象 日期对象:使用new关键字实例化出来的对象 const date new Date() //这样就获取到了一个日期对象 直接打印对象: console.log(date) 打印到控制台如截图所示 时间对象内的方法们: 1.获取对象 对象.getFullYear() -- 获取当前…

Python制作简易PDF查看工具PDFViewerV1.0

PDFViewer PDF浏览工具,Python自制PDF查看工具,可实现基本翻页浏览功能,其它功能在进一步开发完善当中,如果有想一起开发的朋友,可以留言。本软件完全免费,自由使用。 软件界面简洁,有菜单栏、…

开源AI智能名片2+1链动模式S2B2C商城小程序源码在活动运营中的应用与优化

摘要:在数字化时代,开源AI智能名片21链动模式S2B2C商城小程序源码作为一种创新的商业应用模式,为企业提供了强大的运营工具。本文旨在探讨该源码在活动运营中的应用与优化策略,包括活动类型与时间节点的梳理、活动模块化设计、后台…

Centos7系统下安装和卸载TDengine Database

记录一下Centos7系统下安装和卸载TDengine Database 安装TDengine Database 先看版本信息 [root192 ~]# cat /etc/centos-release CentOS Linux release 7.9.2009 (Core) [root192 ~]# uname -r 3.10.0-1160.119.1.el7.x86_64 [root192 ~]# uname -a Linux 192.168.1.6 3.10…

【专题三:穷举vs暴搜vs深搜vs回溯vs剪枝】46. 全排列

1.题目解析 2.讲解算法原理 1.首先画出决策树&#xff0c;越详细越好 2.设计代码 全局变量 List<List<Integer>> retList<Integer> pathboolean[] check dfs函数 仅关心某一节点在干什么 细节问题回溯 干掉path最后一个元素修改check权限 剪枝 check中为…

【氮化镓】香港科技大学陈Kevin-单片集成GaN比较器

一、引言(Introduction) GaN HEMT的重要性 文章开篇便强调了氮化镓(GaN)高电子迁移率晶体管(HEMT)在下一代功率转换系统中的巨大潜力。GaN HEMT具备高开关频率、低导通电阻、高击穿电压以及宽工作温度范围等优势,使其成为功率电子领域的热门研究对象。这些特性使得GaN…

【Linux】进程的程序替换

前言&#xff1a; 在未进行进程的程序替换时&#xff0c;父子进程的数据是独立的通过页表进行映射进行实现进程数据的独立性&#xff0c;但是父子进程的代码还是共享的&#xff0c;我父进程将子进程进行创建出来不仅仅只会有父子进程只进行执行共享代码的需求&#xff0c;有的…

linux网络编程11——线程池

1. 线程池 1.1 池化技术原理 池化技术 当一个资源或对象的创建或者销毁的开销较大时&#xff0c;可以使用池化技术来保持一定数量的创建好的对象以供随时取用&#xff0c;于是就有了池式结构。常见的池式结构包括线程池、内存池和连接池。 池化技术应用的前提条件主要包括三…