
AzureChatOpenAI._create_chat_result emits PydanticSerializationUnexpectedValue warnings for structured-output responses
快速结论:该报错发生在使用 AzureChatOpenAI 且启用了 with_structured_output 时。优先排查 langchain-openai 是否已更新至包含 #37727 修复的版本。
问题场景
用户在使用 AzureChatOpenAI(属 langchain-openai 包)并调用结构化输出(structured-output)功能时,控制台持续出现 PydanticSerializationUnexpectedValue 警告。该警告在 ChatOpenAI(非 Azure 版本)中已通过 PR #35543 修复,但 AzureChatOpenAI._create_chat_result 的重写方法遗漏了相同的 exclude 参数。
报错原文
# warnings: 1
UserWarning Pydantic serializer warnings:
PydanticSerializationUnexpectedValue(Expected `none` - serialized value may not be as expected [field_name='parsed', input_value=ModelOutput(output='Paris'), input_type=ModelOutput])
原因分析
根本原因是 AzureChatOpenAI._create_chat_result 方法覆盖了基类 BaseChatOpenAI._create_chat_result。基类方法在 PR #35543 中已添加了 exclude={"choices": {"__all__": {"message": {"parsed"}}}} 参数以抑制结构化输出中的序列化警告,但 Azure 覆盖方法为了检查 Azure 内容过滤元数据,执行了第二次 response.model_dump() 调用,且没有携带相同的 exclude 参数,导致警告仍然被触发。
环境排查
- 确认
langchain-openai的版本。该问题在langchain-openai包中,修复已合入 PR #37727。 - 确认
langchain-core及pydantic版本兼容性。 - 检查
AzureChatOpenAI的_create_chat_result方法实现,确认是否包含exclude={"choices": {"__all__": {"message": {"parsed"}}}}。
解决步骤
- 升级
langchain-openai到包含 PR #37727 修复的版本(例如 >=0.2.10 或后续对应版本)。 - 如果无法立即升级,临时规避方案是手动将
exclude={"choices": {"__all__": {"message": {"parsed"}}}}添加到AzureChatOpenAI._create_chat_result中的response.model_dump()调用处(位于azure.py第 774 行附近)。 - 验证修复:使用包含结构化输出的 mock 响应运行测试,确认不再产生
UserWarning。
验证方法
使用 Issue 中提供的 mock 数据(MockChatCompletion 等)调用 AzureChatOpenAI._create_chat_result(),捕获并检查 warnings,确认 PydanticSerializationUnexpectedValue 警告不再出现。如果警告计数为 0,则问题已解决。



