-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Open
Labels
eh: Improveenhance: 现有功能的改进 / improve current featuresenhance: 现有功能的改进 / improve current featuresm: Tools工具(ToolUse、内容函数)相关 / Function Calling or tools management工具(ToolUse、内容函数)相关 / Function Calling or tools management
Description
背景
当前 LocalAgentRunner(src/langbot/pkg/provider/runners/localagent.py)在处理 LLM 返回的多个 tool_calls 时,采用的是顺序执行:
for tool_call in pending_tool_calls:
func_ret = await self.ap.tool_mgr.execute_func_call(func.name, parameters, query=query)每个工具调用都是逐个 await,没有使用 asyncio.gather() 或类似机制进行并发。
问题
当 LLM 单次返回多个 tool_calls 时(这在 OpenAI、Claude 等模型中很常见),这些调用之间往往是相互独立的——模型在同一次响应中请求的多个工具本身不存在依赖关系,否则模型会分多轮调用。
顺序执行意味着:
- 如果有 3 个工具调用,每个耗时 2 秒,总耗时 6 秒,而并行只需约 2 秒
- 对于涉及网络请求的工具(HTTP 调用、MCP 远程工具等),延迟被线性叠加
- 用户体验上,Agent 响应会明显变慢
建议
将 tool_calls 的执行改为并行,例如:
import asyncio
async def _execute_tool_call(tool_call):
func = tool_call.function
parameters = json.loads(func.arguments)
try:
func_ret = await self.ap.tool_mgr.execute_func_call(func.name, parameters, query=query)
return tool_call, func_ret, None
except Exception as e:
return tool_call, None, e
results = await asyncio.gather(*[
_execute_tool_call(tc) for tc in pending_tool_calls
])LLM 在同一次响应中返回的多个 tool_calls 在语义上就是并行意图,顺序执行没有必要。主流框架(LangChain、OpenAI Agents SDK 等)对此均采用并行执行策略。
参考
- OpenAI Function Calling 文档中明确建议 parallel tool calls 应并行处理
- LangChain AgentExecutor 默认并行执行同批次 tool calls
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
eh: Improveenhance: 现有功能的改进 / improve current featuresenhance: 现有功能的改进 / improve current featuresm: Tools工具(ToolUse、内容函数)相关 / Function Calling or tools management工具(ToolUse、内容函数)相关 / Function Calling or tools management