使用 FewShotPromptTemplate
什么是FewShot
Few-Shot(少样本)、One-Shot(单样本)和与 Zero-Shot(零样本)的概念都起源于机器学习。
在[提示工程](Prompt Engineering)中,Few-Shot 和 Zero-Shot 学习的概念也被广泛应用。在 [Few-Shot]学习中,模型会被给予几个示例,以帮助模型理解任务,并生成正确的响应,而 [One-Shot]可以看作是一种最常见的 Few-Shot 。在 Zero-Shot 学习中,模型只根据任务的描述生成响应,不需要任何示例。
Few-Shot 在 prompt 中的作用是通过少量样本引导模型对特定任务进行学习和执行,例如通过提供少量风格或主题示例,引导模型产出具有相似风格或主题的创作,这样可以让大模型更加理解问题,提高大模型的输出质量。
而 Zero-Shot 学习设置中,模型只根据任务的描述生成响应,不需要任何示例。
Langchain 中的提示工程 | 🦜️🔗 Langchain
1. 创建示例样本
首先,创建一些示例,作为提示的样本。其中每个示例都是一个字典,其中键是输入变量,值是这些输入变量的值。
# 1. 创建一些示例
samples = [
{
"flower_type": "玫瑰",
"occasion": "爱情",
"ad_copy": "玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。"
},
{
"flower_type": "百合",
"occasion": "生日",
"ad_copy": "百合,象征着希望和希望,是生日appropriate的礼物。"
},
{
"flower_type": "康乃馨",
"occasion": "farewell",
"ad_copy": "康乃馨,象征着bye-bye,是farewell appropriate的礼物。"
}
]
print(samples)
2. 创建提示模板
配置一个提示模板,将一个示例格式化为字符串。这个格式化程序应该是一个PromptTemplate对象。
template = "鲜花类型: {flower_type}\n场合: {occasion}\n文案: {ad_copy}"
prompt_sample = PromptTemplate(input_variables=["flower_type", "occasion", "ad_copy"],
template=template) # 提示模板
print(prompt_sample.format(**samples[0])) # 输出:鲜花类型: 玫瑰\n场合: 爱情\n文案: 玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。
定义模板:template 变量定义了一个字符串模板,其中包含三个占位符 {flower_type}、{occasion} 和 {ad_copy}。 创建提示模板对象:使用 PromptTemplate 类创建一个提示模板对象 prompt_sample,并传入输入变量和模板字符串。 格式化并输出:调用 prompt_sample.format 方法,传入一个示例数据 samples[0],输出格式化的字符串。
3. 创建 FewShotPromptTemplate 对象
然后,通过使用上一步骤中创建的prompt_sample,以及samples列表中的所有示例, 创建一个FewShotPromptTemplate对象,生成更复杂的提示。
# 3. 创建一个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"]
)
print(prompt.format(flower_type="野玫瑰", occasion="爱情"))
输出
[{'flower_type': '玫瑰', 'occasion': '爱情', 'ad_copy': '玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。'}, {'flower_type': '百合', 'occasion': '生日', 'ad_copy': '百合,象征着希望和希望,是生日appropriate的礼物。'}, {'flower_type': '康乃馨', 'occasion': 'farewell', 'ad_copy': '康乃馨,象征着bye-bye,是farewell appropriate的礼物。'}]
鲜花类型: 玫瑰
场合: 爱情
文案: 玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。
鲜花类型: 玫瑰
场合: 爱情
文案: 玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。
鲜花类型: 百合
场合: 生日
文案: 百合,象征着希望和希望,是生日appropriate的礼物。
鲜花类型: 康乃馨
场合: farewell
文案: 康乃馨,象征着bye-bye,是farewell appropriate的礼物。
鲜花类型: 野玫瑰
场合: 爱情
可以看到,FewShotPromptTemplate是一个更复杂的提示模板,它包含了多个示例和一个提示。这种模板可以使用多个示例来指导模型生成对应的输出。目前我们创建一个新提示,其中包含了根据指定的花的类型“野玫瑰”和场合“爱情”。
4.调用大模型使用提示得到结果
# 将提示模板传递到模型中,以获得模型的输出。
# 设置API密钥,这是调用ChatZhipuAI服务所必需的
set_api_key()
# 实例化ChatZhipuAI类,指定模型为"glm-4",并设置温度参数为0.5
# 温度参数影响模型输出的随机性,较低的值使输出更确定
llm = ChatZhipuAI(model="glm-4", temperature=0.5)
print("_________________________________________")
# 使用模型生成文本,传入特定的花卉类型和场合作为提示
# 这里是将"野玫瑰"和"爱情"作为上下文,以激发与之相关的创意文本
print(llm.invoke(prompt.format(flower_type="野玫瑰", occasion="爱情")).content)
输出
_________________________________________
文案:野玫瑰,代表着自由而热烈的爱情,为你心中的狂野与激情发声,是向爱人表达不羁爱意的独特选择。
完整代码:
# 1. 创建示例样本
#
# 首先,创建一些示例,作为提示的样本。其中每个示例都是一个字典,其中键是输入变量,值是这些输入变量的值。
import os
from langchain.prompts.prompt import PromptTemplate
from langchain_community.chat_models import ChatZhipuAI
def set_api_key():
os.environ["ZHIPUAI_API_KEY"] = ""
"""Set the ZhipuAI API key from environment variable or prompt the user."""
if not os.getenv("ZHIPUAI_API_KEY"):
os.environ["ZHIPUAI_API_KEY"] = input("Enter your ZhipuAI API key: ")
# 1. 创建一些示例
samples = [
{
"flower_type": "玫瑰",
"occasion": "爱情",
"ad_copy": "玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。"
},
{
"flower_type": "百合",
"occasion": "生日",
"ad_copy": "百合,象征着希望和希望,是生日appropriate的礼物。"
},
{
"flower_type": "康乃馨",
"occasion": "farewell",
"ad_copy": "康乃馨,象征着bye-bye,是farewell appropriate的礼物。"
}
]
print(samples)
# 2. 创建提示模板
# 配置一个提示模板,将一个示例格式化为字符串。这个格式化程序应该是一个PromptTemplate对象。
template = "鲜花类型: {flower_type}\n场合: {occasion}\n文案: {ad_copy}"
prompt_sample = PromptTemplate(input_variables=["flower_type", "occasion", "ad_copy"],
template=template) # 提示模板
print(prompt_sample.format(**samples[0])) # 输出:鲜花类型: 玫瑰\n场合: 爱情\n文案: 玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。
# 3. 创建一个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"]
)
print(prompt.format(flower_type="野玫瑰", occasion="爱情"))
# 将提示模板传递到模型中,以获得模型的输出。
# 设置API密钥,这是调用ChatZhipuAI服务所必需的
set_api_key()
# 实例化ChatZhipuAI类,指定模型为"glm-4",并设置温度参数为0.5
# 温度参数影响模型输出的随机性,较低的值使输出更确定
llm = ChatZhipuAI(model="glm-4", temperature=0.5)
print("_________________________________________")
# 使用模型生成文本,传入特定的花卉类型和场合作为提示
# 这里是将"野玫瑰"和"爱情"作为上下文,以激发与之相关的创意文本
print(llm.invoke(prompt.format(flower_type="野玫瑰", occasion="爱情")).content)
使用示例选择器
如果我们的示例很多,那么一次性把所有示例发送给模型是不现实而且低效的。另外,每次都包含太多的Token也会浪费流量。
LangChain给我们提供了示例选择器,来选择最合适的样本。(注意,因为示例选择器使用向量相似度比较的功能,此处需要安装向量数据库,可以选择之前用过的Qdrant。)
下面,就是使用示例选择器的示例代码。
# 5. 使用示例选择器
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain_community.vectorstores import Qdrant
from langchain_community.embeddings import ZhipuAIEmbeddings
# 初始化示例选择器
example_selector = SemanticSimilarityExampleSelector.from_examples(
samples,
ZhipuAIEmbeddings(),
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 对象。这个对象的作用是根据语义相似性来选择最相关的示例,具体来说,它会计算示例与当前输入之间的余弦相似度,并选择与输入语义最相似的几个示例。
接着,我们创建了一个新的 FewShotPromptTemplate 对象。这个对象用于生成提示,并且我们传入了前面创建的 example_selector,使得它可以根据语义相似性自动选择最相关的示例来构建提示。
然后,我们使用这个模板生成了一个新的提示,因为我们需要创建的是关于 红玫瑰 的文案。此时,example_selector 会根据输入的关键词(“红玫瑰”)与示例之间的相似度来选择最相关的示例。通过计算余弦相似度,example_selector 找到了与“红玫瑰”最相关的示例(例如,"玫瑰")并将其作为参考。
最后,通过这个新的 FewShotPromptTemplate,我们避免了传递过多无关的示例,从而有效减少了Token的使用量,并让大模型能够更加高效地生成与目标文案相关的内容。
总结起来,关键点在于:通过语义相似性选择最相关的示例,避免将过多无关示例传递给大模型,既提高了生成内容的准确性,又优化了Token的使用。
下一节,我们将在探讨输出解析的同时,讲解另一种备受关注的提示技术,被称为“思维链提示”(Chain of Thought,简称CoT)。这种技术因其独特的应用方式和潜在的实用价值而引人注目。