Gradio 月活用户突破 100 万!

阅读更多
Gradio logo
  1. Gradio 客户端和 Lite
  2. Gradio 与 Llm 代理

Gradio & LLM 代理 🤝

大型语言模型 (LLMs) 非常令人印象深刻,但如果我们能赋予他们完成专门任务的技能,它们会变得更加强大。

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

要求是:

  1. 您的工具名称
  2. 您的工具的描述。这至关重要!代理根据其描述决定使用哪个工具。请务必精确,并务必包含工具的输入和输出应如何的示例。
  3. Gradio 应用程序的 url 或 Space ID,例如 freddyaboulton/calculator。基于此值,gradio_tool 将创建一个 Gradio 客户端实例,以通过 API 查询上游应用程序。如果您不熟悉 gradio 客户端库,请务必单击链接并了解更多信息。
  4. create_job - 给定一个字符串,此方法应解析该字符串并从客户端返回一个作业。大多数时候,这就像将字符串传递给客户端的 submit 函数一样简单。有关创建作业的更多信息,请参见此处
  5. postprocess - 给定作业的结果,将其转换为 LLM 可以向用户显示的字符串。
  6. 可选 - 某些库,例如 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()

关于此实现的一些注意事项

  1. 所有 GradioTool 的实例都有一个名为 client 的属性,该属性指向底层的 gradio 客户端。 这就是您应该在 create_job 方法中使用的内容。
  2. create_job 只是将查询字符串传递给客户端的 submit 函数,并硬编码了一些其他参数,即负面提示字符串和 guidance scale。 在后续版本中,我们可以修改我们的工具,使其也接受来自输入字符串的这些值。
  3. postprocess 方法只是从 stable diffusion space 创建的图像库中返回第一张图像。 我们使用 os 模块来获取图像的完整路径。

结论

现在您知道如何使用在野外运行的数千个 gradio spaces 扩展 LLM 的能力了! 再次,我们欢迎大家为 gradio_tools 库做出贡献。 我们很高兴看到大家构建的工具!