我们之前在书写的时候给模板生成时加入了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提示可以有效的增强模型回答的质量

发表评论

邮箱地址不会被公开。 必填项已用*标注