做 AI 应用开发时,我们经常需要处理大模型的输出文本。大模型生成自然流畅的人类语言能力很强,但要把这些非结构化的自然语言,精准转换成能直接存入数据库、能安全传给下游接口的标准 JSON 格式,却是一件非常棘手的事情。好在 LangChain 为这个行业普遍存在的痛点提供了优雅的解决方案 ------ 通过它内置的专业输出解析器,只需寥寥几行代码,就能轻松实现从自然语言到结构化 JSON 的可靠转换。
动画视频在《20. 大模型输出转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模型定义的对象。如果大模型输出的内容不符合模型定义(比如年龄是字符串、缺少必填字段),解析器会直接抛出明确的异常,方便你快速定位和处理问题。