LangChain结构化输出-Pydantic

发布时间:2026/8/1 11:56:24
LangChain结构化输出-Pydantic 在没有 Pydantic 等结构化方案之前开发者需要写大量的 Prompt 苦口婆心地求大模型“请返回 JSON不要带任何解释”然后自己写繁琐的 json.loads() 和 try…except 。而有了 Pydantic 等结构化方案结合 .with_structured_output() 之后Prompt 变干净了 字段的 description 直接充当了 Prompt 的一部分类型安全 编辑器能自动补全代码运行前就能做类型检查。极其稳定 依托大模型厂商底层的 JSON 模式输出错误率降到了极低目前LangChain 1.x 支持多种Schema与结构化输出方式Pydantic字段校验、描述、嵌套结构功能最丰富TypedDict轻量类型约束JSON Schema与前后端/跨语言接口最通用dataclass模型对象可以调用 with_structured_output() 绑定输出模式schema。只有 Pydantic 返回的是Schema类实例其余三种方式返回的都是 字典 也只有 Pydantic 在类型不匹配时会抛出异常。Pydantic基本使用所有结构化输出的数据模型都必须继承 BaseModel使用 类型提示 。Pydantic 支持丰富的字段类型str 、int、float、List[xxx]、Optional[xxx]等使用 Field() 添加字段默认值和描述帮助 LLM 理解字段含义定义 Pydantic 模型使用清晰的字段描述没有描述LLM 可能格式错误# 方式2绑定到模型主流importosfromurllibimportresponsefromrichimportprintasrprintfromdotenvimportload_dotenvfromlangchain_deepseekimportChatDeepSeekfrompydantic_settings.sources.providersimportdotenvfromtyping_extensionsimportoverride#读取.env中的配置文件,相关的环境变量以.env文件中优先# 通过load_dotenv()将.env中的变量加载为环境变量## overrideTrue表示无论你当前的操作系统、终端或者虚拟环境中是否已经存在同名的环境变量#都会强行用 .env 文件里写的值去覆盖它load_dotenv(overrideTrue)DEEPSEEK_API_KEYos.getenv(DEEPSEEK_API_KEY)DEEPSEEK_BASE_URLos.getenv(DEEPSEEK_BASE_URL)modelChatDeepSeek(modeldeepseek-v4-flash,api_keyDEEPSEEK_API_KEY,api_baseDEEPSEEK_BASE_URL,)frompydanticimportBaseModel,FieldclassPerson(BaseModel):人物信息name:strField(description姓名)age:intField(description年龄)occupation:strField(description职业)# 创建结构化输出的大语言模型structured_modelmodel.with_structured_output(Person)resultstructured_model.invoke(张三是一名30岁的软件工程师)print(result)print(type(result))