有一篇文章概述了先进的prompt工程技术:https://luxiangdong.com/2023/08/08/advprompt/
一些作品探讨了直接修改promptEmbedding的prompt工程策略(即,每个token的Embeddings列表)。换句话说,这些作品并不直接修改prompt的单词,而是使用梯度下降等规则更新promptEmbeddings。这方面的主要工作概述如下:
- AutoPrompt 将原始prompt输入与一组共享(跨所有输入数据)“触发tokens”相结合,这些令牌是通过基于梯度的搜索选择的,以提高性能。
- 前缀调优 在输入层和隐藏层的promptEmbedding中添加几个“前缀”tokens,然后使用梯度下降作为参数高效的微调策略训练该前缀的参数(保持模型参数固定)。
- Prompt Tuning 类似于前缀调优,但前缀tokens只添加到输入层。这些tokens对语言模型解决的每个任务进行了微调,允许前缀tokens为给定任务调整模型。
- P-Tuning向模型的输入层添加了特定于任务的锚定tokens,但允许将这些tokens放置在任意位置(例如,prompt的中间),使该方法比前缀调优更灵活。
注意:所有这些方法(如下所示)都探索向语言模型添加“软”tokens,这些语言模型在目标数据集上进行监督微调。值得注意的是,这些技术不能用于只能通过付费API访问的语言模型(例如,OpenAI API)
其中AutoPrompt的方法
看图说步骤
① 定义一个任务,其中需要插入一个Prompt <INSERT>
,使得规定的输入能得到规定的输出。
② 面对多个候选的Prompt,计算输出的对数似然性来作为分数
③ 得到分数后排序获得最佳Prompt
④ 最佳Prompt作为输入,得到相似的Prompt
⑤ 用相似的Prompt再次打分,得到最佳Prompt的变体。再次打分得到更好的Prompt
整个过程如下