LangChain教程:StrOutputParser字符串输出解析器

介绍

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")

优点

  1. 简化代码:省去每次调用后写 .content 的重复操作,尤其在多轮对话/循环调用中更明显。
  2. 类型统一:无论模型返回 AIMessage 还是纯字符串,解析后都统一为 str 类型,避免类型错误。
  3. 兼容扩展:可以和其他解析器(如 JsonOutputParser)无缝替换,符合 LangChain 的链式设计思想。
  4. 调试友好:直接打印就是最终的文本结果,无需额外处理。

注意

StrOutputParser 不会修改 模型的回答内容 → 不会,它只做类型转换,内容完全不变。

总结

  1. 核心作用:StrOutputParser 是 LangChain 的基础输出解析器,将模型返回的 AIMessage 等结构化消息转换成纯字符串。
  2. 使用方式:串联在链的最后(prompt | llm | StrOutputParser()),调用后直接得到字符串。
  3. 核心优势:简化代码、统一输出类型,是日常开发中最常用的解析器,几乎适用于所有纯文本回答场景。

简单来说,只要你想直接获取模型的文本回答,而不是结构化的 AIMessage 对象,就可以用 StrOutputParser,这是 LangChain 开发的最佳实践之一。


原文出处:/show_1GW2qkDs7zkb.html