LangChain工具调用后二次响应无内容问题求助
LangChain工具调用后二次响应无内容问题求助
大家好,我现在在尝试用LangChain实现工具调用功能,跟着相关指引做的时候遇到了一个奇怪的问题,想请各位帮忙看看。
我使用的是部署在Together.xyz上的mistralai/Mixtral-8x7B-Instruct-v0.1模型,绑定了加法和乘法两个简单工具,用户的查询是同时计算两个算术题:“3*12是多少?另外,11+49是多少?”。
第一次调用模型时,它正确识别出需要调用两个工具,我也顺利执行了工具调用,把工具返回的结果添加到了消息对话列表中。但第二次调用模型时,返回的响应里content字段是空的,完全没有生成我预期的自然语言回答(比如类似“3乘12的结果是36,11加49的结果是60”这样的总结内容)。
我的代码实现
from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage from langchain_core.tools import tool llm = ChatOpenAI( base_url="https://api.together.xyz/v1", api_key="<api_key>", model="mistralai/Mixtral-8x7B-Instruct-v0.1", ) @tool def add(a: int, b: int) -> int: """Add two integers. Args: a: First integer b: Second integer """ return a + b @tool def multiply(a: int, b: int) -> int: """Multiply two integers. Args: a: First integer b: Second integer """ return a * b tools = [add, multiply] llm = llm.bind_tools(tools) messages = [HumanMessage("What is 3 * 12? Also, what is 11 + 49?")] response = llm.invoke(messages) print(response) print("-----------------------------------") if response.tool_calls: messages.append(response) for tool_call in response.tool_calls: selected_tool = {"add": add, "multiply": multiply}[tool_call["name"].lower()] tool_msg = selected_tool.invoke(tool_call) messages.append(tool_msg) print(messages) print("-----------------------------------") second_response = llm.invoke(messages) print(second_response)
运行输出结果
第一次模型响应
content='' additional_kwargs={'tool_calls': [{'id': 'call_thdcqzbn85b4nrl63n3jqj1y', 'function': {'arguments': '{"a":3,"b":12}', 'name': 'multiply'}, 'type': 'function'}, {'id': 'call_7qhd09fknz6t74z5b5zuetvb', 'function': {'arguments': '{"a":11,"b":49}', 'name': 'add'}, 'type': 'function'}], 'refusal': None} response_metadata={'token_usage': {'completion_tokens': 84, 'prompt_tokens': 342, 'total_tokens': 426, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'mistralai/Mixtral-8x7B-Instruct-v0.1', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None} id='run-74d1414c-f12e-4a98-a1f5-eeff6039b4e5-0' tool_calls=[{'name': 'multiply', 'args': {'a': 3, 'b': 12}, 'id': 'call_thdcqzbn85b4nrl63n3jqj1y', 'type': 'tool_call'}, {'name': 'add', 'args': {'a': 11, 'b': 49}, 'id': 'call_7qhd09fknz6t74z5b5zuetvb', 'type': 'tool_call'}] usage_metadata={'input_tokens': 342, 'output_tokens': 84, 'total_tokens': 426, 'input_token_details': {}, 'output_token_details': {}}
更新后的消息列表
[HumanMessage(content='What is 3 * 12? Also, what is 11 + 49?', additional_kwargs={}, response_metadata={}), AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_thdcqzbn85b4nrl63n3jqj1y', 'function': {'arguments': '{"a":3,"b":12}', 'name': 'multiply'}, 'type': 'function'}, {'id': 'call_7qhd09fknz6t74z5b5zuetvb', 'function': {'arguments': '{"a":11,"b":49}', 'name': 'add'}, 'type': 'function'}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 84, 'prompt_tokens': 342, 'total_tokens': 426, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'mistralai/Mixtral-8x7B-Instruct-v0.1', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None}, id='run-74d1414c-f12e-4a98-a1f5-eeff6039b4e5-0', tool_calls=[{'name': 'multiply', 'args': {'a': 3, 'b': 12}, 'id': 'call_thdcqzbn85b4nrl63n3jqj1y', 'type': 'tool_call'}, {'name': 'add', 'args': {'a': 11, 'b': 49}, 'id': 'call_7qhd09fknz6t74z5b5zuetvb', 'type': 'tool_call'}], usage_metadata={'input_tokens': 342, 'output_tokens': 84, 'total_tokens': 426, 'input_token_details': {}, 'output_token_details': {}}), ToolMessage(content='36', name='multiply', tool_call_id='call_thdcqzbn85b4nrl63n3jqj1y'), ToolMessage(content='60', name='add', tool_call_id='call_7qhd09fknz6t74z5b5zuetvb')]
第二次模型响应
content='' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 1, 'prompt_tokens': 477, 'total_tokens': 478, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'mistralai/Mixtral-8x7B-Instruct-v0.1', 'system_fingerprint': None, 'finish_reason': 'eos', 'logprobs': None} id='run-4195c304-6c37-45bf-b745-cb370dba452f-0' usage_metadata={'input_tokens': 477, 'output_tokens': 1, 'total_tokens': 478, 'input_token_details': {}, 'output_token_details': {}}
预期与实际差异
我本来以为第二次调用模型后,它会把工具返回的结果整理成自然语言回答,但实际返回的content是空字符串,finish_reason是eos,完全没有生成想要的总结内容。
有没有朋友遇到过类似的问题?或者我哪里的代码逻辑写得不对?麻烦帮忙指点一下,谢谢大家!
备注:内容来源于stack exchange,提问作者AhmedAbbas
相关产品推荐
相关产品推荐

