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

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模型定义的对象。如果大模型输出的内容不符合模型定义(比如年龄是字符串、缺少必填字段),解析器会直接抛出明确的异常,方便你快速定位和处理问题。

浙公网安备 33010602011771号