自然语言处理技术视角下的编程演进研究
作者: 陈凤妹 程显毅
摘要:人类想要与计算机沟通就对编程语言的语法和结构有一定的了解。随着自然语言处理技术的发展,让计算机听懂人类语言不再是梦想。ChatGPT的应用催生了Prompt(提示工程),Prompt可以直接使用自然语言表达用户的意图,大大降低了编程的门槛。文章从编程语言发展历程,了解Prompt原理和应用,在自然语言处理时代,编程的边界在扩大。
关键词:NLP; prompt;ChatGPT;编程语言;编程范式
中图分类号:TP318 文献标识码:A
文章编号:1009-3044(2024)27-0015-04
1 早期编程语言
目前编程语言有数百种,每种语言有其独特的特性,软件开发使用哪种编程语言,对软件性能、可读性和移植性都有影响,选择合适的语言不仅仅是个人偏好的问题。无论你在编程方面有无经验,选择一种合适的语言来学习至关重要。合适的语言将帮助你快速创建功能强大的应用系统。
编程语言是人类为了方便计算机理解和执行而创造的一种工具。随着计算机技术的不断发展,编程语言也在不断地发展和演变,如图1所示。
早期编程语言经历了“面向机器、面向过程、面向问题”三种编程范式。
1.1 面向机器的编程语言
1) 机器语言。
机器语言是第一代编程语言。所谓的机器语言,就是计算机能直接识别的语言格式,计算机属于电子元器件,最容易识别的两种状态就是“1”和“0”。例如:101代表数字5,其他的内容也是如此。
但对于程序员来讲,这差不多就相当于是在看“天书”。那么有没有办法能够让程序员更容易地读懂计算机中的数据呢?答案是肯定的!这就好比我们要和外国人交流,你听不懂外国人在讲什么,我们就可以找一个翻译,在程序中我们所找的这位“翻译官”,就是所谓的第二代语言。
2) 汇编语言。
第二代编程语言是汇编语言。这种语言相当于是对机器语言的封装,毕竟1010的组合太难记了,所以就产生了汇编这种中间层语言。
当然,汇编语言对于程序员来讲,也不是特别的友好,因为它的语法结构还有很大的改进空间。举个例子,用汇编语言做算数运算时,可以使用ADD代表加法运算,SUB代表减法运算,诸如此类。但如果能直接使用“+”“-”符号来进行计算,可读性方面则会更好,第三代编程语言应运而生。
1.2 面向过程的编程语言
从程序员的编码角度来说,去除了各种晦涩难懂的汇编语法,这就极大提高了程序员的开发效率。出现了大量的高级语言,主要是面向计算过程,它历史悠久,流传很广,有大量的已开发的软件库,拥有众多的用户, 为人们所熟悉和接受。属于这类语言的有 FORTRAN、COBOL、BASIC、ALGOL、C等。
这些高级语言都是属于第三代语言,也称为结构化编程范式或模块化编程范式,程序主要由三种基本程序结构构成:顺序结构、分支结构和循环结构,如图2所示。
给大家举个例子:如果我的钱多于100元,那么今天就打车上班。这个案例的C语言代码可以描述成下面的样子:
int money=500; //这是我钱包的500元
if(money>=100){ //判断钱大于100元,则进入{}执行语句
scanf("有钱,打车上班"); //执行打车的语法输出}
}
相信只要有一点C编程和英语基础,都能看懂上面的语法,所以高级语言相比前面的机器语言和汇编语言有更强的可读性、逻辑性。
1.3 面向问题的编程语言
什么是问题呢?需要解决的事情就是问题。一个问题可以由几个较小的问题组成,一个较小的问题也可以由更小的问题组成,直到那个小问题可以一步解决。
传统的面向过程编程要完成一项功能(大的问题)需要大量的代码,但是许多代码并不是直接和这项功能有关,而是用于完成细微的工作 (较小的问题)。以编写“邮件发送程序”为例子,编程者需要检查网络情况、连接服务器;又要编写界面,处理 用户动作,因此需要大量的代码。如果用面向过程的C语言编写,至少要100行代码,并且只有专业的人才能看懂,而用面向问题语言(如:Angela语言),只要用到一个“黑箱”:SENDEM,以及相关的参数(发件人账户用户名、发件人账户密码、收件人账户用户名、邮件标题、邮件正文、邮件附件),用三行代码就可以了:
Program SENDEMTEST
SENDEM:[发件人账户用户名],[发件人账户密码],[收件人账户用户名],[邮件标题],[邮件正文],[邮件附件]
END
面向问题的编程语言包括面向对象、函数式、声明式编程语言。
2 面向人工智能的编程语言
人工智能(Artificial Intelligence,AI) 旨在模拟和实现人类智能的理论和方法。它涉及对语言、学习、推理、问题解决和决策等人类智能的模拟和应用。在人工智能系统开发过程中,有几种主要的编程语言被广泛应用,本质上面向人工智能的编程语言也是面向问题的。
1)Python是目前人工智能领域最受欢迎的编程语言之一。Python语言简洁、易读易写,拥有丰富的第三方库和开发工具,使得它成了人工智能开发的首选语言。Python 的库和工具如Numpy、Pandas、Scikitlearn和TensorFlow等提供了强大的数据处理、机器学习和深度学习功能,能够帮助开发者快速实现各种人工智能算法。
2)R语言是专门用于统计分析和数据可视化的编程语言,也被广泛应用于人工智能领域。R语言提供了丰富的统计分析和机器学习的函数库,如caret、e1071和randomForest等,使得开发者可以方便地进行数据挖掘和建模。
除了上述的主要编程语言外,还有一些其他语言也在人工智能开发中得到了应用。例如,Lisp语言是最早用于人工智能研究和开发的编程语言之一,它的函数式编程特性使其适合于符号推理和专家系统的开发。而Prolog语言则主要用于逻辑推理和知识表示的领域。
总结起来,Python、R以及Lisp和Prolog等编程语言都在人工智能的开发中发挥着重要的作用。开发者可以根据自己的需求和项目特点选择合适的编程语言来实现人工智能算法。无论选择哪种编程语言,都需要结合相应的库和工具来提供强大的功能支持,以便更好地实现人工智能的目标。
3 面向用户的编程语言
3.1 Prompt 编程
ChatGPT中的Prompt被称为面向用户的编程语言。如何通过设计和优化Prompt来提高模型的准确性和可用性?如何通过选择和设计恰当的Prompt来引导模型更好地理解用户需求和任务,生成更加准确、自然、连贯的文本就变成了一门全新的编程范式。
假设让你编写一个Python代码,实现“生成和发送通知邮件”。如果用传统的编程范式(第一代、第二代、第三代),不知有多少人能徒手编写出来,如果使用Prompt:请编写“用于生成和发送通知邮件Python 代码”,结果如图3所示。
读者会有个疑问:Prompt不但能写代码,还能写诗、绘画、回答问题,那Prompt不是编程语言。在自然语言处理时代,程序设计的边界需要扩大,不是传统意义上的逻辑问题编程,而Prompt更擅长非逻辑问题的编程。
3.2 Prompt 原理
受到ChatGPT工作的启发,很多人开始探索在训练数据很少甚至不存在的情况下,通过将下游任务修改为语言生成任务,来获得相对较好的模型,如图4 所示。
图4左侧预训练+微调范式。对于下游不同的任务A、B、C,会对11B量级参数的预训练模型分别进行微调,得到3个微调之后不同的11B模型,核心是让预训练模型来适配下游任务。而图4右侧Prompt范式,针对三个不同的下游任务只使用同一个预训练模型来构建任务,省去了微调的步骤,核心是让下游任务来适配预训练模型,这样可以充分利用已经训练好的预训练模型,大大提升预训练模型的使用效率。
3.3 Prompt 构建方法
通用的Prompt构建方法是:
扮演角色+具体任务+完成任务的步骤+约束条件+目标+输出格式
例如:“我希望你能担任一位AI写作导师。我会提供一个需要改善写作技巧的学生,你的任务是利用人工智能工具,如自然语言处理,为学生提供反馈,指导他如何改进他的作文。你还应该运用自己的修辞知识和写作技巧经验,建议他如何更好地书写自己的思想和观点。我的第一个请求是‘我需要有人帮我编辑文章的第一段,并在文章后用列表的方式列出你的修改意见。’”
扮演角色:可以是前端设计师、作家、评论员、诗人等各种角色,这一步的目的是使ChatGPT快速且准确地了解任务领域。具体任务:简单清晰地描述任务。
完成任务的步骤:希望ChatGPT实现任务时所采取的步骤,当任务较为复杂时使用。
约束条件:不要解释、不要评论、不要修改原始文本等约束语。
目标:希望ChatGPT完成的目标。
输出格式:ChatGPT除了各种文字的格式,还可以输出列表等格式。
使用主要有以下三种Prompt模式:
1) 指令模式。
在这种模式下,我们给模型提供一些明确的指令,模型需要根据这些指令生成文本。这种模式通常用于生成类似于技术说明书、操作手册等需要明确指令的文本。指令可以是单个句子或多个段落,具体取决于任务的要求。
Prompt:给我推荐三中文的科幻小说,推荐格式:(1) 书名;(2) 作者;(3) 主要内容;(4) 推荐理由。
2) 代理模式。
代理模式是指用户可以要求 ChatGPT 以特定的身份、角色或者身份扮演某个特定的人、角色或对象来生成回答。这种模式通常用于模拟某个特定人物的语言风格和语境,生成特定情境下的对话、回答或其他形式的文本。如:描述秋天,小学生、大学生、老年人的不同身份,内容是有很大的不同,AI对身份和角色的把握还是很准确的。因此,在提问前告诉你的身份很重要。下面是一些扮演的例子。
Prompt1:我希望你充当 Linux 终端。我会输入命令,你会用终端应该显示的内容回复我。我希望你只回复唯一的代码块内终端输出,不要写解释,除非我要求你这样做。当我需要用英语告诉你一些事情时,我会用花括号 {像这样}。我的第一个命令是 pwd。
Prompt2: 我希望您充当英语翻译官、拼写纠正器和改进者。我会用任何语言与您交谈,您将检测语言,翻译它,并在英语中回答我更正和改进后的文本。我希望您用更优美、更优雅、更高级的英语单词和句子替换我的简化 A0 级别的单词和句子。保持意思相同,但使它们更具文学性。我希望您只回复更正和改进的内容,不要写解释。我的第一个句子是“istan⁃bulu cok seviyom burada olmak cok guzel”。
Prompt3: 我希望您充当面试官。我将成为应聘者,您将为我提出该职位的面试问题。我希望你只回答作为面试官。不要一次性写下所有对话。我只想和你进行面试。请如同面试官一样一个一个地问我问题,等待我的回答。不要写解释。我的第一个句子是“你好”。
Prompt4:我希望您充当基于文本的 Excel。您将只向我回复基于文本的 10 行 Excel 表格,行号和列字母作为列(A 到 L)。第一列的标题应为空以引用行号。我会告诉你要写入哪些单元格,你只会以文本形式回复 Excel 表格的结果,不要写解释。不要写公式,您将执行公式,只回复 Excel 表格的结果。首先,请回复我空表格。