大型语言模型(LLMs)非常令人印象深刻,但如果我们能够赋予它们完成专门任务的技能,它们将变得更加强大。
gradio_tools 库可以将任何 Gradio 应用程序转换为 工具,供 代理 使用以完成任务。例如,一个LLM可以使用Gradio工具转录它在网上找到的语音记录,然后为你总结。或者,它可以使用另一个Gradio工具对你Google Drive上的文档进行OCR处理,然后回答有关该文档的问题。
本指南将展示如何使用gradio_tools来授予您的LLM代理访问全球最前沿的Gradio应用程序的权限。尽管gradio_tools与多个代理框架兼容,但在本指南中我们将重点介绍Langchain Agents。
一个LangChain代理是一个大型语言模型(LLM),它接收用户输入并根据使用其众多工具之一报告输出。
Gradio 是构建机器学习Web应用程序并与世界分享的实际标准框架 - 仅需使用python!🐍
要开始使用gradio_tools,您只需要导入并初始化您的工具,然后将它们传递给langchain代理!
在以下示例中,我们导入StableDiffusionPromptGeneratorTool来为稳定扩散创建良好的提示,使用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 client 实例,通过 API 查询上游应用程序。如果您不熟悉 gradio 客户端库,请务必点击链接了解更多信息。submit函数一样简单。有关创建作业的更多信息,请参见此处_block_input(self, gr)和_block_output(self, gr)方法。gr变量是gradio模块(import gradio as gr的结果)。它将被GradiTool父类自动导入并传递给_block_input和_block_output方法。就这样!
一旦你创建了你的工具,请向gradio_tools仓库提交一个拉取请求!我们欢迎所有的贡献。
以下是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 client。这就是你应该在create_job方法中使用的内容。create_job 只是将查询字符串传递给客户端的 submit 函数,并附带一些硬编码的其他参数,例如负面提示字符串和指导比例。我们可以在后续版本中修改我们的工具,以从输入字符串中接受这些值。postprocess 方法简单地返回由稳定扩散空间创建的图像库中的第一张图像。我们使用 os 模块来获取图像的完整路径。你现在知道如何通过运行在野外的数千个gradio空间来扩展你的LLM的能力了! 再次,我们欢迎对gradio_tools库的任何贡献。 我们很期待看到你们构建的工具!