编者注:这是一篇来自 Gradio 软件工程师 Freddy Boulton 的客座博文。我们很高兴分享这篇文章,因为它为生态系统带来了大量令人兴奋的新工具。代理在很大程度上由他们拥有的工具定义,因此能够为他们配备所有这些 gradio_tools
对我们来说非常令人兴奋!
重要链接
大型语言模型 (LLM) 非常令人印象深刻,但如果我们能够赋予他们完成专门任务的技能,它们会变得更加强大。
gradio_tools 库可以将任何 Gradio 应用程序变成 工具,代理 可以使用该工具来完成其任务。例如,LLM 可以使用 Gradio 工具来转录它在网上找到的录音,然后为您总结。或者,它可以使用不同的 Gradio 工具对您 Google Drive 中的文档应用 OCR,然后回答有关它的问题。
本指南将展示如何使用 gradio_tools
让您的 LLM 代理访问世界上最前沿的 Gradio 应用程序。尽管 gradio_tools
与不止一个代理框架兼容,但本指南将重点介绍 LangChain 代理。
一些背景知识
什么是代理?
LangChain 代理 是一个大型语言模型 (LLM),它接受用户输入并根据使用其可用的众多工具之一来报告输出。
什么是 Gradio?
Gradio 是构建机器学习 Web 应用程序并与世界分享它们的 фактический 标准框架 - 所有这些都只需使用 python!🐍
gradio_tools - 端到端示例
要开始使用 gradio_tools
,您只需导入和初始化您的工具,并将它们传递给 langchain 代理!
在以下示例中,我们导入 StableDiffusionPromptGeneratorTool
以创建用于 stable diffusion 的良好提示,即StableDiffusionTool
使用我们改进的提示创建图像,ImageCaptioningTool
为生成的图像添加标题,以及TextToVideoTool
从提示创建视频。
然后我们告诉我们的代理创建一张狗骑滑板的图像,但请提前改进我们的提示。我们还要求
它为生成的图像添加标题并为其创建视频。代理可以决定使用哪个工具,而无需我们明确告诉它。
import os
if 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 ConversationBufferMemory
llm = 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."))
您会注意到我们正在使用一些 gradio_tools
附带的预构建工具。请参阅此文档,了解 gradio_tools
附带的完整工具列表。
如果您想使用当前不在 gradio_tools
中的工具,则添加自己的工具非常容易。这就是下一节将介绍的内容。
gradio_tools - 创建您自己的工具
核心抽象是 GradioTool
,只要您实现标准接口,它就允许您为 LLM 定义新工具
class GradioTool(BaseTool):
def __init__(self, name: str, description: str, src: str) -> None:
@abstractmethod
def create_job(self, query: str) -> Job:
pass
@abstractmethod
def postprocess(self, output: Tuple[Any] | Any) -> str:
pass
要求是
- 您的工具的名称
- 您的工具的描述。这至关重要!代理根据其描述决定使用哪个工具。请务必精确,并确保包含工具的输入和输出应如何的示例。
- Gradio 应用程序的 url 或 space id,例如
freddyaboulton/calculator
。基于此值,gradio_tool
将创建一个 gradio 客户端 实例,以通过 API 查询上游应用程序。如果您不熟悉 gradio 客户端库,请务必点击链接并了解更多信息。 - create_job - 给定一个字符串,此方法应解析该字符串并从客户端返回作业。在大多数情况下,这就像将字符串传递给客户端的
submit
函数一样简单。有关创建作业的更多信息,请点击此处。 - postprocess - 给定作业的结果,将其转换为 LLM 可以向用户显示的字符串。
- 可选 - 某些库,例如 MiniChain,可能需要有关工具使用的底层 gradio 输入和输出类型的一些信息。默认情况下,这将返回 gr.Textbox(),但
如果您想提供更准确的信息,请实现工具的_block_input(self, gr)
和_block_output(self, gr)
方法。gr
变量是 gradio 模块(import gradio as gr
的结果)。它将是
由GradiTool
父类自动导入并传递给_block_input
和_block_output
方法。
就是这样!
创建工具后,打开一个拉取请求到 gradio_tools
仓库!我们欢迎所有贡献。
示例工具 - Stable Diffusion
以下是 StableDiffusion 工具的代码示例
from gradio_tool import GradioTool
import os
class 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
方法只是从 stable diffusion space 创建的图像库中返回第一张图像。我们使用os
模块来获取图像的完整路径。
结论
您现在知道如何使用在野外运行的数千个 gradio space 扩展 LLM 的能力!
再次,我们欢迎对 gradio_tools 库的任何贡献。
我们很高兴看到大家构建的工具!