我们之前在书写的时候给模板生成时加入了partial_variables,其中声明了提示信息
{“format_instructions”: format_instructions }
之后在使用prompt的时候,可以看出其加入了输入模板的提示
您是一位专业的鲜花店文案撰写员。
对于售价为 50 元的 玫瑰 ,您能提供一个吸引人的简短描述吗? The output should be a markdown code snippet formatted in the following schema, including the leading and trailing ““`json” and ““`”: “`json { “description”: string // 鲜花的描述文案 “reason”: string // 问什么要这样写这个文案 } |
上面的提示就是在告诉模型,需要在输出的时候follow如上的schema
那么创建模板的时候,这个提示的生成,就是我们本章的重点
在讲解模板的创建之前,我们可以看下OpenAI的官方文档在使用的时候给出的建议
分别是:
1. 写出清晰的指示
2. 给模型提供参考
3. 将复杂任务拆分为子任务
4. 给GPT时间思考
5. 使用外部工具
6. 反复迭代问题
那么现在我们针对的是前两点,分别是写出清晰的指示,给模型提供参考
那么我们就看下常见的提示模板类型
常见的主要有以下几类
首先是Prompt Template
这是最为简单的String提示模板,之前也用过
from langchain import PromptTemplate
template = “””\ 你是业务咨询顾问。 你给一个销售{product}的电商公司,起一个好的名字? “”” prompt = PromptTemplate.from_template(template) print(prompt.format(product=”鲜花”)) |
主要是利用其中提供的format能力,将文本模板和变量相结合,从而创建出input传递给模型。
其次是ChartPromptTemplate
主要是配合Chat模型使用的提示模板,主要是在模板中包含了不同的角色,比如system,user,assistant,这些角色我们在第二章讲了,那么围绕着角色我们来看下如何使用Chat模板。
首先是一个system角色的prompt
template=”你是一位专业顾问,负责为专注于{product}的公司起名。”
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
然后是user的prompt
human_template=”公司主打产品是{product_detail}。”
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
之后就可以利用ChartPrompt Template进行模板生成了
prompt_template = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
prompt = prompt_template.format_prompt(product=”鲜花装饰”, product_detail=”创新的鲜花设计。”).to_messages()
这样我们就实现了对Chat模型的提示
之后是FewShot提示的使用
不过在说之前,我们需要了解FewShot的概念
在大模型之中,存在几个概念,FewShot和ZeroShot,关于这个概念的理解,可以如下
比如我对孩子说吃一个水果吧,可能孩子不理解什么是水果,这时候我给其举例,说苹果,香蕉就是水果
这时候孩子就明白了水果的基本概念,这种举例,就是Few-Shot
当然,可能有孩子天赋异禀,他从之前的知识积累之中就知道了什么是水果,不需要我们举例就知道什么是水果,这种称为Zero-shot
那么在模型使用中,就有这Few-Shot和Zero-Shot的概念
比如我们可以准备一些示例给模型,帮助其作为正确的响应,这就是Few-Shot
而不准备任何提示,只给出任务描述,就是Zero-Shot
那么开始介绍关于FewShotPromptTemplate的使用
首先是准备一些示例样本
# 1. 创建一些示例
samples = [ { “flower_type”: “玫瑰”, “occasion”: “爱情”, “ad_copy”: “玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。” }, { “flower_type”: “康乃馨”, “occasion”: “母亲节”, “ad_copy”: “康乃馨代表着母爱的纯洁与伟大,是母亲节赠送给母亲的完美礼物。” }, { “flower_type”: “百合”, “occasion”: “庆祝”, “ad_copy”: “百合象征着纯洁与高雅,是你庆祝特殊时刻的理想选择。” }, { “flower_type”: “向日葵”, “occasion”: “鼓励”, “ad_copy”: “向日葵象征着坚韧和乐观,是你鼓励亲朋好友的最好方式。” } ] |
上面的数组中,存在着多个dict,对应的含义有 花的类型,花语,和广告文案
我们就要讲这些作为Few-shot输入到模型之中
首先我们创建一个普通的模板
prompt_sample = PromptTemplate(input_variables=[“flower_type”, “occasion”, “ad_copy”],
template=”鲜花类型: {flower_type}\n场合: {occasion}\n文案: {ad_copy}”)
然后我们利用普通模板和示例创建出FewShotPromptTemplate
from langchain.prompts.few_shot import FewShotPromptTemplate
prompt = FewShotPromptTemplate(
examples=samples,
example_prompt=prompt_sample,
suffix=”鲜花类型: {flower_type}\n场合: {occasion}”,
input_variables=[“flower_type”, “occasion”]
)
之后的使用和普通的prompt一样
result = model(prompt.format(flower_type=”野玫瑰”, occasion=”爱情”))
print(result)
不过对于FewShot这种使用方式来说,一次性把所有的示例发给模型是不现实而且低效的
所以推荐搭配示例选择器来一并使用
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain.vectorstores import Qdrant from langchain.embeddings import OpenAIEmbeddings example_selector = SemanticSimilarityExampleSelector.from_examples( samples, OpenAIEmbeddings(), Qdrant, k=1 ) # 创建一个使用示例选择器的FewShotPromptTemplate对象 prompt = FewShotPromptTemplate( example_selector=example_selector, example_prompt=prompt_sample, suffix=”鲜花类型: {flower_type}\n场合: {occasion}”, input_variables=[“flower_type”, “occasion”] ) print(prompt.format(flower_type=”红玫瑰”, occasion=”爱情”)) |
我们首先创建了一个SemanticSimilarityExampleSelector对象
并且将sample传递给了他
在此之后我们利用这个selecotr创建了一个FewShotPromptTemplate对象
之后就是正常的使用了,利用模板得到的input为
鲜花类型: 玫瑰
场合: 爱情
文案: 玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。
鲜花类型: 红玫瑰
场合: 爱情
因为红玫瑰和玫瑰很相似,所以Selector选择使用了玫瑰来进行构建
总结一下,Few-Shot提示可以有效的增强模型回答的质量