Skip to content

输出解析器 (Output Parsers)

模型的原始输出通常是文本(str)或消息对象(AIMessage)。在开发应用时,我们往往需要结构化的数据(如 JSON、List、Date 等)以便程序处理。输出解析器就是为了解决这个问题。

常见解析器

1. StrOutputParser (最常用)

AIMessage 或其他消息对象直接转换为字符串内容。这在 LCEL 链中非常常用,用于简化输出。

python
from langchain_core.output_parsers import StrOutputParser

parser = StrOutputParser()
# 假设 message 是 model.invoke() 的结果
parsed_output = parser.invoke(message)
# parsed_output 直接就是字符串 "..."

2. JsonOutputParser

要求模型输出 JSON 格式,并将其解析为 Python 字典。

注意: 配合 JsonOutputParser 使用时,通常需要在提示词中明确指示模型“请以 JSON 格式输出”。

python
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.pydantic_v1 import BaseModel, Field

# 定义期望的数据结构
class Joke(BaseModel):
    setup: str = Field(description="笑话的铺垫")
    punchline: str = Field(description="笑话的笑点")

parser = JsonOutputParser(pydantic_object=Joke)

# 提示词中注入格式说明
prompt = ChatPromptTemplate.from_template(
    "讲一个关于{topic}的笑话。\n{format_instructions}"
)

# 初始化模型
model = ChatOpenAI(model="gpt-3.5-turbo")

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

response = chain.invoke({
    "topic": "冰淇淋",
    "format_instructions": parser.get_format_instructions()
})

print(response)
# 输出: {'setup': '为什么冰淇淋从不被邀请参加派对?', 'punchline': '因为它们一来就融化了气氛!'}
# 类型为 dict

3. PydanticOutputParser

功能与 JsonOutputParser 类似,但提供更严格的校验,直接返回 Pydantic 对象实例。

最佳实践

在构建 LCEL 链时,解析器通常是链的最后一环:

python
chain = prompt | model | StrOutputParser()

这样 chain.invoke(...) 的返回值就是直接可用的数据,而不是需要二次处理的消息对象。


恭喜你完成了初级教程!接下来,让我们进入 中级教程:构建应用,学习如何将这些组件串联起来。

LangChain中文文档