第 03 课:结构化输出与解析
第 03 课结构化输出与解析配套代码仓库https://gitee.com/wang-zeyong111/lang-chain-lecture本课定位自然语言适合人读结构化数据适合程序处理。只要你的 LLM 输出要进入后续业务逻辑例如分类、抽取、路由、写数据库、触发工具就应该优先考虑结构化输出。学习目标理解结构化输出的工程价值。使用 Pydantic 定义输出 schema。理解 ProviderStrategy 与 ToolStrategy。学会用结构化结果做分类和抽取。掌握结构化输出失败时的处理思路。一、为什么不能只依赖自然语言假设模型回答这个用户看起来比较着急可能是技术问题建议尽快处理。人能看懂但程序很难稳定判断类别是什么优先级是什么是否需要转人工理由字段是什么能否写入数据库。结构化输出可以要求模型返回{category:technical,priority:high,reason:登录失败影响发布}这样下游代码可以直接使用。二、Pydantic schemaPydantic 是 Python 中常用的数据校验库。用它定义结构化输出有三个好处字段清楚类型清楚校验失败时能得到明确错误。示例fromtypingimportLiteralfrompydanticimportBaseModel,FieldclassTicketClassification(BaseModel):category:Literal[billing,technical,account,other]priority:Literal[low,medium,high]reason:strField(description分类理由)Literal可以限制字段取值避免模型自由发挥。三、结构化输出的两种主流策略ProviderStrategy由模型供应商原生支持结构化输出。优点是更可靠因为供应商 API 会约束输出格式。缺点是并非所有模型都支持。适合OpenAI 等支持原生结构化输出的模型高可靠性分类和抽取生产场景。ToolStrategy把结构化输出当作一种特殊工具调用。优点是适配面更广许多支持工具调用的模型都能用。缺点是稳定性通常略低于原生结构化输出。适合模型不支持原生结构化输出Agent 中需要统一使用工具调用机制多 schema 选择。四、with_structured_output对于单次模型调用可以使用structured_modelmodel.with_structured_output(TicketClassification)resultstructured_model.invoke(用户无法登录影响发布)这适合固定任务例如文本分类、字段抽取、评论分析。五、Agent 的response_format如果任务需要 Agent例如还要检索、调用工具、多步判断就可以在create_agent中使用response_formatagentcreate_agent(modelopenai:gpt-5-nano,tools[...],response_formatTicketClassification,)resultagent.invoke({messages:[...]})classificationresult[structured_response]注意结构化结果通常不在最终文本里而在structured_response字段中。六、结构化输出设计原则字段少而关键不要一开始设计二十个字段。字段越多模型越容易出错业务也越难解释。枚举值要明确能用Literal就不要让模型自由写。例如优先级用low | medium | high。字段描述要写给模型看Field(description...)会帮助模型理解字段用途。允许不确定如果业务允许增加confidence;missing_info;needs_human_review;reason。这比强迫模型装作确定更安全。七、错误处理结构化输出可能失败模型返回缺字段字段值不在枚举中JSON 格式不合法一次返回多个结构工具调用参数不符合 schema。处理方式降低 temperature改善字段描述使用供应商原生结构化输出使用 ToolStrategy 的错误重试对失败结果转人工或降级处理把失败案例加入评估集。八、分类与抽取的区别分类是从固定标签中选工单类别情绪风险等级是否转人工。抽取是从文本中提取字段姓名电话日期金额任务负责人。两者都适合结构化输出但 schema 设计不同。分类更依赖枚举抽取更依赖字段描述和可空设计。九、常见坑schema 字段太多导致模型不稳定。枚举值设计含糊例如urgent和high同时存在。prompt 要求输出 JSON但没有校验。结构化输出失败后没有降级策略。忽略structured_response只看最终文本。十、自测清单我能解释为什么结构化输出比自然语言更适合程序处理。我能用 Pydantic 定义一个分类 schema。我知道 ProviderStrategy 和 ToolStrategy 的区别。我知道 Agent 结构化结果在哪里读取。我能为失败输出设计重试或降级方案。十一、课后练习定义一个ProductReviewschema包含评分、情绪、关键词。定义一个RagAnswerschema包含答案、来源、置信度、缺失信息。用 5 条文本手动模拟模型输出并用 Pydantic 验证。故意构造错误字段观察校验错误信息。