面向Java开发者的ChatGPT提示词工程(3)

2023-09-01 16:48:01 浏览数 (1)

在之前的文章中,我们了解到了编写明确具体的指令关键原则的四种策略的其中两种:

  • 使用分隔符清楚地指示输入的不同部分。
  • 要求 GPT 结构化输出。

接下来,我们将继续了解编写明确具体的指令关键原则的另外两个策略:

  • 要求 GPT 检查是否满足条件。
  • 写示例时提示词要尽量少一些。

编写清晰明确的指令

要求 GPT 检查是否满足条件

如果任务做出了不一定满足的假设,那么我们可以告诉模型先检查这些假设,如果不满足,就指出这一点,并停止尝试完成整个任务。你还可以考虑潜在的边缘情况以及模型应该如何处理它们,以避免意外的错误或结果。比如:

代码语言:javascript复制
    public static void main(String[] args) {
        String text = "我说道:“爸爸,你走吧。”n"
                  "他望车外看了看,说:“我买几个橘子去。你就在此地,不要走动。”n"
                  "我看那边月台的栅栏外有几个卖东西的等着顾客。走到那边月台,须穿过铁道,须跳下去又爬上去。父亲是一个胖子,走过去自然要费事些。我本来要去的,他不肯,只好让他去。n"
                  "我看见他戴着黑布小帽,穿着黑布大马褂,深青布棉袍,蹒跚地走到铁道边,慢慢探身下去,尚不大难。可是他穿过铁道,要爬上那边月台,就不容易了。"
                  "他用两手攀着上面,两脚再向上缩;他肥胖的身子向左微倾,显出努力的样子。这时我看见他的背影,我的泪很快地流下来了。我赶紧拭干了泪。怕他看见,也怕别人看见。n"
                  "我再向外看时,他已抱了朱红的橘子往回走了。过铁道时,他先将橘子散放在地上,自己慢慢爬下,再抱起橘子走。到这边时,我赶紧去搀他。"
                  "他和我走到车上,将橘子一股脑儿放在我的皮大衣上。于是扑扑衣上的泥土,心里很轻松似的。过一会儿说:“我走了,到那边来信!”我望着他走出去。"
                  "他走了几步,回过头看见我,说:“进去吧,里边没人。”等他的背影混入来来往往的人里,再找不着了,我便进来坐下,我的眼泪又来了。n";
        String prompt = "你将得到一段三个反引号之间的文本。n"
                 "如果它包含一系列的步骤,请按以下格式重写这些步骤,然后只写出步骤:n"
                  "第一步:...n"
                  "第二步:...n"
                  "...n"
                  "第N步:...nn"
                  "如果文本不包含一系的步骤,则只需写“没有提供步骤”。n"
                  "```%s```";
        String response = getCompletion(String.format(prompt, text));
        System.out.println(response);
    }

可以看到提示词是:你将获得由三个引号分隔的文本。如果它包含一系列指令,请按以下格式重写这些指令,然后只写出步骤。如果文本不包含一系列指令,则只需写“未提供步骤”。看一下运行的结果:

代码语言:javascript复制
第一步:父亲要买橘子,让我在车站等他。
第二步:我看到卖东西的人在月台外,想去看看,但父亲不让。
第三步:父亲穿过铁道,要爬上月台,费了很大劲。
第四步:我看到父亲的背影,不禁流泪。
第五步:父亲买了橘子回来,我去搀他。
第六步:父亲把橘子放在我的衣服上,很开心。
第七步:父亲告别我,让我进去等车。
第八步:我看着父亲走远,再次流泪。

现在我要尝试在不同的文本上使用相同的提示词:

代码语言:javascript复制
public static void main(String[] args) {
    String text = "天空落着雨,灰蒙蒙的。一条笔直的柏油马路直直通到家门口,白墙红瓦,整个罩在微密的雨帘中,在雨水的冲洗下,愈显干净。" 
              "雨“啪”的一声落在屋檐上,汇成小流,沿着瓦槽留下来,在砖上留下一排排的小小的坑。" 
              "窗子雾蒙蒙的,氤氲着一层薄薄的水汽,雨水划过,拉出一道道纵横交错的痕迹,弯曲、纠缠、凌乱,剪不断却理还乱。" 
              "从窗子里,隐隐显出几个黑色的影子,一高一矮,像是被摆弄着的皮影一样,动着、比划着。";
    String prompt = "你将得到一段三个反引号之间的文本。n"
             "如果它包含一系列的步骤,请按以下格式重写这些步骤,然后只写出步骤:n"
              "第一步:...n"
              "第二步:...n"
              "...n"
              "第N步:...nn"
              "如果文本不包含一系的步骤,则只需写“没有提供步骤”。n"
              "```%s```";
    String response = getCompletion(String.format(prompt, text));
    System.out.println(response);
}

看一下运行的结果:

代码语言:javascript复制
没有提供步骤。

这段文本只是描述一个下雨的场景,里面没有任何步骤。如果我们使用之前使用过的相同提示词,而是在这个文本上运行它,那么GPT将尝试提取步骤。如果它找不到任何步骤,我们将要求它只说“没有提供步骤”。GPT确定第二段文本没有步骤,所以就输出了”没有提供步骤“。

写示例时提示词要尽量少一些

在要求GPT执行你想要执行的任务之前提供成功执行任务的示例,这时你的提示词要尽量少一些。我们来举一个例子:

代码语言:javascript复制
    public static void main(String[] args) {
        String prompt = "你的任务是用连贯的方式回答。n"
                  "学生:什么是坚持?n"
                  "老师:坚持就像一条河流,它源远流长,虽然在某些时候可能会受到阻碍,但它总是能够继续前行。n"
                  "学生:什么是耐心?";
        String response = getCompletion(prompt);
        System.out.println(response);
    }

在这个提示词中,我们告诉GPT它的任务是用问答的风格回答,我们有这样一个学生和老师之间的对话的例子,老师用一些隐喻回答学生的问题,因为GPT有这个少量提示的例子,它将以类似的风格回答下一个问题:

代码语言:javascript复制
老师:耐心就像一棵树,它需要时间和养分才能成长茁壮。虽然在等待的过程中可能会感到无聊或者焦虑,但只有耐心等待,才能看到最终的成果。

总结

以上就是编写明确具体的指令关键原则的四种策略:

  • 使用分隔符清楚地指示输入的不同部分。
  • 要求 GPT 结构化输出。
  • 要求 GPT 检查是否满足条件。
  • 写示例时提示词要尽量少一些。

在接下来的文章中,我们将继续了解第二个关键原则:给 GPT 一定的“思考”时间,尽请期待。

0 人点赞