惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
G
Google Developers Blog
人人都是产品经理
人人都是产品经理
U
Unit 42
爱范儿
爱范儿
Hugging Face - Blog
Hugging Face - Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
WordPress大学
WordPress大学
B
Blog RSS Feed
The Cloudflare Blog
D
Docker
A
About on SuperTechFans
IT之家
IT之家
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Y
Y Combinator Blog
月光博客
月光博客
云风的 BLOG
云风的 BLOG
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MongoDB | Blog
MongoDB | Blog
Google DeepMind News
Google DeepMind News
The GitHub Blog
The GitHub Blog
博客园_首页
Stack Overflow Blog
Stack Overflow Blog

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解
20. AI大模型输出转JSON,原来这么简单!
老陈说编程 · 2026-05-20 · via 博客园_首页

做 AI 应用开发时,我们经常需要处理大模型的输出文本。大模型生成自然流畅的人类语言能力很强,但要把这些非结构化的自然语言,精准转换成能直接存入数据库、能安全传给下游接口的标准 JSON 格式,却是一件非常棘手的事情。好在 LangChain 为这个行业普遍存在的痛点提供了优雅的解决方案 —— 通过它内置的专业输出解析器,只需寥寥几行代码,就能轻松实现从自然语言到结构化 JSON 的可靠转换。

动画视频在《20. 大模型输出转JSON,原来这么简单!》

image

 JsonOutputParser的核心作用就是按照标准 JSON 语法,把大模型返回的纯文本解析成 Python字典对象,不用你自己写任何解析逻辑。整个使用流程非常清晰,如下完整可运行的代码:

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import JsonOutputParser
 
# 定义提示模板,预留格式指令的位置
prompt = ChatPromptTemplate.from_messages(
    [
        {"role": "system", "content": "你是一位有10年经验的资深软件工程师。{format_instructions}"},
        {"role": "user", "content": "{new_input}"}
    ]
)
 
# 创建解析器实例
parser = JsonOutputParser()
# 自动生成格式要求,告诉大模型如何输出
format_instructions = parser.get_format_instructions()
 
# 组装提示词并调用大模型
prompt_value = prompt.invoke(
    {
        "format_instructions": format_instructions,
        "new_input": "请描述一下张三这个人,包括姓名、年龄、职业和兴趣爱好。"
    }
)
 
# 打印生成的完整提示词,方便调试
print(prompt_value.to_string())
 
# 调用大模型(llm和config需要你根据自己使用的模型提前初始化)
res = llm.invoke(prompt_value, config=config)
 
# 直接解析为JSON字典
result = parser.invoke(res)
print(result)

PydanticOutputParser是JsonOutputParser的增强版,基于 Pydantic 数据模型做解析和校验,能把大模型的输出直接转成强类型的 Python 对象,从根本上解决类型安全问题。如下是完整的 PydanticOutputParser 使用代码:

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field
from typing import List, Optional
 
# 定义提示模板
prompt = ChatPromptTemplate.from_messages(
    [
        {"role": "system", "content": "你是一位有10年经验的资深软件工程师。{format_instructions}"},
        {"role": "user", "content": "{new_input}"}
    ]
)
 
# 定义数据模型,每个字段指定类型并添加清晰描述
class Person(BaseModel):
    name: str = Field(description="姓名")
    age: int = Field(description="年龄")
    post: str = Field(description="职业")
    hobbies: list[str] = Field(description="兴趣爱好")
 
# 绑定Pydantic模型创建解析器
parser = PydanticOutputParser(pydantic_object=Person)
# 自动生成格式指令
format_instructions = parser.get_format_instructions()
 
# 组装提示词
prompt_value = prompt.invoke(
    {
        "format_instructions": format_instructions,
        "new_input": "请描述一下张三这个人,包括姓名、年龄、职业和兴趣爱好。"
    }
)
 
# 打印生成的完整提示词
print(prompt_value.to_string())
 
# 调用大模型
res = llm.invoke(prompt_value, config=config)
 
# 解析为强类型的Person对象
person = parser.invoke(res)
 
# 直接通过属性访问数据,IDE会提供完整代码提示
print(f"姓名: {person.name}")
print(f"年龄: {person.age}")
print(f"职位: {person.post}")
print(f"爱好: {person.hobbies}")

解析完成后,你得到的不是一个松散的字典,而是一个严格符合Person模型定义的对象。如果大模型输出的内容不符合模型定义(比如年龄是字符串、缺少必填字段),解析器会直接抛出明确的异常,方便你快速定位和处理问题。