背景
最近听了八叉的一个ChatGPT讲座,讲的是如何将ChatGPT训练成领域专家,这样我们就可以用它来解决该领域的各种问题。
整个讲座中最让我印象深刻的就是训练方法,它是通过让ChatGPT向我们提问,然后由我们给出答案的方式进行训练。这和我日常使用ChatGPT的方法完全相反。
训练方法
第一步:输入已知需求
我们需要把当前已知的需求输入给ChatGPT。想象一下,当我们需要别人完成一项任务时,要做的第一件事就是向其介绍任务的基本情况。
第二步:让ChatGPT提问
在输入已知需求后,我们需要确认ChatGPT是否理解需求。这里最重要的是,要让ChatGPT在不理解需求时提出问题。这就像,在我们介绍完任务的基本情况后,总要问上一句,“有没有问题?”。
这是最关键的一步。ChatGPT能够帮助我们发现已知需求中的遗漏点,这通常能够引起我们更深层次的思考。
第三步:回答问题并再次让ChatGPT提问
在ChatGPT提出问题后,我们要先给出答案,然后回到第二步,看ChatGPT是否还有问题。这就像,在我们回答完别人的问题后,总要问上一句,“还有问题吗?”。
第四步:重复上述步骤直到ChatGPT没有问题
不断的重复第二步和第三步,直到ChatGPT没有任何问题。这是一个由扩散到收敛的过程,刚开始时问题会很多,但随着信息输入的增多,问题会越来越少。
第五步:输出完整需求
在ChatGPT没有任何问题后,我们可以让其输出一份它理解的完整需求。这份需求就是我们的领域模型,在输入该模型后,ChatGPT可以更加准确的解决该领域内的问题。
示例
基于上述训练方法,我让ChatGPT帮我完善了一个爬虫程序的需求。
已知需求
在已知需求中,我对架构,技术栈和业务逻辑做了描述。
在需求描述完成后,我让ChatGPT在不理解或需要澄清时进行提问。
第一轮提问
ChatGPT第一轮问了三个问题
- 在URL不能访问或返回错误时,程序该如何处理?
- 如何实现定时任务?是使用程序外部的定时任务还是程序内部的定时任务?
- 如何对S3上的文件进行命名?
第三个问题我没有考虑过,这是ChatGPT找到的第一个遗漏点
第二轮提问
ChatGPT第二轮问了六个问题
- 是否支持同时爬取多个URL?
- 在S3上传失败时,程序该如何处理?
- 如何获取S3的鉴权信息?
- 上传到S3的文件是否有大小限制?如果有,限制是多大?
- 在自动爬取时,我们是否需要给用户返回信息?自动爬取是否是一个后台进程?
- 如果一次爬取的时间超过了5分钟,程序该如何处理?(在原始需求里,自动爬取的时间间隔是5分钟)
第四个和第六个问题我没有考虑过,这次ChatGPT帮我找到了两个遗漏点。
第三轮提问
ChatGPT第三轮问了六个问题
- 如果程序关闭时爬取操作正在进行,是否要停止爬取操作?
- 如果S3上传失败,是否需要重试?如果要,重试几次?
- 自动爬取的时间间隔是否可配置?还是固定在5分钟?
- 程序是否需要支持一些特定的返回值?例如301。
- 程序是否需要对一些异常做特殊处理?
- 程序使用的是哪种日志框架?
第一个,第二个和第四个问题我没考虑过,这次ChatGPT帮我找到了三个遗漏点。
第四轮提问
ChatGPT第四轮问了六个问题
- 是否需要支持HTTPS?
- 爬取时是否有不同的请求方法?例如POST或PUT。
- 爬取时是否需要设置HTTP Header?例如Authorization。
- 爬取时是否需要设置查询参数?如果需要,S3的文件名要如何生成?
- 错误消息的格式是什么?
- 程序是否需要支持不同的S3区域?
第一个,第二个,第三个和第四个问题我没有考虑过,这次ChatGPT帮我找到了四个遗漏点。
第五轮提问
ChatGPT第五轮只问了一个问题
- 在爬取时是否需要限速?例如,如果某个网站对每分钟的请求数量有限制,我们是否需要处理?
这个问题我已经考虑过,但没有写在已知需求里
完整需求
在没有问题后,ChatGPT输出了它所理解的完整需求
总结
在我第一次听到这种训练方法时,我其实不太相信ChatGPT的提问能够收敛,但事实胜于雄辩,它不但能够收敛,而且还可以找到非常重要的遗漏点,让需求更加完备。