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格式的数据?输出解析器如何实现这一点?
- 自动修复解析器的“修复”功能是如何实现的?如何设计“提示”?
- 重试解析器的原理是什么?它实现了解析器类的哪个可选方法?