大型语言模型(LLM)令人印象深刻,但如果我们能赋予它们执行专业任务的能力,它们就会变得更加强大。
gradio_tools 库可以将任何 Gradio 应用程序转换为 工具,供 代理 用于完成任务。例如,LLM 可以使用 Gradio 工具来转录它在网上找到的录音,然后为您总结内容。或者它可以利用另一个 Gradio 工具对 Google Drive 上的文档进行 OCR,然后回答有关该文档的问题。
本指南将展示如何使用 gradio_tools 来赋予您的 LLM 代理访问全球托管的尖端 Gradio 应用程序的能力。尽管 gradio_tools 与多个代理框架兼容,但本指南中我们将重点关注 Langchain 代理。
LangChain 代理 是一个大型语言模型(LLM),它接受用户输入并根据使用其可用的工具之一来报告输出。
Gradio 是构建机器学习 Web 应用程序并将其分享给世界的首选框架——所有这些都只需使用 Python!🐍
要开始使用 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 中的工具,添加自己的工具非常容易。下一节将介绍这一点。
核心抽象是 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要求如下:
freddyaboulton/calculator。基于此值,gradio_tool 将创建一个 gradio 客户端 实例,通过 API 查询上游应用程序。如果您不熟悉 gradio 客户端库,请务必点击链接了解更多信息。submit 函数一样简单。有关创建作业的更多信息,请参阅此处。_block_input(self, gr) 和 _block_output(self, gr) 方法。gr 变量是 gradio 模块(即 import gradio as gr 的结果)。它将由 GradiTool 父类自动导入并传递给 _block_input 和 _block_output 方法。就是这样!
创建工具后,请向 gradio_tools 仓库提交拉取请求!我们欢迎所有贡献。
这是 Stable Diffusion 工具的代码示例
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",
token=None,
) -> None:
super().__init__(name, description, src, 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 空间创建的图片库中的第一张图片。我们使用 os 模块获取图片的完整路径。您现在知道如何通过全球运行的数千个 Gradio space 来扩展 LLM 的能力了!再次重申,我们欢迎对 gradio_tools 库的任何贡献。我们很高兴看到大家构建的工具!