05_Output_Parsers(输出解析器)

模型输出为文本,有时候需要输出结果为结构化数据,如数组、字典等类型,这个时候需要输出解析器。

LangChain框架提供了基础的解析器类BaseOutputParser,其他的解析器都是继承自该类,

实现的两个主要方法

1. get_format_instructions: 返回包含指令的字符串,关于语言模型如何格式化的输出

2. parse: 输入一个字符串(如语言模型的响应消息)解析成其他的结构

LangChain提供多种输出解析器,本文仅介绍三种,了解更多参阅parser

列表解析器(List parser)

将逗号分隔的文本解析为列表

使用CommaSeparatedListOutputParser类,按逗号处理

from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import (
        PromptTemplate, ChatPromptTemplate, HumanMessagePromptTemplate
        )
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI

# 实例化解析器output_parser
output_parser = CommaSeparatedListOutputParser()
# 生成format_instructions
format_instructions = output_parser.get_format_instructions()
# 查看format_instructions
print(format_instructions)

# 实例化prompt
prompt = PromptTemplate(
    template = "List five {subject}\n{format_instructions}",
    input_variables = ["subject"],
    partial_variables = {"format_instructions":format_instructions}
)

# 生成模板_input
_input = prompt.format(subject = "color")
model = OpenAI(temperature = 0, openai_api_key = "你的openai_api_key")

# 模型输出为文本
out_put = model(_input)
print(out_put)
print('\n')

# 解析器输出为列表
out_put_parser = output_parser.parse(out_put)
print(out_put_parser)

应该可以看到如下输出

Your response should be a list of comma separated values, eg: `foo, bar, baz`


Red, Blue, Green, Yellow, Orange
['Red', 'Blue', 'Green', 'Yellow', 'Orange']

Enum Parser

枚举输出解析器来自EnumOutputParser类

from langchain.output_parsers.enum import EnumOutputParser
from enum import Enum

class Genders(Enum):
    MALE = "male"
    FEMALE = "female"

output_parser = EnumOutputParser(enum = Genders)
output_parser.parse("male")

我们应该能看到下面的输出

Structured Output Parser

当我们想要多个字段,如JSON数据结构,使用该解析器。

from langchain.output_parsers import StructuredOutputParser, ResponseSchema
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI

response_schemas = [
    ResponseSchema( name = "answer", description = "answer the user's question"),
    ResponseSchema( name = "source", description = "source referred the user's answer, should be the website")
]

output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
format_instructions = output_parser.get_format_instructions()

prompt = PromptTemplate(
    template = "the users questions as best as possible.\n{format_instructions}\n{question}",
    input_variables = ["question"],
    partial_variables = {"format_instructions": format_instructions}
)

input = prompt.format_prompt(question = "where is the capital of France?")
model = OpenAI(temperature = 0, openai_api_key = "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" )
response = model(input.to_string())
output_parser.parse(response)

我们将会看到如下输出:

{'answer': 'Paris is the capital of France', 'source': 'What is the Capital of France? - WorldAtlas'}

总结:本节我们了解了为什么要输出解析器,以及输出解释器基础类中get_format_instructions和parse。以List Parser、Enum Parser、StructuredOutputParser为例,学习了三种输出解析器的使用方法。

遇到的错误

ValueError: Argument 'prompts' is expected to be of type List[str], received argument of type .

翻译:ValueError:参数“prompts”的类型应为List[str],但收到的参数的类型为

分析:参数的类型应为List,收到的参数类型是类。

解决办法:使用to_string()方法将类转换为List

TypeError: Serializable.__init__() takes 1 positional argument but 2 were given

翻译:TypeError:可序列化__init__()接受1个位置参数,但给定了2个

分析:只有一个参数,但是给定了两个参数,不匹配

解决办法:补上from_response_schemas函数

TypeError: 'StructuredOutputParser' object is not callable

翻译:TypeError:“StructuredOutputParser”对象不可调用

解决办法:加上to_string()函数

你可能感兴趣的:(人工智能,大规模语言模型(LLM),langchain,语言模型,自然语言处理,人工智能,gpt)