LangChain核心模块 Model I/O——Output Parsers
Output Parsers
输出解析器负责获取 LLM 的输出并将其转换为更合适的格式。
输出解析器是帮助构建语言模型响应的类。输出解析器必须实现两个主要方法:
- 获取格式指令(Get format instructions):一个返回字符串的方法,其中包含有关如何格式化语言模型输出的说明
- Parse:一种接收字符串(假设是语言模型的响应)并将其解析为某种结构的方法。
还有一个可选项:
- 带有提示的解析(Parse with prompt):一种接收字符串(假设是来自语言模型的响应)和提示(假设是生成此类响应的提示)并将其解析为某种结构的方法。提示主要是在 OutputParser 希望以某种方式重试或修复输出的情况下提供的,并且需要提示中的信息才能执行此操作。
Custom Output Parsers
有两种方法可以实现自定义解析器:
- 在 LCEL 中使用
RunnableLambda
或RunnableGenerator
(推荐) - 通过基类继承(困难)
两种方法的差异主要在表面,主要在于触发哪些回调,以及如何在像 LangSmith 这样的跟踪平台中可视化可运行的 lambda 与解析器。
Runnable Lambdas and Generators
- 使用可运行的Lambda和生成器
示例:反转模型输出的大小写,如果模型输出:“Meow”,解析器将生成“mEOW”。
from typing import Iterablefrom langchain_anthropic.chat_models import ChatAnthropic
from langchain_core.messages import AIMessage, AIMessageChunkmodel = ChatAnthropic()
def parse(ai_message: AIMessage) -> str:"""Parse the AI message."""return ai_message.content.swapcase()chain = model | parse
chain.inoke("Meow")
提示:
LCEL 会自动将函数
parse
升级为RunnableLambda(parse)
使用|
语法组合时的函数,还可以手动导入RunnableLambda
然后运行parse = RunnableLambda(parse)
。
由于解析器在解析输出前聚合输入,所以它不会进行流式输出
如果想要实现一个流式解析器,可以让解析器接受输入中的可迭代对象,并在可用时生成结果。
from langchain_core.runnables import RunnableGeneratordef streaming_parse(chunks: Iterable[AIMessageChunk]) -> Iterable[str]:for chunk in chunks:yield chunk.content.swapcase()streaming_parse = RunnableGenerator(streaming_parse)
chain = model | streaming_parse
chain.invoke("hello")
for chunk in chain.stream("tell me about yourself in one sentence"):print(chunk, end="|", flush=True)
i|'M| cLAUDE|,| AN| ai| ASSISTANT| CREATED| BY| aN|THROP|IC| TO| BE| HELPFUL|,| HARMLESS|,| AND| HONEST|.|
Inherting from Parsing Base Classes
- 从解析基类继承
实现解析器的另一种方法是根据需要执行的操作,从 BaseOutputParser
、BaseGenerationOutputParser
或另一个基本解析器继承。
最简单的输出解析器扩展了 BaseOutputParser
类,并且必须实现以下方法:
parse
:从模型中获取字符串输出并解析它- (optional)
_type
:标识解析器的名称。
当聊天模型或 LLM 的输出格式错误时,可以抛出 OutputParserException 来指示由于输入错误而导致的解析失败。使用此异常允许利用解析器的代码以一致的方式处理异常。
由于BaseOutputParser
实现了 Runnable
接口,所以这种方式创建的任何自定义解析器都将成为有效的 LangChain Runnables,并将受益于自动异步支持、批处理接口、日志记录支持等。
Simple Parser
- 简单解析器
解析器将使用 LLM 的输出(字符串)或聊天模型的输出(一个AIMessage
)
Parsing Raw Model Outputs
- 解析原始模型
除了原始文本之外,模型输出上还有其他重要的元数据。其中一个示例是工具调用,其中要传递给被调用函数的参数在单独的属性中返回。如果需要这种更细粒度的控制,可以对该BaseGenerationOutputParser
类进行子类化。
该类需要一个方法parse_result
。此方法采用原始模型输出(例如,Generation
或的列表ChatGeneration
)并返回解析的输出。
支持两者Generation
并ChatGeneration
允许解析器与常规 LLM 以及聊天模型一起使用。