在使用OpenAI提供的API进行开发时,我们可能会碰到工具调用默认是并行执行的场景。这意味着如果我们询问类似“东京、纽约和芝加哥的天气如何?”的问题,并且我们有一个获取天气的工具,OpenAI将会同时对这三个城市分别发起调用。
然而,在某些开发场景中,我们可能希望限制工具调用的并行性,比如在顺序依赖较强的任务中,或者对于某些需要节约资源的场景。本文将通过代码示例,详细讲解如何禁用并行工具调用。
核心原理解析
OpenAI的工具调用是通过设置参数parallel_tool_calls
来控制的。默认情况下,parallel_tool_calls
为True
,即工具调用会并行执行。我们可以通过将该参数设置为False
来让工具调用以串行方式进行。
代码实现演示
下面的示例代码展示了如何禁用OpenAI API的并行工具调用功能:
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
import os
from getpass import getpass
# 设置环境变量来存储API密钥
os.environ["OPENAI_API_KEY"] = getpass("Enter your OpenAI API Key:")
# 定义工具函数
@tool
def add(a: int, b: int) -> int:
"""Adds a and b."""
return a + b
@tool
def multiply(a: int, b: int) -> int:
"""Multiplies a and b."""
return a * b
# 创建工具列表
tools = [add, multiply]
# 初始化ChatOpenAI对象
llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
# 绑定工具并禁用并行调用
llm_with_tools = llm.bind_tools(tools, parallel_tool_calls=False)
# 发起调用请求
result = llm_with_tools.invoke("Please call the first tool two times").tool_calls
# 输出结果
print(result)
代码说明
parallel_tool_calls=False
: 这一行代码设置工具调用为串行模式。llm_with_tools.invoke
: 发起工具调用请求。
在此示例中,即便我们请求调用工具两次,通过设置parallel_tool_calls
为False
,我们可以观察到工具只被调用了一次。
应用场景分析
- 顺序任务执行:当工具调用之间存在先后顺序依赖时,需要确保前一个调用完成后再进行下一个调用。
- 资源优化:在有限的资源环境中,串行调用可以防止同时发起过多请求导致的资源耗竭。
实践建议
- 明确使用场景:在需要高效处理独立任务的场景中,保留并行调用;在需要顺序处理的场景中,考虑禁用并行。
- 监控和优化:注意监控调用的性能指标,确保工具调用优化符合业务需求。
如果遇到问题欢迎在评论区交流。
—END—