首页 > 编程语言 >面向Java开发者的ChatGPT提示词工程(4)明确步骤、GPT自己找解决方案

面向Java开发者的ChatGPT提示词工程(4)明确步骤、GPT自己找解决方案

时间:2024-01-31 17:47:33浏览次数:24  
标签:Java 概要 提示 GPT ChatGPT 解答 String

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

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

接下来,我们将继续了解第二个关键原则:给 GPT 一定的“思考”时间

GPT 一定的“思考”时间

当 GPT 匆忙给出错误结论时,我们可以考虑重新构思问题,并要求 GPT 在给出最终答案之前提供一系列相关的推理过程。就像人类一样,如果我们给予 GPT 一个过于复杂的任务,要求它在短时间内或者用较少的词语来完成,那么它很可能会随意猜测,进而导致错误答案的产生。实际上,人也会在类似情况下犯错误。举个例子,如果我们让一个人在没有足够时间来计算复杂数学问题的情况下,要求其给出答案,那么他们很可能也会出错。

明确任务完成所需的步骤

第一个策略是明确任务完成所需的步骤。我们用以下的例子阐释:

 public static void main(String[] args) {
     String text = "我说道:“爸爸,你走吧。”\n"
             + "他望车外看了看,说:“我买几个橘子去。你就在此地,不要走动。”\n"
             + "我看那边月台的栅栏外有几个卖东西的等着顾客。走到那边月台,须穿过铁道,须跳下去又爬上去。父亲是一个胖子,走过去自然要费事些。我本来要去的,他不肯,只好让他去。\n"
             + "我看见他戴着黑布小帽,穿着黑布大马褂,深青布棉袍,蹒跚地走到铁道边,慢慢探身下去,尚不大难。可是他穿过铁道,要爬上那边月台,就不容易了。"
             + "他用两手攀着上面,两脚再向上缩;他肥胖的身子向左微倾,显出努力的样子。这时我看见他的背影,我的泪很快地流下来了。我赶紧拭干了泪。怕他看见,也怕别人看见。\n"
             + "我再向外看时,他已抱了朱红的橘子往回走了。过铁道时,他先将橘子散放在地上,自己慢慢爬下,再抱起橘子走。到这边时,我赶紧去搀他。"
             + "他和我走到车上,将橘子一股脑儿放在我的皮大衣上。于是扑扑衣上的泥土,心里很轻松似的。过一会儿说:“我走了,到那边来信!”我望着他走出去。"
             + "他走了几步,回过头看见我,说:“进去吧,里边没人。”等他的背影混入来来往往的人里,再找不着了,我便进来坐下,我的眼泪又来了。\n";

     String prompt = "按照如下步骤完成:\n"
             + "第一步,将三个反引号之间的文本总结为一句话的概要。\n"
             + "第二步,把概要翻译成英语。\n"
             + "第三步,列出英语概要中出现的人物。\n"
             + "第四步,以JSON格式输出,包括以下字段:english_summary、persons_num。\n"
             + "每个步骤按行输出。\n"
             + "```%s```";
     String response = getCompletion(String.format(prompt, text));
     System.out.println(response);
 }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

我们会给出一段父亲给儿子买橘子的故事段落,然后让 GPT 完成一系列任务,包括总结这段文字、翻译成英语、列出英语总结中的每个人物,并输出一个包含英语总结和人物数量的JSON对象。输出结果如下:

概要:一个人送父亲去买橘子,父亲穿过铁道回来时费力,他看到父亲的背影很感动,父亲走后他哭了。
English summary: A person sends his father to buy oranges. When the father returns, he struggles to climb back over the railway. The person is moved by his father's efforts and cries when he leaves.
Persons: the person, the father
JSON输出:
{
    "english_summary": "A person sends his father to buy oranges. When the father returns, he struggles to climb back over the railway. The person is moved by his father's efforts and cries when he leaves.",
    "persons_num": 2
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

有趣的是,英文概要和人物的说明都是英文的,这可能不是我想要的。我们用另一个提示词来完成同样的任务。在这个提示词中,我使用了一种我很喜欢使用的格式,来指定 GPT 的输出结构:

 public static void main(String[] args) {
     String text = "我说道:“爸爸,你走吧。”\n"
             + "他望车外看了看,说:“我买几个橘子去。你就在此地,不要走动。”\n"
             + "我看那边月台的栅栏外有几个卖东西的等着顾客。走到那边月台,须穿过铁道,须跳下去又爬上去。父亲是一个胖子,走过去自然要费事些。我本来要去的,他不肯,只好让他去。\n"
             + "我看见他戴着黑布小帽,穿着黑布大马褂,深青布棉袍,蹒跚地走到铁道边,慢慢探身下去,尚不大难。可是他穿过铁道,要爬上那边月台,就不容易了。"
             + "他用两手攀着上面,两脚再向上缩;他肥胖的身子向左微倾,显出努力的样子。这时我看见他的背影,我的泪很快地流下来了。我赶紧拭干了泪。怕他看见,也怕别人看见。\n"
             + "我再向外看时,他已抱了朱红的橘子往回走了。过铁道时,他先将橘子散放在地上,自己慢慢爬下,再抱起橘子走。到这边时,我赶紧去搀他。"
             + "他和我走到车上,将橘子一股脑儿放在我的皮大衣上。于是扑扑衣上的泥土,心里很轻松似的。过一会儿说:“我走了,到那边来信!”我望着他走出去。"
             + "他走了几步,回过头看见我,说:“进去吧,里边没人。”等他的背影混入来来往往的人里,再找不着了,我便进来坐下,我的眼泪又来了。\n";

     String prompt = "按照如下步骤完成:\n"
             + "第一步,将三个反引号之间的文本总结为一句话的概要。\n"
             + "第二步,把概要翻译成英语。\n"
             + "第三步,列出英语概要中出现的人物。\n"
             + "第四步,以JSON格式输出,包括以下字段:english_summary、persons_num。\n"
             + "用以下格式回答:\n"
             + "中文概要:<总结的概要>\n"
             + "英文概要:<英语概要>\n"
             + "人物:<英语概要中出现的人物>\n"
             + "JSON:<english_summary、persons_num的JSON格式输出>\n"
             + "```%s```";
     String response = getCompletion(String.format(prompt, text));
     System.out.println(response);
 }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

在这个提示词中,我们在询问了类似的东西,提示词的开头是一样的。然后我们要求 GPT 使用中文概要、英文概要、人物和JSON的格式。我们运行以后的输出:

中文概要:父亲买橘子,儿子送行,父亲过铁道时艰难,儿子看着流泪。
英文概要:Father went to buy oranges, son saw him off. Father had difficulty crossing the railway, son cried. 
人物:Father, son
JSON:{"english_summary": "Father went to buy oranges, son saw him off. Father had difficulty crossing the railway, son cried.", "persons_num": 2}
 
  • 1
  • 2
  • 3
  • 4

正如你所看到的,GPT 使用了我们要求的格式。我们已经给它了文本,然后它给我们了中文概要、英文概要、人物和JSON。

在匆忙得出结论之前,指示 GPT 自己找出解决方案

我们下一个策略是:在匆忙得出结论之前,指示 GPT 自己找出解决方案。 有时候当我们明确指示 GPT 在得出结论之前先理出自己的解决方案时,我们会得到更好的结果。
这个策略跟我们之前讨论的一样,就是给 GPT 一些时间去解决问题,而不是直接说答案对不对,就像人一样。

在下面的例子中,我们要求 GPT 判断学生的解答是否正确。

 public static void main(String[] args) {
     String prompt = "判断学生的解答是否正确。\n"
             + "问题:\n"
             + "《红岩》一共有288页,小明每天读36页书,几天可以读完《红岩》?\n\n"
             + "学生解答:\n"
             + "288 / 36 = 10(天)\n"
             + "小明10天可以读完《红岩》。";
     String response = getCompletion(prompt);
     System.out.println(response);
 }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

这是一个数学应用题,然后是学生的解答。学生的解答实际上是错误的,因为288 / 36等于 8,不是10。让我们运行一下看看:

学生的解答是正确的。
 
  • 1

如果你只是读一下学生的解答,你会发现这个解答看起来是正确的。因此,GPT 只是像我一样粗略地阅读了一下,就同意了学生的解答。

我们优化一下提示词,可以让 GPT 先解答这个问题,然后再比较自己的解答和学生的解答:

public static void main(String[] args) {
    String prompt = "判断学生的解答是否正确。\n"
            + "按照如下步骤完成:\n"
            + "第一步,你对这个问题进行解答。\n"
            + "第二步,将你的解答与学生的解答进行比较,并评估学生的解答是否正确。\n"
            + "在你自己解答问题之前,不要确定学生的解答是否正确。\n"
            + "用以下的格式回答:\n"
            + "正确解答:<你的解题步骤和解答>\n"
            + "学生的答案和你的答案的比较:<一样或者不一样>\n"
            + "学生答案的判断结果:<正确或者错误>\n"
            + "问题:\n"
            + "《红岩》一共有288页,小明每天读36页书,几天可以读完《红岩》?\n\n"
            + "学生解答:\n"
            + "288 / 36 = 10(天)\n"
            + "小明10天可以读完《红岩》。";
    String response = getCompletion(prompt);
    System.out.println(response);
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

我们在这个提示中告诉模型什么?它的任务是确定学生的解答是否正确。为了完成任务做以下步骤: 首先,解决自己的问题。然后比较你的解答和学生的解答,评估学生的解答是否正确。在你自己解决问题之前,不要决定学生的解答是否正确。一定要非常清楚,确保你自己解决了这个问题。因此,我们使用了相同的技巧来优化了提示词。

运行结果如下:

正确解答:288÷36=8(天)
学生的答案和你的答案的比较:不一样
学生答案的判断结果:错误
 
  • 1
  • 2
  • 3

总结

我们了解第二个关键原则:给 GPT 一定的“思考”时间。当 GPT 匆忙给出错误结论时,我们可以考虑重新构思问题,并要求 GPT 在给出最终答案之前提供一系列相关的推理过程。主要有以下两个策略:

  • 明确任务完成所需的步骤。
  • 在匆忙得出结论之前,指示 GPT 自己找出解决方案。

《面向Java开发者的ChatGPT提示词工程》总目录

     

标签:Java,概要,提示,GPT,ChatGPT,解答,String
From: https://www.cnblogs.com/oopo/p/17999765

相关文章

  • GPT自己找解决方案
    GPT自己找解决方案  前言今天突然突发奇想,就想要用java来调用chatget的接口,实现自己的聊天机器人,但是网上找文章,属实是少的可怜(可能是不让发吧)。找到了一些文章,但是基本都是通过调用别人的库来完成的,导入其他的jar还有不低的学习成本,于是就自己使用HttpClient5写了一个,......
  • 超级详细 JAVA 对接 ChatGPT 教程,实现自己的AI对话小助手
    1    前言大家好,由于近期需要对接了ChatGPTAPI所以特地记录下来,据介绍该模型是和当前官网使用的相同的模型,如果你还没体验过ChatGPT,那么今天就教大家如何打破网络壁垒,打造一个属于自己的智能助手把。本文包括APIKey的申请以及网络代理的搭建,那么事不宜迟,我们现在开......
  • java开发的chatGPT机器人系统
      ChatGPT机器人发展趋势:  更加个性化:随着数据和技术的不断进步,ChatGPT机器人将能够更加准确地理解用户的需求和偏好,并提供更加个性化的回复和服务。  多语言支持:随着ChatGPT在各个国家和地区的普及,对多语言支持的需求也越来越高。未来的ChatGPT机器人将支持更多......
  • ChatGPT全栈开发实战:从需求分析到数据可视化,一站式指南助你快速构建全面应用
    《ChatGPT全栈开发实战:从需求分析到数据可视化,一站式指南助你快速构建全面应用》是一本旨在引领我们进入全栈开发世界的综合指南。通过结合强大的ChatGPT技术和全栈开发的实践,我们将探索需求分析、后端开发、前端开发、测试、运维、算法优化、数据库、网络安全、人工智能、自然......
  • 关于 java如何集成chatgpt,如何开发接口,如何集成vue前端界面
    Java如何集成ChatGPT,如何开发接口,如何集成Vue前端界面随着人工智能技术的不断发展,聊天机器人已经成为了人们日常生活中不可或缺的一部分。ChatGPT是一种基于深度学习的聊天机器人技术,它可以通过学习大量的语料库来生成自然流畅的对话。本文将介绍如何使用Java语言集成ChatGPT,开......
  • 如何用ChatGPT使开发效率提高50%以上?
    简介  ChatGPT是一个大型语言模型,由OpenAI开发。它被训练用于进行对话式交互,能够理解和生成自然语言文本。ChatGPT可以用于多种任务和场景,包括但不限于:智能助手、创意生成、语言学习、编程辅助等。ChatGPT的优势在于它的广泛知识和对多个领域的理解。它可以利用其训练数据中......
  • 基于Python开发ChatGPT应用
    ChatGPT是目前非常热门的一种人工智能模型,它是基于深度学习技术的一种针对自然语言处理的算法。ChatGPT的应用非常广泛,可以应用于聊天机器人、文本生成、翻译、自动化等多个领域。本文将介绍如何使用Python开发一个基于ChatGPT模型的聊天机器人应用。 1.ChatGPT简介......
  • 同时使用300万个GPT是什么体验?ChatGPT新上线@功能
    据ChatGPT特邀灰度用户介绍,ChatGPT内测推出了“GPT@Mentions”功能,允许用户使用“@”标签+GPTs的名称来内联GPT商店中的任意一款GPTs,实现在同一对话窗口中与多个定制的GPT模型交互,就像将多个高级智能代理集成到您的私人助手中,每个代理都擅长解决特定的问题。目前GPT商店超300万个G......
  • Java字符串池(String Pool)深度解析
    在工作中,String类是我们使用频率非常高的一种对象类型。JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存空间,这就是我们今天要讨论的核心,即字符串池(StringPool)。字符串池由String类私有的维护。   我们知道,在Java中有两种创建字符串对象的方式:1......
  • 在项目中如何避免Java中的内存泄漏和解决内存泄漏问题
    内存泄漏(MemoryLeak)是指程序在动态分配内存后,由于某种原因没有释放这块内存,导致这块内存无法再被使用的现象。在Java中,内存泄漏通常指的是程序中存在一些不再使用的对象或数据结构仍然保持对内存的引用,从而导致这些对象无法被垃圾回收器回收,最终导致内存占用不断增加,进而影响程序......