序列化Azure OpenAI响应JSON时缺失prompt_filter_results的原因
问题:Azure OpenAI响应序列化为JSON时缺失
prompt_filter_results字段? 运行Azure OpenAI请求并尝试将响应转为JSON时,发现打印的completion对象包含prompt_filter_results字段,但序列化后的JSON里却没有。相关代码、打印结果如下:
示例代码
#Note: This code sample requires OpenAI Python library version 1.0.0 or higher. import json import pprint from openai import AzureOpenAI client = AzureOpenAI( azure_endpoint = "https://xxxxxx.openai.azure.com/", api_key='xxxxxxxxxxxxxxxxxxxxx', api_version="2023-07-01-preview" ) message_text = [{"role":"system","content":"You are an AI assistant that helps people find information."}] completion = client.chat.completions.create( model="gpt-4xxxxxxxx", messages = message_text, temperature=0.7, max_tokens=800, top_p=0.95, frequency_penalty=0, presence_penalty=0, stop=None ) print('completion:\n') pprint.pprint(completion) # Convert Python object to JSON json_data = json.dumps(completion, default=lambda o: o.__dict__, indent=4) # Print JSON print(json_data)
打印的completion对象(含prompt_filter_results)
ChatCompletion(id='chatcmpl-xxxxxxxxx', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='Great! How can I assist you today?', role='assistant', function_call=None, tool_calls=None), content_filter_results={'hate': {'filtered': False, 'severity': 'safe'}, 'self_harm': {'filtered': False, 'severity': 'safe'}, 'sexual': {'filtered': False, 'severity': 'safe'}, 'violence': {'filtered': False, 'severity': 'safe'}})], created=1709313222, model='gpt-4', object='chat.completion', system_fingerprint='fp_xxxxx', usage=CompletionUsage(completion_tokens=9, prompt_tokens=18, total_tokens=27), 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'}}}])
序列化后的JSON(缺失prompt_filter_results)
{ "id": "chatcmpl-xxxxxxx", "choices": [ { "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "Great! How can I assist you today?", "role": "assistant", "function_call": null, "tool_calls": null } } ], "created": 1709313222, "model": "gpt-4", "object": "chat.completion", "system_fingerprint": "fp_xxxxx", "usage": { "completion_tokens": 9, "prompt_tokens": 18, "total_tokens": 27 } }
原因及解决方法
原因
OpenAI Python SDK v1.x的响应对象基于Pydantic构建,prompt_filter_results属于额外扩展字段(不在ChatCompletion核心模型定义中):
- 打印对象时能看到该字段,是因为Pydantic模型的
__repr__方法会包含所有字段(包括额外字段); - 但直接通过
o.__dict__获取属性时,只能拿到模型定义内的标准属性,取不到额外的prompt_filter_results,因此序列化JSON时会缺失。
解决方法
方法1:使用Pydantic的model_dump()方法(推荐)
Pydantic模型提供的model_dump()方法会导出所有字段(包括额外字段),替换原序列化代码即可:
# 替换原json.dumps行 json_data = json.dumps(completion.model_dump(), indent=4)
方法2:修改序列化的默认处理函数
如果需要兼容非Pydantic对象,可以修改default参数的lambda函数,优先调用Pydantic的序列化方法:
json_data = json.dumps( completion, default=lambda o: o.model_dump() if hasattr(o, "model_dump") else o.__dict__, indent=4 )
内容的提问来源于stack exchange,提问作者Franck Dernoncourt
相关产品推荐
相关产品推荐

