全网最详细Gradio教程系列6——Gradio Tools:将Gradio Apps用于LLM Agents
- 前言
- 本篇摘要
- 6. Gradio Tools:将Gradio用于LLM Agents
- 6.1 gradio_tools库
- 6.1.1 简介
- 6.1.2 预构建工具集
- 6.2 端到端(end-to-end)示例详解
- 6.2.1 示例代码
- 6.2.2 视频及分步演示
- 6.3 GradioTool:创建自己的gradio_tools
- 6.3.1 创建步骤
- 6.3.2 工具示例:StableDiffusion
- 参考文献
前言
本系列文章旨在全面系统的介绍Hugging Face,让小白也能熟练使用Hugging Face上的各种开源资源,并上手创建自己第一个Space App,在本地加载Hugging Face管线训练自己的第一个模型,并使用模型生成采样数据,同时详细解决部署中出现的各种问题。后续文章会分别介绍采样器及其加速、显示分类器引导扩散模型、CLIP多模态图像引导生成、DDMI反转及控制类大模型ControlNet等,根据反馈情况可能再增加最底层的逻辑公式和从零开始训练LLM等,让您从原理到实践彻底搞懂扩散模型和大语言模型。欢迎点赞评论、收藏和关注。
本系列文章如下:
- 《全网最详细Gradio教程系列1——Gradio简介》
- 《全网最详细Gradio教程系列2——Gradio的安装与运行》
- 《全网最详细Gradio教程系列3——Gradio的3+1种部署方式实践》
- 《全网最详细Gradio教程系列4——浏览器集成Gradio-Lite》
- 《全网最详细Gradio教程系列5——Gradio Client: python》
- 《全网最详细Gradio教程系列5——Gradio Client: javascript》
- 《全网最详细Gradio教程系列5——Gradio Client: curl》
- 《全网最详细Gradio教程系列6——Gradio Tools:将Gradio用于LLM Agents》
- 《全网最详细Gradio教程系列——Interfaces》
- 《全网最详细Gradio教程系列——Blocks》
- 《全网最详细Gradio教程系列——Custom Components》
- 《全网最详细Gradio教程系列——Tabular Data Science And Plots 》
本篇摘要
本篇继续介绍Gradio的高级特性:Gradio Tools,它用于将Gradio应用程序打包后,通过LangChain Agents应用到LLM中。
6. Gradio Tools:将Gradio用于LLM Agents
本章介绍Gradio的高级特性:Gradio Tools,它用于将Gradio应用程序打包后,通过LangChain Agents应用到LLM中。
首先了解下背景知识。
LangChain Agent:LangChain是一个开源的基于 LLM 的上层应用开发框架,它提供了一系列的工具和接口,让开发者可以轻松地构建和部署基于LLM的应用 。而Agent是LangChain中的一个重要概念,它是一种使用语言模型作为推理引擎来确定执行哪些操作以及执行顺序的工具,但由于Agent的功能有限,有逐渐被LangGraph取代的趋势。
这里尽量用简短的语言让读者了解LangChain Agent,关于LangChain、LangGraph及目前流行智能体如ChatDev/MetaGPT的详细介绍、区别和联系,涉及诸多知识,博主也耗费很多时间才搞清楚,同时计划在完成此系列文章后,新开一个专栏来讲述,感兴趣的朋友请多关注后续文章。
Gradio:Gradio就是用于构建机器学习Web应用程序的标准框架,并可将其与世界共享。
6.1 gradio_tools库
Large Language Models (LLMs)的功能强大,可被定制以完成各种各样的任务。各式的LLMs可被集成到WEB程序Gradio中,以便以网页的形式呈现出来。而Hugging Face Spaces上有成千上万的Gradio应用程序,如何使用这些Gradio程序呢,这就用到了gradio_tools库。
6.1.1 简介
具体来说,gradio tools是一个Python库,用于将gradio应用程序转换为基于大型语言模型(LLM)的代理(如LangChain Agent、LangGraph)可以利用的工具,以完成其任务。例如,LLM可以使用Gradio工具转录网上的某段录音并对录音文字进行总结概括,或者将OCR(Optical Character Recognition,光学字符识别)应用于电子文档并回答有关它的问题。gradio_tools的github地址为:https://github.com/freddyaboulton/gradio-tools?tab=readme-ov-file#gradio-tools-gradio–llm-agents。下面我们看一下gradio_tools内置的工具集。
6.1.2 预构建工具集
gradio_tools附带了一组预构建的工具,以便用户随时使用。它们均托管在HuggingFace Spaces上,这些工具包括:
- StableDiffusionTool:使用开源stable diffusion例程,根据给定提示生成图像;
- ImageCaptionTool:所有者Niels Rogge,根据所提供的图像文件路径,自动为图像添加文字说明;
- ImageToMusicTool:所有者Sylvain Filoni,根据所提供的图像文件,创建与之风格相匹配的音频片段;
- StableDiffusionPromptGeneratorTool:用于改进stable diffusion或其它图像生成器的提示;
- TextToVideoTool:根据文本创建短视频;
- WhisperAudioTranscriptionTool:使用Whisper转录音频;
- ClipInterrogatorTool:它根据源图像对提示进行逆向工程;
- DocQueryDocumentAnsweringTool:根据文档图片回答有关文档的问题;
- BarkTextToSpeechTool:用于文本转语音。
本章将展示如何让LLM Agent通过gradio_tools获得权限,从而访问托管在世界各地最前沿的Gradio程序,以及如何构造gradio_tools。尽管gradio_tools与多个代理框架兼容,如LangChain、MiniChain等,但在本文中将重点介绍Langchain代理。下面通过示例讲解gradio_tools的使用方法。
6.2 端到端(end-to-end)示例详解
6.2.1 示例代码
使用gradio_tools的方法很简单,只需从库gradio_tools导入所需的工具,并将它们传递给LangChain的initialize_agent方法即可。如下例所示,我们从预构建工具集中分别导入StableDiffusionPromptGeneratorTool、StableDiffusionTool、ImageCaptioningTool和ImageCaptioningTool,它们将依次创建改进的提示、根据提示创建图片、为图片添加文字说明并根据改进提示创建视频。
根据提示,我们告诉代理创建一个滑滑板的狗的图片,但在创建之前需先改进提示。然后要求代理为生成的图像添加文字说明,最后根据改进提示为生成图片创建视频。代理可以自行决定使用哪种工具,而无需我们明确告知。
详细代码如下:
import osif not os.getenv("OPENAI_API_KEY"):raise ValueError("OPENAI_API_KEY must be set")from langchain.agents import initialize_agent
from langchain.llms import OpenAI
from gradio_tools import (StableDiffusionTool, ImageCaptioningTool, StableDiffusionPromptGeneratorTool,TextToVideoTool)from langchain.memory import ConversationBufferMemoryllm = OpenAI(temperature=0)
memory = ConversationBufferMemory(memory_key="chat_history")
tools = [StableDiffusionTool().langchain, ImageCaptioningTool().langchain,StableDiffusionPromptGeneratorTool().langchain, TextToVideoTool().langchain]agent = initialize_agent(tools, llm, memory=memory, agent="conversational-react-description", verbose=True)
output = agent.run(input=("Please create a photo of a dog riding a skateboard ""but improve my prompt prior to using an image generator.""Please caption the generated image and create a video for it using the improved prompt."))
6.2.2 视频及分步演示
有自己的OPENAI_API_KEY的读者可以一试,也可以观看官方制作的执行过程视频,如下:
Gradio-Tools+LLM-Agents
无法观看视频的同学可以通过视频截图管中窥豹,了解下Agents的执行过程。如下:
第一步,Agent执行工具StableDiffusionPromptGeneratorTool,根据输入"A dog riding a skateboard",输出用于Stable Diffusion的改进提示:
第二步,调用StableDiffusionTool,根据改进提示生成图像,并存储在文件目录中:
生成图像如下:
第三步,执行ImageCaptioningTool,向生成图像添加文字说明:
第四步,调用TextToVideoTool,根据文字说明生成视频:
生成视频如下:

上面例子使用的是gradio_tools附带的一些预构建工具,如果想使用其它工具怎么办呢?这就是下节的内容,如何手动添加自己需要的GradioTool工具。
6.3 GradioTool:创建自己的gradio_tools
创建gradio_tools工具用到的核心抽象类是GradioTool。
6.3.1 创建步骤
在为LLM创建新工具类时,只需实现GradioTool中的标准接口即可,GradioTool的标准接口及说明如下:
The core abstraction is the GradioTool, which lets you define a new tool for your LLM as long as you implement a standard interface:
class GradioTool(BaseTool):def __init__(self, name: str, description: str, src: str) -> None:@abstractmethoddef create_job(self, query: str) -> Job:pass@abstractmethoddef postprocess(self, output: Tuple[Any] | Any) -> str:pass
初始化方法__init__()的要求及参数说明如下
- name:为工具类命名;
- description:为工具类添加描述。此步极为关键,因为代理是根据描述决定使用哪种工具,因此描述应该精准且确定的包括工具的输入和输出是什么样的例子;
- src:Gradio应用程序的url或space id,例如:freddyaboulton/calculator。gradio_tool将根据此值创建一个gradio client实例,通过API查询上游应用程序。关于Gradio Client可参考作者之前的文章:《全网最详细Gradio教程系列5——Gradio Client: python》。
抽象方法create_job()的要求及参数说明如下:
- query:给定字符串query,此方法解析该字符串并从client端返回一个job。大多数情况下,它就像将字符串query传递给客户端的submit()函数,然后创建一个job对象;
- 输出job:当向client提交必需的参数并submit后,client会创建相应的job。关于job的使用可参考《全网最详细Gradio教程系列5——Gradio Client: python》的节5.1.4中的异步调用job。
抽象方法postprocess()的要求及参数说明如下:
- output:作业job的输出结果,当有多个结果时,可使用Tuple类;
- 输出src:解析作业的结果,将其转换为LLM可以向用户显示的字符串。
可选方法Optional:某些库比如MiniChain,可能需要gradio模块更高级的输入和输出类型,但默认情况下,工具类只返回gr.Textbox(),如果我们想更换输入或输出的类型,可以通过_block_input(self, gr) and _block_output(self, gr) 来实现。gr即导入的gradio模块的缩写,它将由父类GradiTool自动导入,并传递给_block_input和_block_output方法。
当然,我们还可以将创建的工具提交到开源gradio_tools仓库供他人使用。
最后,我们看一个创建示例。
6.3.2 工具示例:StableDiffusion
我们可以自己创建一个stable diffusion工具,示例代码如下:
from gradio_tool import GradioTool
import osclass StableDiffusionTool(GradioTool):"""Tool for calling stable diffusion from llm"""def __init__(self,name="StableDiffusion",description=("An image generator. Use this to generate images based on ""text input. Input should be a description of what the image should ""look like. The output will be a path to an image file."),src="gradio-client-demos/stable-diffusion",hf_token=None,) -> None:super().__init__(name, description, src, hf_token)def create_job(self, query: str) -> Job:return self.client.submit(query, "", 9, fn_index=1)def postprocess(self, output: str) -> str:return [os.path.join(output, i) for i in os.listdir(output) if not i.endswith("json")][0]def _block_input(self, gr) -> "gr.components.Component":return gr.Textbox()def _block_output(self, gr) -> "gr.components.Component":return gr.Image()
关于示例的一些说明:
- GradioTool的所有实例都有一个名为client的属性,该属性指向底层gradio客户端。这就是您应该在create_job方法中使用的;
- create_job只是将查询字符串传递给客户端的submit函数,并硬编码了其他一些参数,比如质量差的提示字符串和引导标量。我们可以修改我们的工具,以便在后续版本中也接受输入字符串中的这些值;
- postprocess简单地从稳定扩散空间创建的图像库中返回第一幅图像,我们可以使用os模块来获取图像的完整路径。
总结:当掌握gradio_tools后,我们就可以通过外界的数以千计Gradio程序扩展LLM的能力,我们也可以将自己创建的GradioTool工具提交到gradio_tools库以便他人使用,大大扩展了Gradio的应用能力。
参考文献
- Gradio & LLM Agents 🤝
- Gradio Tools: Gradio 🤝 LLM Agents
