首页 > 其他分享 >如何创建自定义输出解析器

如何创建自定义输出解析器

时间:2025-01-10 23:01:09浏览次数:3  
标签:解析器 输出 自定义 val text parse import

在某些情况下,您可能需要实现自定义解析器,以便将模型输出结构化为自定义格式。本文将介绍两种实现自定义解析器的方法:使用 RunnableLambda 或者 RunnableGenerator,这是我们强烈推荐的方法;以及通过继承基础类实现解析器的方法,这种方法较为复杂。

技术背景介绍

输出解析器在AI模型的实际应用中非常重要,尤其是在需要将模型的输出数据转换为符合业务需求的格式时。合理的解析器设计可以显著提高数据处理效率。

核心原理解析

  1. Runnable Lambdas 和 Generators: 这种方式利用可运行的Lambda函数或者生成器函数来处理AI模型的输出。通过这种方法,我们可以直接处理模型输出,并进行实时的流解析。

  2. 继承解析器基础类: 在这种方式中,我们通过继承 BaseOutputParserBaseGenerationOutputParser 等基础类来实现自定义解析逻辑。尽管这种方式能提供更细粒度的控制,但通常会增加代码复杂性。

方法一: 使用 Runnable Lambda 和 Generator

这是推荐的方法,它允许快速创建轻量级的解析逻辑。我们来实现一个简单的解析器,反转模型输出的字符大小写。

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

# 创建模型实例
model = ChatAnthropic(model_name="claude-2.1")

# 定义解析函数
def parse(ai_message: AIMessage) -> str:
    """反转AI消息的字符大小写."""
    return ai_message.content.swapcase()

# 使用管道运算符构建链
chain = model | parse
print(chain.invoke("hello"))

# 处理流数据的解析器
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
for chunk in chain.stream("tell me about yourself in one sentence"):
    print(chunk, end="|", flush=True)

方法二: 继承解析器基础类

不推荐一般用户使用的方法,但在需要自定义异常处理或复杂逻辑时可以考虑。

from langchain_core.exceptions import OutputParserException
from langchain_core.output_parsers import BaseOutputParser

# 定义布尔解析器
class BooleanOutputParser(BaseOutputParser[bool]):
    """自定义布尔解析器."""
    true_val: str = "YES"
    false_val: str = "NO"

    def parse(self, text: str) -> bool:
        cleaned_text = text.strip().upper()
        if cleaned_text not in (self.true_val.upper(), self.false_val.upper()):
            raise OutputParserException(
                f"BooleanOutputParser expected output value to either be "
                f"{self.true_val} or {self.false_val} (case-insensitive). "
                f"Received {cleaned_text}."
            )
        return cleaned_text == self.true_val.upper()

# 测试解析器
parser = BooleanOutputParser()
print(parser.invoke("YES"))

# 使用新参数测试
parser = BooleanOutputParser(true_val="OKAY")
print(parser.invoke("OKAY"))

应用场景分析

  • 文本处理: 自动化转换和格式化模型输出。
  • 数据清洗: 将非结构化数据转换为结构化格式。
  • 复杂业务逻辑: 自定义解析器支持复杂的业务逻辑实现。

实践建议

  • 对于简单解析需求,优先使用 RunnableLambdaRunnableGenerator
  • 需要复杂异常处理时,考虑继承基础解析器类。
  • 提前设计解析器的输入输出格式,确保与业务需求一致。

通过以上方法,可以高效地实现自定义输出解析器,提高AI模型的应用价值。

如果遇到问题欢迎在评论区交流。
—END—

标签:解析器,输出,自定义,val,text,parse,import
From: https://blog.csdn.net/sagvWSRJHMNEB/article/details/145066554

相关文章

  • 算法提高 图形输出
    时间限制:C/C++1000MS,其他语言2000MS内存限制:C/C++512MB,其他语言1024MB难度:困难分数:100 OI排行榜得分:14(0.1*分数+2*难度)描述编写一程序,在屏幕上输出如下内容:注意:本题请严格按照图形的格式输出对齐,其中X和O为大写,否则系统会判为错误。输入描述无输出描......
  • uniapp - 实现精美全屏抽屉弹窗带动画过渡功能组件,从页面左侧或右侧弹出抽屉窗口带挤
    效果图在uni-app手机h5网页网站/支付宝微信小程序/安卓app/苹果app/nvue等(全平台兼容)开发中,实现uniapp抽屉弹框组件,从页面全屏侧滑弹出抽屉窗口,简单易用的Drawer抽屉插件,uniApp抽屉组件好看弹跳挤压出现动画过渡效果,适用于侧边隐藏时导航菜单、我的个人信息等场景,自定义......
  • 部落竞争与成员合作算法(CTCM)求解多个无人机协同路径规划(可以自定义无人机数量及起始点
    一、部落竞争与成员合作算法部落竞争与成员合作算法(Competitionoftribesandcooperationofmembersalgorithm,CTCM)由ChenZuyan等人于2024年提出的一种智能优化算法。该算法受古代部落之间竞争及其合作行为的启发而得。参考文献:[1]ZuyanChen,ShuaiLi,AmeerTamo......
  • 1.9日学习笔记之高阻态和开漏输出
    三态:高电平、低电平和高阻态高阻态输出(High-ZOutput):高阻态输出是指一个IO口处于高阻抗状态,此时IO口既不输出高电平也不输出低电平,而是呈现高阻抗状态,相当于断开电路。高阻态输出的主要用途是:多设备共享总线:允许多个设备共享同一根数据线,但每次只有一个设备能够控制这条数据......
  • C++:爬楼梯问题,设有阶台阶需要攀登,每次只能上1阶或2阶,问共有多少种上台阶方案。程序输
    代码如下:#include<iostream>usingnamespacestd;intlou(intx){ if(x==1||x==2) returnx; else returnlou(x-1)+lou(x-2);}intmain(){ intn; cout<<"请输入台阶数:"; cin>>n; cout<<"上台阶方案总数为&quo......
  • go-zero使用自定义模板实现统一格式的 body 响应
    前提go环境的配置、goctl的安装、go-zero的基本使用默认都会需求go-zero框架中,默认使用goctl命令生成的代码并没有统一响应格式,现在使用自定义模板的方式实现统一响应格式:{"code":0,"msg":"OK","data":{}}步骤1、下载模板goctltemplateinit下载完......
  • Python Matplotlib 教程- Matplotlib 如何自定义样式
    PythonMatplotlib样式和自定义Matplotlib是一个强大的Python数据可视化库,提供丰富的绘图功能。在实际使用中,熟悉其样式和自定义技巧可以让你的图表更加专业和美观。本文将简要介绍Matplotlib样式和一些常用的自定义方法。1.设置全局样式Matplotlib提供了一些预设的样......
  • 【C语言输入输出】
    一、scanf()、printf()、putchar()、getchar();scanf(“输入控制符”,输入参数);1.功能:将从键盘输入的字符转化为“输入控制符”所规定格式的数据,然后存入以输入参数的值为地址的变量中。2.scanf是缓冲输入的,也就是说从键盘输入的数据都会先存放在内存中的一个缓冲区。......
  • PD快充适配器如何把电压输出高电压9V12V15V20V28V36V48V呢?
    PD快充适配器电压输出9V12V15V20V28V36V48V等电压来PD快充适配器如何把电压输出高电压9V12V15V20V28V36V48V呢?很简单只需要用一颗泛海微的FS8025B就可以把快充充电器电压输出9V12V15V20V28V36V48V等高电压出来。​一、引言随着科技的飞速发展,快充技术已成为现代设备充电的......
  • C++ 格式化输出 printf
    格式化输出的目的是先组织好格式,然后把变量替换进去。格式化说明格式化输出必会表保留指定位的小数在输出小数的时候,经常需要指定保留几位小数。比如保留2位小数要用%.2f,保留3位小数要用%.3f,依此类推。doublepi=3.1415926;printf("pi=%.3f",pi);补0输出补0输出常见......