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

推荐订阅源

The GitHub Blog
The GitHub Blog
Martin Fowler
Martin Fowler
Vercel News
Vercel News
U
Unit 42
Engineering at Meta
Engineering at Meta
aimingoo的专栏
aimingoo的专栏
MyScale Blog
MyScale Blog
Y
Y Combinator Blog
阮一峰的网络日志
阮一峰的网络日志
爱范儿
爱范儿
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
B
Blog RSS Feed
N
Netflix TechBlog - Medium
GbyAI
GbyAI
F
Fortinet All Blogs
MongoDB | Blog
MongoDB | Blog
大猫的无限游戏
大猫的无限游戏
C
Check Point Blog
M
MIT News - Artificial intelligence
D
Docker
IT之家
IT之家
Stack Overflow Blog
Stack Overflow Blog

博客园_首页

Linux实操--组管理、权限管理和定时任务 Java + EasyExcel 实现单个接口导出多个Excel Mem0 源码解析系列(二):提示词工程的深度剖析 Openclaw TaskFlow究竟是什么?和普通Skill技能有什么区别 博文阅读密码验证 - 博客园 嘉立创开源:应该是全网MicroPython教程最多的开发板 Hermes Agent 集成实践:从协议到生产 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf Java程序员必看的RAG入门教程 2026 AI效率神器:Superpowers + Claude Code 保姆级教程 本地大模型部署全攻略:从 0 到 1 玩转 Ollama 【从0到1构建一个ClaudeAgent】内存管理-上下文压缩 .NET 高级开发 | 设计、实现一个事件总线框架 电子小白入门之NE555 3. WorkBuddy:隐藏玩法,一键召唤专家,让 AI 以"专家身份"给你干活 和AI一起搞事情#3:Claude Teammate 游戏开发翻车实录 【OpenClaw】通过 Nanobot 源码学习架构---(7)Memory C# .NET 周刊|2026年3月3期 我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版) 深度学习进阶(七)Data-efficient Image Transformer CLI+Skill搭建浏览器AI自动化框架,告别一切重复枯燥任务 告别Token账单无底洞:OpenClaw本地部署,重塑企业数据主权的唯一解 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程 多模态检索开始进入工程期:用 Sentence Transformers 搭建可落地的 Multimodal RAG 100多行代码实现一个最简单的Agent(用ReAct) Claude Code 通关手册(八):推荐 5 个 Hooks,代码质量提升 3 倍 老板:“有人截图了!”。安全部门:“收到,马上查暗水印!” - why技术 技术之外,皆是人间 C#/.NET/.NET Core技术前沿周刊 | 第 69 期(2026年4.01-4.12)
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模型定义的对象。如果大模型输出的内容不符合模型定义(比如年龄是字符串、缺少必填字段),解析器会直接抛出明确的异常,方便你快速定位和处理问题。