LangGraph:调用代理的工具
- Rifx.Online
- Programming , Generative AI , Machine Learning
- 19 Jan, 2025
本文假设读者对 LangGraph / 多代理设计有基本的了解。在此基础上,让我们尝试理解实现工具调用代理的基本原理。
对生成式 AI 感兴趣的人应该对函数调用/工具调用等概念有所了解。这个概念非常简单,模型可以借助一个或多个工具根据用户的提示生成推理。工具就是作为催化剂的函数,帮助模型提供所需的信息以便进行更好的推理。此外,工具可以是内置工具或自定义定义的工具。
在我寻找实现多代理图的工具调用选项时,偶然发现了多个使用 AgentExecutor / ToolNode / ReAct 框架 / create_tool_calling_agent 实现的示例,但没有一个建议如何使用自定义代理进行实现,而自定义代理是任何多代理工作流的核心部分。如果你想设计复杂的工作流,那么我们需要创建自定义代理(而不是使用 ReAct / create_tool_calling_agents)。我希望这个汇编能帮助那些计划实现相同的人。
让我们保持图形简单易懂。这里有三个代理
- 自主代理,它在图中充当起始节点
- 输出代理,它在图中充当结束节点
- 工具箱代理,它作为催化剂为自主代理提供所需的信息。
自主代理可以响应与天气和股票价格相关的查询。(免责声明:我理解代理不应该设计成这样多样化的任务,但请将其视为假设场景,仅作为示例)。接下来,每当用户提示包含与以下任务相关的内容时:
- 天气,自主代理将对 get_weather 函数进行工具调用。
- 股票价格,自主代理将对 get_stock_price 函数进行工具调用。
- 天气和股票价格(两者),那么自主代理将使用批处理函数并行调用这两个工具。
任何代理图的基本部分是 图形设计。在这里,我们定义了三个节点,命名为
- autonomous_agent : 该代理的工作是回答用户关于天气或股票价格的提示
- output : 该代理的工作是使用自主代理生成的最终推理并原样回应用户。没有逻辑/解析。
- toolbox : 该代理的工作是理解模型需要从哪个工具/工具中获得帮助 → 调用相应的工具/工具 → 将工具生成的输出回应给自主代理。
任何图形的下一个重要部分是其边缘。它定义了工作流,如果你仔细观察,
- 入口点设置为 autonomous_agent
- 从 autonomous_agent 有一个条件边。条件边允许图形在两个节点之间动态定义边。在这里,should_continue() 决定下一个应该调用哪个节点。
- toolbox 与 autonomous_agent 之间有一个静态边。这意味着一旦 toolbox 完成其执行,流程将默认返回到 autonomous_agent。
- 退出点定义为 output 代理。
以下是两个将帮助自主代理生成推理的工具。它具有声明性定义,帮助模型理解其实现了什么功能以及需要哪些参数作为输入。为了示例,实施保持简约。
让我们看看 should_continue() 的流程。这个代码块决定下一个应该调用哪个节点。如果你仔细观察,它返回一个字符串。基于此,图形决定在自主代理完成后应该调用哪个节点。我不会在本文中讨论状态及其定义/模式(为了不稀释原始主题)。但请记住,
- 如果自主代理请求调用工具,则 → 调用工具箱节点。 (哪个工具??我们在这里不需要担心)
- 如果自主代理已完成其推理并且在 tool_calls 中没有值,则 → 调用输出节点。
现在,让我们考虑自主代理希望从工具/工具中获得帮助的场景 → 在这种情况下,将调用工具箱节点。如果你查看上面所示的图形定义,toolbox 节点调用以下函数。让我们深入了解它所做的所有活动。
- 该函数将静态函数 _invoke_tool 转换为 RunnableLambda(我稍后会解释这个函数的作用)。
- 它从 Runnable 接口调用批处理方法,并将工具/工具信息作为输入从 tool_calls 属性中获取。
- 从工具接收到的 val 然后被迭代并设置在状态属性 tool_response 中。
- 这个 tool_response 后来在调用模型时用作提示中的占位符。
上面创建的 RunnableLambda 调用这个函数。它根据工具名称调用工具。让我们深入了解其实现:
- 该信息作为输入参数从 call_tools() 方法接收,当调用批处理方法时。
- 它可以接受单个/多个工具作为输入。
- 由于每个工具都是可运行的,我们可以调用其 invoke 函数以从各自的工具获取输出。
- 然后将值设置到 ToolMessage 对象中并返回。
- 该信息在 call_tools() 中设置为状态属性 tool_response。
请记住,我们已经针对每个节点定义了边(参见上面的图像)。我们从 toolbox 到 autonomous_agent 之间有静态边。因此,现在将调用 autonomous_agent 的 invoke()。工具生成的值在调用模型进行推理之前设置到提示中。这次你会注意到模型的响应将具有
- tool_call 属性为空。
- content 属性将包含推理值。
希望这篇文章有助于理解工具调用代理的基本概念。如果它对你有所帮助,请随意分享。
仅供参考,以下是代码生成的输出。上述提到的所有三种场景都在测试场景中涵盖。
Github : https://github.com/shaktipawar/langgraph_tool_calling
乐于助人!!
Shakti.