大模型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文件更新地址,一直以为这是固定的流程和方法,今天无…

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

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

第4章:Python TDD消除重复与降低依赖实践

写在前面 这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许…

Python爬虫-爱奇艺电视剧数据

前言 本文是该专栏的第44篇,后面会持续分享python爬虫干货知识,记得关注。 本文以爱奇艺平台的电视剧为例,获取电视剧的相关数据信息。废话不多说,具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看正文详细内容。(附带完整代码…

ASP.NET Core 中基于 Cookie 的身份鉴权实现

在 ASP.NET Core 应用中,基于 Cookie 的身份鉴权是一种常见的身份验证方式,特别适用于传统的 Web 应用程序。Cookie 能够在用户的浏览器中存储身份验证数据,从而在用户访问应用的不同页面时保持登录状态。 一、配置 Cookie 身份验证 首先&a…

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

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

数据仓库经典面试题

一、数据仓库基础概念 1. 什么是数据仓库? 答案:数据仓库是一个面向主题的、集成的、非易失的且随时间变化的数据集合,用于支持管理决策过程。解释:面向主题:围绕特定主题组织数据,如销售主题、客户主题&…

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…

用sklearn运行分类模型,选择AUC最高的模型保存模型权重并绘制AUCROC曲线(以逻辑回归、随机森林、梯度提升、MLP为例)

诸神缄默不语-个人CSDN博文目录 文章目录 1. 导入包2. 初始化分类模型3. 训练、测试模型,绘图,保存指标 1. 导入包 from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier, GradientBoostingClass…

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. 配置提供程序 前…

ESP32学习笔记_FreeRTOS(6)——Event and Notification

摘要(From AI): 这篇博客详细介绍了 FreeRTOS 中的事件组和任务通知机制,讲解了事件组如何通过位操作实现任务间的同步与通信,以及任务如何通过通知机制进行阻塞解除和数据传递。博客提供了多个代码示例,展示了如何使用事件组和任务通知在多任…

ASP.NET Core WebApi接口IP限流实践技术指南

在当今的Web开发中,接口的安全性和稳定性至关重要。面对恶意请求或频繁访问,我们需要采取有效的措施来保护我们的WebApi接口。IP限流是一种常见的技术手段,通过对来自同一IP地址的请求进行频率控制,可以有效地防止恶意攻击和过度消…

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

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

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

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

yt-dlp脚本下载音频可选设置代理

import yt_dlp# 配置:是否使用代理 use_proxy = True # 设置为 False 可关闭代理# 代理地址 proxy_url = socks5://127.0.0.1:1089URLS = [https://www.bilibili.com/video/BV1WTktYcEcQ/?spm_id_from=333.1007.tianma.6-2-20.click&vd_source=dcb58f8fe1faf749f438620b…