Transformers 文档

代理,强力升级 - 多代理、外部工具等

Hugging Face's logo
加入 Hugging Face 社区

并获得增强版文档体验

开始使用

代理增强版 - 多代理、外部工具等

什么是代理?

如果您不熟悉 transformers.agents,请务必先阅读主要代理文档

在本页面中,我们将重点介绍 transformers.agents 的一些高级用法。

多代理

微软的框架 Autogen 中引入了多智能体。简单来说,就是使用多个智能体协同工作来解决你的任务,而不是只有一个智能体。在大多数基准测试中,它都获得了更好的经验性能。这种性能提升的原因在概念上很简单:对于许多任务,你更倾向于将单元专门用于子任务,而不是使用一个包打天下的系统。在这里,拥有具有独立工具集和记忆体的智能体可以实现高效的专业化。

你可以使用 transformers.agents 轻松构建分层的多智能体系统。

为此,将智能体封装在 ManagedAgent 对象中。此对象需要参数 agentnamedescription,这些参数随后将嵌入到管理器智能体的系统提示中,以告知它如何调用此受管理的智能体,就像我们对工具所做的那样。

以下是如何使用我们的 DuckDuckGoSearchTool 创建一个管理特定网络搜索智能体的智能体的示例。

from transformers.agents import ReactCodeAgent, HfApiEngine, DuckDuckGoSearchTool, ManagedAgent

llm_engine = HfApiEngine()

web_agent = ReactCodeAgent(tools=[DuckDuckGoSearchTool()], llm_engine=llm_engine)

managed_web_agent = ManagedAgent(
    agent=web_agent,
    name="web_search",
    description="Runs web searches for you. Give it your query as an argument."
)

manager_agent = ReactCodeAgent(
    tools=[], llm_engine=llm_engine, managed_agents=[managed_web_agent]
)

manager_agent.run("Who is the CEO of Hugging Face?")

有关高效多智能体实现的深入示例,请参阅 我们如何将我们的多智能体系统推到 GAIA 排行榜榜首

高级工具用法

通过继承 Tool 并将其共享到 Hub 来直接定义工具

让我们再次以主文档中的工具示例为例,为此我们已实现了 tool 装饰器。

如果你需要添加变体,例如工具的自定义属性,你可以按照细粒度方法构建你的工具:构建一个继承自 Tool 超类的类。

自定义工具需要

  • 一个 name 属性,对应于工具本身的名称。名称通常描述工具的功能。由于代码返回特定任务下载次数最多的模型,因此我们将其命名为 model_download_counter
  • 一个 description 属性,用于填充智能体的系统提示。
  • 一个 inputs 属性,它是一个包含键 "type""description" 的字典。它包含有助于 Python 解释器对输入做出明智选择的信息。
  • 一个 output_type 属性,指定输出类型。
  • 一个 forward 方法,其中包含要执行的推理代码。

inputsoutput_type 的类型都应在 Pydantic 格式 之中。

from transformers import Tool
from huggingface_hub import list_models

class HFModelDownloadsTool(Tool):
    name = "model_download_counter"
    description = """
    This is a tool that returns the most downloaded model of a given task on the Hugging Face Hub.
    It returns the name of the checkpoint."""

    inputs = {
        "task": {
            "type": "string",
            "description": "the task category (such as text-classification, depth-estimation, etc)",
        }
    }
    output_type = "string"

    def forward(self, task: str):
        model = next(iter(list_models(filter=task, sort="downloads", direction=-1)))
        return model.id

现在自定义的 HfModelDownloadsTool 类已准备就绪,你可以将其保存到名为 model_downloads.py 的文件中并导入以供使用。

from model_downloads import HFModelDownloadsTool

tool = HFModelDownloadsTool()

你还可以通过在工具上调用 push_to_hub() 将自定义工具共享到 Hub。确保你在 Hub 上为其创建了一个存储库,并且正在使用具有读取访问权限的令牌。

tool.push_to_hub("{your_username}/hf-model-downloads")

使用 ~Tool.load_tool 函数加载工具,并将其传递到智能体中的 tools 参数。

from transformers import load_tool, CodeAgent

model_download_tool = load_tool("m-ric/hf-model-downloads")

使用 gradio 工具

gradio-tools 是一个功能强大的库,允许将 Hugging Face Spaces 作为工具使用。它支持许多现有的 Spaces 以及自定义 Spaces。

Transformers 使用 Tool.from_gradio() 方法支持 gradio_tools。例如,让我们使用来自 gradio-tools 工具包的 StableDiffusionPromptGeneratorTool 来改进提示以生成更好的图像。

导入并实例化工具,然后将其传递到 Tool.from_gradio 方法。

from gradio_tools import StableDiffusionPromptGeneratorTool
from transformers import Tool, load_tool, CodeAgent

gradio_prompt_generator_tool = StableDiffusionPromptGeneratorTool()
prompt_generator_tool = Tool.from_gradio(gradio_prompt_generator_tool)

现在你可以像使用任何其他工具一样使用它。例如,让我们改进提示 a rabbit wearing a space suit

image_generation_tool = load_tool('huggingface-tools/text-to-image')
agent = CodeAgent(tools=[prompt_generator_tool, image_generation_tool], llm_engine=llm_engine)

agent.run(
    "Improve this prompt, then generate an image of it.", prompt='A rabbit wearing a space suit'
)

模型充分利用了工具

======== New task ========
Improve this prompt, then generate an image of it.
You have been provided with these initial arguments: {'prompt': 'A rabbit wearing a space suit'}.
==== Agent is executing the code below:
improved_prompt = StableDiffusionPromptGenerator(query=prompt)
while improved_prompt == "QUEUE_FULL":
    improved_prompt = StableDiffusionPromptGenerator(query=prompt)
print(f"The improved prompt is {improved_prompt}.")
image = image_generator(prompt=improved_prompt)
====

在最终生成图像之前

即使在处理图像和音频对象等不同模态时,gradio-tools 也需要文本输入和输出。图像和音频输入和输出目前不兼容。

使用 LangChain 工具

我们喜欢 Langchain,并且认为它有一套非常引人注目的工具。要从 LangChain 导入工具,请使用 from_langchain() 方法。

以下是如何使用它来使用 LangChain 网络搜索工具重新创建引言中的搜索结果。

from langchain.agents import load_tools
from transformers import Tool, ReactCodeAgent

search_tool = Tool.from_langchain(load_tools(["serpapi"])[0])

agent = ReactCodeAgent(tools=[search_tool])

agent.run("How many more blocks (also denoted as layers) in BERT base encoder than the encoder from the architecture proposed in Attention is All You Need?")

在炫酷的 Gradio 界面中显示你的智能体运行

你可以利用 gradio.Chatbot 使用 stream_to_gradio 显示智能体的想法,以下是一个示例。

import gradio as gr
from transformers import (
    load_tool,
    ReactCodeAgent,
    HfApiEngine,
    stream_to_gradio,
)

# Import tool from Hub
image_generation_tool = load_tool("m-ric/text-to-image")

llm_engine = HfApiEngine("meta-llama/Meta-Llama-3-70B-Instruct")

# Initialize the agent with the image generation tool
agent = ReactCodeAgent(tools=[image_generation_tool], llm_engine=llm_engine)


def interact_with_agent(task):
    messages = []
    messages.append(gr.ChatMessage(role="user", content=task))
    yield messages
    for msg in stream_to_gradio(agent, task):
        messages.append(msg)
        yield messages + [
            gr.ChatMessage(role="assistant", content="⏳ Task not finished yet!")
        ]
    yield messages


with gr.Blocks() as demo:
    text_input = gr.Textbox(lines=1, label="Chat Message", value="Make me a picture of the Statue of Liberty.")
    submit = gr.Button("Run illustrator agent!")
    chatbot = gr.Chatbot(
        label="Agent",
        type="messages",
        avatar_images=(
            None,
            "https://em-content.zobj.net/source/twitter/53/robot-face_1f916.png",
        ),
    )
    submit.click(interact_with_agent, [text_input], [chatbot])

if __name__ == "__main__":
    demo.launch()
< > 在 GitHub 上更新