Prompt 工程

532 阅读6分钟

Prompt 工程

提示原则

依赖引入

message可以包含多个信息;

role可以设置用户类型:user、system、

import openai
import os
​
#环境变量中读取api_key
openai.api_key = os.environ.get("OPENAI_KPI_KEY")
#直接写 api_key
#openai.api_key = 'API_KEY'#Prompt
#可以添加多个message
def get_completion(prompt, model="")
    messages = [{"role":"user", "content":prompt}]
    response = openai.ChatCompletion.create{
        model = ""
        message = ["role":"user", "content":"什么是机器学习?"]
    }
    response.choices[0].message["content"]

One-shot && Few-shot提示方法

Few-shot提示方法:类似问题的问题+答案作为prompt的一部分进行输入。

在学习了第一个例子后,可以对第二个问题作出判断。发现Few-shot在提升模型逻辑能力方面起到一定的作用。

prompt_Few_shot2 = 'Q:“罗杰有五个网球,他又买了两盒网球,每盒有3个网球,请问他现在总共有多少个网球?” \
                  A:“现在罗杰总共有11个网球。” \
                  Q:“食堂总共有23个苹果,如果他们用掉20个苹果,然后又买了6个苹果,请问现在食堂总共有多少个苹果?” \
                  A:“现在食堂总共有9个苹果。” \
                  Q:“杂耍者可以杂耍16个球。一半的球是高尔夫球,一半的高尔夫球是蓝色的。请问总共有多少个蓝色高尔夫球?” \
                  A:'
​
def get_completion(prompt, model="")
    messages = [{"role":"user", "content":prompt}]
    response = openai.ChatCompletion.create{
        model = ""
        #message = ["role":"user", "content":"什么是机器学习?"]
        prompt = prompt_Few_shot2,
        max_tokens=1000,
    }
    response.choices[0].["text"].strip()

Zero-shot-Cot提示法

这种方法最早由东京大学和谷歌在论文《Large Language Models are Zero-Shot Reasoners》中提出。

Zero-shot-Cot:借助思维链提示法来解决这个问题:在提示词尾部追加一句“let's think step by step”,即可提高大模型推理能力。

其他

可以通过:进行问题的拆分并分段解答问题,然后第二阶段再进行答案的汇总来回答问题。

该论文(《Large Language Models are Zero-Shot Reasoners》)首次提出了利用大模型进行来嗯阶段推理的设想,第一个阶段先进行问题的拆分并分段解决问题,第二阶段进行答案的汇总。

作者通过测试验证,在实际使用过程中,Zero-shot-CoT要弱于Few-shot-CoT方法。

模型越大,CoT效果越小,换而言之,模型越大,CoT对模型“涌现能力”的激发效果越好。

Few-shot-CoT提示方法

Zero-shot-CoT是零样本提示的情况下通过修提示词后缀激发模型的思维链,而Few-shot-CoT则是通过编写思维链样本作为提示词,让模型学会思维链的推导方式,从而更好的完成推导任务。

该方法最早由谷歌团队在论文《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》中首次提出,也是这篇论文中思维链的概念被首次提出。

相比于Few-shot,Few-shot-CoT的不同之处只是在与需要在提示样本中不仅给出问题的答案、还同时需要给出问题推导的过程(即思维链),从而让模型学到思维链的推导过程,并将其应用到新的问题中。

prompt_Few_shot_CoT4 = 'Q:“罗杰有五个网球,他又买了两盒网球,每盒有3个网球,请问他现在总共有多少个网球?” \
                        A:“罗杰一开始有五个网球,又购买了两盒网球,每盒3个,共购买了6个网球,因此现在总共由5+6=11个网球。因此答案是11。” \
                        Q:“食堂总共有23个苹果,如果他们用掉20个苹果,然后又买了6个苹果,请问现在食堂总共有多少个苹果?” \
                        A:“食堂最初有23个苹果,用掉20个,然后又买了6个,总共有23-20+6=9个苹果,答案是9。” \
                        Q:“杂耍者可以杂耍16个球。一半的球是高尔夫球,一半的高尔夫球是蓝色的。请问总共有多少个蓝色高尔夫球?” \
                        A:“杂耍者总共能杂耍16个球,并且一半是高尔夫球,而且高尔夫球有一半是蓝色的。所以蓝色高尔夫球的数量是 8 ÷ 2 = 4,也就是说总共有4个蓝色的高尔夫球。” \
                        Q:“艾米需要4分钟能爬到滑梯顶部,然后需要花费1分钟滑下来,现在水滑梯将在15分钟后关闭,请问在关闭之前她能滑多少次?” \
                        A:'response_Few_shot_CoT = openai.Completion.create(
                        model="",
                        prompt=prompt_Few_shot_CoT2,
                        max_tokens=1000,
                        )
response_Few_shot_CoT2["choices"][0]["text"].strip()

单个的四个问题都能正确回答。

输入前三个问题的思维链作为提示次样本,第四个问题也能得到正确的解答。但是测试过程中,会有错误情况。也就是说,Few_shot_CoT方法虽然有效,但是并不是很稳定,如果想要得到稳定的正确答案,需要更高阶的提示方法。

根据《Large Language Models are Zero-Shot Reasoners》论文中提出的结论,从海量数据的测试结果来看,Few_shot_CoT比Zero_shot_CoT准确率更高。

重点强调了模型体量和思维链效果之间的关系,即模型越大,Few_shot_CoT应用效果越好

Cot改良方法:LEAST-TO-MOST-PROMPTING(LtM提示法)

谷歌提出CoT被实际验证能够大幅提升大语言模型的推理能力不久,来自谷歌的另一个团队在此基础上发表了另一篇重量级别论文《LEAST-TO-MOST PROMPTING ENABLES COMPLEX REASONING IN LARGE LANGUAGE MODELS》,并在其中提出了名位ieLeast-to-Most的提示方法。

该方法是截至目前围绕模型推理能力提升的最为有效的提示学习方法。

LtM提示方法提出的初衷是为了解决CoT提示方法泛化能力不足的问题—通过人工编写的思维链提示样本可能并不能够很好的前一到别的问题中,换言之,泛化能力不够。

提出:让大模型自己解决当前问题的思维链。先通过提示过程让模型找到解决该问题必须要分步解决哪几个问题,然后再通过一次解决这些问题来解决最原始的问题。再根据每个具体的问题生成解决问题的链路,从而能够更加精准的解决复杂推理问题。

prompt_Zero_shot_LtM1 = 'Q:“罗杰有五个网球,他又买了两盒网球,每盒有3个网球,请问他现在总共有多少个网球?”\
                         A:为了解决“罗杰总共又多少个网球?”这个问题,首先要解决的问题是'prompt_Zero_shot_LtM1 = openai.Completion.create(
                        model="text-davinci-003",
                        prompt=prompt_Zero_shot_LtM1,
                        max_tokens=1000,
                        )
​
prompt_Zero_shot_LtM1["choices"][0]["text"].strip()

总结

参考论文: