Path: blob/main/smolagents_doc/zh/pytorch/guided_tour.ipynb
5689 views
Agents - 导览
构建您的 agent
要初始化一个最小化的 agent,您至少需要以下两个参数:
model
,一个为您的 agent 提供动力的文本生成模型 - 因为 agent 与简单的 LLM 不同,它是一个使用 LLM 作为引擎的系统。您可以使用以下任一选项:TransformersModel 使用预初始化的
transformers
管道在本地机器上运行推理InferenceClientModel 在底层使用
huggingface_hub.InferenceClient
LiteLLMModel 让您通过 LiteLLM 调用 100+ 不同的模型!
AzureOpenAIServerModel 允许您使用部署在 Azure 中的 OpenAI 模型。
tools
,agent 可以用来解决任务的Tools
列表。它可以是一个空列表。您还可以通过定义可选参数add_base_tools=True
在您的tools
列表之上添加默认工具箱。
一旦有了这两个参数 tools
和 model
,您就可以创建一个 agent 并运行它。您可以使用任何您喜欢的 LLM,无论是通过 Hugging Face API、transformers、ollama、LiteLLM、Azure OpenAI,还是mlx-lm.。
Hugging Face API 可以免费使用而无需 token,但会有速率限制。
要访问受限模型或使用 PRO 账户提高速率限制,您需要设置环境变量 HF_TOKEN
或在初始化 InferenceClientModel
时传递 token
变量。
要使用 LiteLLMModel
,您需要设置环境变量 ANTHROPIC_API_KEY
或 OPENAI_API_KEY
,或者在初始化时传递 api_key
变量。
要连接到 Azure OpenAI,您可以直接使用 AzureOpenAIServerModel
,或使用 LiteLLMModel
并进行相应配置。
初始化 AzureOpenAIServerModel
实例时,需要传递模型部署名称,可选择以下任一种方式:1.传递 azure_endpoint
、api_key
和 api_version
参数;2.设置环境变量 AZURE_OPENAI_ENDPOINT
、AZURE_OPENAI_API_KEY
和 OPENAI_API_VERSION
也可按如下方式配置 LiteLLMModel
连接 Azure OpenAI:
将模型部署名称作为
model_id
参数传递,并确保其前缀为azure/
确保设置环境变量
AZURE_API_VERSION
任选其一:1.传递
api_base
和api_key
参数;2.设置环境变量AZURE_API_KEY
和AZURE_API_BASE
CodeAgent 和 ToolCallingAgent
[!WARNING] LLM 可以生成任意代码然后执行:不要添加任何不安全的导入!
如果生成的代码尝试执行非法操作或出现常规 Python 错误,执行将停止。
您也可以使用 E2B 代码执行器 或 Docker 而不是本地 Python 解释器。对于 E2B,首先 设置 E2B_API_KEY
环境变量,然后在初始化 agent 时传递 executor_type="e2b"
。对于 Docker,在初始化时传递 executor_type="docker"
。
[!TIP] 在 该教程中 了解更多关于代码执行的内容。
我们还支持广泛使用的将动作编写为 JSON-like 块的方式:ToolCallingAgent,它的工作方式与 CodeAgent 非常相似,当然没有 additional_authorized_imports
,因为它不执行代码:
检查 agent 运行
以下是一些有用的属性,用于检查运行后发生了什么:
agent.logs
存储 agent 的细粒度日志。在 agent 运行的每一步,所有内容都会存储在一个字典中,然后附加到agent.logs
中。运行
agent.write_memory_to_messages()
会为 LLM 创建一个 agent 日志的内部内存,作为聊天消息列表。此方法会遍历日志的每一步,并仅存储它感兴趣的内容作为消息:例如,它会将系统提示和任务存储为单独的消息,然后对于每一步,它会将 LLM 输出存储为一条消息,工具调用输出存储为另一条消息。如果您想要更高级别的视图 - 但不是每个日志都会被此方法转录。
工具
工具是 agent 使用的原子函数。为了被 LLM 使用,它还需要一些构成其 API 的属性,这些属性将用于向 LLM 描述如何调用此工具:
名称
描述
输入类型和描述
输出类型
例如,您可以查看 PythonInterpreterTool:它有一个名称、描述、输入描述、输出类型和一个执行操作的 forward
方法。
当 agent 初始化时,工具属性用于生成工具描述,该描述被嵌入到 agent 的系统提示中。这让 agent 知道它可以使用哪些工具以及为什么。
默认工具箱
smolagents
附带了一个用于增强 agent 的默认工具箱,您可以在初始化时通过参数 add_base_tools=True
将其添加到您的 agent 中:
DuckDuckGo 网页搜索:使用 DuckDuckGo 浏览器执行网页搜索。
Python 代码解释器:在安全环境中运行 LLM 生成的 Python 代码。只有在使用
add_base_tools=True
初始化 ToolCallingAgent 时才会添加此工具,因为基于代码的 agent 已经可以原生执行 Python 代码转录器:基于 Whisper-Turbo 构建的语音转文本管道,将音频转录为文本。
您可以通过调用 load_tool() 函数和要执行的任务手动使用工具。
创建一个新工具
您可以创建自己的工具,用于 Hugging Face 默认工具未涵盖的用例。 例如,让我们创建一个工具,返回 Hub 上给定任务下载量最多的模型。
您将从以下代码开始。
这段代码可以通过将其包装在一个函数中并添加 tool
装饰器快速转换为工具: 这不是构建工具的唯一方法:您可以直接将其定义为 Tool 的子类,这为您提供了更多的灵活性,例如初始化重型类属性的可能性。
让我们看看这两种选项的工作原理:
该函数需要:
一个清晰的名称。名称应该足够描述此工具的功能,以帮助为 agent 提供动力的 LLM。由于此工具返回任务下载量最多的模型,我们将其命名为
model_download_tool
。输入和输出的类型提示
一个描述,其中包括一个 'Args:' 部分,其中每个参数都被描述(这次没有类型指示,它将从类型提示中提取)。与工具名称一样,此描述是为您的 agent 提供动力的 LLM 的说明书,所以不要忽视它。 所有这些元素将在初始化时自动嵌入到 agent 的系统提示中:因此要努力使它们尽可能清晰!
[!TIP] 此定义格式与
apply_chat_template
中使用的工具模式相同,唯一的区别是添加了tool
装饰器:这里 了解更多关于我们的工具使用 API。
子类需要以下属性:
一个清晰的
name
。名称应该足够描述此工具的功能,以帮助为 agent 提供动力的 LLM。由于此工具返回任务下载量最多的模型,我们将其命名为model_download_tool
。一个
description
。与name
一样,此描述是为您的 agent 提供动力的 LLM 的说明书,所以不要忽视它。输入类型和描述
输出类型 所有这些属性将在初始化时自动嵌入到 agent 的系统提示中:因此要努力使它们尽可能清晰!
然后您可以直接初始化您的 agent:
多 agent
多 agent 系统是随着微软的框架 Autogen 引入的。
在这种类型的框架中,您有多个 agent 一起工作来解决您的任务,而不是只有一个。 经验表明,这在大多数基准测试中表现更好。这种更好表现的原因在概念上很简单:对于许多任务,与其使用一个全能系统,您更愿意将单元专门用于子任务。在这里,拥有具有单独工具集和内存的 agent 可以实现高效的专业化。例如,为什么要用网页搜索 agent 访问的所有网页内容填充代码生成 agent 的内存?最好将它们分开。
您可以使用 smolagents
轻松构建分层多 agent 系统。
为此,将 agent 封装在 ManagedAgent
对象中。此对象需要参数 agent
、name
和 description
,这些参数将嵌入到管理 agent 的系统提示中,以让它知道如何调用此托管 agent,就像我们对工具所做的那样。
以下是一个使用我们的 WebSearchTool
制作一个管理特定网页搜索 agent 的 agent 的示例:
[!TIP] 有关高效多 agent 实现的深入示例,请参阅 我们如何将多 agent 系统推向 GAIA 排行榜的顶部。
与您的 agent 交谈并在酷炫的 Gradio 界面中可视化其思考过程
您可以使用 GradioUI
交互式地向您的 agent 提交任务并观察其思考和执行过程,以下是一个示例:
在底层,当用户输入新答案时,agent 会以 agent.run(user_request, reset=False)
启动。 reset=False
标志意味着在启动此新任务之前不会刷新 agent 的内存,这使得对话可以继续。
您也可以在其他 agent 化应用程序中使用此 reset=False
参数来保持对话继续。
下一步
最后,当您按需配置好agent后,即可将其分享至 Hub!
类似地,若要加载已推送至 Hub 的agent,在信任其工具代码的前提下,可使用:
要更深入地使用,您将需要查看我们的教程: