
第二课 结构化输出摘要本文介绍了 LangChain 中结构化输出的概念与实践。通过 Pydantic BaseModel 定义响应 schema结合with_structured_output方法强制模型按指定格式返回将 LLM 输出从给人看的文本转换为给程序用的数据。文中提供了完整的代码示例展示如何从运维记录中提取结构化节点信息包括节点名称、硬件厂商、GPU数量、部署状态等字段实现自动化数据处理。为什么要学习结构化输出Pydantic BaseModel ≈ RPC/API 的响应结构体定义with_structured_output ≈ 强制模型按这个 schema 返回Ollama 底层用 JSON schema 约束解码返回的就是 Pydantic 对象字段校验、类型转换自动完成 —— 不用再自己解析自然语言价值LLM 输出从给人看的文本变成给程序用的数据可以进数据库、做条件判断。运行python 03_structured_output.pyfromtypingimportLiteral,OptionalfrompydanticimportBaseModel,Fieldfromlangchain_ollamaimportChatOllama MODELqwen2.5:7b# 1. 定义响应 schema —— 就像定义 API 返回体classNodeInfo(BaseModel):从裸金属节点描述中提取的信息node_name:strField(description节点名称如 node-42)vendor:Optional[str]Field(defaultNone,description硬件厂商如 Dell/浪潮没提到就是 null)gpu_count:intField(default0,descriptionGPU 卡数量没有则为 0)deploy_ok:boolField(description部署是否成功)failure_reason:Optional[str]Field(defaultNone,description部署失败原因成功则为 null)severity:Literal[info,warning,critical]Field(description事件严重程度成功info可重试的失败warning硬件类故障critical)# 2. 把 schema 绑到模型上llmChatOllama(modelMODEL,temperature0)structured_llmllm.with_structured_output(NodeInfo)if__name____main__:cases[node-42 是一台戴尔 R650插了 2 张 A100昨天部署失败日志显示 PXE 超时。,node-07浪潮 NF5280M6今天凌晨顺利完成部署无 GPU。,]fortextincases:info:NodeInfostructured_llm.invoke(f从下面这段运维记录中提取节点信息\n{text})print(f输入:{text})print(f输出:{info.model_dump_json(indent2,exclude_noneTrue)}\n)运行结果