AI大模型学习笔记:LangChain核心组件-输出解析器
文章目录
在实际的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就能提供额外的保障,避免出问题。
更多推荐


所有评论(0)