LangChain(第6课)输出解析器学习笔记
引言
在第5课中,我们学习了如何为一些鲜花及其价格生成吸引人的描述,并将这些描述和理由存储到一个CSV文件中。程序利用了OpenAI模型、结构化输出解析器以及数据处理工具。今天,我们将进一步研究LangChain中的输出解析器,并用Pydantic解析器重构上次的程序。这是模型I/O框架的最后一讲。
输出解析器的作用
语言模型的输出通常是为人类设计的文本,但实际应用中我们需要的是程序能够理解和操作的结构化信息。输出解析器正是为此而设计的工具,其核心功能包括:
- get_format_instructions:生成模型输出的格式说明。
- parse:将模型输出解析为特定的数据结构。
- parse_with_prompt(可选):基于提示解析输出,用于修正或优化结果。
常见的解析器包括:
- 列表解析器:处理模型输出为列表。
- 日期时间解析器:解析日期和时间。
- 枚举解析器:确保输出属于预定义值范围。
- 结构化输出解析器:解析复杂结构化数据。
- Pydantic(JSON)解析器:验证和解析符合JSON格式的数据。
- 自动修复解析器:修复语法或拼写错误。
- 重试解析器:重新生成不符合要求的输出。
Pydantic(JSON)解析器实战
第一步:创建模型实例
我们首先通过环境变量设置OpenAI API密钥,并创建了一个模型实例:
python
复制代码
import os
from langchain import OpenAI
os.environ["OPENAI_API_KEY"] = "你的API密钥"
model = OpenAI(model_name="gpt-3.5-turbo-instruct")
第二步:定义输出数据格式
通过Pydantic库定义输出的格式:
python
复制代码
import pandas as pd
from pydantic import BaseModel, Field
# 空的DataFrame用于存储生成的描述
df = pd.DataFrame(columns=["flower_type", "price", "description", "reason"])
# 定义数据格式
class FlowerDescription(BaseModel):
flower_type: str = Field(description="鲜花的种类")
price: int = Field(description="鲜花的价格")
description: str = Field(description="鲜花的描述文案")
reason: str = Field(description="描述文案的理由")
Pydantic特点:
- 自动验证数据类型。
- 支持数据转换(如将字符串“42”转换为整数42)。
- 易用性高,支持JSON数据处理。
第三步:创建输出解析器
我们使用LangChain的PydanticOutputParser创建解析器,并生成输出格式指示:
python
复制代码
from langchain.output_parsers import PydanticOutputParser
# 创建解析器
output_parser = PydanticOutputParser(pydantic_object=FlowerDescription)
# 获取格式指示
format_instructions = output_parser.get_format_instructions()
print("输出格式:", format_instructions)
格式指示清晰定义了输出的JSON Schema,描述了字段的类型及要求,确保模型输出符合指定格式。
第四步:创建提示模板
定义模板并加入格式指示,形成输入提示:
python
复制代码
from langchain import PromptTemplate
template = """您是一位专业的鲜花店文案撰写员。
对于售价为 {price} 元的 {flower} ,您能提供一个吸引人的简短中文描述吗?
{format_instructions}"""
prompt = PromptTemplate.from_template(template,
partial_variables={"format_instructions": format_instructions})
第五步:结合模型生成结果
将模板和解析器结合起来,生成结构化输出并存储:
python
复制代码
# 使用模型生成结果
result = model(prompt.format(flower="玫瑰", price="50"))
# 解析结果并存入DataFrame
parsed_result = output_parser.parse(result)
df = df.append(parsed_result.dict(), ignore_index=True)
总结
通过本课的学习,我们了解了输出解析器的作用及Pydantic解析器的使用方法。从定义数据格式到创建解析器,再到结合模型生成结构化数据,LangChain提供了一种高效且灵活的方式来处理语言模型的输出。掌握这些技能后,可以让模型的应用更加规范和强大!