当前位置: 首页 > news >正文

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

​ 实现解析器的另一种方法是根据需要执行的操作,从 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 以及聊天模型一起使用。

相关文章:

  • SpringMVC | SpringMVC中的 “文件上传和下载”
  • 【Unity】UI九宫格
  • 以太网交换——数据链路层
  • linux之zabbix自定义监控
  • C++测试代码
  • ARM中断实验
  • Docker指令
  • Excel 使用VBA自动调整插入图片大小到单元格
  • 一文读懂SPI通讯协议
  • 2025汤家凤考研数学视频,基础网课百度网盘课程+PDF讲义资料
  • 从边缘设备丰富你的 Elasticsearch 文档
  • Go 限流器-漏桶 VS 令牌桶 常用包原理解析
  • 设计模式面试专题
  • 【深度学习】一文搞懂 如何计算图像数据集的RGB均值和方差(超详细的哦~)
  • MQ高级篇---消息可靠性
  • 0基础学习移动端适配
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • ComponentOne 2017 V2版本正式发布
  • MobX
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Vue.js源码(2):初探List Rendering
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 让你的分享飞起来——极光推出社会化分享组件
  • 世界上最简单的无等待算法(getAndIncrement)
  • const的用法,特别是用在函数前面与后面的区别
  • 关于Android全面屏虚拟导航栏的适配总结
  • 湖北分布式智能数据采集方法有哪些?
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 如何在招聘中考核.NET架构师
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​HTTP与HTTPS:网络通信的安全卫士
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #每天一道面试题# 什么是MySQL的回表查询
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (C语言)共用体union的用法举例
  • (NSDate) 时间 (time )比较
  • (编译到47%失败)to be deleted
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (九)c52学习之旅-定时器
  • (已解决)什么是vue导航守卫
  • .Net 8.0 新的变化
  • .NET NPOI导出Excel详解
  • .net 中viewstate的原理和使用
  • .NET的微型Web框架 Nancy
  • /boot 内存空间不够
  • @JsonFormat与@DateTimeFormat注解的使用
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [Angular] 笔记 7:模块