介绍
StrOutputParser 是 LangChain 内置的输出解析器
功能
将 LangChain 聊天模型返回的 BaseMessage(如 AIMessage、HumanMessage),统一转换成 字符串。
不用每次调用模型后都写 response.content,简化代码,同时兼容不同类型的输出
适用场景
使用 对话模型 时,需要获取 纯文本回答 的场景
传统用法
获取整体结果
下面的例子中,res 是 <class 'langchain_core.messages.ai.AIMessage'> 类型,需要通过 res.content 方式,获取AI返回的字符串,代码如下:
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.chat_models.tongyi import ChatTongyi
from dotenv import load_dotenv
# 加载 .env 文件,并放入到环境变量中
load_dotenv()
# 定义模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个温柔的小学数学老师,回答问题时用“亲”、“小朋友”,并且简短回答问题,回答问题不要用markdown格式"),
("human", "计算过程:{msg}")
])
chat = ChatTongyi(model="qwen3-max")
# 串联
chain = prompt | chat
while True:
"""
提问:3x+5=20,x 等于多少?
"""
question = input("请输入:")
# 调用stream向模型提问,返回 generator类型
res = chain.invoke({
"msg": question
})
print("res 的类型:", type(res))
print(res.content, end="", flush=True)
执行
提问:
第一次提问:3x+5=20,x 等于多少?
执行结果可以看到 chunk 的类型是 <class 'langchain_core.messages.ai.AIMessage'>
流式获取结果
下面的例子中,chunk 是 <class 'langchain_core.messages.ai.AIMessageChunk'> 类型,需要通过 chunk.content 方式,获取AI返回的字符串,代码如下:
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.chat_models.tongyi import ChatTongyi
from dotenv import load_dotenv
# 加载 .env 文件,并放入到环境变量中
load_dotenv()
# 定义模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个温柔的小学数学老师,回答问题时用“亲”、“小朋友”,并且简短回答问题,回答问题不要用markdown格式"),
("human", "计算过程:{msg}")
])
chat = ChatTongyi(model="qwen3-max")
# 串联
chain = prompt | chat
while True:
"""
第一次输入:3x+5=20,x 等于多少?
第二次输入:5x-8=72,x 等于多少?
"""
question = input("请输入:")
# 调用stream向模型提问,返回 generator类型
res = chain.stream({
"msg": question
})
# 流式输出
for chunk in res:
print(chunk.content, end="", flush=True)
print("\n----回答结束-------\n")
执行
提问:
第一次提问:3x+5=20,x 等于多少?
执行结果可以看到 chunk 的类型是 <class 'langchain_core.messages.ai.AIMessageChunk'>
使用 StrOutputParser
创建对象
sop = StrOutputParser()
串联
放在串联提示词模板和模型的后面,如下:
chain = prompt | chat | sop
案例
下面的例子使用后,chunk 是 字符串 类型,直接获取AI返回的字符串,代码如下:
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_core.output_parsers import StrOutputParser
from dotenv import load_dotenv
# 加载 .env 文件,并放入到环境变量中
load_dotenv()
# 定义模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个温柔的小学数学老师,回答问题时用“亲”、“小朋友”,并且简短回答问题,回答问题不要用markdown格式"),
("human", "计算过程:{msg}")
])
model = ChatTongyi(model="qwen3-max")
# 串联时,最后使用 StrOutputParser 字符串输出解析器
sop = StrOutputParser()
chain = prompt | model | sop
while True:
"""
输入:3x+5=20,x 等于多少?
"""
question = input("请输入:")
# 调用stream向模型提问,返回 generator类型
res = chain.stream({
"msg": question
})
# 流式输出
for chunk in res:
# ※※※ 不需要调用 .content ※※※
print(chunk, end="", flush=True)
print("\n----回答结束-------\n")
优点
- 简化代码:省去每次调用后写
.content的重复操作,尤其在多轮对话/循环调用中更明显。 - 类型统一:无论模型返回
AIMessage还是纯字符串,解析后都统一为str类型,避免类型错误。 - 兼容扩展:可以和其他解析器(如
JsonOutputParser)无缝替换,符合 LangChain 的链式设计思想。 - 调试友好:直接打印就是最终的文本结果,无需额外处理。
注意
StrOutputParser 不会修改 模型的回答内容 → 不会,它只做类型转换,内容完全不变。
总结
- 核心作用:
StrOutputParser是 LangChain 的基础输出解析器,将模型返回的AIMessage等结构化消息转换成纯字符串。 - 使用方式:串联在链的最后(
prompt | llm | StrOutputParser()),调用后直接得到字符串。 - 核心优势:简化代码、统一输出类型,是日常开发中最常用的解析器,几乎适用于所有纯文本回答场景。
简单来说,只要你想直接获取模型的文本回答,而不是结构化的 AIMessage 对象,就可以用 StrOutputParser,这是 LangChain 开发的最佳实践之一。