Prompt是LLM中一个很重要的部分,诞生了许多Prompt工程师。这足以证明这是大模型中的核心组件。 Langchain的提供了以下功能:
- 模板管理:你可以书写一系列模板,然后挖空,选择不同的内容填入
- 变量提取和检查:会自动检查你是否忘记或者填充错误
- 模型切换:切换不同模型无需切换模板
- 输出解析:可以加入对输出格式的定义,同时也可以格式化输出的内容。
1. 输入解析
我们可以通过PrompotTemplate来生成一个提示模板
# 导入LangChain中的提示模板
from langchain.prompts import PromptTemplate
# 创建原始模板
template = """您是一位专业的鲜花店文案撰写员。\n
对于售价为 {price} 元的 {flower_name} ,您能提供一个吸引人的简短描述吗?
"""
# 根据原始模板创建LangChain提示模板
prompt = PromptTemplate.from_template(template)
# 打印LangChain提示模板的内容
print(prompt)
这里我们首先声明了一个挖空的字符串,然后通过from_template便生成了一个模板。之后我们每次只需要根据不同的需求,实例化模板就可以。例如:
input = prompt.format(flower_name=["玫瑰"], price='50')
2. 输出解析
输出解析分为两部分,第一部分负责在输入prompt里给模型定义好输出格式,其实就是用规范化的语言,告诉模型要如何输出。第二部分就是把输出的内容,转换为需要的格式。第二部分基本不涉及LLM,例如把大模型输出的字符串格式的Json转换成真正的Json。
2.1 在prompt中添加输出定义
# 导入结构化输出解析器和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})
让我们看一看,我们首先定义了一个回复格式response_schemas,这是一个回复列表,因为我们有多个回复格式要求,包含了两个ResponseSchema,然后我们根据response_schemas创建了一个输出解析器。我们通过这个解析器的get_formate_instructions()方法,得到了一个格式指令,让我们看看这是什么:
就是一个字符串,并且定义了模型要给我们输出什么,所以这个方法其实很简单,就是把原本人为要写的东西,LangChain里自己写了一套,但是官方的get_format_instructions()是英文,我不知道在中英混杂的prompt中,这是否会影响LLM性能。
这就是生成最终的prompt,其实就是在我们的prompt最后加上了{format_instructions}
然后我们第二次使用output_parser,除了可以生成输出格式指令,还可以使用parse来解析输出,模型只能输出字符串,output_parser.parse可以将其转换成真正的json。
input = prompt.format(flower_name=flower, price=price)
print(input)
# 获取模型的输出
output = model.invoke(input)
# 解析模型的输出(这是一个字典结构)
parsed_output = output_parser.parse(output.content)