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
相关产品推荐
相关产品推荐

