
目录一、Pydantic二、PydanticOutputParser1、为什么需要 PydanticOutputParser2、Pydantic和PydanticOutputParser核心区别3、Pydantic的不足1无法直接解析非结构化文本2缺乏对 LLM 输出的适配性3缺少格式指导生成4错误处理不够场景化4、PydanticOutputParser核心功能5、实现结构化输出三、为什么需要两者结合四、总结先思考一个问题为什么要使用结构化输出?在LangChain中结构化输出就像是让AI“说话有条理”。举个生活中的例子假设你让朋友推荐电影普通回答可能是“《星际穿越》不错科幻片诺兰拍的有黑洞剧情。” 而结构化输出就像朋友递给你一张卡片{ 电影名: 星际穿越, 类型: 科幻, 导演: 克里斯托弗·诺兰, 关键词: [黑洞, 时间膨胀, 亲情] }为什么需要这样机器好处理就像快递分拣机只认条形码程序处理这种整齐的数据比从大段文字里“猜”信息容易得多。避免遗漏提前说好要哪些信息比如必须包含导演AI就不会忘记回答。方便对接直接塞进数据库、生成图表或者转发给其他系统都不用人工整理一、PydanticPydantic是一个用于数据验证和设置的 Python 库它通过类型注解和数据模型的方式简化了数据校验、转换和序列化的过程Pydantic的BaseModel类允许我们定义数据模型如Author、Book、Library并自动处理数据的验证和转换。这确保了输入和输出的数据符合预期的格式和类型要求主要用于确保输入数据符合预定义的结构和约束。将数据转换为标准化的格式如字典、JSON。与框架如 FastAPI深度集成简化 API 开发。核心功能数据验证基于 Python 的类型注解自动校验数据。类型转换将输入数据转换为定义的类型如str转int。结构化输出将模型转换为字典或 JSON。错误处理提供清晰的错误信息便于调试二、PydanticOutputParserPydanticOutputParser是LangChain库中的一个工具用于语言模型生成输出解析并转换为结构化的Python数据模型通过PydanticOutputParserPydantic 可以直接用于解析来自语言模型的输出将其转换为预定义的 Pydantic 数据模型。这种集成简化了将自然语言处理结果映射到结构化数据的过程1、为什么需要 PydanticOutputParser既然Pydantic已经提供了强大的数据验证和结构化能力为什么还要引PydanticOutputParser关键在于输入源的差异和使用场景的特殊性。2、Pydantic和PydanticOutputParser核心区别维度PydanticPydanticOutputParser输入类型结构化数据如字典、JSON非结构化文本如 LLM 的输出、自然语言主要职责数据校验、类型转换、序列化解析自由文本为结构化数据适用场景API 请求、配置文件加载、数据库交互处理 LLM 输出、外部系统非标准响应自动化程度需手动转换输入数据到模型自动提取文本中的结构化信息3、Pydantic的不足1无法直接解析非结构化文本假设 LLM 输出以下文本用户信息张三年龄30岁邮箱zhangsanexample.com。Pydantic 无法直接将其转换为结构化模型需手动编写文本提取和格式转换逻辑2缺乏对 LLM 输出的适配性问题LLM 的输出具有不确定性和模糊性例如混合自然语言和 JSON如答案是{ name: 张三 }。字段名称不匹配如user_namevsusername。格式错误如未闭合的引号、缺少逗号LLM 可能返回以下有问题的 JSON{ name: 张三, age: 30 } // 引号未闭合age 是字符串Pydantic 会直接抛出错误无法自动修复或提取有效部分3缺少格式指导生成问题Pydantic 无法生成针对 LLM 的格式指令例如在提示Prompt中明确要求输出符合特定 JSON 结构。需开发者手动编写格式说明增加维护成本而PydanticOutputParser的get_format_instructions()能根据 Pydantic 模型自动生成格式模板直接嵌入到提示中确保 LLM 按指定格式输出4错误处理不够场景化问题Pydantic 的错误提示面向开发者但未针对 LLM 输出场景优化。例如无法区分“字段缺失”和“LLM 未理解指令”。缺少对 LLM 常见输出问题如多余的解释文本的容错。若 LLM 返回以下文本回答我不知道用户年龄但名字是张三。Pydantic 会直接报错而无法提取部分有效信息如name4、PydanticOutputParser核心功能1 结构化输出将非结构化文本如 LLM 生成的自由格式文本或 JSON 字符串转换为结构化的Pydantic模型使其符合预定义的数据格式和规则。2 数据验证在解析过程中自动验证输出是否满足 Pydantic 模型定义的约束例如类型校验如int、float、bool。范围限制如数值范围、字符串长度。格式要求如日期格式、邮箱格式。3错误处理当输出不符合预期时提供详细的错误信息帮助快速定位问题例如字段缺失。类型不匹配。值超出范围。5、实现结构化输出这是一个图书馆信息生成与结构化解析的案例目标是通过 LangChain 和 Pydantic 实现以下功能让 LLM 按指定格式生成图书馆信息包含名称和书籍列表。将 LLM 的非结构化输出自动转换为强类型的 Python 对象。确保数据格式正确如作者年龄在 0-120 之间。from typing import List from langchain_core.output_parsers import PydanticOutputParser from langchain_core.prompts import PromptTemplate from langchain_openai import ChatOpenAI from pydantic import BaseModel, Field # 定义作者模型 class Author(BaseModel): name: str Field(descriptionName of the author) age: int Field(descriptionAge of the author,ge0, le120) # 定义图书模型 class Book(BaseModel): title: str Field(descriptionpython) author: Author Field(descriptionechola) # 定义图书馆模型 class Library(BaseModel): name: str Field(descriptionHistory Library) books: List[Book] Field(descriptionList of books) # 使用PydanticOutputParser解析输出指定模型为Library parser PydanticOutputParser(pydantic_objectLibrary) # 定义提示模版包含图书馆及图书的信息 prompt PromptTemplate( # 提示的文本模版 templateProvide information about a library an its book,\n{format_instructions}\n{library}, # 输入变量为library input_variables[library], # 部分变量为格式说明 partial_variables{format_instructions: parser.get_format_instructions()} ) # 定义LLM llm ChatOpenAI( modeldeepseek-ai/DeepSeek-R1, openai_api_keysk-jcuzvtuophtzgkfhhbanhjgqfxviewnwyhkihsvwwoufsu, openai_api_basehttps://api.siliconflow.cn/v1, temperature0, max_tokens1000 ) # 格式化提示内容传入查询内容请描述图书馆的书籍“ message prompt.format_prompt(library请描述图书馆的书籍) # 获取输出 # 解析模型输出为Library对象 result llm.invoke(message) # 打印结果 print(result.content)运行结果输出{ name: History Library, books: [ { title: python, author: { name: echola, age: 40 } }, { title: The Art of Programming, author: { name: John Code, age: 45 } }, { title: Data Science Essentials, author: { name: Alice Data, age: 38 } } ] }PromptTemplate定义了一个模板用于生成传递给 LLM 的输入提示。模板包含两个两个占位符变量部分用户的查询library和格式化指令format_instructions在实例化PromptTemplate类时将format_instructions作为partial_variables的一部分传入如此便在原有的提示词模版中追加了format_instructions变量这个变量是输出指令字符串释义library是希望模型产生的列表主题format_instructions是从输出解析器中获取的预设的输出指令此处library变量就是请描述图书馆的书籍format_instructions的指令模型就是Library类PydanticOutputParser用于将模型的文本解析为结构化的Library对象三、为什么需要两者结合1. 场景互补Pydantic解决“数据如何存储和使用”的问题例如确保从数据库读取的数据符合模型。验证 API 请求参数的合法性。PydanticOutputParser解决“数据如何从非结构化来源提取”的问题例如将用户自然语言指令如“帮我订明天北京到上海的机票”解析为结构化的预订请求。处理外部 API 返回的半结构化文本如混合了文本和 JSON 的响应。2、开发效率减少胶水代码若手动解析 LLM 输出需编写大量字符串处理、类型转换和错误检查代码。PydanticOutputParser将这些逻辑封装为通用工具。统一错误处理Pydantic的校验错误与PydanticOutputParser的解析错误可统一捕获简化异常处理流程。3、动态适配灵活应对 LLM 的不确定性LLM 的输出可能不稳定如偶尔遗漏字段或格式错误。PydanticOutputParser的解析逻辑能动态适配结合重试机制如 LangChain 的RetryOutputParser提高鲁棒性四、总结结构化输出的意义对机器友好程序无需从自由文本中“猜测”数据直接按字段提取。对系统友好数据格式统一便于跨模块传递如存入数据库、生成报表、触发后续流程。对开发者友好减少数据清洗代码专注业务逻辑。PydanticPydanticOutputParser的协同价值从自由到规范将 LLM 的“自由发挥”转换为严格的结构化数据。端到端校验从输入解析到业务使用全程保障数据质量。标准化开发范式为 NLP 任务提供可复用的数据管理方案。通过两者的结合开发者能更高效地构建基于 LLM 的智能应用确保数据从输入到输出的全链路可控、可靠、可维护。