Skip to main content

输出解析器

语言模型输出文本。但很多时候,您可能希望获得比纯文本更结构化的信息。这就是输出解析器的作用。

输出解析器是帮助结构化语言模型响应的类。输出解析器必须实现两个主要方法:

  • "获取格式指令":返回一个字符串,其中包含语言模型输出的格式指令。
  • "解析":接受一个字符串(假设为语言模型的响应)并将其解析为某种结构。

然后还有一个可选的方法:

  • "带提示解析":接受一个字符串(假设为语言模型的响应)和一个提示(假设为生成此响应的提示)并将其解析为某种结构。提示主要是为了在OutputParser希望重新尝试或修复输出时提供信息,并且需要来自提示的信息来完成此操作。

开始使用

下面我们将介绍主要类型的输出解析器,即PydanticOutputParser

from langchain.prompts import PromptTemplate, ChatPromptTemplate, HumanMessagePromptTemplate  
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI

from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field, validator
from typing import List

model_name = 'text-davinci-003'
temperature = 0.0
model = OpenAI(model_name=model_name, temperature=temperature)

# 定义您期望的数据结构。
class Joke(BaseModel):
setup: str = Field(description="设置一个笑话的问题")
punchline: str = Field(description="解答笑话的答案")

# 您可以使用Pydantic轻松添加自定义验证逻辑。
@validator('setup')
def question_ends_with_question_mark(cls, field):
if field[-1] != '?':
raise ValueError("问题格式错误!")
return field

# 设置解析器并将指令注入到提示模板中。
parser = PydanticOutputParser(pydantic_object=Joke)

prompt = PromptTemplate(
template="回答用户的查询。\n{format_instructions}\n{query}\n",
input_variables=["query"],
partial_variables={"format_instructions": parser.get_format_instructions()}
)

# 准备一个查询,用于提示语言模型填充数据结构。
joke_query = "告诉我一个笑话。"
_input = prompt.format_prompt(query=joke_query)

output = model(_input.to_string())

parser.parse(output)

输出结果:

Joke(setup='为什么小鸡要过马路?', punchline='为了到达另一边!')