LangChain 中型工具调用后,模型没有产生自然语言响应,根本原因往往是所选大型模型不真正支持结构化工具调用协议(如 OpenAI-style tool calling),即使文档声称“支持”,也可能缺乏正确性 tool_calls → tool_messages → 最终 content 产生完整的闭环能力。
langchain 工具调用后,模型没有产生自然语言响应。根本原因是所选大型模型并不真正支持结构化工具调用协议(例如) openai-style tool calling),即使文档声称“支持”,也可能缺乏正确性 `tool_calls` → `tool_messages` → 最终 `content` 产生完整的闭环能力。
在 LangChain 在标准工具调用过程中,模型需要三阶段协调:
-
第一轮响应:识别用户意图,输出
tool_calls(而非content); -
工具执行:开发人员调用相应的函数,将结果封装为
ToolMessage并将其添加到新闻史上; -
第二轮响应:模型基于原始问题 + 工具返回结果,生成人类最终可读的结果
content。
你的代码逻辑完全正确——messages 正确追加了 HumanMessage、AIMessage 和两个 ToolMessage,且 second_response 它确实被调用了。但关键问题是:您使用的模型 mistralai/Mixtral-8x7B-Instruct-v0.1(通过 Together AI 提供)虽然可以输出 tool_calls,但是不能接收 ToolMessage 后生成有意义的 content。其 second_response.content 为空、output_tokens=1、finish_reason='eos',表示模型直接终止输出,未进行推理整合。
✅ 正确的方法是选择原生和稳定的支持 LangChain 例如,工具调用协议模型:
-
gpt-4o-mini(推荐:轻量、高效、兼容性极佳) -
gpt-4o、gpt-3.5-turbo-0125(OpenAI 官方模型,协议最成熟) -
claude-3-haiku-20240307或sonnet-20240229(Anthropic 模型,需要使用ChatAnthropic)
? 修改示例(仅替换模型配置):
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="gpt-4o-mini", # ✅ 替换为真正的支持 tool calling 的模型
api_key="your_openai_api_key", # 使用 OpenAI 官方 API Key
temperature=0,
)⚠️ 注意事项:
- 不要依赖第三方平台(如 Together AI、Fireworks AI)标记开源模型的“工具调用”——它们通常只模拟
tool_calls输出,缺乏完整的工具响应链; - 如果必须使用开源模型,请优先考虑明确的支持
function calling微调版(如Qwen2.5-7B-Instruct配合langchain_qwen验证工具适配器是否可以处理ToolMessage输入; - 始终检查
second_response.content并添加容错逻辑:if not second_response.content.strip(): print("Warning: Model returned empty content. Check model compatibility.")
总结:LangChain 工具调用不是纯代码问题,而是模型能力合同问题。确保模型和客户端(如 ChatOpenAI)、消息格式(ToolMessage)三者严格对齐 OpenAI 为了实现从工具执行到自然语言回答的无缝闭环,工具调用规范。