在大语言模型(LLM)应用开发中,结构化输出是高频需求 —— 相比于自由文本,JSON 格式的输出更便于程序解析、数据存储和后续处理。LangChain 作为主流的 LLM 应用开发框架,提供了多种实现结构化 JSON 输出的方式。本文将结合实际代码,讲解两种核心实现方法:适配通用模型的SimpleJsonOutputParser方法,以及依赖模型原生支持的with_structured_output方法。
方法一:通用适配 ——SimpleJsonOutputParser
该方法通过 Prompt 模板强制模型输出指定结构的 JSON,再借助SimpleJsonOutputParser解析结果,适配绝大多数不支持原生结构化输出的模型,通用性更强。
完整代码示例
# 导入所需依赖
from langchain_core.output_parsers import SimpleJsonOutputParser
from langchain_core.prompts import ChatPromptTemplate
from learning.my_llm import llm # 替换为你的LLM实例
# 1. 创建聊天提示词模板,强制输出指定结构的JSON
prompt = ChatPromptTemplate.from_template(
'尽你所能回答用户的问题'
'你必须始终输出一个包含“title”, “year”, “director”, “rating”键的json对象'
'{question}'
)
# 2. 构建LangChain执行链:Prompt -> LLM -> JSON解析
chain = prompt | llm | SimpleJsonOutputParser()
# 3. 调用执行链,传入用户问题
response = chain.invoke({'question': '请你提供电影《盗梦空间》的详细信息'})
# 4. 输出解析后的结构化结果
print(response)
核心逻辑解析
方法二:原生支持 ——with_structured_output
该方法基于 Pydantic 定义数据模型,通过with_structured_output让模型直接输出符合结构的结果,仅适用于支持原生结构化输出的模型(如 GPT 系列、部分开源大模型),无需手动解析文本,效率更高。
完整代码示例
# 导入所需依赖
from pydantic import BaseModel, Field
from learning.my_llm import llm # 替换为你的LLM实例
# 1. 基于Pydantic定义数据模型(Schema)
class Movie(BaseModel):
title: str = Field(…, description='电影标题')
year: str = Field(…, description='电影发行年份')
director: str = Field(…, description='电影导演')
rating: str = Field(…, description='电影评分(满分10分)')
# 2. 为LLM绑定结构化输出能力,指定输出模型为Movie
model_with_structure = llm.with_structured_output(Movie)
# 若需保留原始响应,可启用:model_with_structure = llm.with_structured_output(Movie, include_raw=True)
# 3. 调用模型,传入用户问题
response = model_with_structure.invoke('提供电影《盗梦空间》的详细信息')
# 4. 输出结构化结果(可直接通过属性访问字段)
print(response)
print(f"导演:{response.director}") # 直接通过属性提取值,无需字典索引
核心逻辑解析
两种方法对比与选型建议
| 模型兼容性 | 通用,适配所有模型 | 仅支持原生结构化输出的模型 |
| 实现复杂度 | 低(仅需 Prompt 约束 + 解析器) | 中(需定义 Pydantic 模型) |
| 解析效率 | 需文本转 JSON,略低 | 原生输出,效率高 |
| 容错性 | 依赖 Prompt 约束,易受模型输出影响 | 模型原生校验,容错性强 |
选型建议
- 若使用的模型无原生结构化输出能力(如部分小众开源模型),选SimpleJsonOutputParser;
- 若使用 GPT、Claude 等支持原生结构化输出的模型,优先选with_structured_output,代码更简洁、结果更稳定。
总结
LangChain 提供了 “通用适配” 和 “原生支持” 两类结构化 JSON 输出方案,核心差异在于是否依赖模型的原生能力。实际开发中,可根据所用模型的特性选择对应方法:通用场景用SimpleJsonOutputParser,高性能场景用with_structured_output。两种方法的核心目标都是将 LLM 的非结构化输出转为结构化数据,降低后续数据处理的成本。




