从零开始学 LangChain(9) | 豆包MarsCode AI刷题

164 阅读2分钟

输出解析(下)

自动修复解析器(OutputFixingParser)

使用OutputFixingParser来帮助自动解决类似的格式错误。

# 从langchain库导入所需的模块
from langchain.chat_models import ChatOpenAI
from langchain.output_parsers import OutputFixingParser

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

# 使用OutputFixingParser创建一个新的解析器,该解析器能够纠正格式不正确的输出
new_parser = OutputFixingParser.from_llm(parser=parser, llm=ChatOpenAI())

# 使用新的解析器解析不正确的输出
result = new_parser.parse(misformatted) # 错误被自动修正
print(result) # 打印解析后的输出结果

用上面的新的new_parser来代替Parser进行解析,会发现,JSON格式的错误问题被解决了,程序不再出错。

输出如下:

name='Rose' colors=['red', 'pink', 'white']

这里的秘密在于,在OutputFixingParser内部,调用了原有的PydanticOutputParser,如果成功,就返回;如果失败,它会将格式错误的输出以及格式化的指令传递给大模型,并要求LLM进行相关的修复。

重试解析器(RetryWithErrorOutputParser)

通过实现输出解析器中parsewithprompt方法,LangChain提供的重试解析器可以帮助我们利用大模型的推理能力根据原始提示找回相关信息。

格式内容错误,使用RetryWithErrorOutputParser这个解析器:

# 初始化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解析器都旨在从大型语言模型中获取格式化的输出。结构化解析器更适合简单的文本响应,而Pydantic解析器则提供了对复杂数据结构和类型的支持。选择哪种解析器取决于应用的具体需求和输出的复杂性。

自动修复解析器主要适用于纠正小的格式错误,它更加“被动”,仅在原始输出出现问题时进行修复。重试解析器则可以处理更复杂的问题,包括格式错误和内容缺失。它通过重新与模型交互,使得输出更加完整和符合预期。

在选择哪种解析器时,需要考虑具体的应用场景。如果仅面临格式问题,自动修复解析器可能足够;但如果输出的完整性和准确性至关重要,那么重试解析器可能是更好的选择。