输出解释 | 豆包MarsCode AI刷题

121 阅读6分钟

输出解析器是一种专用于处理和构建语言模型响应的类。一个基本的输出解析器类通常需要实现两个核心方法。

  • get_format_instructions:这个方法需要返回一个字符串,用于指导如何格式化语言模型的输出,告诉它应该如何组织并构建它的回答。
  • parse:这个方法接收一个字符串(也就是语言模型的输出)并将其解析为特定的数据结构或格式。这一步通常用于确保模型的输出符合我们的预期,并且能够以我们需要的形式进行后续处理。

另一个可选方法

  • parse_with_prompt:这个方法接收一个字符串(也就是语言模型的输出)和一个提示(用于生成这个输出的提示),并将其解析为特定的数据结构。这样,你可以根据原始提示来修正或重新解析模型的输出,确保输出的信息更加准确和贴合要求。

在LangChain中,通过实现get_format_instructions、parse 和 parse_with_prompt 这些方法,针对不同的使用场景和目标,设计了各种输出解析器。

  1. 列表解析器(List Parser):这个解析器用于处理模型生成的输出,当需要模型的输出是一个列表的时候使用。例如,如果你询问模型“列出所有鲜花的库存”,模型的回答应该是一个列表。
  2. 日期时间解析器(Datetime Parser):这个解析器用于处理日期和时间相关的输出,确保模型的输出是正确的日期或时间格式。
  3. 枚举解析器(Enum Parser):这个解析器用于处理预定义的一组值,当模型的输出应该是这组预定义值之一时使用。例如,如果你定义了一个问题的答案只能是“是”或“否”,那么枚举解析器可以确保模型的回答是这两个选项之一。
  4. 结构化输出解析器(Structured Output Parser):这个解析器用于处理复杂的、结构化的输出。如果你的应用需要模型生成具有特定结构的复杂回答(例如一份报告、一篇文章等),那么可以使用结构化输出解析器来实现。
  5. Pydantic(JSON)解析器:这个解析器用于处理模型的输出,当模型的输出应该是一个符合特定格式的JSON对象时使用。它使用Pydantic库,这是一个数据验证库,可以用于构建复杂的数据模型,并确保模型的输出符合预期的数据模型。
  6. 自动修复解析器(Auto-Fixing Parser):这个解析器可以自动修复某些常见的模型输出错误。例如,如果模型的输出应该是一段文本,但是模型返回了一段包含语法或拼写错误的文本,自动修复解析器可以自动纠正这些错误。
  7. 重试解析器(RetryWithErrorOutputParser):这个解析器用于在模型的初次输出不符合预期时,尝试修复或重新生成新的输出。

Pydantic(JSON)解析器

核心摘要

特性pydantic(2.x)pydantic.v1(1.x 模式)
API 兼容性与 Pydantic 1.x 不完全兼容与 Pydantic 1.x 完全兼容
方法和属性例如model_json_schemafield_validator例如schema()root_validator
推荐用法新项目推荐使用旧项目的临时兼容方案
性能优化包括新的更高效的验证机制和更简化的逻辑仍然使用 Pydantic 1.x 的实现方式
长期支持是官方推荐路径,未来版本更新优先支持转让协议,可能在未来被移除

尽量使用pydantic pydanticv1作为过渡,不是老项目尽量不用

  1. 第一步:创建模型实例
  2. 第二步:定义输出数据的格式
  3. 第三步:创建输出解析器
  4. 第四步:创建提示模板
  5. 第五步:生成提示,传入模型并解析输出
from langchain import OpenAI 
model = OpenAI(model_name='gpt-3.5-turbo-instruct')
import pandas as pd 
df = pd.DataFrame(columns=["flower_type", "price", "description", "reason"])
# 数据准备 
flowers = ["玫瑰", "百合", "康乃馨"] 
prices = ["50", "30", "20"] 
# 定义我们想要接收的数据格式 
from pydantic import BaseModel, Field 
class FlowerDescription(BaseModel):     
    flower_type: str = Field(description="鲜花的种类")
    price: int = Field(description="鲜花的价格")
    description: str = Field(description="鲜花的描述文案")
    reason: str = Field(description="为什么要这样写这个文案")
# 创建输出解析器
from langchain.output_parsers
import PydanticOutputParser 
output_parser = PydanticOutputParser(pydantic_object=FlowerDescription)
# 获取输出格式指示
format_instructions = output_parser.get_format_instructions()
# 创建提示模板
from langchain import PromptTemplate
prompt_template = """
您是一位专业的鲜花店文案撰写员。 对于售价为 {price} 元的 {flower} ,您能提供一个吸引人的简短中文描述吗? {format_instructions}
"""
# 根据模板创建提示,同时在提示中加入输出解析器的说明
prompt = PromptTemplate.from_template(prompt_template,
partial_variables={"format_instructions": format_instructions})
for flower, price in zip(flowers, prices):
# 根据提示准备模型的输入
input = prompt.format(flower=flower, price=price)
# 打印提示
print("提示:", input)
# 获取模型的输出
output = model(input)
# 解析模型的输出
parsed_output = output_parser.parse(output)
parsed_output_dict = parsed_output.dict()
# 将Pydantic格式转换为字典
# 将解析后的输出添加到DataFrame中
df.loc[len(df)] = parsed_output.dict()
print("输出的数据:", df.to_dict(orient='records'))

在OutputFixingParser内部,调用了原有的PydanticOutputParser,如果成功,就返回;如果失败,它会将格式错误的输出以及格式化的指令传递给大模型,并要求LLM进行相关的修复。

重试解析器(RetryWithErrorOutputParser)

OutputFixingParser不错,但它只能做简单的格式修复。如果出错的不只是格式,比如,输出根本不完整,有缺失内容,那么仅仅根据输出和格式本身,是无法修复它的。

思考题

重试解析器(Retry Parser) 主要原理是在解析过程中,当遇到错误或无法继续的情况时,自动回退到上一个有效状态,重新尝试解析或尝试其他解析路径。它一般用在需要容错、灵活解析的场景,特别是在语法分析过程中。

解析器的基本任务是读取输入数据,逐步分析它是否符合语言的语法规则,生成语法树或执行其他相关任务。如果在解析过程中遇到问题,比如不匹配的符号或意外的输入,重试解析器会回退并尝试其他可能的解析路径。这种重试机制可以确保解析器能尽可能地从多个角度解析输入。

为什么大模型能够返回JSON格式的数据,输出解析器用了什么魔法让大模型做到了这一点?:

大模型能够返回JSON格式的数据,主要依赖于其 预训练自然语言生成(NLG)能力。 大模型能够返回JSON格式数据,并不是通过传统的解析器来实现的,而是通过在大量数据中学习到如何生成结构化数据格式的能力。模型通过自然语言处理和生成(NLG)能力,结合预训练过程中学习到的模式,能够在用户请求时自动生成符合JSON格式要求的响应。