代理增强版 - 多代理、外部工具等
什么是代理?
如果您不熟悉 transformers.agents
,请务必先阅读主要代理文档。
在本页面中,我们将重点介绍 transformers.agents
的一些高级用法。
多代理
微软的框架 Autogen 中引入了多智能体。简单来说,就是使用多个智能体协同工作来解决你的任务,而不是只有一个智能体。在大多数基准测试中,它都获得了更好的经验性能。这种性能提升的原因在概念上很简单:对于许多任务,你更倾向于将单元专门用于子任务,而不是使用一个包打天下的系统。在这里,拥有具有独立工具集和记忆体的智能体可以实现高效的专业化。
你可以使用 transformers.agents
轻松构建分层的多智能体系统。
为此,将智能体封装在 ManagedAgent 对象中。此对象需要参数 agent
、name
和 description
,这些参数随后将嵌入到管理器智能体的系统提示中,以告知它如何调用此受管理的智能体,就像我们对工具所做的那样。
以下是如何使用我们的 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
方法,其中包含要执行的推理代码。
inputs
和 output_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()