LangChain结构化输出:Pydantic与JSON解析器实战
1. 为什么需要模型返回结构化数据在自然语言处理的实际应用中我们经常会遇到这样的场景模型输出的文本内容需要被后续程序解析和处理。比如你问模型明天北京的天气如何理想的回答可能是{ city: 北京, date: 2023-11-20, weather: 晴, temperature: { high: 15, low: 5 } }而不是一段自由文本明天北京天气晴朗最高气温15度最低气温5度。后者虽然对人类友好但程序需要额外编写复杂的解析逻辑才能提取关键信息。1.1 结构化数据的优势结构化数据相比自由文本有几个显著优势程序可读性JSON/YAML等格式可以直接被各种编程语言解析数据一致性固定字段确保每次返回的数据结构相同接口标准化便于不同系统间的数据交换类型安全可以定义字段的数据类型减少错误1.2 LangChain中的结构化输出LangChain提供了几种实现结构化输出的方式Pydantic输出解析器利用Python的类型提示系统JSON输出解析器直接返回JSON格式自定义解析器针对特定需求定制提示选择哪种方式取决于你的具体需求。Pydantic适合Python项目JSON更通用自定义解析器灵活性最高但开发成本也最高。2. 使用Pydantic实现结构化输出Pydantic是Python中用于数据验证和设置管理的库LangChain内置了对Pydantic的支持。2.1 定义输出模型首先需要定义一个Pydantic模型来描述你期望的数据结构from pydantic import BaseModel, Field class WeatherInfo(BaseModel): city: str Field(description城市名称) date: str Field(description日期格式为YYYY-MM-DD) weather: str Field(description天气状况) temperature: dict Field(description温度信息包含最高和最低温度) class Config: schema_extra { example: { city: 北京, date: 2023-11-20, weather: 晴, temperature: {high: 15, low: 5} } }2.2 创建解析器并绑定到链from langchain.output_parsers import PydanticOutputParser from langchain.prompts import PromptTemplate from langchain.llms import OpenAI # 创建解析器 parser PydanticOutputParser(pydantic_objectWeatherInfo) # 创建提示模板 prompt PromptTemplate( template回答用户问题。\n{format_instructions}\n问题{query}\n, input_variables[query], partial_variables{format_instructions: parser.get_format_instructions()} ) # 创建链 model OpenAI(temperature0) chain prompt | model | parser # 执行查询 result chain.invoke({query: 明天北京的天气如何}) print(result)2.3 关键参数解析temperature0设置为0确保输出确定性高适合结构化数据get_format_instructions()自动生成模型的结构描述partial_variables将格式指令作为固定部分加入提示注意Pydantic模型中的Field描述很重要它们会被转换为模型的结构说明影响LLM的输出。3. JSON输出解析器实战如果你不需要Pydantic的验证功能或者需要与非Python系统交互JSON格式是更好的选择。3.1 基本使用from langchain.output_parsers import StructuredOutputParser, ResponseSchema from langchain.prompts import ChatPromptTemplate # 定义响应模式 response_schemas [ ResponseSchema(namecity, description城市名称), ResponseSchema(namedate, description日期), ResponseSchema(nameweather, description天气状况), ResponseSchema(nametemperature, description温度范围) ] # 创建解析器 parser StructuredOutputParser.from_response_schemas(response_schemas) # 创建提示 prompt ChatPromptTemplate.from_template( 回答关于天气的问题返回JSON格式。 {format_instructions} 问题{query} ) # 创建链 chain prompt | model | parser # 执行 result chain.invoke({ query: 明天上海的天气怎么样, format_instructions: parser.get_format_instructions() })3.2 高级配置# 自定义JSON格式 custom_parser StructuredOutputParser.from_response_schemas( response_schemas, json_pattern{ 回答: { 城市: ..., 日期: ..., 天气: ..., 温度: {最高: xx, 最低: xx} } } )3.3 处理复杂结构对于嵌套结构可以这样定义response_schemas [ ResponseSchema(namecity, description城市名称), ResponseSchema(namedate, description日期), ResponseSchema(nameweather, description天气状况), ResponseSchema( nametemperature, description温度信息, typeobject, schema{ high: {type: number, description: 最高温度}, low: {type: number, description: 最低温度} } ) ]4. 常见问题与解决方案4.1 模型不遵循格式现象返回自由文本而非指定格式解决方案加强提示词中的格式要求在示例中展示正确格式降低temperature值使用更强大的模型如GPT-4改进后的提示模板prompt PromptTemplate( template请严格按照指定格式回答问题。 格式要求 {format_instructions} 示例 问题明天北京的天气如何 回答 {{ city: 北京, date: 2023-11-20, weather: 晴, temperature: {{high: 15, low: 5}} }} 现在请回答 问题{query} 回答, input_variables[query], partial_variables{format_instructions: parser.get_format_instructions()} )4.2 字段缺失或错误现象缺少某些字段或字段值不符合预期解决方案在Pydantic模型中设置必填字段为字段添加更详细的描述使用try-catch处理解析错误from pydantic import validator class WeatherInfo(BaseModel): city: str date: str weather: str temperature: dict validator(date) def date_format(cls, v): if not re.match(r\d{4}-\d{2}-\d{2}, v): raise ValueError(日期格式必须是YYYY-MM-DD) return v4.3 处理多值返回有时一个问题需要返回多个结构化结果class WeatherInfoList(BaseModel): items: List[WeatherInfo] # 提示词中明确说明 prompt 返回以下城市未来三天的天气 {cities} 每个城市每天一个记录共{count}条记录。 {format_instructions}5. 性能优化技巧5.1 批量处理当需要处理多个相似查询时可以使用批量模式queries [北京天气, 上海天气, 广州天气] results chain.batch([{query: q} for q in queries])5.2 缓存结果对相同查询缓存结果from langchain.cache import InMemoryCache from langchain.globals import set_llm_cache set_llm_cache(InMemoryCache())5.3 流式处理对于大结构数据可以分段处理class ChunkedOutputParser(BaseOutputParser): def parse(self, text: str): # 实现分段解析逻辑 pass6. 高级应用场景6.1 动态结构根据输入动态确定输出结构def dynamic_schema(query): if 天气 in query: return WeatherInfo elif 股票 in query: return StockInfo else: return BaseModel parser PydanticOutputParser(pydantic_objectdynamic_schema(query))6.2 多模型协作让一个模型决定结构另一个模型填充内容# 第一步确定结构 schema_chain prompt | model | SchemaParser() # 第二步填充数据 data_chain prompt | model | DataParser()6.3 结合其他LangChain组件from langchain.chains import LLMChain from langchain.agents import Tool weather_tool Tool( nameWeather, funclambda x: chain.run(queryx), description获取天气信息输入格式城市名 天气 )在实际项目中我发现结构化输出特别适合以下场景构建问答系统API数据提取和标准化多步骤工作流中的数据传递需要精确解析的自动化任务一个实用的技巧是先让模型用自由文本回答再让另一个模型将其转换为结构化格式。这种方法结合了两种方式的优点在复杂场景下效果更好。

相关新闻

Python的包与依赖管理:从模块搜索到项目构建

Python的包与依赖管理:从模块搜索到项目构建

Python项目的规模增长到一定程度后,代码组织就不再是简单的“把文件放在一起”。模块导入、包结构、虚拟环境、依赖管理——这些问题从项目的早期阶段就开始出现,理解它们背后的机制有助于避免工程陷阱。一、模块搜索路径的机制与调试import语句执行时&a…

2026/7/27 8:20:53 阅读更多 →
TMS320VC5509A DSP外设接口时序详解:从MMC/SD到USB的硬件设计与调试

TMS320VC5509A DSP外设接口时序详解:从MMC/SD到USB的硬件设计与调试

1. 项目概述与核心价值 如果你正在基于德州仪器(TI)的TMS320VC5509A这款经典的定点数字信号处理器(DSP)进行嵌入式系统开发,尤其是在设计需要连接外部存储卡(如SD卡)或实现USB设备功能的项目时&…

2026/7/27 8:20:53 阅读更多 →
FastAdmin任意文件读取漏洞深度剖析与立体化防御实战

FastAdmin任意文件读取漏洞深度剖析与立体化防御实战

1. 项目概述:从一次应急响应说起那天晚上,我正打算关电脑,手机突然响了,是客户那边负责运维的老张。电话那头语气有点急,说他们一个面向公众的FastAdmin后台管理界面,好像被人“看”了,系统日志…

2026/7/27 8:20:53 阅读更多 →

最新新闻

在TI AM57xx/AM65x开发板上构建Android Automotive OS完整指南

在TI AM57xx/AM65x开发板上构建Android Automotive OS完整指南

1. 项目概述与核心价值 如果你手头有一块德州仪器(TI)的AM57xx或AM65x系列开发板,并且一直在琢磨如何让它跑起来一套真正为汽车座舱优化的操作系统,那么这篇文章就是为你准备的。我最近花了相当长的时间,在TI的BeagleB…

2026/7/27 8:33:58 阅读更多 →
A*与DWA融合算法在机器人路径规划中的Matlab实现

A*与DWA融合算法在机器人路径规划中的Matlab实现

1. 项目背景与核心价值在机器人路径规划领域,全局规划与局部避障的协同一直是个经典难题。A*算法作为经典的启发式搜索算法,擅长在已知环境中寻找全局最优路径,但当遇到未知障碍物时就会显得力不从心。而动态窗口算法(DWA)则擅长基于实时传感…

2026/7/27 8:33:58 阅读更多 →
基于YOLOv5与GhostHGNetV2的海洋漏油检测系统

基于YOLOv5与GhostHGNetV2的海洋漏油检测系统

1. 海洋漏油检测系统概述海洋漏油事件是威胁海洋生态安全的重要环境问题。传统的人工巡查方式存在效率低、覆盖范围有限等缺陷。我们基于YOLOv5框架和GhostHGNetV2骨干网络,开发了一套高效的海洋漏油自动检测与分类系统。这个系统能够处理来自卫星、无人机和固定摄像…

2026/7/27 8:33:58 阅读更多 →
优化RRT算法在狭窄通道运动规划中的高效实现

优化RRT算法在狭窄通道运动规划中的高效实现

1. 项目概述在机器人运动规划和自主导航领域,采样型算法因其在高维空间中的高效性而广受关注。今天要分享的是一种针对复杂环境(特别是狭窄通道场景)深度优化的新型运动规划算法,它创新性地整合了ADD-RRT、RRV和改进型Bridge Test…

2026/7/27 8:33:58 阅读更多 →
着色器编译工具性能对比:Opus 5与Fable的差异化设计哲学

着色器编译工具性能对比:Opus 5与Fable的差异化设计哲学

上周在测试几个新的着色器编译方案时,我偶然发现了一个有趣的现象:一个名为 Opus 5 的工具在短任务上的表现几乎与业界标杆 Fable 持平,但在处理长任务时却显得异常保守。这个反差让我停下来思考——为什么同一个工具在不同场景下会有如此大的…

2026/7/27 8:33:58 阅读更多 →
NCM音乐格式解密:技术原理、工具生态与数字版权平衡

NCM音乐格式解密:技术原理、工具生态与数字版权平衡

1. 项目概述:当音乐被“锁”在格式里作为一名在数字音频处理和软件逆向领域摸爬滚打了十多年的老手,我见过太多因为格式壁垒而让用户头疼的事情。最近几年,国内几家主流音乐平台推出的专属加密格式,比如网易云的NCM、QQ音乐的QMC、…

2026/7/27 8:32:57 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻