You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AzureChatOpenAI结合LangChain单次仅调用一个工具的问题求助

LangChain + AzureChatOpenAI 单次仅触发单个工具调用问题

使用LangChain结合AzureChatOpenAI时,遇到工具调用限制:当要求模型对两组数字分别执行乘法和加法运算时,期望触发两次工具调用,但实际每次仅调用一个工具,且调用的工具无明显规律。

以下是复现代码:

from langchain_core.tools import tool
from langchain_core.messages import HumanMessage, ToolMessage
from langchain_openai import AzureChatOpenAI

model = AzureChatOpenAI(
    azure_endpoint=api_base,
    openai_api_key=api_key,
    api_version=api_version,
    deployment_name=chat_deployment_name,
    temperature=0.3,
)

@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]
llm_with_tools = model.bind_tools(tools)

query = "multiply 34 and 79. Also add 2 and 7."

messages = [HumanMessage(query)]
ai_msg = llm_with_tools.invoke(messages)
messages.append(ai_msg)
for tool_call in ai_msg.tool_calls:
    selected_tool = {"add": add, "multiply": multiply}[tool_call["name"].lower()]
    tool_msg = selected_tool.invoke(tool_call)
    messages.append(tool_msg)

messages.append(llm_with_tools.invoke(messages))
for msg in messages:
    print(msg, "\n")

实际输出

第一次调用模型仅触发单个工具调用:

[HumanMessage(content='multiply 34 and 79. Also add 2 and 7.'), 
AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_6vEJMVX4TBHwRhqb1NQUoUZs', 'function': {'arguments': '{
  "a": 34,
  "b": 79
}', 'name': 'multiply'}, 'type': 'function'}]}, response_metadata={'token_usage': {'completion_tokens': 21, 'prompt_tokens': 87, 'total_tokens': 108}, 'model_name': 'gpt-35-turbo', 'system_fingerprint': None, 'prompt_filter_results': [{'prompt_index': 0, 'content_filter_results': {'hate': {'filtered': False, 'severity': 'safe'}, 'self_harm': {'filtered': False, 'severity': 'safe'}, 'sexual': {'filtered': False, 'severity': 'safe'}, 'violence': {'filtered': False, 'severity': 'safe'}}}], 'finish_reason': 'tool_calls', 'logprobs': None, 'content_filter_results': {}}, id='run-a8889a20-acf8-471d-aa78-73cea8b8c2de-0', tool_calls=[{'name': 'multiply', 'args': {'a': 34, 'b': 79}, 'id': 'call_6vEJMVX4TBHwRhqb1NQUoUZs', 'type': 'tool_call'}], usage_metadata={'input_tokens': 87, 'output_tokens': 21, 'total_tokens': 108}), 
ToolMessage(content='2686', name='multiply', tool_call_id='call_6vEJMVX4TBHwRhqb1NQUoUZs')]

再次调用模型才触发第二个工具调用:

content='' additional_kwargs={'tool_calls': [{'id': 'call_TB6Ioax1ExQF3lHbmLmrBtdF', 'function': {'arguments': '{"a": 2, "b": 7}', 'name': 'add'}, 'type': 'function'}]} response_metadata={'token_usage': {'completion_tokens': 17, 'prompt_tokens': 113, 'total_tokens': 130}, 'model_name': 'gpt-35-turbo', 'system_fingerprint': None, 'prompt_filter_results': [{'prompt_index': 0, 'content_filter_results': {'hate': {'filtered': False, 'severity': 'safe'}, 'self_harm': {'filtered': False, 'severity': 'safe'}, 'sexual': {'filtered': False, 'severity': 'safe'}, 'violence': {'filtered': False, 'severity': 'safe'}}}], 'finish_reason': 'tool_calls', 'logprobs': None, 'content_filter_results': {}} id='run-78784e10-497b-4444-886b-f37e5113fd85-0' tool_calls=[{'name': 'add', 'args': {'a': 2, 'b': 7}, 'id': 'call_TB6Ioax1ExQF3lHbmLmrBtdF', 'type': 'tool_call'}] usage_metadata={'input_tokens': 113, 'output_tokens': 17, 'total_tokens': 130}

版本信息

Python 3.12.3
langchain                          0.2.6
langchain-community                0.2.6
langchain-core                     0.2.23
langchain-openai                   0.1.17
langchain-text-splitters           0.2.2

解决方向

  • 升级模型部署:gpt-35-turbo对并行工具调用的支持存在局限性,切换到gpt-4或gpt-4o部署,新版本模型的多工具调用逻辑更完善,能更准确识别并行调用需求。
  • 明确提示词要求:修改查询语句,明确要求模型并行调用两个工具,例如:"请同时调用multiply工具计算34和79的乘积,调用add工具计算2和7的和",强化模型的并行调用意识。
  • 开启并行工具调用参数:在绑定工具时添加parallel_tool_calls=True参数(LangChain 0.2+版本支持),明确告知模型允许并行调用多个工具:
    llm_with_tools = model.bind_tools(tools, parallel_tool_calls=True)
    
  • 使用Agent框架处理:改用LangChain的Agent框架自动管理工具调用流程,无需手动维护消息序列,示例代码:
    from langchain.agents import create_openai_tools_agent, AgentExecutor
    from langchain_core.prompts import ChatPromptTemplate
    
    prompt = ChatPromptTemplate.from_messages([
        ("system", "你是一个擅长使用工具的助手。"),
        ("user", "{input}"),
        ("placeholder", "{agent_scratchpad}")
    ])
    
    agent = create_openai_tools_agent(model, tools, prompt)
    agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
    
    agent_executor.invoke({"input": "multiply 34 and 79. Also add 2 and 7."})
    

内容的提问来源于stack exchange,提问作者Julian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 17:57:32