在大语言模型(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)

核心逻辑解析

  1. Prompt 约束:在模板中明确要求模型输出包含title(电影标题)、year(发行年份)、director(导演)、rating(评分)的 JSON 对象,从输入侧规范输出格式;
  2. 执行链设计|是 LangChain 的管道运算符,左侧输出作为右侧输入 —— 先将 Prompt 渲染后传入 LLM,再将 LLM 的文本输出传入 JSON 解析器;
  3. 解析结果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}")  # 直接通过属性提取值,无需字典索引

核心逻辑解析

  1. Pydantic 模型定义Movie类继承BaseModel,通过Field定义每个字段的名称、类型和描述,LangChain 会将该模型转为模型可识别的结构化提示;
  2. 原生结构化输出with_structured_output(Movie)让 LLM 直接输出符合Movie结构的对象,而非纯文本,返回的responseMovie类的实例;
  3. 便捷访问:可直接通过属性(如response.title)获取字段值,无需手动解析 JSON 字符串。

两种方法对比与选型建议

特性 SimpleJsonOutputParser 方法 with_structured_output 方法
模型兼容性 通用,适配所有模型 仅支持原生结构化输出的模型
实现复杂度 低(仅需 Prompt 约束 + 解析器) 中(需定义 Pydantic 模型)
解析效率 需文本转 JSON,略低 原生输出,效率高
容错性 依赖 Prompt 约束,易受模型输出影响 模型原生校验,容错性强

选型建议

  • 若使用的模型无原生结构化输出能力(如部分小众开源模型),选SimpleJsonOutputParser
  • 若使用 GPT、Claude 等支持原生结构化输出的模型,优先选with_structured_output,代码更简洁、结果更稳定。

总结

LangChain 提供了 “通用适配” 和 “原生支持” 两类结构化 JSON 输出方案,核心差异在于是否依赖模型的原生能力。实际开发中,可根据所用模型的特性选择对应方法:通用场景用SimpleJsonOutputParser,高性能场景用with_structured_output。两种方法的核心目标都是将 LLM 的非结构化输出转为结构化数据,降低后续数据处理的成本。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐