9.4.3 Few-Shot Prompting技术
在本项目中,还可以使用其他技术可以帮助我们取得更好的摘要结果,其中之一就是称为Few-Shot Prompting。Few-Shot Prompting 是一种提示工程技术,它通过使用少量的示例(few examples)作为条件来引导模型生成期望的响应。这种方法特别适用于模型需要快速学习新任务但只有有限的标注数据可用的情况。在 Few-Shot Prompting 中,模型首先接收到一些与任务相关的示例,这些示例作为“提示”帮助模型理解接下来需要执行的任务类型。
请看下面的代码,使用 Few-Shot Prompting 技术来训练语言模型,以便它能够识别和生成与给定示例相似的响应。这段代码展示了引导模型生成具有特定情感和主题的文本的过程,模型被训练识别评论的情感(正面或负面)和主题(如电影或公园),并生成相应的标签。
messages_few_shot = [
{"role": "user",
"content": "This film was great, rich of details and with great actors."},
{"role": "assistant",
"content": "SENTIMENT: Positive.\nSUBJECT: Film"},
{"role": "user",
"content": "This park is dirty."},
{"role": "assistant",
"content": "SENTIMENT: Negative.\nSUBJECT: Park"},
{"role": "user",
"content": "This notebook is fantastic. I'm learning a lot"},
]
prompt_few_shot = pipe.tokenizer.apply_chat_template(messages_few_shot, tokenize=False, add_generation_prompt=True)
outputs_few_shot = pipe(
prompt_few_shot,
add_special_tokens=True,
do_sample=True,
temperature=0.1,
top_k=20,
top_p=0.3
)
print(outputs_few_shot[0]["generated_text"][len(prompt_few_shot):])
对上述代码的实现流程如下所示:
(1)准备 Few-Shot 示例:创建了一个名为 messages_few_shot 的列表,其中包含了几对用户评论和助手的标签响应。这些示例展示了不同的句子(用户评论)和相应的情感标签及主题(助手响应)。
(2)应用聊天模板:使用方法pipe.tokenizer.apply_chat_template将 messages_few_shot 转换成模型可以理解的格式。参数 tokenize=False 表示不对消息内容进行分词处理,而 add_generation_prompt=True 表示在生成文本时添加特殊的生成前提示。
(3)生成响应:使用 pipe 方法生成基于 Few-Shot 示例的响应,设置了多个参数来控制文本生成的过程,包括:
- add_special_tokens=True:确保在生成的文本中添加特殊令牌。
- do_sample=True:表示在生成文本时进行采样,增加多样性。
- temperature=0.1:控制生成文本时的随机性,较低的温度值会使模型生成更确定的结果。
- top_k=20:在生成每个令牌时,只考虑概率最高的 k 个选项。
- top_p=0.3:使用 top-p(nucleus)采样,只考虑累积概率超过 p 的部分。
(4)输出结果:使用 print 函数打印输出生成的文本。outputs_few_shot[0]["generated_text"] 获取了第一个生成的文本响应,并通过 len(prompt_few_shot): 排除了提示部分,只显示模型生成的内容。执行后会输出:
SENTIMENT: Positive.
SUBJECT: Notebook
The book is well-written and engaging.
由此可见,当前的模型成功地学会了通过少量示例来执行任务的方法,此过程使用了 apply_chat_template 方法。在没有明确要求的情况下,正确地推断出我们想要两行输出:一行指示情感,另一行指示句子的主题。
注意:
-
- 虽然使用 Few-Shot Learning 对我们的情景可能是可行的方法,但这将需要提供实际的Kaggle 写作摘要的示例作为输入,这可能会导致提示过于庞大的问题。考虑到文本长度可能会带来问题,应该坚持采用更简单的方法,专注于改进提示工程技巧。
- 为了使 Few-Shot Prompting 有效,模型需要在类似的任务上进行预训练,以便它可以理解和学习示例之间的关系。此外,选择与目标任务相关的示例是至关重要的,因为它们直接影响模型生成的质量和相关性。
9.4.4 关键参数总结
到目前为止,在生成文本摘要的过程中用到了几个关键的管道参数,这些参数对于控制模型输出的质量和风格至关重要。
- do_sample:当设置为 True 时,这个参数允许从整个词汇表的概率分布中选择下一个令牌的解码策略。与 num_beams 结合使用,可以控制不同的解码策略。您选择了 True 和 num_beams=1(默认值),这是多项式采样。这种策略允许模型在生成文本时有更多的随机性,但仍然保持了一定程度的多样性。
- temperature:这个参数控制生成文本时的随机性。temperature越低,结果越确定性,意味着更可能选择概率最高的令牌。我们选择了一个非常低的值,因为需要鼓励更事实性的响应,而不是创造性的响应。
- top_p:根据文档,这个参数控制令牌的采样。值越高,模型考虑更多可能的词(包括不太可能的词)的机会就越大。为了保持摘要的连贯性,我们选择了一个相对较低的值。
- top_k:这个参数与 top_p 结合使用,控制用于预测的令牌数量,用低值将有利于生成较少创造性的响应,这正是在本文本摘要任务中所需要的。