Skip to main content

结构化输出解析器

当您想要返回多个字段时,可以使用此输出解析器。虽然Pydantic/JSON解析器更强大,但我们最初尝试了仅具有文本字段的数据结构。

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

在这里,我们定义了要接收的响应模式。

response_schemas = [  
ResponseSchema(name="answer", description="回答用户的问题"),
ResponseSchema(name="source", description="用于回答用户问题的来源,应为一个网站。")
]
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)

现在,我们获取一个包含响应格式化指令的字符串,然后将其插入到我们的提示中。

format_instructions = output_parser.get_format_instructions()  
prompt = PromptTemplate(
template="尽可能好地回答用户的问题。\n{format_instructions}\n{question}",
input_variables=["question"],
partial_variables={"format_instructions": format_instructions}
)

现在,我们可以使用它来格式化要发送给语言模型的提示,然后解析返回的结果。

model = OpenAI(temperature=0)  

_input = prompt.format_prompt(question="法国的首都是什么?")
output = model(_input.to_string())

output_parser.parse(output)
    {'answer': 'Paris',
'source': 'https://www.worldatlas.com/articles/what-is-the-capital-of-france.html'}

以下是在聊天模型中使用此功能的示例。

chat_model = ChatOpenAI(temperature=0)  

prompt = ChatPromptTemplate(
messages=[
HumanMessagePromptTemplate.from_template("尽可能好地回答用户的问题。\n{format_instructions}\n{question}")
],
input_variables=["question"],
partial_variables={"format_instructions": format_instructions}
)

_input = prompt.format_prompt(question="法国的首都是什么?")
output = chat_model(_input.to_messages())

output_parser.parse(output.content)
    {'answer': 'Paris', 'source': 'https://en.wikipedia.org/wiki/Paris'}