跳转到主要内容

category

编者按:这是Gradio的软件工程师Freddy Boulton的一篇客座博客文章。我们很高兴能分享这篇文章,因为它为生态系统带来了大量令人兴奋的新工具。代理在很大程度上是由他们所拥有的工具定义的,所以能够为他们配备所有这些gradio_tools对我们来说是非常令人兴奋的!

重要链接:

大型语言模型(LLM)给人留下了深刻的印象,但如果我们能赋予它们完成专门任务的技能,它们可以变得更加强大。

gradio_tools库可以将任何gradio应用程序变成代理可以用来完成任务的工具。例如,LLM可以使用Gradio工具转录它在网上找到的录音,然后为你总结。或者,它可以使用不同的Gradio工具将OCR应用于谷歌硬盘上的文档,然后回答有关问题。

本指南将展示如何使用gradio_tools授予LLM Agent访问世界上托管的尖端gradio应用程序的权限。尽管gradio_tools与多个代理框架兼容,但我们将在本指南中重点介绍Langchain代理。

一些背景

什么是代理?

LangChain代理是一种大型语言模型(LLM),它接受用户输入,并根据使用其可支配的众多工具之一报告输出。

Gradio是什么?

Gradio是构建机器学习Web应用程序并与世界共享的实际标准框架——所有这些都只需要python!🐍

gradio_tools-一个端到端的例子

要开始使用gradio_tools,您所需要做的就是导入和初始化工具,并将它们传递给langchain代理!

在以下示例中,我们导入StableDiffusionPromptGeneratorTool以创建一个良好的稳定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

 

要求是:

  1. 工具的名称
  2. 工具的描述。这是至关重要的!代理根据其描述决定使用哪种工具。要精确,并确保包含工具的输入和输出应该是什么样子的示例。
  3. Gradio应用程序的url或空间id,例如freddyaboulton/cacalculator。基于此值,gradio_tool将创建一个gradio客户端实例,以通过API查询上游应用程序。如果您不熟悉gradio客户端库,请务必单击链接并了解更多有关它的信息。
  4. create_job-给定一个字符串,此方法应该解析该字符串并从客户端返回一个作业。大多数情况下,这只需将字符串传递给客户端的submit函数即可。有关在此处创造就业机会的更多信息
  5. 后处理-给定作业的结果,将其转换为LLM可以向用户显示的字符串。
  6. 可选-一些库,例如MiniChain,可能需要一些关于该工具使用的底层gradio输入和输出类型的信息。默认情况下,这将返回gr.Textbox(),但是如果您想提供更准确的信息,请实现该工具的block_input(self,gr)和block_output(self-,gr)方法。gr变量是gradio模块(将gradio导入为gr的结果)。会的由GradiTool父类自动导入并传递给_block_input和_block_output方法。

就这样!

创建工具后,向gradio_tools repo打开一个pull请求!我们欢迎所有的贡献。

示例工具-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()

关于此实施的一些注意事项:

  1. GradioTool的所有实例都有一个名为client的属性,该属性指向底层gradio客户端。这就是你应该使用的在create_job方法中。
  2. create_job只是将查询字符串传递给客户端的submit函数,并硬编码一些其他参数,即负提示字符串和指导量表。我们可以修改我们的工具,以便在后续版本中也接受输入字符串中的这些值。
  3. 后处理方法简单地返回由稳定扩散空间创建的图像库中的第一个图像。我们使用操作系统模块来获取图像的完整路径。

结论

你现在知道如何通过在野外奔跑的1000个gradio空间来扩展你的LLM的能力了!

同样,我们欢迎对gradio_tools库的任何贡献。

我们很高兴看到你们所有人构建的工具!

 

文章链接