Bootstrap

如何使用 OutputFixingParser 修复格式错误的输出

老铁们,今天我们来聊聊如何在格式错误的情况下,通过使用 OutputFixingParser 来修复输出结果。说白了就是利用另一个输出解析器,当第一个解析器失败时,通过调用一个语言模型(LangChain LLM)来修复错误。这种机制不仅仅是抛出错误,我们还可以将格式不正确的输出连同格式说明传递给模型,请求其修复。

技术背景介绍

在处理自然语言生成任务时,我们经常需要将生成的文本解析成结构化的数据格式。然而,模型生成的输出不总是按我们的需求格式化的,比如 JSON 格式。在这种情况下,直接解析会抛出错误。为了解决这个问题,我们可以使用 OutputFixingParser 来自动修复这些错误的格式输出。

原理深度解析

首先,我们看一个例子,使用 PydanticOutputParser 来解析模型生成的输出。假设我们想生成一个演员的电影作品列表:

from typing import List
from langchain_core.output_parsers import PydanticOutputParser
from langchain_core.pydantic_v1 import BaseModel, Field

class Actor(BaseModel):
    name: str = Field(description="name of an actor")
    film_names: List[str] = Field(description="list of names of films they starred in")

actor_query = "Generate the filmography for a random actor."
parser = PydanticOutputParser(pydantic_object=Actor)

# 模拟一个格式错误的输出
misformatted = "{'name': 'Tom Hanks', 'film_names': ['Forrest Gump']}"

# 尝试解析
try:
    parser.parse(misformatted)  # 这里会抛出 JSONDecodeError
except Exception as e:
    print(f"Error: {e}")

由于输出不符合 JSON 的标准格式(属性名称未被双引号包围),解析器会抛出 JSONDecodeError。这个错误很常见,尤其是在处理模型生成的自然语言时。

实战代码演示

为了解决上述问题,我们可以使用 OutputFixingParser,它需要一个现有的输出解析器(如 PydanticOutputParser)和一个语言模型(例如 ChatOpenAI),来尝试纠正任何格式错误。

from langchain.output_parsers import OutputFixingParser
from langchain_openai import ChatOpenAI

# 创建一个新的 OutputFixingParser 实例
new_parser = OutputFixingParser.from_llm(parser=parser, llm=ChatOpenAI())

# 使用 new_parser 进行解析
result = new_parser.parse(misformatted)
print(result)

这波操作可以说是相当丝滑,通过 OutputFixingParser,我们成功解析出了格式错误的文本,得到正确的 Actor 对象。

优化建议分享

在实际应用中,合理选择和配置你的 LLM 是关键。建议使用具备快速响应和高准确率的代理服务,以提高修复的稳定性和效率。此外,可以通过异步调用提高解析速度,特别是在批量处理的场景下。

补充说明和总结

我个人一直在用 https://yunwu.ai 提供的一站式大模型解决方案,效果非常不错。在处理复杂自然语言任务时,选择合适的工具和服务能够大幅提高开发效率。

今天的技术分享就到这里,希望对大家有帮助。开发过程中遇到问题也可以在评论区交流~

—END—

;