提示模板
prompt(提示)为实际语言模型的输入,最基本的构造方式如下: 首先定义一个f-string,它可以包含多个变量,以占位符的形式:
# 创建原始模板
template = """您是一位专业的鲜花店文案撰写员。\n 对于售价为 {price} 元的 {flower_name} ,您能提供一个吸引人的简短描述吗? """
之后,通过langchain的PromptTemplate来创建LangChain提示模板:
from langchain.prompts import PromptTemplate
# 根据原始模板创建LangChain提示模板
prompt = PromptTemplate.from_template(template)
提示模板的具体内容如下:
input_variables=['flower_name', 'price']
output_parser=None partial_variables={}
template='/\n您是一位专业的鲜花店文案撰写员。
\n对于售价为 {price} 元的 {flower_name} ,您能提供一个吸引人的简短描述吗?\n'
template_format='f-string'
validate_template=True
from_template是一个类方法,它允许我们直接从一个字符串模板中创建一个PromptTemplate对象 之后,通过:
prompt.format(flower_name=["玫瑰"], price='50')
的方式,可以实例化提示模板。
输出解析
LangChain提供的解析模型输出的功能,让我们能够更容易地从模型输出中获取结构化的信息,例如python字典等,之后可以由程序直接处理,或者通过json加载。 输出解析使用方法如下:
# 导入结构化输出解析器和ResponseSchema
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
# 定义我们想要接收的响应模式
response_schemas = [ ResponseSchema(name="description", description="鲜花的描述文案"), ResponseSchema(name="reason", description="问什么要这样写这个文案") ]
# 创建输出解析器
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
# 获取格式指示
format_instructions = output_parser.get_format_instructions()
# 根据原始模板创建提示,同时在提示中加入输出解析器的说明
prompt = PromptTemplate.from_template(prompt_template, partial_variables={"format_instructions": format_instructions})
首先定义输出结构,我们希望模型生成的答案包含两部分:鲜花的描述文案(description)和撰写这个文案的原因(reason)。所以我们定义了一个名为response_schemas的列表,其中包含两个ResponseSchema对象,分别对应这两部分的输出。 根据这个列表,可以通过StructuredOutputParser.from_response_schemas方法创建了一个输出解析器。 然后,通过输出解析器对象的get_format_instructions()方法获取输出的格式说明(format_instructions),再根据原始的字符串模板和输出解析器格式说明创建新的提示模板(这个模板就整合了输出解析结构信息)。再通过新的模板生成模型的输入,得到模型的输出。此时模型的输出结构将尽最大可能遵循我们的指示,以便于输出解析器进行解析。
得到模型的输出后,通过output_parser.parse(output) 把模型输出的文案解析成之前定义好的数据格式,也就是一个Python字典,这个字典中包含了description 和 reason 这两个字段的值。
探究:加入了partial_variables,也就是输出解析器指定的format_instructions之后的提示,为什么能够让模型生成结构化的输出? 首先,打印出此时的langchain prompt:
input_variables=['flower_name', 'price']
partial_variables={'format_instructions': 'The output should be a markdown code snippet formatted in the following schema, including the leading and trailing "```json" and "```":\n\n```json\n{\n\t"description": string // 鲜花的描述文案\n\t"reason": string // 问什么要这样写这个文案\n}\n```'} template='您是一位专业的鲜花店文案撰写员。\n对于售价为 {price} 元的 {flower_name} ,您能提供一个吸引人的简短描述吗?\n{format_instructions}'
实际上:
response_schemas = [ ResponseSchema(name="description", description="鲜花的描述文案"),
name="description"类似键值,而description="鲜花的描述文案"则类似对应的值,即期待模型填充的地方。