查看原文
其他

Everything App: HuggingFace Transformers Agent

lencx 浮之静 2023-05-12
🔗
  • 文档:Transformers Agent[1]

  • 在线体验:Colab[2]

😅

Transformers Agent 是一个实验性的 API,可能会随时更改。由于 API 或底层模型可能会发生变化,代理返回的结果可能会有所不同。

Transformers v4.29.0 版本基于工具和代理的概念进行构建。你可以在 Colab 中尝试它。简而言之,它在 Transformers 之上提供了一个自然语言 API:Agent 定义了一组精选的工具并设计了一个代理来解释自然语言并使用这些工具,而且它是可扩展的。

下面精选了一些相关工具,来向你展示系统如何轻松扩展以使用社区开发的任何工具。让我们从一些可以使用这个新 API 实现的示例开始。当涉及到多模态任务时,它特别强大,因此让我们试试生成图像并大声朗读文本。

agent.run("Caption the following image", image=image)

agent.run("Read the following text out loud", text=text)

agent.run(
"In the following `document`, where will the TRRF Scientific Advisory Council Meeting take place?",
document=document,
)

快速入门

在使用 agent.run 之前,你需要实例化一个代理人(agent),它是一个大型语言模型(LLM)。Transformers Agent 支持使用来自 OpenAI 的模型以及来自 BigCode[3]OpenAssistant[4] 的开源替代方案。OpenAI 模型的性能更好(需要 OpenAI API 密钥,不能免费使用);Hugging Face 提供免费访问 BigCode 和 OpenAssistant 模型的端点。

1. 安装依赖

安装 agents 附加组件以安装所有默认依赖项:

pip install transformers[agents]

2. 安装 openai 并实例化

要使用 openAI 模型,请在安装 openai 依赖项后实例化 OpenAiAgent[5]

pip install openai
from transformers import OpenAiAgent

# 实例化
agent = OpenAiAgent(model="text-davinci-003", api_key="<your_api_key>")
📌

获取 OpenAI API Key[6],为了保护你帐户的安全,OpenAI 还可能会自动轮换已发现公开泄露的任何 API 密钥。

3. 登陆并实例化

要使用 BigCode 或 OpenAssistant,需先登录以访问 Inference API:

from huggingface_hub import login

# 登陆
login("<YOUR_TOKEN>")
📌

访问令牌以编程方式向 Hugging Face Hub 验证你的身份,允许应用程序执行由授予的权限范围(读取、写入或管理)指定的特定操作。

Hugging Face Hub Token[7] 获取步骤:
登陆 Hugging Face -> 点击右上角头像 -> 下拉菜单 Settings -> Access Tokens -> New token -> 输入名称,选择权限(读或写) -> Generate a token

from transformers import HfAgent

# 实例化
# Starcoder
agent = HfAgent("https://api-inference.huggingface.co/models/bigcode/starcoder")
# StarcoderBase
# agent = HfAgent("https://api-inference.huggingface.co/models/bigcode/starcoderbase")
# OpenAssistant
# agent = HfAgent(url_endpoint="https://api-inference.huggingface.co/models/OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5")
😅

这里使用了 Hugging Face 目前提供的免费 Inference API。如果你有自己的模型推理端点(或其他模型的),你可以将上面的 URL 替换为你的端点。

StarCoder 和 OpenAssistant 是免费的,对于简单的任务表现出色。然而,当处理更复杂的提示时,这些检查点可能无法胜任。如果你面临此类问题时,建议尝试 OpenAI 模型,在目前这个时间点上它的表现更好,但不幸的是它不是开源的。

开始使用

现在你已经准备好了!让我们来深入讲解一下你现在可以使用的两个 API。

单次执行(run[8]

单一执行方式是在使用 agent 的 run() 方法时:

agent.run("Draw me a picture of rivers and lakes.")

它会自动选择适合你要执行的任务的工具(或多个工具),并适当地运行它们。它可以在同一个指令中执行一个或多个任务(指令越复杂,代理程序失败的可能性就越大)。

agent.run("Draw me a picture of the sea then transform the picture to add an island")

每个 run() 操作都是独立的,因此可以在不同的任务连续运行它多次。

需要注意的是,agent 只是一个大型语言模型,因此提示的微小变化可能会产生完全不同的结果。清晰地解释你想要执行的任务非常重要。下面将带你更深入地了解如何编写良好提示(参考:Writing good user inputs[9])。

😄 编写良好的用户输入

尽管大型语言模型在理解用户意图方面变得越来越好,但尽可能精确地说明任务可以极大地帮助代理程序选择正确的任务。什么是尽可能精确的含义?

代理程序在其提示中看到一系列工具名称及其描述。随着添加的工具越来越多,代理程序选择正确工具的难度也随之增加,选择运行正确工具序列的难度更大。让我们看一个常见的失败案例,这里我们将只返回代码以进行分析。

from transformers import HfAgent

agent = HfAgent("https://api-inference.huggingface.co/models/bigcode/starcoder")

agent.run("Show me a tree", return_code=True)

返回:

==Explanation from the agent==
I will use the following tool: `image_segmenter` to create a segmentation mask for the image.


==Code generated by the agent==
mask = image_segmenter(image, prompt="tree")

这可能不是我们想要的。相反,我们更有可能希望生成树的图像。因此,为了引导代理更多地使用特定工具,使用工具名称和描述中存在的重要关键字会非常有帮助。我们来看一下。

agent.toolbox["image_generator"].description
'This is a tool that creates an image according to a prompt, which is a text description. It takes an input named `prompt` which contains the image description and outputs an image.

名称和描述使用关键字“image”、“prompt”、“create”和“generate”。使用这些词在这里很可能会更好。让我们稍微改进一下我们的提示。

agent.run("Create an image of a tree", return_code=True)

返回:

==Explanation from the agent==
I will use the following tool `image_generator` to generate an image of a tree.


==Code generated by the agent==
image = image_generator(prompt="tree")

好多了!这看起来更像我们想要的。简而言之,当你注意到代理难以将你的任务正确映射到正确的工具时,请尝试查找工具名称和描述中最相关的关键字,并尝试用它来优化你的任务请求。

如果你想在执行过程中保留状态或向 agent 传递非文本对象,可以通过指定要使用的变量来实现。例如,你可以生成第一张河流和湖泊的图片,并要求模型更新该图片以添加一个岛屿,方法如下:

picture = agent.run("Generate a picture of rivers and lakes.")
updated_picture = agent.run("Transform the image in `picture` to add an island to it.", picture=picture)
📌

这在模型无法理解你的请求并混淆工具时会很有帮助。以下是一个示例:

agent.run("Draw me the picture of a capybara swimming in the sea")

在这里,模型可以有两种解释方式:

  1. 让文本到图像生成一个在海里游泳的水豚

  2. 或者先生成水豚的图片,再使用图像转换工具让它在海里游泳

如果你想强制执行第一种方案,可以将提示作为参数传递给模型:

agent.run("Draw me a picture of the `prompt`", prompt="a capybara swimming in the sea")

基于聊天执行(chat[10]

代理还有一种基于聊天的方法,使用 chat() 方法:

agent.chat("Generate a picture of rivers and lakes")

agent.chat("Transform the picture so that there is a rock in there")

这是一种在多个指令中保留状态的有趣方法。这种方法更适合于试验,但通常在处理单个指令时会比处理复杂指令(run() 方法更好地处理复杂指令)更有效。如果你想传递非文本类型或特定提示,此方法也可以接受参数。

远程执行

出于演示目的,以便它可以与所有设置一起使用,还为代理可以访问的几个默认工具创建了远程执行器。这些是使用推理端点(Inference Endpoints[11])创建的。要了解如何自己设置远程执行器工具,建议阅读自定义工具指南。

要使用远程工具运行,请将 remote=True 指定为 run()chat() 的参数。例如:以下命令可以在任何设备上高效运行,而无需大量 RAM 或 GPU:

# run
agent.run("Draw me a picture of rivers and lakes", remote=True)

# chat
agent.chat("Draw me a picture of rivers and lakes", remote=True)

核心原理

你可以能会存在一系列的问题,比如这里发生了什么?什么是工具,什么是代理?

代理

这里的“代理(agent)”是一个大型语言模型,我们通过提示它来让它访问一组特定的工具。

大型语言模型在生成少量代码示例方面表现得相当不错,因此这个 API 利用这一点,通过提示 LLM 提供一小段使用一组工具执行任务的代码示例。然后,你给代理的任务和工具的描述会完成这个提示。这样,代理就可以访问你使用的工具的文档,特别是它们期望的输入和输出,从而生成相关的代码。

工具

工具非常简单:它们是一个带有名称和描述的单个函数。然后,我们使用这些工具的描述来提示代理。通过提示,我们向代理展示它如何利用工具执行查询中所请求的操作。

这是使用全新的工具而不是管道,因为代理使用非常原子的工具编写更好的代码。管道更多是被重构的,并经常将几个任务合并为一个。工具旨在专注于一个非常简单的任务。

代码执行 ?!

这段代码将使用你提供的工具和输入参数与我们的小型 Python 解释器一起执行。我们听到你在后面大声尖叫“任意代码执行!”,但让我们解释一下为什么不是这种情况。

只有你提供的工具和 print 函数可以调用,因此你的可执行内容已经受到限制。如果限制在 Hugging Face 工具范围内,那么你应该是安全的。

然后,我们不允许任何属性查找或导入(对于传递输入/输出到一小组函数而言,这也不需要),因此所有最明显的攻击方式(你需要提示 LLM 输出它们)不应是一个问题。如果你想要更加安全,请使用额外的参数 return_code=True 执行 run() 方法,这样代理将仅返回要执行的代码,你可以决定是否执行它。

如果尝试执行非法操作或代码生成的 Python 错误,则执行将停止。

精选工具集

Agent 确定了一组可以授权此类代理的工具,以下是在 Transformer 中集成的最新工具列表:

  • 文档问答:针对文档(例如 PDF)中的图像格式,回答关于该文档的问题(Donut[12]

  • 文本问答:给定一段长文本和一个问题,在文本中回答该问题(Flan-T5[13]

  • 无条件图像字幕生成:为图像生成字幕!(BLIP[14]

  • 图像问答:给定一张图片,回答关于这张图片的问题(VILT[15]

  • 图像分割:给定图像和提示,输出该提示的分割掩码(CLIPSeg[16]

  • 语音转文本:给定一个人说话的音频记录,将该语音转换为文本(Whisper[17]

  • 文本转语音:将文本转换为语音(SpeechT5[18]

  • 零样本文本分类:给定一段文本和一个标签列表,确定该文本最符合哪个标签(BART[19]

  • 文本摘要:用一到几句话概括一篇长文本(BART)

  • 翻译:将文本翻译成指定的语言(NLLB[20]

这些工具已经在 transformers 中整合,也可以手动使用,例如:

from transformers import load_tool

tool = load_tool("text-to-speech")
audio = tool("This is a text to speech tool")

自定义工具

虽然已经确定了一组经过筛选的工具,但我们强烈认为这种实现提供的主要价值在于快速创建和共享自定义工具的能力。

通过将工具的代码推送到 Hugging Face Space 或模型仓库,你就可以直接利用代理来使用该工具。已经向 huggingface-tools[21] 组织添加了一些与 transformers 无关的工具:

  • 文本下载器: 从网址下载文本

  • 文本转图片: 根据提示生成图片,利用稳定扩散(Stable Diffusion)

  • 图像转换: 根据初始图像和提示修改图像,利用指导像素到像素(InstructPix2Pix)稳定扩散(Stable Diffusion)

  • 文本到视频: 根据提示生成一个小视频,利用 damo-vilab[22]

🔗 论文摘要
  • 论文:InstructPix2Pix: Learning to Follow Image Editing Instructions[23]

  • GitHub:timothybrooks/instruct-pix2pix[24]

  • 演示 Demo:InstructPix2Pix Demo[25]

我们提出了一种从人类指令编辑图像的方法:给定一个输入图像和一条书面指令,告诉模型要做什么,我们的模型遵循这些指令来编辑图像。为了解决这个问题的训练数据,我们结合了两个大型预训练模型的知识——语言模型(GPT-3)和文本到图像模型(Stable Diffusion),生成了一个大规模的图像编辑示例数据集。我们的有条件扩散模型 InstructPix2Pix 是基于我们生成的数据进行训练的,并且在推理时推广到实际图像和用户编写的指令。由于它在正向传递中执行编辑而不需要每个示例的微调或反演,因此我们的模型能够在几秒钟内快速编辑图像。我们展示了各种不同的输入图像和书面指令的引人注目的编辑结果。

🔗 damo-vilab

达摩院视觉智能实验室(DAMO Vision Intelligence Lab)致力于开发计算机视觉技术,可以感知、理解、生成和处理图像和视频内容,并生成和重构三维场景和物体。为使用视频和图像帮助客户在诸如新零售、新媒体和新制造等广泛行业中识别商业机会的服务和应用提供技术支持。这些服务和应用已广泛用于互动娱乐、数字智能教育和离线智能领域。

一直以来在使用的文本到图像工具(huggingface-tools/text-to-image[26])就是一个远程工具,HuggingFace 将继续在此组织和其他组织发布此类工具,以进一步增强这种实现。

代理默认可以访问驻留在 huggingface-tools 上的工具。在 Custom Tools and Prompts[27] 指南中有解释如何编写和共享自定义工具,以及如何利用存储在 Hub 上的任何自定义工具。

代码生成

到目前为止,已经展示了如何使用代理来为你执行操作。然而代理只能生成使用非常受 Python 解释器限制的可执行代码。如果你想在不同的设置中使用生成的代码,可以提示代理返回代码,以及工具定义和准确的导入。例如,以下指令:

agent.run("Draw me a picture of rivers and lakes", return_code=True)

返回以下代码,然后您可以自己修改和执行。

from transformers import load_tool

image_generator = load_tool("huggingface-tools/text-to-image")

image = image_generator(prompt="rivers and lakes")

Twitter 动态

🧵

终于实现了:HuggingFace Transformers Agent。它使编程 LLM 能够即时组合其他 HF 模型来解决多模态任务。

这是向 “Everything App” 迈出的一步,随着生态系统的增长,它的能力也在不断增强。

自从 HuggingGPT 以来,我一直在等待这个:

  • HuggingGPT 是该想法的首次大规模演示。它使用 GPT 作为控制器,动态选择工具(模型)来解决多阶段任务。

  • ChatGPT 应用商店是这种人工智能工具生态系统的第一个实例。OpenAI 的下一步显然是一个可以在单个会话中使用许多插件的元应用程序。

🧵

HuggingGPT 是我本周读过的最有趣的论文。它非常接近我一段时间前描述的 “Everything App” 愿景。

ChatGPT 充当 AI 模型空间的控制器,根据人类规范选择正确的模型(应用程序),并正确地组装它们以解决任务。它是一种“低带宽”的多模态方法——所有模态都需要通过文本字符串进行压缩和连接。

HuggingGPT 也与 Prismer 的想法相关:尽可能地利用预训练的领域专家模型。有时候,训练得少反而做得更多!

🧵

你是否看到 OpenAI 的总体计划?应用商店只是开始。

你们正在为终极 GPT 编写工具集成——一个单一的模型,可以动态地读取你的文档,链式地调用应用程序,并对世界产生影响。

最终目标只有一个——一个全能的应用程序。即将到来。

References

[1]

Transformers Agent: https://huggingface.co/docs/transformers/transformers_agents

[2]

Colab: https://colab.research.google.com/drive/1c7MHD-T1forUPGcC_jlwsIptOzpG3hSj

[3]

BigCode: https://huggingface.co/bigcode

[4]

OpenAssistant: https://huggingface.co/OpenAssistant

[5]

OpenAiAgent: https://huggingface.co/docs/transformers/v4.29.1/en/main_classes/agent#transformers.OpenAiAgent

[6]

OpenAI API Key: https://platform.openai.com/account/api-keys

[7]

Hugging Face Hub Token: https://huggingface.co/settings/tokens

[8]

run: https://huggingface.co/docs/transformers/v4.29.1/en/main_classes/agent#transformers.Agent.run

[9]

Writing good user inputs: https://huggingface.co/docs/transformers/custom_tools#writing-good-user-inputs

[10]

chat: https://huggingface.co/docs/transformers/v4.29.1/en/main_classes/agent#transformers.Agent.chat

[11]

Inference Endpoints: https://huggingface.co/inference-endpoints

[12]

Donut: https://huggingface.co/docs/transformers/model_doc/donut

[13]

Flan-T5: https://huggingface.co/docs/transformers/model_doc/flan-t5

[14]

BLIP: https://huggingface.co/docs/transformers/model_doc/blip

[15]

VILT: https://huggingface.co/docs/transformers/model_doc/vilt

[16]

CLIPSeg: https://huggingface.co/docs/transformers/model_doc/clipseg

[17]

Whisper: https://huggingface.co/docs/transformers/model_doc/whisper

[18]

SpeechT5: https://huggingface.co/docs/transformers/model_doc/speecht5

[19]

BART: https://huggingface.co/docs/transformers/model_doc/bart

[20]

NLLB: https://huggingface.co/docs/transformers/model_doc/nllb

[21]

huggingface-tools: https://huggingface.co/huggingface-tools

[22]

damo-vilab: https://huggingface.co/damo-vilab

[23]

InstructPix2Pix: Learning to Follow Image Editing Instructions: https://huggingface.co/docs/diffusers/api/pipelines/stable_diffusion/pix2pix

[24]

timothybrooks/instruct-pix2pix: https://github.com/timothybrooks/instruct-pix2pix

[25]

InstructPix2Pix Demo: https://huggingface.co/spaces/timbrooks/instruct-pix2pix

[26]

huggingface-tools/text-to-image: https://huggingface.co/spaces/huggingface-tools/text-to-image

[27]

Custom Tools and Prompts: https://huggingface.co/docs/transformers/custom_tools

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存