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

137 阅读4分钟

一、LangChain 中的输出解析器概述

输出解析器(OutputParser)是一种专门设计用于处理和解析语言模型响应的工具,旨在将模型输出的文本转化为结构化信息,以便程序进一步处理。

核心方法
  1. get_format_instructions():提供格式化指令,指导模型输出符合预期的格式。
  2. parse():解析模型的输出,转化为特定的数据结构。
  3. parse_with_prompt()(可选):结合原始提示解析模型输出,确保结果更加精准。
常见解析器种类
  1. 列表解析器(List Parser):处理列表格式输出。
  2. 日期时间解析器(Datetime Parser):处理日期和时间输出。
  3. 枚举解析器(Enum Parser):输出必须是预定义值时使用。
  4. 结构化输出解析器(Structured Output Parser):适合复杂的结构化回答。
  5. Pydantic(JSON)解析器:处理符合 JSON 格式的复杂数据结构。
  6. 自动修复解析器(Auto-Fixing Parser):自动修正常见的格式错误。
  7. 重试解析器(RetryWithErrorOutputParser):处理内容缺失或不完整的问题,通过与模型的二次交互生成正确输出。

二、Pydantic(JSON)解析器实战

1. 定义数据格式

利用 Pydantic 创建数据模型(如 FlowerDescription),定义字段及其类型,并自动验证输入数据。

示例代码

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="为什么要这样写这个文案")
2. 创建输出解析器

利用 PydanticOutputParser 创建解析器,并获取输出格式指示。

from langchain.output_parsers import PydanticOutputParser

output_parser = PydanticOutputParser(pydantic_object=FlowerDescription)
format_instructions = output_parser.get_format_instructions()
  • format_instructions:描述输出需要符合的 JSON Schema 结构。
    • 指定字段名称、类型、描述等。
    • 提供示例,说明什么是格式正确的输出。
3. 生成提示模板

定义提示模板,将 format_instructions 格式指示嵌入到提示模板中,确保模型生成的输出符合指定格式。

from langchain import PromptTemplate

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

prompt = PromptTemplate.from_template(prompt_template, 
       partial_variables={"format_instructions": format_instructions})
4. 解析输出并存储

使用提示生成输入,获取模型输出并解析,最后存储在 DataFrame 中。

for flower, price in zip(flowers, prices):
    input = prompt.format(flower=flower, price=price)
    output = model(input)
    parsed_output = output_parser.parse(output)
    df.loc[len(df)] = parsed_output.dict()

输出示例

{
  "flower_type": "玫瑰",
  "price": 50,
  "description": "玫瑰是最浪漫的花,柔和的粉红色象征浓浓的爱意。",
  "reason": "玫瑰代表爱情,是最浪漫的礼物。"
}

三、自动修复解析器(OutputFixingParser)

用于自动修复格式错误的输出,例如 JSON 格式中的单双引号问题。

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

misformatted = "{'name': '康乃馨', 'colors': ['粉红色','白色']}"
new_parser = OutputFixingParser.from_llm(parser=parser, llm=ChatOpenAI())
result = new_parser.parse(misformatted)

输出结果

name='康乃馨' colors=['粉红色', '白色']

优点

  • 自动修复小的格式问题。
  • 使用 LLM 的推理能力补充细节。

四、重试解析器(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)

优点

  • 解决内容缺失问题。
  • 根据原始提示生成更贴合预期的结果。

五、对比与总结

特性Pydantic解析器自动修复解析器重试解析器
适用场景复杂数据结构的验证与解析小的格式错误修正缺失内容修复与补充
实现方式类型验证、格式定义调用LLM修复利用LLM重新生成输出
优点强类型验证,灵活易用快速修复常见错误输出更完整、准确
缺点格式错误无法直接修复修复能力有限可能增加调用成本

六、应用建议

  1. 简单场景:直接使用 PydanticOutputParser 定义格式。
  2. 小错误修复:优先选择 OutputFixingParser
  3. 高精度需求:在内容缺失或需严格验证时使用 RetryWithErrorOutputParser

七、个人思考

通过实践LangChain的输出解析器,充分体会到构建复杂数据处理系统的灵活性。自动修复和重试解析器充分展现了LLM的强大潜力,但需合理选择工具以平衡成本与效率。在未来实际应用中,应根据具体需求设计最适合的解析流程,提高系统的鲁棒性与可靠性。