在实际的AI应用开发中,可能经常遇到这样的问题:很多时候大语言模型输出格式不够标准化,有时候返回的是纯文本,有时候是JSON格式,甚至还可能包含一些不需要的冗余信息,如:

Human:帮我生成一个商品信息的json字符串,格式是:{"name": "苹果", "price": "1000"}
AI:好的,已经为你生成:{"name": "橘子", "price": "500"}

但实际上,我们期望的是只返回一个JSON字符串,AI却返回了一些多余的文字,为了解决这个问题,LangChain提供了输出解析器(Output Parsers)组件,可以帮助我们将模型的原始输出转换为结构化的、易于处理的数据格式,这一步不仅仅涉及数据类型的转换,也包括对返回数据的处理。

一、什么是输出解析器

输出解析器是LangChain框架中的重要组件,它的作用是将大语言模型的原始输出内容解析为如JSON、XML、YAML等结构化数据。在LangChain中,输出解析器位于模型和最终数据输出之间,作为数据处理的中间层。通过输出解析器,可以实现如下目的:

  • 指定格式输出:将模型的文本输出转换指定格式
  • 数据校验:确保输出内容符合预期的格式和类型
  • 错误处理:当解析失败时,进行错误修复和重试
  • 输出格式提示词:生成对应格式要求的提示词,如要生成JSON的具体描述,可以通过提示词传递给大模型,达到返回特定格式数据的目的

为什么需要OutputParser
常规的使用LangChain构建LLM应用的流程是:Prompt 输入、调用LLM 、LLM输出。有时候我们期望LLM给到的数据是格式化的数据,方便做后续的处理。

这时就需要在Prompt里设置好要求,然后LLM会在输出内容后,再将内容传给输出解析器,输出解析器会解析成我们预期的格式。

在这里插入图片描述

二、输出解析器类型

LangChain提供了多种输出解析器,以下是常见的输出解析器及使用场景:

解析器类型 适用场景 输出格式
StrOutputParser 简单文本输出 字符串
JsonOutputParser JSON格式数据 字典/列表
PydanticOutputParser 复杂结构化数据 Pydantic模型对象
ListOutputParser 列表数据 Python列表
DatetimeOutputParser 时间日期数据 datetime对象
BooleanOutputParser 布尔值输出 True/False

输出解析器核心方法:

parse:将大模型输出的内容,格式化成指定的格式返回。

format_instructions:它会返回一段清晰的格式说明字符串,告诉 LLM 希望输出成什么格式(比如 JSON,或者特定格式)。

三、常用输出解析器用法

3.1 StrOutputParser用法

StrOutputParser 是LangChain中最简单的输出解析器,它直接从AIMessage的content中提取纯文本内容。在前面的章节中,其实已经使用过它,代码示例如下,在示例中使用了链式调用,在后续的文章中会详细讲解。

示例代码

from langchain_community.llms.tongyi import Tongyi
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

# 模型
model = Tongyi(model="qwen-max")

# 提示词
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "你是一个资深文学家"),
        ("human", "请简短赏析{input}这首诗,并给出评价")
    ]
)

# 输出转换
str_parser = StrOutputParser()

# 链
chain = prompt | model | str_parser

#测试
result = chain.invoke({"input": "静夜思"})
print(result)

运行结果

《静夜思》是唐代诗人李白创作的一首五言古诗,全诗仅二十字:“床前明月光,疑是地上霜。举头望明月,低头思故乡。”这首诗以其简洁明快的语言、深邃的情感以及广泛流传而著称。

- **语言之美**:李白用最平实无华的文字描绘了一个宁静夜晚的情景,特别是“明月光”与“地上霜”的比喻,不仅形象生动地勾勒出了月色皎洁、环境清冷的画面,也巧妙地将视觉上的错觉转化为诗意。
- **情感之真**:通过从“举头望明月”到“低头思故乡”的动作转变,表达了诗人内心深处对远方家乡的深切思念之情。这种由外向内的视角转换,使得个人情绪得到了升华,触动了无数离乡背井之人的心弦。
- **意境之远**:整首诗虽短小精悍,但其营造出来的意境却极为广阔深远。它不仅仅是一幅美丽的月下思归图,更是关于时间流逝、人生漂泊等普遍主题的深刻思考。

综上所述,《静夜思》不仅是李白个人情感的真实写照,也是中国古典文学中表达思乡之情的经典之作。它以极其简练的形式承载着丰富的内容和深厚的文化底蕴,跨越千年依然能够引起读者强烈共鸣,堪称诗歌艺术中的瑰宝。
进程已结束,退出代码为 0
3.2 JsonOutputParser用法

当我们需要模型输出JSON格式数据时,可以使用 JsonOutputParser。这个解析器不仅能解析JSON格式,还能为模型提供输出指定格式的提示词,使用示例如下,这里要注意的是案例中使用的模型是gpt-4o,因为经过多次测试,使用gpt-3.5-turbo输出结果会产生幻觉,幻觉可能表现为格式错误或字段遗漏。

示例代码

from langchain_core.prompts import PromptTemplate
from pydantic import BaseModel, Field
from langchain_core.output_parsers import JsonOutputParser
from langchain_community.llms.tongyi import Tongyi

model = Tongyi(model="qwen-max")

class Poetry(BaseModel):
    name: str = Field(description="古诗名字")
    author: str = Field(description="古诗作者")
    content: str = Field(description="古诗内容")

parser = JsonOutputParser(pydantic_object=Poetry)

prompt = PromptTemplate(
    template="请你输出题目为:{query}这首诗的内容\n{format_instructions}",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()}
)

chain = prompt | model | parser

result = chain.invoke({"query": "登鹳雀楼"})
print(result)  # 可直接访问字段

运行结果

{'name': '登鹳雀楼', 'author': '王之涣', 'content': '白日依山尽,黄河入海流。欲穷千里目,更上一层楼。'}

进程已结束,退出代码为 0
3.3 PydanticOutputParser用法

对于结构更复杂、具有强类型约束的需求,PydanticOutputParser 则是最佳选择。它结合了Pydantic模型的强大功能,提供了类型验证、数据转换等高级功能,使用示例如下:

from langchain_core.prompts import PromptTemplate
from pydantic import BaseModel, Field,field_validator
from langchain_core.output_parsers import PydanticOutputParser
from langchain_community.llms.tongyi import Tongyi

# 模型
model = Tongyi(model="qwen-max")

# 诗人信息模型
class Poetry(BaseModel):
    name: str = Field(description="古诗名字")
    content: str = Field(description="古诗内容")
    author: str = Field(description="古诗作者")


# 诗歌信息模型
class Poet(BaseModel):
    name: str = Field(description="诗人姓名")
    age: int = Field(description="诗人年龄")
    sex: int = Field(description="性别,0女,1男")
    poetries: list[Poetry] = Field(description="诗歌信息列表")

    # 数据验证器
    @field_validator('poetries')
    def validate_priority(cls, value):
        if len(value) < 1 :
            raise ValueError('诗歌列表必须大于等于1')
        return value

    @field_validator('age')
    def validate_hours(cls, value):
        if value <= 0:
            raise ValueError('年龄必须大于0')
        return value

# 构建输出解析器
parser = PydanticOutputParser(pydantic_object=Poet)

# 构建提示词
prompt = PromptTemplate(
    template="你是一个中国古代诗人信息的专家。请你介绍一下{name}这位诗人的情况\n{format_instructions}",
    input_variables=["name"],
    partial_variables={"format_instructions": parser.get_format_instructions()}
)

# 构建链式调用
chain = prompt | model | parser

# 执行链式调用
result = chain.invoke({"name": "李白"})
print(result)

运行效果

name='李白' age=61 sex=1 poetries=[Poetry(name='静夜思', content='床前明月光,疑是地上霜。举头望明月,低头思故乡。', author='李白'), Poetry(name='望庐山瀑布', content='日照香炉生紫烟,遥看瀑布挂前川。飞流直下三千尺,疑是银河落九天。', author='李白')]

进程已结束,退出代码为 0

四、结合使用

多种输出解释器可以结合在一起使用。

示例代码

from langchain_community.llms.tongyi import Tongyi
from langchain_core.output_parsers import StrOutputParser, JsonOutputParser
from langchain_core.prompts import PromptTemplate

# 模型
model = Tongyi(model="qwen-plus")

# 文本输出
str_parser = StrOutputParser()

# json输出
json_parser = JsonOutputParser()

# 提示词1
first_prompt = PromptTemplate.from_template(
    "我邻居姓:{lastname}, 刚生了{gender}, 请起名,并封装到JSON格式返回给我,"
    "要求key是name,value是起的名字"
)

# 提示词2
second_prompt = PromptTemplate.from_template(
    "姓名{name}, 请帮我解析含义"
)

# 链
chain = first_prompt | model | json_parser | second_prompt | model | str_parser

# 测试
result = chain.invoke({"lastname": "张", "gender": "女儿"})

# 打印
print(result)

运行结果

“张婉清”是一个富有诗意与传统文化意蕴的中文姓名,下面从字义、音韵、五行、文化内涵及姓名学角度为您逐层解析:

一、字义解析  
🔹 张(Zhāng)  
- 本义:张开、展开;引申为“伸展、扩大、彰显”,如“张弓”“张扬”“张目”。  
- 作为姓氏:源自春秋晋国解张(字张侯),后以字为氏,是中华大姓之一(排名第三),象征根基稳固、家族昌盛。  
- 姓氏寓意:有担当、有格局,具开拓性与责任感。

🔹 婉(Wǎn)  
- 本义:柔顺、美好、委婉。《说文解字》:“婉,顺也。”  
- 引申义:温婉、婉约、婉丽,常形容女子仪态娴雅、言辞和柔、性情含蓄而有修养。  
- 文化意象:与“婉约派”词风(如李清照)相通,代表内在的智慧、分寸感与人文温度。

🔹 清(Qīng)  
- 本义:水澄澈透明,引申为纯净、清明、高洁、清醒、清正。  
- 经典用例:“清水出芙蓉”“两袖清风”“清心寡欲”“耳清目明”。  
- 哲学内涵:契合儒家“清正廉明”、道家“清静无为”、佛家“清净本心”的三重精神境界。

▶ 二字连读“婉清”:  
- 音义相谐,如“温婉而清雅”“柔中有清刚”,既显女性之柔美灵动,又透出超然脱俗的气质;  
- 不落俗套——非单纯强调“娇美”,而重“内修外润”,有古典才女之风,亦具现代独立清醒之格。

二、音韵分析(普通话)  
- 发音:Zhāng Wǎn Qīng(阴平—上声—阴平)  
- 节奏:平—仄—平,抑扬顿挫,朗朗上口;尾音“qīng”清亮悠长,余韵绵远。  
- 避讳与谐音:无不良谐音(如“完清”“晚晴”等虽音近,但“婉清”二字本义积极,且书写清晰,不易误读);“晚晴”反可视为雅致别解(取自李商隐“天意怜幽草,人间重晚晴”),增添诗意联想。

三、五行与八字简析(需生辰八字精准推演,此处仅依字形常规对应)  
- 张:火(“弓”部属火,或依笔画数11→属火)  
- 婉:土(“女”为阴柔之象,传统归土;或按康熙字典笔画11→属土)  
- 清:水(“氵”三点水旁,明确属水)  
→ 五行组合:火→土→水,形成“火生土、土克水”的流通与制衡关系。  
✅ 优点:有生发(火生土)、有节制(土克水不泛滥),暗示性格中热情与理性并存,能以温和之力调和矛盾。  
⚠️ 注意:若八字本身水弱或土重,宜搭配木(疏土生火)、金(生水)元素平衡;但单看姓名,水火土兼具,结构较均衡,不偏枯。

四、文化意象与文学联想  
- “婉清”二字常见于古典诗文:  
  ▪ 宋·朱淑真《清平乐》:“婉娩光阴,春梦惊回处。”  
  ▪ 明·高启《题画》:“山气日夕佳,婉清如有期。”  
- 可联想到意象:  
  → 晨光初照的溪畔,水色空明,女子素衣临流,眉目温润,神态从容——既有《诗经》“婉兮清扬”的古典美人风致,又有林徽因式“理性的诗意”与知性之美。

五、综合人格寓意(姓名学视角)  
“张婉清”一名传递出:  
✨ 外柔内刚:婉而不弱,清而不冷;  
✨ 知行合一:温婉中见主见,清雅里藏锋芒;  
✨ 心灵澄明:重内在修养,不随波逐流,有审美力与判断力;  
✨ 家国情怀:张姓赋予责任底色,“婉清”则升华其精神高度——如清风拂原野,润物无声却自有力量。

✅ 小结:  
这是一个**典雅隽永、刚柔相济、富于文化底蕴与现代人格张力**的好名字。“张”立身立世,“婉”修心养性,“清”守志明德——三字合一,恰似一幅水墨小品:留白处见气韵,着墨处显风骨。

如您愿意提供出生时间(公历/农历、具体时辰),我可进一步为您分析八字喜用神,优化名字在命理层面的助益性。🌿  
愿张婉清女士——婉若清扬,心似明镜,步履从容,一生清嘉。

进程已结束,退出代码为 0

五、总结

输出解析器是LangChain框架里非常重要的一个部分,它主要解决了一个常见问题——大语言模型的输出格式太杂乱、不规范,没法直接使用。通过这篇内容,我们可以学会基础解析器的用法,从最简单的StrOutputParser,到相对复杂一些的PydanticOutputParser,都能轻松理解。

我们还会了解到如何处理“结构化数据”:借助JsonOutputParser和PydanticOutputParser这两个工具,就能把模型输出的内容,转换成规整的Python对象或JSON对象,后续处理起来会方便很多。如果LangChain自带的解析器,满足不了你项目里的特殊需求,也可以自己创建一个自定义解析器,专门处理那些特殊格式的数据。

在实际做项目的时候,选对输出解析器,能大大提高开发效率,还能让数据处理更准确。建议大家根据自己的实际业务需求,挑选最适合的解析器类型,同时搭配错误处理机制,这样才能保证整个系统稳定运行,不出岔子。

至于怎么选合适的解析器,其实很简单,看需求就好:如果只需要简单的文本输出,用StrOutputParser就够了;如果需要规整的结构化数据,选JsonOutputParser或者StructuredOutputParser会更合适;要是对“容错性”要求比较高,比如怕解析出错影响整个流程,那OutputFixingParser或者RetryOutputParser就能提供额外的保障,避免出问题。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐