LangChain核心模块 Model I/O——Output Parsers

Output Parsers

输出解析器负责获取 LLM 的输出并将其转换为更合适的格式。

输出解析器是帮助构建语言模型响应的类。输出解析器必须实现两个主要方法:

  • 获取格式指令(Get format instructions):一个返回字符串的方法,其中包含有关如何格式化语言模型输出的说明
  • Parse:一种接收字符串(假设是语言模型的响应)并将其解析为某种结构的方法。

还有一个可选项:

  • 带有提示的解析(Parse with prompt):一种接收字符串(假设是来自语言模型的响应)和提示(假设是生成此类响应的提示)并将其解析为某种结构的方法。提示主要是在 OutputParser 希望以某种方式重试或修复输出的情况下提供的,并且需要提示中的信息才能执行此操作。

Custom Output Parsers

有两种方法可以实现自定义解析器:

  1. 在 LCEL 中使用RunnableLambdaRunnableGenerator(推荐)
  2. 通过基类继承(困难)

两种方法的差异主要在表面,主要在于触发哪些回调,以及如何在像 LangSmith 这样的跟踪平台中可视化可运行的 lambda 与解析器。

Runnable Lambdas and Generators
  • 使用可运行的Lambda和生成器

示例:反转模型输出的大小写,如果模型输出:“Meow”,解析器将生成“mEOW”。

from typing import Iterable

from langchain_anthropic.chat_models import ChatAnthropic
from langchain_core.messages import AIMessage, AIMessageChunk

model = 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 RunnableGenerator


def 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
  • 从解析基类继承

​ 实现解析器的另一种方法是根据需要执行的操作,从 BaseOutputParserBaseGenerationOutputParser 或另一个基本解析器继承。

最简单的输出解析器扩展了 BaseOutputParser 类,并且必须实现以下方法:

  • parse:从模型中获取字符串输出并解析它
  • (optional)_type:标识解析器的名称。

当聊天模型或 LLM 的输出格式错误时,可以抛出 OutputParserException 来指示由于输入错误而导致的解析失败。使用此异常允许利用解析器的代码以一致的方式处理异常。

由于BaseOutputParser实现了 Runnable 接口,所以这种方式创建的任何自定义解析器都将成为有效的 LangChain Runnables,并将受益于自动异步支持、批处理接口、日志记录支持等。

Simple Parser
  • 简单解析器

解析器将使用 LLM 的输出(字符串)或聊天模型的输出(一个AIMessage

Parsing Raw Model Outputs
  • 解析原始模型

​ 除了原始文本之外,模型输出上还有其他重要的元数据。其中一个示例是工具调用,其中要传递给被调用函数的参数在单独的属性中返回。如果需要这种更细粒度的控制,可以对该BaseGenerationOutputParser类进行子类化。

​ 该类需要一个方法parse_result。此方法采用原始模型输出(例如,Generation或的列表ChatGeneration)并返回解析的输出。

支持两者GenerationChatGeneration允许解析器与常规 LLM 以及聊天模型一起使用。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值