LangChain输出解析器的实践 | 豆包MarsCode AI刷题

121 阅读5分钟

LangChain输出解析器的实践 | 豆包MarsCode AI刷题


LangChain中的输出解析器概述

语言模型(如 GPT 系列)生成的输出通常是自然语言文本,适合人类阅读。但在实际开发中,我们往往需要的是结构化的信息,以便进一步处理。这时,输出解析器便发挥了其关键作用。输出解析器是一个类,用于处理和构建语言模型响应,它通过两个核心方法来实现功能:

  • get_format_instructions:返回一个字符串,指导语言模型如何组织输出。
  • parse:接收模型生成的字符串,并将其解析成所需的数据结构。

此外,输出解析器还可以有一个可选方法:

  • parse_with_prompt:此方法不仅解析模型的输出,还能结合原始提示进行修正,确保输出更为准确。

LangChain中的解析器种类

LangChain 提供了多种输出解析器,以满足不同场景的需求。常见的解析器类型有:

  • 列表解析器(List Parser) :处理模型生成的列表型输出。
  • 日期时间解析器(Datetime Parser) :处理与日期时间相关的输出。
  • 枚举解析器(Enum Parser) :确保模型的输出符合预定义的值集。
  • 结构化输出解析器(Structured Output Parser) :用于生成复杂的、具有特定结构的输出。
  • Pydantic(JSON)解析器:用于解析符合特定 JSON 格式的数据,借助 Pydantic 进行数据验证。
  • 自动修复解析器(Auto-Fixing Parser) :自动修复模型输出中的常见错误。
  • 重试解析器(RetryWithErrorOutputParser) :当模型初次输出不符合预期时,尝试修复或重新生成输出。

Pydantic(JSON)解析器实践

Pydantic(JSON)解析器是 LangChain 中最常用的输出解析器之一,它借助 Pydantic 数据模型,确保模型输出符合预期的数据结构。下面,我们通过一个实例来演示如何使用 Pydantic 解析器构建鲜花文案生成程序。

第一步:环境设置与模型实例化

首先,设置 OpenAI API 密钥,并通过 LangChain 库创建 OpenAI 模型实例。我们选择使用 text-davinci-003 作为大语言模型。

# 设置OpenAI API密钥
import os
os.environ["OPENAI_API_KEY"] = '你的OpenAI API Key'

# 创建模型实例
from langchain import OpenAI
model = OpenAI(model_name='gpt-3.5-turbo-instruct')
第二步:定义数据格式

接下来,我们定义一个数据格式,用于接收模型生成的鲜花文案。我们使用 Pydantic 库创建一个 FlowerDescription 类,确保每个字段的类型和内容符合预期。

import pandas as pd
from pydantic import BaseModel, Field

# 创建一个空的DataFrame用于存储结果
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="为什么要这样写这个文案")
第三步:创建输出解析器

我们使用 LangChain 中的 PydanticOutputParser 创建一个输出解析器,将模型输出解析为 FlowerDescription 格式。

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()  # 将Pydantic格式转换为字典

    # 将解析后的输出添加到DataFrame中
    df.loc[len(df)] = parsed_output.dict()

# 打印字典
print("输出的数据:", df.to_dict(orient='records'))

自动修复解析器实战

在实际应用中,模型的输出可能会存在格式错误。例如,JSON 格式的字段名可能没有使用双引号。我们可以利用 LangChain 的 OutputFixingParser 自动修复这些错误。

错误示例与自动修复
from langchain.output_parsers import PydanticOutputParser
from langchain.output_parsers import OutputFixingParser

# 定义一个错误格式的JSON字符串
misformatted = "{'name': '康乃馨', 'colors': ['粉红色','白色']}"

# 创建Pydantic解析器
parser = PydanticOutputParser(pydantic_object=Flower)

# 使用OutputFixingParser来自动修复格式错误
new_parser = OutputFixingParser.from_llm(parser=parser, llm=ChatOpenAI())
result = new_parser.parse(misformatted)
print(result)  # 输出修正后的结果

总结

在本篇笔记中,我们介绍了 LangChain 的输出解析器,并通过实际案例展示了如何使用 Pydantic 解析器生成符合 JSON 格式的鲜花文案。通过结合使用 PydanticOutputParserOutputFixingParser,我们可以有效处理模型输出的结构化信息,并修复常见的格式错误。这些工具在实际开发中十分有用,能够帮助开发者确保数据的准确性和一致性。