学习笔记7《输出解析:用OutputParser生成鲜花推荐列表》

96 阅读3分钟

LangChain输出解析器概述

在LangChain中,输出解析器用于将语言模型生成的文本输出转换为结构化信息,以便程序能够处理。输出解析器需要实现以下核心方法:

  • get_format_instructions:返回一个字符串,指导如何格式化模型的输出。
  • parse:将模型的输出解析为特定的数据结构或格式。
  • parse_with_prompt(可选):基于原始提示解析模型的输出,转换为特定的数据结构。

输出解析器种类

  • 列表解析器(List Parser):处理模型输出为列表的情况。
  • 日期时间解析器(Datetime Parser):处理日期和时间格式的输出。
  • 枚举解析器(Enum Parser):处理预定义值集合中的输出。
  • 结构化输出解析器(Structured Output Parser):处理复杂结构化的输出。
  • Pydantic(JSON)解析器:处理符合特定格式的JSON对象输出。
  • 自动修复解析器(Auto-Fixing Parser):自动修复常见的模型输出错误。
  • 重试解析器(RetryWithErrorOutputParser):在输出不符合预期时,尝试修复或重新生成输出。

Pydantic(JSON)解析器实战

Pydantic是一个基于Python类型提示的数据验证和设置管理库,非常适合处理和验证JSON数据。

第一步:创建模型实例

import os
from langchain import OpenAI

os.environ["OPENAI_API_KEY"] = '你的OpenAI API Key'
model = OpenAI(model_name='gpt-3.5-turbo-instruct')

第二步:定义输出数据的格式

import pandas as pd
from pydantic import BaseModel, Field

df = pd.DataFrame(columns=["flower_type", "price", "description", "reason"])
flowers = ["玫瑰", "百合", "康乃馨"]
prices = ["50", "30", "20"]

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()
print("输出格式:", format_instructions)

第四步:创建提示模板

from langchain import PromptTemplate

prompt_template = """您是一位专业的鲜花店文案撰写员。
对于售价为 {price} 元的 {flower} ,您能提供一个吸引人的简短中文描述吗?
{format_instructions}"""

prompt = PromptTemplate.from_template(prompt_template, 
  partial_variables={"format_instructions": format_instructions}) 
print("提示:", prompt)

第五步:生成提示,传入模型并解析输出

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()  

    df.loc[len(df)] = parsed_output.dict()

print("输出的数据:", df.to_dict(orient='records'))

自动修复解析器(OutputFixingParser)实战

自动修复解析器可以自动修复某些常见的模型输出错误,如格式问题。

from langchain.output_parsers import OutputFixingParser
from langchain.chat_models import ChatOpenAI

new_parser = OutputFixingParser.from_llm(parser=parser, llm=ChatOpenAI())
result = new_parser.parse(misformatted) 
print(result)

重试解析器(RetryWithErrorOutputParser)实战

重试解析器在模型的初次输出不符合预期时,尝试修复或重新生成新的输出。

from langchain.output_parsers import RetryWithErrorOutputParser
from langchain.llms import OpenAI

retry_parser = RetryWithErrorOutputParser.from_llm(parser=parser, llm=OpenAI(temperature=0))
parse_result = retry_parser.parse_with_prompt(bad_response, prompt_value)
print('RetryWithErrorOutputParser的parse结果:',parse_result)

总结

  • 结构化解析器和Pydantic解析器适用于不同的场景,根据输出的复杂性选择。
  • 自动修复解析器适用于小的格式错误,而重试解析器可以处理更复杂的问题。
  • 选择解析器时,需要考虑具体的应用场景和需求。

思考题

  • 我们已经使用了哪些LangChain输出解析器?它们的用法和异同是什么?
  • 大模型如何返回JSON格式的数据?输出解析器如何实现这一点?
  • 自动修复解析器的“修复”功能是如何实现的?如何设计“提示”?
  • 重试解析器的原理是什么?它实现了解析器类的哪个可选方法?