
关于大模型格式化输出问题的深入研究 原创
“ 大模型格式化输出的原理,第一步告诉大模型我们需要什么样的格式,第二步按照我们的格式要求去解析大模型的输出;大模型的输入与输出只有一种,那就是文本数据包括格式化的文本数据。”
今天在开发时遇到一个格式化输出的问题,开发框架使用的是Langchain的格式化解析器PydanticOutputParser;关于Langchain的格式化解析器就不多做介绍了,为了兼容不同的数据格式,Langchain提供了多种不同的解析器,包括StructuredOutputParser(配合ResponseSchema使用),JSONOutputParser,StrOutputParser解析器等。
但输出解析器的原理也很简单,首先在提示词中约束模型的输出格式,然后获取模型输出之后,再把输出数据转换成我们所需要的数据。
注意:大模型只接受一种输入和输出,那就是文本字符串;我们需要什么格式的数据,需要把这些文本转换成对应的数据格式。
数据解析器——OutputParser
在上面我们介绍说,大模型只接受一种输入和输出,那就是文本格式;虽然大模型的输出可能看起来很像JSON或XML对象等,但实际山它就是一个字符串。
而我们也都知道,提示词是一种与大模型交互的手段,但提示词并不能强制约束大模型要做什么,不要做什么;什么意思呢?
就是说,虽然我们可以在提示词中要求大模型按照JSON的格式进行输出,并且指定其输出的字段;但大模型并不一定会听你的按照固定的格式,固定的要求进行输出。
而这就带来了一个问题,那就是模型没有按照我们的要求进行输出,也就是说模型的输出是错误的;这就导致我们无法正常处理输出数据;这样也就无法进行下一步处理。
所以,这时我们就需要做一个异常处理,当模型输出有误时,我们需要捕获这个解析异常,注意这里说的是解析异常不是输出异常;原因就是前面所说的,我们可以要求大模型按照我们需要的格式进行输出,但大模型并不一定会听你的;而这时,只有我们解析数据时,才会知道大模型的输出是否符合我们的标准。
当捕获这个解析异常之后,我们需要重新调用模型,让模型再次按照我们要求的格式进行输出;当然,模型这一次也不一定会听我们的,因此可能需要几次重试,才有可能得到我们想要的结果。
为什么这里要专门强调格式化输出?
原因在于,在构建大模型应用时,我们需要大模型的输出方便我们的处理,或者让大模型去自主调用工具,而这些都需要格式化输出才行;否则,面对完全没有格式的数据,我们什么都做不了。
而所谓的格式化输出的原理也很简单,首先是告诉大模型我们需要什么格式的数据,然后再按照我们的格式要求去解析大模型的输出。
本文转载自AI探索时代 作者:DFires
