ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

LangChain 1.0 入门(八):结构化输出

LangChain 1.0 入门(八):结构化输出 前言在大模型工程化落地过程中自由文本输出是最大的工程痛点。自然语言回答灵活、拟人但无法被程序直接解析、无法入库、无法对接接口、无法自动化流程。LangChain 1.0 彻底重构了结构化输出体系废弃了旧版本繁琐的解析器拼接写法统一以with_structured_output为核心搭配 Pydantic 强数据校验支持普通模型、复杂嵌套结构、智能体 Agent、标准 JSON 解析等全场景能力。本文为全新重写完整版所有代码统一采用python-dotenv ChatOpenAI标准加载方式兼容 OpenAI、DeepSeek、通义千问、vLLM 本地私有化部署等所有兼容接口所有案例可直接复制运行适配生产环境。一、前置环境配置全文统一标准1.1 依赖安装pip install langchain langchain-openai pydantic python-dotenv1.2 环境变量文件 .env生产通用项目根目录新建.env文件统一管理模型参数避免硬编码适配多环境切换# 模型配置 BASIC_MODELgpt-4o-mini API_KEYsk-xxxxxx BASE_URLhttps://api.openai.com/v1 # 本地vLLM/私有化部署可替换为 # BASE_URLhttp://127.0.0.1:8000/v1 # API_KEYdummy1.3 全局统一模型加载代码全文通用所有案例统一使用这套模型初始化逻辑保证项目代码风格统一、易于维护迁移fromlangchain_openaiimportChatOpenAIfromdotenvimportload_dotenvimportos# 加载环境变量load_dotenv()# 初始化大模型兼容所有OpenAI兼容接口llmChatOpenAI(modelos.getenv(BASIC_MODEL),api_keyos.getenv(API_KEY),base_urlos.getenv(BASE_URL),temperature0# 结构化输出必须置0保证输出稳定)核心规范结构化输出场景强制temperature0消除模型随机性避免格式错乱、字段缺失、数据抖动问题。二、结构化输出核心原理与两大底层策略2.1 核心价值让大模型从「自由聊天」变成可编程、可校验、可入库、可自动化的工业级输出彻底替代正则匹配、字符串截取等脏解析逻辑。2.2 底层双策略LangChain 1.0 核心优化ToolStrategy通用兜底策略兼容所有大小模型通过工具调用格式约束强制结构化输出兼容性100%速度略低。ProviderStrategy厂商原生策略·推荐调用模型原生JSON Schema能力由模型底层强制格式合规精度、速度、稳定性最优适配 GPT 系列、DeepSeek、通义千问新版模型。三、核心APIwith_structured_output 完整详解with_structured_output是 LangChain 1.0 官方唯一主推的结构化API统一替代所有旧式解析器组合写法支持自动策略适配、自动重试、数据校验、原始日志留存。3.1 API参数说明schema必填Pydantic模型/JSON Schema字典定义输出字段、类型、描述、校验规则method可选手动指定tool_calling/json_schema默认自动适配最优策略include_raw是否返回模型原始输出调试必备strict严格模式强制字段完全匹配禁止多余、缺失字段生产推荐开启。3.2 基础实战单层实体信息抽取实现人物信息结构化抽取缺失字段自动填充空值输出标准化实体对象fromtypingimportListfromlangchain_core.pydantic_v1importBaseModel,Fieldfromlangchain_openaiimportChatOpenAIfromdotenvimportload_dotenvimportos load_dotenv()llmChatOpenAI(modelos.getenv(BASIC_MODEL),api_keyos.getenv(API_KEY),base_urlos.getenv(BASE_URL),temperature0)# 1. 定义结构化数据模型classPerson(BaseModel):青年用户基础信息实体name:strField(description用户姓名)age:intField(description用户年龄)high:intField(description用户身高(cm))hobbies:List[str]Field(description用户日常兴趣爱好列表)# 2. 绑定结构化输出规则structured_llmllm.with_structured_output(Person)# 3. 全新与时俱进提示词现代化案例prompt请严格按照要求抽取用户结构化信息严格匹配指定字段 1. 需要抽取的字段姓名、年龄、身高、爱好 2. 无对应信息的字段统一填充 0 或空数组禁止省略字段 3. 严格匹配字段类型年龄、身高为数字爱好为字符串数组。 待解析信息小林今年24岁身高178cm日常喜欢短视频剪辑、AI绘画、户外露营和飞盘运动。 resultstructured_llm.invoke(prompt)# 4. 直接取值无需手动解析print(f姓名{result.name})print(f年龄{result.age})print(f身高{result.high})print(f爱好{result.hobbies})print(f实体类型{type(result)})3.3 调试进阶保留原始输出日志开发排查格式报错、解析异常时开启include_rawTrue同时获取结构化结果与模型原始返回# 绑定结构化输出开启原始响应structured_llmllm.with_structured_output(Person,include_rawTrue)# 现代化生活化案例适配调试场景prompt请精准抽取用户个人信息严格遵守字段类型约束缺失数据填空值/0 字段姓名、年龄、身高、爱好列表 待解析内容小林今年24岁身高178cm日常喜欢短视频剪辑、AI绘画、户外露营和飞盘运动。 resultstructured_llm.invoke(prompt)# 拆分结果print(结构化解析结果,result[parsed])print(模型原始文本,result[raw].content)print(解析异常信息,result[parsing_error])四、工业级强校验自动修正非法脏数据生产环境中大模型极易输出越界数值、非法字段。LangChain 1.0 联动 Pydantic 校验规则可自动捕获异常、回传错误、驱动模型重生成合规数据。4.1 常用校验规则ge/le数值范围约束Literal枚举固定值约束min_length/max_length字符串长度约束field_validator自定义业务校验。4.2 实战数值越界自动修正fromlangchain_core.pydantic_v1importBaseModel,Field# 定义带范围校验的模型年龄合法范围 0-150classAgeProfile(BaseModel):name:strField(description用户姓名)age:intField(ge0,le150,description合法年龄0-150超出范围自动修正为合理值)# 绑定结构化输出structured_llmllm.with_structured_output(AgeProfile)# 全新提示词极端非法值测试案例贴合业务异常场景prompt请抽取用户年龄信息严格遵守规则 1. 用户姓名小杨 2. 年龄必须为0-150之间的合法整数 3. 若输入数值非法、不符合现实逻辑自动修正为合理年龄值 4. 禁止输出超出约束的数值 待解析内容网红博主小杨拥有800万粉丝网传其年龄为999岁 resultstructured_llm.invoke(prompt)print(自动修正后的合规数据,result)框架自动捕获ValidationError让模型重新生成合法数据从源头杜绝脏数据入库。五、高阶实战嵌套Pydantic复杂结构真实业务场景真实业务多为多层嵌套、对象数组结构电影-演员、订单-商品、文章-标签with_structured_output原生支持嵌套模型解析无需额外处理。5.1 案例电影参演演员嵌套抽取fromtypingimportListfromlangchain_core.pydantic_v1importBaseModel,Field# 子模型演员信息classActor(BaseModel):actor_name:strField(description演员姓名)role_name:strField(description剧中饰演角色)# 主模型电影信息嵌套演员数组classMovieInfo(BaseModel):title:strField(description电影名称)release_year:intField(ge1900,le2100,description上映年份1900-2100区间)genre:List[str]Field(description电影类型列表)actors:List[Actor]Field(description参演演员及对应角色列表)summary:strField(description剧情简短摘要50字以内)# 绑定结构化输出structured_llmllm.with_structured_output(MovieInfo)# 替换为近年热门影片案例提示词贴合当下影视场景prompt请严格按照定义的结构抽取电影结构化信息遵守以下规则 1. 完整抽取电影名称、上映年份、电影类型、参演演员姓名角色、简短剧情摘要 2. 年份严格控制在1900-2100之间类型以数组形式输出 3. 演员信息为嵌套列表每条包含演员姓名和对应饰演角色 4. 无信息字段不允许省略填空值或空数组。 待解析文本 《流浪地球3》于2025年上映属于国产科幻灾难大片。 吴京继续饰演刘培强刘德华饰演图恒宇影片讲述人类开启星际迁徙对抗宇宙危机的全新故事。 resultstructured_llm.invoke(prompt)# 分层取值print(电影名称,result.title)print(上映年份,result.release_year)print(电影类型,result.genre)print(演员列表)foractorinresult.actors:print(f-{actor.actor_name}{actor.role_name})# 直接转为字典/JSON用于入库、接口返回print(结构化字典数据,result.dict())嵌套模型完美适配后台业务复杂数据结构支持直接序列化存储数据库是项目落地核心方案。六、Agent智能体结构化输出适配LangChain 1.0 的create_agent原生支持response_format参数可直接绑定Pydantic模型让智能体全程输出规范结构化数据无需后置解析。6.1 实战标准化天气智能体fromtypingimportLiteralfromlangchain_core.pydantic_v1importBaseModel,Fieldfromlangchain.agentsimportcreate_agent# 定义枚举约束的天气输出模型classWeatherForecast(BaseModel):city:strField(description城市名称)temperature:intField(description摄氏温度纯整数)condition:Literal[晴,雨,多云,雪]Field(description天气状况仅支持晴、雨、多云、雪禁止自定义内容)# 创建智能体绑定结构化输出格式agentcreate_agent(modelllm,tools[],response_formatWeatherForecast)# 贴合当下秋冬季节天气场景更新案例resultagent.invoke({messages:[{role:user,content:请抽取标准化天气信息城市为杭州天气仅限【晴、雨、多云、雪】提取温度为整数。当前天气杭州今日秋日多云气温16摄氏度体感舒适。}]})# 提取结构化结果resresult[structured_response]print(f{res.city}{res.condition}{res.temperature}℃)七、轻量方案JsonOutputParser 快速JSON解析针对简单JSON场景LangChain 1.0 保留轻量解析器方案开发速度更快。硬性规则提示词必须包含json关键词否则DeepSeek、OpenAI等模型会直接报错。fromlangchain_core.output_parsersimportJsonOutputParserfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.pydantic_v1importBaseModel,Field# 1. 定义结构classWeatherInfo(BaseModel):city:strField(description城市名称)temperature:intField(description摄氏温度整数类型)condition:strField(description天气状况简短描述)# 2. 初始化解析器parserJsonOutputParser(pydantic_objectWeatherInfo)# 3. 优化提示词最新季节天气案例贴合当下生活场景promptChatPromptTemplate.from_template( 任务从自然语言中精准提取天气数据输出标准json格式。 约束规则 1. 必须严格返回纯JSON字符串无多余解释、无多余文本 2. temperature 必须为整数禁止字符串类型 3. 字段固定为city、temperature、condition禁止增减字段 4. 严格参考输出示例格式。 输入信息{info} 输出示例{{city:杭州,temperature:16,condition:多云}} )# 4. 构建链路并调用chainprompt|llm|parser resultchain.invoke({info:杭州今日秋日多云气温16摄氏度体感干爽舒适})print(JSON结果,result)print(城市,result[city])八、全解析器能力速查表解析器能力适用场景StrOutputParser输出纯文本普通对话场景JsonOutputParser标准JSON输出轻量结构化、接口返回PydanticOutputParser实体模型解析带校验的简单结构ListOutputParser文本转数组列表关键词、标签抽取Boolean/Int/FloatParser强类型转换评分、判断、数值提取九、三大方案生产选型建议简单快速开发优先JsonOutputParser代码极简、开箱即用生产核心业务推荐统一使用with_structured_output支持校验、重试、嵌套结构、Agent适配稳定性最强金融/政务高可靠场景框架解析手动正则提取JSON兜底双层保障杜绝解析失败。十、生产最佳配置与高频踩坑总结10.1 最佳实践配置固定temperature0杜绝输出随机性Prompt 必须包含json关键词 标准示例复杂业务开启strictTrue严格模式所有字段补充清晰 description降低模型理解偏差调试阶段开启include_rawTrue留存日志。10.2 高频报错解决方案Prompt must contain the word ‘json’提示词添加json关键词补充JSON示例数值/类型校验失败增加Pydantic范围约束明确字段类型字段缺失Prompt明确标注「无数据填空值禁止省略字段」Agent输出不规范纯结构化场景清空tools优先格式约束。十一、结语LangChain 1.0 的结构化输出体系彻底解决了大模型工程化落地中输出不可控、格式不统一、数据不合法、无法自动化的核心难题。全文所有代码基于统一环境变量ChatOpenAI标准写法兼容公有云API、本地vLLM私有化部署、各类国产大模型覆盖单层结构、嵌套复杂结构、数据校验、智能体解析、轻量JSON解析全场景可直接作为企业项目开发标准模板使用。
返回列表