LangChain Output Parser
1. OutPut Parser 的 UML 类图
如图,OutPut Parser 有如下抽象基类:
- BaseLLMOutputParser
- BaseGenerationOutputParser
- BaseOutputParser
- BaseTransformOutputParser
- BaseCumulativeTransformOutputParser
1.1 提问
让我们问问大模型这三个基类代表的语义。
|
|
1.2 回答
langchain.output_parsers
子包中定义的这些 Base 抽象类(BaseOutputParser
、BaseGenerationOutputParser
、BaseTransformOutputParser
、BaseCumulativeTransformOutputParser
)是 LangChain 中构建输出解析器(output parsers)的基础组件,用于将 LLM 的原始输出(字符串或结构化数据)解析为用户需要的特定结构或对象。
下面我从语义与职责上解释这些基类的作用和区别:
1. BaseOutputParser
语义: 最基础的输出解析器抽象类,定义了“如何从 LLM 输出中提取有用数据”的核心接口。
职责:
- 接收 字符串类型 的 LLM 输出;
- 实现一个
parse
方法将字符串解析为结构化数据; - 可以拓展为适用于 chat 或 completion 类型模型的解析器。
适用场景: 适用于对 文本输出进行直接解析,例如 JSON、列表、标量值提取等。
2. BaseGenerationOutputParser
语义:
解析 Generation
对象列表,而非单纯字符串。
职责:
- 解析 LLM 的输出
List[Generation]
类型(每个元素包含 text/token/metadata); - 实现
parse_result(generations: list[Generation]) -> T
方法; - 支持更高级的解析逻辑(如从多个 generations 中选择、聚合等)。
适用场景:
当你用的是 LLM.invoke()
或 ChatModel.generate()
并返回了多个 Generation
,需要从中抽取、分析结果时。
3. BaseTransformOutputParser
语义: 一个中间转换器解析器,用于将一个解析器的输出再进一步加工为另一种形式。
职责:
- 接收一个上游解析器的输出;
- 实现
transform()
方法对其进行转换; - 典型的功能是 “后处理” 逻辑,例如从字典中提取字段、重命名字段、单位换算等。
适用场景:
可以在一个已有 OutputParser
的基础上,做轻量级转换处理,实现模块组合。
4. BaseCumulativeTransformOutputParser
语义: 用于在一个流式(streaming)上下文中,逐步累积处理多个输出片段。
职责:
- 每接收一个输出块(如
str
或GenerationChunk
),就调用一次transform()
; - 保持一个状态,持续地累积结果(如构造 JSON 数组、聚合值等);
- 实现
get_format_instructions()
说明如何格式化输出(可选); - 与流式处理(例如 OpenAI streaming responses)结合使用效果很好。
适用场景: 适用于增量输出或流式消费的场景,比如逐步构造结构、长文档汇总、连续对话等。
总结对比表:
类名 | 输入类型 | 方法 | 主要作用/特点 |
---|---|---|---|
BaseOutputParser |
str |
parse() |
解析字符串为结构化数据 |
BaseGenerationOutputParser |
List[Generation] |
parse_result() |
解析 LLM 多个输出项 |
BaseTransformOutputParser |
任意类型(上游 parser 输出) | transform() |
对已有 parser 输出进行再加工 |
BaseCumulativeTransformOutputParser |
str 或 GenerationChunk |
transform() , final() |
流式地累积解析多个输出 |
2. 基础抽象类
我把这几个类的定义都摘了出来,从实现上可以更好的理解他们语义上的区别:
- BaseLLMOutputParser 有 parse_result 抽象方法,处理
list[Generation]
- BaseGenerationOutputParser 继承自 BaseLLMOutputParser,并实现了 Runnable 接口
- BaseOutputParser 继承自 BaseLLMOutputParser,提供了默认的 parse_result 实现,只处理第一条 result,并把处理委托给了 parse。从语义上讲 BaseOutputParser 只处理单条 llm 输出
- BaseTransformOutputParser 继承自 BaseOutputParser 实现了一个默认的 transform 方法用于处理 stream input
- BaseCumulativeTransformOutputParser 重新实现了 BaseTransformOutputParser transform 方法,增加 diff 获取增量输出的语义。
区分和理解这些类的差别,可以从方法接受的输入类型上入手。
|
|
3. JsonOutputParser/PydanticOutputParser
JsonOutputParser/PydanticOutputParser 都可以通过定义 schema 来解析模型输出,而且他们都提供了一个 get_format_instructions 用于在 Prompt 中添加定义输出的提示。
3.1 JsonOutputParser
|
|
3.2 PydanticOutputParser
|
|
4. ListOutputParser
|
|