LangChain 1.x 实现 LLM 结构化 JSON 输出:两种实用方法详解
·
在大语言模型(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)
核心逻辑解析
- Prompt 约束:在模板中明确要求模型输出包含
title(电影标题)、year(发行年份)、director(导演)、rating(评分)的 JSON 对象,从输入侧规范输出格式; - 执行链设计:
|是 LangChain 的管道运算符,左侧输出作为右侧输入 —— 先将 Prompt 渲染后传入 LLM,再将 LLM 的文本输出传入 JSON 解析器; - 解析结果:
SimpleJsonOutputParser会将 LLM 返回的文本转为 JSON 字典,便于直接提取字段(如response['director'])。
方法二:原生支持 ——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}") # 直接通过属性提取值,无需字典索引
核心逻辑解析
- Pydantic 模型定义:
Movie类继承BaseModel,通过Field定义每个字段的名称、类型和描述,LangChain 会将该模型转为模型可识别的结构化提示; - 原生结构化输出:
with_structured_output(Movie)让 LLM 直接输出符合Movie结构的对象,而非纯文本,返回的response是Movie类的实例; - 便捷访问:可直接通过属性(如
response.title)获取字段值,无需手动解析 JSON 字符串。
两种方法对比与选型建议
| 特性 | SimpleJsonOutputParser 方法 | with_structured_output 方法 |
|---|---|---|
| 模型兼容性 | 通用,适配所有模型 | 仅支持原生结构化输出的模型 |
| 实现复杂度 | 低(仅需 Prompt 约束 + 解析器) | 中(需定义 Pydantic 模型) |
| 解析效率 | 需文本转 JSON,略低 | 原生输出,效率高 |
| 容错性 | 依赖 Prompt 约束,易受模型输出影响 | 模型原生校验,容错性强 |
选型建议
- 若使用的模型无原生结构化输出能力(如部分小众开源模型),选
SimpleJsonOutputParser; - 若使用 GPT、Claude 等支持原生结构化输出的模型,优先选
with_structured_output,代码更简洁、结果更稳定。
总结
LangChain 提供了 “通用适配” 和 “原生支持” 两类结构化 JSON 输出方案,核心差异在于是否依赖模型的原生能力。实际开发中,可根据所用模型的特性选择对应方法:通用场景用SimpleJsonOutputParser,高性能场景用with_structured_output。两种方法的核心目标都是将 LLM 的非结构化输出转为结构化数据,降低后续数据处理的成本。
更多推荐



所有评论(0)