我使用的model是GLM-4,使用JsonOutputFunctionsParser()时会报错: Could not parse function call: ‘function_call’
同时输出中的additional_kwargs={}一直是空的,无法返回对应的值
代码相同的情况下,输出均与教程不符,请问是什么原因
这个报错先要区分“返回内容”与“工具调用协议”,不一定是 GLM-4 不能输出 JSON。
JsonOutputFunctionsParser 会读取 AIMessage.additional_kwargs["function_call"],适用于旧的 function_call 格式;如果响应只有普通文本,或者使用了新的 tool_calls 格式,就不能直接交给它解析。
additional_kwargs={} 本身也不能证明没有工具调用,还应检查标准化后的 msg.tool_calls。
建议先把链末尾的 parser 暂时拿掉,查看模型响应的结构:
msg = (prompt | llm).invoke(inputs)
print(type(msg).__name__)
print("legacy function_call:", "function_call" in msg.additional_kwargs)
print("tool_calls:", len(getattr(msg, "tool_calls", [])))
print("invalid_tool_calls:", len(getattr(msg, "invalid_tool_calls", [])))
print("content type:", type(msg.content).__name__)
据此选择解析方式:
| 实际响应 | 应核对的处理方式 |
|---|---|
additional_kwargs["function_call"] 存在 |
旧 JsonOutputFunctionsParser 才有相应输入 |
msg.tool_calls 非空 |
读取工具名和 args,或使用对应的 tools parser |
只有 content 中的 JSON 文本 |
使用 JsonOutputParser,并对字段做 schema 校验 |
| 三者都不符合预期 | 核对模型服务、适配器及请求中是否真正绑定了工具/schema |
我用 langchain-core==1.7.0 构造了一条只有 tool_calls 的本地消息:旧 functions parser 能复现同样的 'function_call' 报错,而 JsonOutputToolsParser 能读取其中的参数;这个实验没有调用 GLM 服务,不能据此断言你当时接口返回的格式。
如果目标只是“让模型输出指定字段”,可以优先核对当前适配器的 with_structured_output 支持情况;不同接入包支持的方式可能不同,不要只因接口号称 OpenAI 兼容就照搬教程参数。
方便的话补充 langchain-core、模型接入包版本、llm 的初始化类名以及上述结构检查结果;密钥、业务正文和工具参数中的敏感数据请删去。