如何解决Pydantic Answer类的两个验证错误问题?
问题分析与解决方案
核心问题
你遇到的验证错误根源在于:
answer字段被传入None,但模型未配置该字段为可选值- 代码存在字段定义错误与过度转义逻辑,导致JSON解析失败后传入无效的
None值 - 类嵌套结构不合理,
Answer类嵌套在TableData内部引发解析命名空间混乱
具体修复步骤
1. 修正字段定义错误
原代码中= Field是错误用法,Field是字段配置工具而非默认值。需明确字段是否允许为空,正确使用Optional或Field配置规则。
2. 移除过度转义函数
fix_json_string错误转义了JSON核心结构符(如[]、{}),导致JSON完全无法解析,最终传入模型的是无效数据。LLM返回的JSON仅需处理换行等特殊字符,无需破坏结构的转义。
3. 调整类结构
将Answer类从TableData内部移出作为独立类,避免解析时的命名空间冲突。
4. 使用Pydantic原生解析能力
用model_validate_json替代手动json.loads,Pydantic会自动处理JSON解析与模型验证,减少手动逻辑错误。
修改后的完整代码
from pydantic import BaseModel, ValidationError from typing import Union, Optional, Dict, List, Any import json class TableData(BaseModel): data: Union[Dict[str, List[Any]], List[Dict[str, Any]]] answer: Optional[str] = None @classmethod def from_json(cls, json_str): try: # 仅清理换行符,保留JSON结构完整性 cleaned_str = json_str.strip().replace("\n", "\\n").replace("\r", "\\r") return cls.model_validate_json(cleaned_str) except json.JSONDecodeError as e: print(f"JSON解析错误: {e}") return None except ValidationError as e: print(f"验证错误: {e}") return None class Answer(BaseModel): # 允许answer为None、字符串或TableData实例 answer: Optional[Union[TableData, str]] = None # 允许sql为字符串或任意类型,默认值设为None sql: Optional[Union[str, Any]] = None @classmethod def from_json(cls, json_str): try: cleaned_str = json_str.strip().replace("\n", "\\n").replace("\r", "\\r") return cls.model_validate_json(cleaned_str) except json.JSONDecodeError as e: print(f"JSON解析错误: {e}") return None except ValidationError as e: print(f"验证错误: {e}") return None
额外说明
- 若LLM返回JSON格式不稳定,可引入第三方库(如
jsonrepair)修复无效JSON后再解析 - 若不需要
answer字段允许None,可移除Optional,但需确保LLM始终返回有效字符串或TableData结构 - 测试时建议打印LLM原始返回内容,确认是否符合预期JSON格式
内容的提问来源于stack exchange,提问作者sherin_a27
相关产品推荐
相关产品推荐

