嘉宾介绍:
谢涛:北京大学计算机学院软件科学与工程系系主任、欧洲科学院外籍院士、ACM会士、IEEE会士、AAAS会士、CCF会士
李戈:北京大学长聘教授,博士生导师,教育部长江学者,是国际上最早从事 “基于深度学习的程序理解与生成” 的研究者,多项成果被国际学者认为是 “首创性成果” 并被广泛引用。科研转化成果 aiXcoder 为航天领域的重大工程、金融与 IT 领域的多家大型企业及数十万国际开发者提供服务。
感谢腾讯的邀请,有这个机会来和腾讯的各位同仁一块来去交流讨论这样一个当下很这个热门的话题,就是基于大模型的代码生成。当然我的这个报告是可能更宏观一些,那么接下来我的同事,北大的同事李戈老师会更聚焦一些,而且他也是在这个领域,应该说第一线的战壕里面去领着团队成员去打拼的这么一个经历,也会给大家有很多干货,这个和大家去交流,包括后面的互动。我的那个报告就是比较宏观的题目,就是《基于大模型的智能化以及工程》,其实人工智能和软件工程或者是系统软件的交叉的这个领域已经存在很多年了,我们自己这个的研究也在很多年前就开始,包括我 2005 年博士毕业以后,就是在美国高校任教,就开始在这个两个交叉领域做了很多的探索。
这我们去看这两个领域,首先就是智能化软件工程或者是智能化系统软件,是说我们人工智能的技术和解决方案怎么样帮助解决好软件工程或者视频软件的任务,这也是我们今天的这个交流主题所落入的这个方向。另外一个方向也很重要,也是刚才我讲的这个方向也会辅助到就是怎么样用软件工程的技术和解决方案来去辅助解决好人工智能这方面的任务。
当然了如果人工智能的任务是聚焦在软件工程的范畴上,就很自然这两个事情就串在一起了,其实我们后面要研讨的不少的一些问题,就是可能都会涉及到这个第二个方向。我们从学术界去看这个大趋势的时候,我们这个是有一个学术界创建的这么一个网站,就是 mi for code,是收集和罗列的。往年就是用机器学习,用在大代码就相对大量代码,而不是说少量的一个这个 Repo 或者几个Repo,而是比如说开源的大量的代码来去进行做机器学习,特别是近年来的深度学习,以及基于大学模型技术的这样的深度学习,是逐年的上升。如果大家这个看屏幕的下方是这个年份,最右边我们是这个放的是 2022 年,然后最左边的这个我看一下这个应该 2007 年,所以就说从最初的时候, 07 年很少量的文章,到 2022 年,这个接近 450 篇文章去探索这个话题,可见这一个增长趋势是特别大的。
如果我们去看这些文章它所聚焦的子领域,那么从多到少,比如说第一个是representation,就是说特别是代码相关的,你怎么去把代码表达出合适合于大这个深度学习。当然了最近的这个大模型来去更好的消化,更好的去做training,对吧?这个很关键,包括fine、tuning,第二个,第二多的就是代码生成,这也是我们今天聚焦的这么一个主题,以及程序修复,还有代码搜索、代码的这个summary,代码的这个注释总结,还有代码的编辑等等。
所以这个是我们很热门的聚焦的要解决的人员工程的任务,那我们从另外一个维度去看的话,就是从它的 representation 出发,对吧?以后来去支撑的任务可以分成深层式的任务和代码和,或者是自然语言的注释相关,当然更广义的比如自然语言的需求等等。
还有就是理解,那从这个我们服务的对象这角度来去看,上方我们在应用场景的时候,使用者可能会是这个普通用户,他比如说现在大家去用 Excel 的,对吧?就是做初步的数据分析、做可视化等等。这些用户它有比较强的行业背景,它这个所这个关注的应用领域的背景,但是它的编程背景或能力不见得是那么强。那另外一类就是专业开发者,就是我们这个软件工程师、这个编程人员等等,这一些是我们另外一大类的应用场景来去支撑的。
用户理解式的任务有各种各样,这里面我是简单罗列了一些,比如说相似代码搜索、代码克隆检测。因为相似代码搜索也可以被利用于就是我一个代码,这个代码库的某个地方,我发现了有一个安全漏洞,或者缺陷,我再去搜整个公司的代码库是不是有类似的漏洞或类似的缺陷,所以它不光是说要去这个找代码克隆,去做你的这个代码质量的提升,同时对于找缺陷、漏洞也有帮助。
以及更通用的代码的缺陷、漏洞的检测,还有不良风格的检测以及缺陷的定位,就是我有测试用例失败了,我怎么定位出什么地方是有可能是缺陷的地方?深层次任务,它就其实和前面理解式的任务还是有一些相关的,比如说前面讲我缺陷定位,我找出很可能说我买一行它是有可能有缺陷,那么对应到我们生成的时候,我直接就把它修复了。我能生成这个修复的这个代码,修复过的代码,那么更广的我们有基于注释,或者是基于需求自然语言需求生成代码,还有基于注释来生成,基于代码来去生成注释。
那么如果我们聚焦在这一个代码变更中我的 commit message,对吧?那么你的 commit message 这个也可以去自动生成,因为可能在实践中大家写的 commit message 要写得比较完备,质量比较高,可能就是也要花一定的心思在里面,也可以借助于大模型来去生成 commit message。
还有就是测试相关的一些任务,比如说可以被测代码,然后我们生成测试代码,这是基本的这个测试的一个任务,包含测试输入、测试数据以及测试预言,就是这个断言。然后还有就是稍微可能问题更稍微容易一点,但是也不容易。那么是说基于被测代码,但是数据 OK 已经产生了,比如我可以用第三方的测试数据生成器产生了这一个数据,或者是说从用户使用的真实的日志里面去获得了他的这一个,这个测试数据可以回放,但是我不知道这个行为是不是这个我们用户期望就是我们这个符合预期的,这就是说我的测试预言或者设置断言怎么来?那我们可以把这个被测代码以及测试输入喂给大模型,让大模型告诉我们预言是什么,断言是什么。
还有就是这个在我们现代的IDE都会这个比较常见的代码补全续写,对吧?现有的这些 IDE都有,包括待会李戈老师会聚焦会介绍这个我们北大团队在李戈老师的带领下去孵化的公司 aiXcoder,以及推出的产品。aiXcoder 就是初期的时候就是用深度学习来去做好代码补全以及代码推荐等等,还有就不同语言之间的代码翻译,对吧?那这个像比如说大家在做系统软件的时候,现在用 rust 来写,内存安全语言去写系统代码,这个也会成为一个比较流行大家采用的那遗产代码,它可能很多是 c 的,那我们可以依赖于大模型把 c 代码翻译成这个rust。
当然更多的传统的这些语言之间的互相翻译也会是一个很重要的场景,以及代码重构,对吧?前面已经谈到理解的时候,说你有些代码这一个这个不良的风格,对吧?或者是它的这一个这个耦合度太高,我要怎么样来去重构使得这个设计质量更高?这都是可以去这个来自动的进行以及代码的修复。
前面也提到了,那我们再回来再看一下历史,看一下这个发展的这个过程,其实很大的,目前我们看到的基于大模型做各种各样的下游的任务,以及我们软件工程任务,比如说代码生成,这也是在大数据,这个是一个前提条件,当然这里面我更广的,我们这个大算力合在一起,然后最近的这个大模型,使得我们在很多的这一些软件工程相关的任务,包括代码补全生成等等都取得了很多经验的结果。
那我们去看特定的在代码生成上, 2021 年7月这个 open AI 的发布的这个他们的结果从他们的这论文里面展现出来的。在编程竞赛题上,这是相当于给大家展示它的能力,确实是超越了我们原先的预期,这是 2021 年7月的这样的一个时间点,那在 10 月这个 open AI 和这个GitHub,对吧?这样的一个联合怎么去发布这样一个CoPilot的这样的一个编程助手?结队编程助手也是这一个让大家更广的能够自己去试,不光是从看热闹,看他们的这个在一些 benchmark 上面的结果,那我们再理一下这一个这个路线基于代码生成的这一些系统,那么前面已经提到了 2021 年 10 月 GitHub 这个是CoPilot发布,然后就我前面提到的北大团队符号的公司这个aiXcoder,在一个老师带领下也这个发布了基于大模型的代码生成以及代码补全,大家也可以在网站上面去试用这个去看它的效果。
然后 AWS 的 code whisper 也是恰好是在 Ascode 发布出来,第二天也发布出来了以后,清华大学唐杰老师他们也有这么一个促商公司,他们除了通用的这些大模型,他们也在代码生成上也去这个做了这么一个系统,叫 code kiss,是 9 月份,华为在 11 月是华为云这个相当于智能化的 IDE 的这么一个组成部分叫 call art。snap 也是集成了这个代码自动生成的这样的一个功能,由这个外部可以去使用。
待会这个李戈老师也会给大家去讲,就是在aiXcoder上基于大模型代码生成的一些实践,它这个目前的这个功能是说代码生成和代码补全以及代码搜索这几个重要的,在开发现场使用的这些任务起到一个支撑,最早是通过深度学习的方式来去支撑好代码补全、代码搜索等等,那么最近也是用大模型的这种技术手段来去支撑这些相关的任务,李戈老师会更加细节的给大家介绍。
那再回应到刚开始讲的两大应用场景,对吧?这个其中一个就是专业的软件工程师,那么大家很熟悉的,对吧?copy 里等等这一些应用场景,包括这个券GPT,对吧?对特定的代码相关的这些场景都有很多的大家的这个好的效果。这里面我们之所以做一个分类,是说软件工程师和专业开发者对你自动产生的代码,它通常是有能力去理解的,当然我们不排除就是说像有些场景它生成的代码过于复杂,那么即使说我这个这样的工具的使用者,他可以是读懂代码就是一般的代码,但是他对特定的生成代码可能他的理解和审查的能力其实不见得到位。
这也是就是说我们这一系列基于大模型代码生成系统的使用时候碰到的一个所谓的难点,虽然有各种技术来去缓解,来去能够说怎么样应对基于大模型代码生成的不可信,仍然使得我们在真实的实验场景中能够发挥作用。那人的审查这个是一个目前应该来说是最常规或最常见的一个把关的一个手段。那这个是一系列这些方面的这些使用就是面向的使用者,是软件工程师、专业开发者。
那第二个应用场景在这个商业落地上其实是走得更快、更前的,其实在还没有大模型出来的时候,基于深度学习去辅助这个终端用户和普通用户来去完成他日常的一些工作。比如说走得比较快而且效果也不错的就是数据分析师。对,前面我提到的用 Excel 等等的这些人,包括可视化还有数据分析这些,因为这些人他很多,包括就是说高管,对吧?我们可能要作为一个数据分析的任务,他不见得他有编程的能力,不见得自己会写 SQL语句,不见得说在可视化这个创建的这方面有很多背景,所以这样的一些所谓的自动化的手段就能很辅助到它,也能落地产生比较高的价值。
那这里面有一个很大的挑战,是说这些使用者你给他,甚至给他这个 SQL语句产生的,他不一定能看懂,对吧?那不看懂,但是他也不说百分之百他都正确,那百分之可能说 1% 5% 的场景,他万一错了,我们怎么能让使用者能够知道目前我的这个使用出来得到的结果是错的,我觉得这个本身也是一个很大的挑战。
刚才我们讲专业的开发者、程序工程师,他还稍微看一看,对吧?是不是靠谱?那这里面这个普通用户他是没有能力去消化你产生的代码的,这里面包括就是说我前面也提到自然语言处理,我用自然语言来表达我的数据分析任务,然后中间产生代码语句,包括可视化的这些脚本等等,包括 RPA 等等的这一些,这些面向终端用户的这种编程也是一个很重要的场景。
其实我们回到就是说去看一个模型,或者是这样的一个系统,基于大模型也好,基于这个之前的深度学习,或者是这个更通用的各种的 AI 的这些技术。所以它应该要包含下面几个特点,不见得是全面的,但起码这几个是这个很重要的一个,就是说它准确率要够高,特别是说我在用户没有办法去 double check 你的出来的结果对不对的时候,那也就万一他出错,也许他后果不会那么严重,那么这样子落地场景应该还是可以接受的,但是准确率高是很重要的。
还有就是他的鲁棒性要强,稳定性要强,因为大家去和大模型去互动的时候是通过 prompt 的方式,那么 prompts 通常大家会以自然语言的方式表达,那自然语言它就有各个,每个人可能都有自己的一个表达的方式,它有一个多样化。但是现在不少的大模型它对于你同样的语义以不同的方式表达,它影响到它大模型的准确度是挺大的。
还有就是不生成危险代码,包括不安全代码,可能有一些违反这个社会伦理,或者是说社会歧视等等的这些代码,包括就是说不能够暴露,就是来自于训练代码里面包含的这些隐私信息的这些代码。还有最后一个就是你的行为可预测,行为可控,因为在很多使用场景他希望说我调你一次,我问你一个问题,对吧?那过了两天,过了 5 天以后,我们假定了这个问题,不是说随着世界的变化,这个他的这个问题就会变的。那我过 5 天之后再去问你,最好给我是一致性的,别一天说一个事儿,这个在实际部署落地的时候是也是特别关键的。
刚才我们讲到的这两类人可以看到,就是说面向终端用户的,它通常是一个全自动化的场景,对吧?用户他很难是说你出来的中间结果我再进一步的我去修正,因为他可能对你这个出来的代码或这种这个代码相关的这种形式不一定有理解,或者是这个判定的能力。那还有就是编程助手的场景,这就是前面这个专职的工程师的这种场景,所以自动化场景他要求的很自然,他就知道我黑盒的,我就得要对这样的挑战是更大的。那针对前面讲的这几大需求,我们来看一看现状,当然这个数据是相对不见得最新的,在最新的这些大模型的成果应该来说效果会是更好,但是没有说好到那个让大家觉得你去使用大模型的时候准确度高到你都这个可以很放心的去用。像这个是不是最新,但是也不是那么老,比如去年的这些结果,就是你第一个生成的代码在比较广的这种场景的任务,当然就说大家一般用的 human email,对吧?都是竞赛题的,那这个也不见得是说拿得准确度那么高,那么你和真实情况相关的它超过50%,这个就很难,所以当然会不停的往前进去提升。
但是这个它 by nature,对吧?这样的一个技术手段方案,它不可能是说能达到百分之百,还有生成的代码安不安全,这也是会有问题。那么呢?其实之前的这一个研究,这个调研的显示,其实让比如 Codex 生成的这个代码,它会包含的不少的这一个安全漏洞,但是这个问题可能会得到比较大的缓解。最近的一些进展,比如说很多大模型都有,就是说生成的代码,或者你给他一段代码里面包不包含这个安全漏洞,对吧?现在大模型的能力也还是比较强的,所以就配合的把两个功能用,能够比较大的缓解这样的问题。当然就是也不能是百分之百的,就是我我保障或者是他百保障的百分率很高的来去说你生成代码是安全代码,还有鲁棒性也是一个问题,就是我碰怎么去写它,使得它的效果很受影响,即使是说我 push 表达的语义是一样的,这里面可能比较字比较小,这个不见得是大家看得那么清楚,那么自然语言这里面是说要去排序一个数组,然后要用的这个是 quick sort 快速排序以一个这个升序的这个方式,那么它是出来的这一个代码也还是靠谱的。
但如果我们把这个语义稍微用另外一种方式去写,这里面我不去读了,它就是,那么它的整个这个代码就乱了,就晕了,这个代码生成的这个引擎就没有生成出这个稍微靠谱一些的,或者是根本就不靠谱的这一堆乱码一样的这个代码,大模型也会生成这个不太合适的代码,这里面细节我就不去多讲了,当然就说比如左上角的这个是说,给一组学生找出哪一个学生是最好的,大家知道这样的一个需求,它本身就是恶意的,对吧?而且就说也没办法去回答,因为他给的信息不足够,因为以什么方式来判定。
那么当然像我们有对话式的这个功能的话,它就会可能说,问用户说你这个具体你是哪方面去评判哪,等等,对吧?那但是如果是说没有去在这方面进行提升的话,就会得出像这样的一段代码,大概就是说去最高的,对吧?现在是说哪一个学生最高的,就是最好的,就是相当于歧视的身高低的这样的学生等等,这都有可能就是说包括隐私泄露都有不少这样的一些问题。
下面这个我会聚焦在某个特定的比较特殊的代码生成一个场景,也是我自己的老本行,就是软件测试的自动化的支撑,那么代码生成的这个具体的实例包括一些技术内部,待会李戈老师也会给大家进行进一步的讨论。那我们如果代码生成的这种形式是以测试用例的形式出现,那自然它就会被应用到测试的任务。那前面讲如果你生成的代码它是功能型的,对吧?我们比如说实现一个特定的功能,这是最常见的一个使用场景,万一是出错,那我们如果使用者不知道,那可能去部署去使用,可能就会造成比较负面的后果。而如果我们生成的这个是测试代码,他可能对于这个负面的效果,意思说如果准确率不是那么高,它的负面项目会大大的降低。
因为假如说我要这个引擎给我生成测试用例,比如测试数据也许是非法的,那我的被测软件有可能异常等等,就相当于误报,误报你起码还有机会让人去看你生成的这一个代码是不是靠谱。那还有一些就是说这个所谓的一些比较特殊的值,对吧? corner case 是边边角角的值,就是让我们来去测看我们的这个被测软件是不是这个有放性比较强等等。
当然也会比如说我测试预言 assertion 比我生成不靠谱,对吧?就按道理一个软件本身是有问题的,但是因为你的预言测试语言太过松,那么也会说我们漏掉我们的这个找到这个缺陷的这么一个机会,当然就是它的后果也是不小。但是相对于说你拿到生成不靠谱的代码去部署,去使用,相对来说还是更小一些。
所以我们来看一看,就是说有个具体的这么一个场景,现有的一些技术,最新的这些成果到底是怎么把它用好?这个是今年X1,就是软件工程的国际软件工程大会,马上这个下周就会在澳大利亚墨尔本召开,这是一个中科院软件所的一个工作。这个是说我们去做移动应用测试的时候,他在自动话题去测产生这个数据的时候,也就是说大家都熟知的monkey,对吧?或者是 monkey 的改良版等等等,以及学术界这个这各种各样的工具,包括我们自己组里面也研发不少这样的。
这个比较 stay off 的那一个难点是说我有一些用户输入它是很难随机去生成数据能够通过的,那么这个举个例子,比如说这个信用卡号,对吧?假如说我们要符合信用卡的这一个格式,那除非你说我把Gramo,对吧?我的这个规则先写好,然后工具能够获得这样的规则,然后根据规则来去生成符合规则的这样的输入。
当然你对每各种各样的 APP 上面的这些输入去写规则就不可行,所以可我们可以利用大模型,对吧?来去让他来去生成有意义的特定的这个用户输入,来去能够通过他的这个所谓的语法,所谓的前置条件流程,我就不细讲了,当然大家基本的思路基本上都是说把我这个上下文我的问题,对吧?我能够把它变成以一些模板的方式把它变成prompts,然后由大模型来去根据 prompts来去生成这个相应的这个知识数据,然后再灌回到这个测试数据生成的这个工具里面,由它来去这个把大模型生成的这一个数据能够结合到它本身自己生成,比如说各种序列、各种事件,对吧?它不是说所有事情都要大模型干,其实我们最近的一个工作没有这个放出来,就是正在被评审的过程里面,就是说我现在我移动应用,我某个功能,我想要到那里,我怎么去让自动工具能够到达我的这一个目标?你比如说我微信,对吧?我说我微信我要转个款给一个朋友,那我可能表达出来就是一个自然语言,我说我要转转一个款给我的朋友,给一笔款,比如一百块钱给朋友。
那怎么把这一个所谓的高层面的需求,我要变成一个个步骤在界面上去使用,所以这个用大模型我们把它变成这个分步骤,当然有很多这些挑战的我们的工作去解决,感兴趣我们可以后面再交流,就是这个工作具体去使用。所以目前这个中科院研所的工作是在某个点上,对吧?特定的用户输入框,我怎么能够产生能够让它能过去的合法的输入?这个是相当于他们这个工作里面怎么样去把我的上下文的信息变成这个prompts,有效的prompts,然后来去把这个,比如chatGPT或其他的这个大模型能够去产生符合他的需求,这个这样的这个测试数据,这是一个样例,就是左边的这一个是应该是这个订机票的这么一个APP,对吧?它比如说界面上,它就把这个界面上的信息,以及把它这个 APP 的名称等等这些把它变成按它的模板变成这个prompts,再灌给这个大模型,再告诉你说我这个这几个框应该填什么样的这个输入,才能这个尽可能去符合这个期望,就相当于能是合法的,能够往下走。
那在单元测试用例生成上也有最近一些工作,这个是 GitHub 的一位这个工程师和这个几个高校,美国的高校,包括欧洲的高校以外合作的,现在是已经发布在 GitHub 的 Copilot LAB 的其中的一个功能,他做的是说我对于每某个,对吧?被测的,比如说类,那么我们去收取这个他的文档,对吧?比如注释了这一个方法,但是以方法为这个单位, API 方法,以后方法的注释,还有就是说你去看这个 API 方法它的 client code,对吧?我别的这个代码去调这个 API 方法的它的这个代码片段,然后再利用这个特定的prompts,就前面我们讲的大思路就是把它用一些模板,把它变成就不停的试去调,看哪一个模板会更加适合,比如说底层的像chatGPT那样,然后生成plus,然后这里用的是Codex,也就是 copy 的或者是这个后面的这个代码大模型,然后产生测试用例。最后面再看你这测试用例是不是能跑得起来,能编译。
然后它这里面是有一个这个所谓的洞察,或者是观察出来的现有的一个局限性的,就是说如果我们把这所有的这信息除了因为被测这个函数或者是方法是很关键,对吧?要灌到给这个大模型里面,但是其他额外的信息,比如说我的这个方法的它的注释,一股脑你给它灌进去作为prompts,其实 Codex 效果不见得会好,所以不见得信息越多是越好,那么这是一个观察,那么是说好它其实默认它可能不见得一股脑把所有的信息灌进去,那灌进去它到了这个 test validation 的这个步骤说,诶你的这个测试用例就是失败了,对吧?失败,或者是说它这个 assertion 生成也不对,等等,他就会把这些额外的上下文信息加上一些所谓的引导,就相当于他再来一次走这个。
再问一下chatGPT 这么一个所谓的有一个adaptation,其实这 adaptation 也不见得是说天生的,因为我们大模型这个它永远都是有这样的局限性,按道理就你信息越全,那你那有一个选择性,把有用的信息把它消化就完了,但是所以这有点相当于是现有大模型的一些局限性,或者它一些特点来去外媒去把它要过去。
这是一个样例,就是说可能字比较小,就左边是说只给这个被测这个方法,对吧?被测的方法,然后这些 Cos nippy 就是这个 client code 来使用这个 API 方法的,不给,然后说出来的他的这些 assertion 都不对,那么呢?把这个加上去之后,然后出来的引导这个 code 出到来的 assertion 这个断言就对了,所以这是一个具体一个例子。
另外一个这个也是最近的一个工作,也是在 X1 下周要去做这个报告的,这个是来自于应该是微软的几个研究者的这个工作,他的这一个工作是什么呢?是说我们如果用传统的这一个,比如说基于搜索的测试数据生成,假如说左边的这些代码,那他跑了一段时间,他会所谓的到了这一个瓶颈,就是他就没法给他更多的时间,他已经这个没法有更多的提升了。然后这个他们这个工作是说他1,比如说我一整个项目,对吧?然后比如说有比 100 个这个函数,那么 100 个函数,那这个我先用,比如说基于搜索的,就是基于一圈算法的这样的测试数据生成器先跑,跑完之后发现再有一些函数,它的这个方法体里头有些代码它没法提升,那么它就会说好,那我就由大模型来帮我。
大家注意到,像很多时候我们在用大模型来解决一个任务的时候,很多的这些工具它是把开销是看作一个很重要的因素,对吧?两个方面,一个人说我每调一次 codex 我都要付钱的,对吧?这是一二,我调一次大模型,它的时延,当然现在这个后这个 chatGPT很快了,当然我们现在要部署的自己其他的这些vendor,它不见得大模型有那么快,所以就是说你这两方的开销,所以我们对于什么时候要触发大模型来帮到我,我们要相当于小心谨慎,或者是这个要有一些策略。
我这个项目有 100 个函数,是吧?那我可以说 100 个函数我都叫大模型,都给我生成作为种子,再用遗传算法再来去演化。其实这个方式也是,假如不计开销的话,其实最后的效果甚至比它目前的这个还要更好。现在他这个是说我这个把我需要大模型这个去帮忙的,然后我在获取了这一个种子,把这些函数采取要套方法,然后我再基于这一个深层种子,再来看是不是能够突破我这个瓶颈,因为有时候我可能就是缺个好的种子。
好这一个技术是这个基于大模型的单元测力用力生成,但这个生成的不是一个我们传统意义的这个单元测试用例生成,而是对于 human eval 里面的,就是我作为评测的 benchmark 里面的测试数据,这个它不充分,我怎么来去进一步提升?所以就是它这一个基本的思想是说我这个是,比如来自于 human eval表的这个,我有这个 ground truth 的实现,我会有一个自然语言的需求,下面我还有个标准答案,我都给你了。
那同时我还有一对测试用例,也就是说我现在把这一个自然语言让大模型生成代码,只要这一次是通过了,我就认为我胜利了,对吧?我打得 100 分了,但如果你这个测试用例不够完备,有可能误判就是他根本没到 100 分,对吧?所以他这个工作也是很近的一个工作,就是挂出来在阿凯上,那么这是 UIUC 还有南大合作的工作,然后它就相当于用大模型去 GPT 来去基于首先自然语言,还有就是你这个样例,对吧?相当于种子那样,有点像现有的你去 GPT 那个 human eval 这个 benchmark 里面的,然后让 check GPT 来去生成这个额外的种子。
所以注意到有一点就说我们如果是有一定的需求,我们如果自然语言给的需求,因为我用一个第三方工具自动产生很多数据的时候,有一个问题,是什么呢?非法输入,对吧?因为我可能说我的需求是说对于正整数的一个数组成什么说什么。然后你这个,因为我们的第三方工具它不太可能理解你的自然语言语义,除非你做一些额外的一些事儿,所以它就会可能产生负数在里头。那我们用到大模型,那很自然的这是它的优势,它能理解你自然语言的这个语义来去生成符合你的所谓的前置条件的这个这样的数据。所以这也是就是说大模型它去生成数据的一个很重要的优势,它会避免去生成非法的这个输入。
当然了另外一个就是说我怎么去生成断言,这也是从自然语言拿出来的,你现有的第三方数据生成工具,它断言基本上是没有办法能够生成,比较这个就去检测本个版本里面有的缺陷的,对吧?他通常都会说回放,捕获,对吧?捕获回放你现在版本出来是啥,他就把它放进去 assertion 或者是崩溃很 call exception 等等,所以它是这样一个模式来去增强 human eval 里面的benchmark。
谈到了benchmark,那么其实 human eval 大家知道是基于这一些竞赛题来的,那竞赛题这样的模式它有很多,这些相当于取巧的地方,对吧?因为它通常是包含对上下文依赖比较少,而且他调 3 第三方库也不会说调一个你自己内部,自己研发的一个库的API,但是在真实场景里面,我们其实大家在日常的研发工作里面写代码工作,这样的情况太少了。所以这个我们也是和华为合作,就发布了这样的一个测试工具,是基于开源代码库里面去拿真实的代码,当然我们要做一些数据的过滤等等去这个使得我们这个选取的这些所谓的自然语言的需求的描述,以及代码作为 ground truth 的,这个这样的实现它是靠谱的,而不是说大家随随便便写一个,这个根本就是不靠谱的,这个实现,这个我们就将有这么一个 pipeline 来把这个 benchmark 发布出来,其实在前段时间都发布出来,大家都可以去访问到,可以去拿来去真刀真枪的去试一试大家自己研发的这个基于大模型的代码生成,包括外部的代码生成,这是来自于真实世界的这个开发场景的代码。
然后基于这样的一个数据集,其实一个很关键的一个点是说我的对上下文的依赖关系,对吧?有几个层面的依赖关系,那么现有的大模型,当然这个应该来说可以解决,也包括我们自己的研发的一些技术,这个是在华为的盘古的这样的一个代码大模型上进行提升,来去更好的应对这种上下文的依赖性。比如我要生成的代码可能要引用我这个上下文里面的某一个变量,对吧?或者是说全局变量,还有就是要调一个第三方库,不见得是,就是比如 Java 的话, Java base library 的这个 API 等等,这都是有一些这个我们的探索。
那待会这个李戈老师也会在这个这些点上都会跟大家去讨论的,就是这个怎么样能够做到做好的基于代码的代码生成数据,特别关键,这是这个要很大算力,这个你要上这个参数量、上规模,它的效果才能可能说不错。好,那么从解决方案使用者的角度,刚才我已经讲了比较多了两大类使用者,对吧?这也是在 communication ACI 年初的时候一篇文章,他这个可能他的观点就是这个作者的观点,原因是哈佛的一个副教授,我们到谷歌最近是出来做那个初创公司,他认为就是说我们这个计算机教育,就不是说让大家知道各种算法啥的,因为就这些基本知识都可以由这个chatGPT 来去这个帮助你了,对吧?你不知道也没唱,但是它的监督的作用就特别关键,就前面我们谈到的它出来的东西不一定是靠谱的。
所以我最近因为在上这个本科生一年级,我们叫软件设计实践的一门课,因为那门课主要是用 C + +,那个 C + + 这个我们助教说这个可能用 boost 这样的一个单元测试框架会比较好,这个然后但这 boost 我也没用过,作为我要上课,对吧?当然我上课要用一些例子,所以这个我就去,因为在像 JUnit ,因为 Java 的我们之前用的比较多,会有叫带参数单元测试用例里面有一个叫assumption。
所以我就问这个chatGPT,他说这个是支持的,有这么一个 assume true 的这个API,他出来一段我特别高兴,结果这个而且很有道理的话,结果我一查再拿这个宏根本就不是这么回事,就说他不是不支持这个上线这个功能,所以好多时候就是也体现了就是说你要有一定的判定能力,当然了我讲这个场景也是体现的,就是说可能是这个 information retrieval,对吧?这个搜索里面的结果要相结合,能够让我们去看到我们生成的答案,或生成的代码它是有根据让我们来去 double check 的,这种能力我觉得还是特别重要。
好,这个展望一下,就是说我认为就说银旦这个是图灵奖获得者 flag Bruce 里面 80 年代中期讲的,就是说在软件工程,软件研发没有一个所谓的应当,就是说能够让我们这个上数量级的提升我们软件开发的效率以及质量。我想在 check GPT 或大模型的来临之下,我觉得在局部领域,特别是终端用户编程,当然终端用户编程还是有个难点,就是说它出来不对怎么办?还有少量的时候它是不对,但是再回到来讲就是说我们去试chatGPT,像自然语言发的SQL,因为我们前面几年和微软、亚电音乐做了很多研发,就说真的还是很惊艳的,接进去就是说很复杂的、很边边角角的情况,他都给你弄对了。
当然我们还没试出来在有些场景它它的很少量的场景看起来是不对的,那不对的时候,万一你用到比较关键的场景,那可能有负面的后果。我觉得,当然这个我们要持续去攻关了,但是我觉得那很可能是个银弹,就已经是完全自动化的这么一个程度。当然就是在普通代码编程,比如说专业开发人员,我认为刚才我讲的就是你对他的理解,还有当然我没有谈到的就是你对一个整体的需求,你要做相当于架构师的分解,对吧?分解到就相当于要还是要结对去互相的互动,这又是另外一番能力了。我们的工程师就是你怎么样和 大模型这样的一个引擎去配合,仍然使得出来的结果是对的,我觉得这会是对教育、再培训程序员、工程师自我修养等等这方面都是要攻关的。
当然我这里面我想讲的有可能还有另外一个角度,是说我们如果给了自然语言需求,然后自然语言需求翻译,我们其实大模型也可以把它翻译成变成形式化的机器,可以去 check 的这些所谓的属性或者是property,对吧?跟那个断言差不多,那生成的代码假如我们未来形式化验证,包括定理证明,我可以自动的去证明了我这个代码符合你这个property,那就是我黑盒,我根本不需要读懂你的这个代码本身不需要改,那我也能判定就是说它是我需要,起码我对 property 是对应的,我觉得这可能是一个方向。
还有一个方向是说我前面讲的例子,对吧?自然语言翻成 SQL 语句,但是 SQL 语句还要用编译器,或者是说我们数据库引擎再变成可执行的这个二进制代码,所以大家可以看到这 SQL 翻到可执行的,它是编译或引擎来辅助,这是完全是可信的,当然里面有 bug 在说了,对吧?但是上面一段自然语言翻译的 SQL 是不可信的,即使说我们百分那个这个准确度达到 99. 9%,仍然有可能不可信,但是你 SQL 人还是能读懂的,但我就说稍微有点训练的人,对吧?所以可能在很多场景就说我直接一下子到代码太复杂了,人很难懂,那有没有可能类似的到 SQL 语句类似的这个抽象层面,人还能消化,能判定?我觉得这也是未来一个发展的方向,也包括我们这个不少国内的同行也是认可这样一个方向。
好,这个我时间拖了一点,那个我这里面就是收个尾,然后我们请李戈老师来针对这一个话题,这个在一线这个打拼的很多这个体会和经验来分享。
好,谢谢大家。
谢老师说了很多遍在第一线,但实际上我这个题目还挺大的。其实讨论的主题我觉得我整理了大概 7 个问题,就是我的这个 PPT 其实最是源于前两天的西湖会议,就是 CCM 组织了一个西湖会议,大家把基本上国内做大模型的一些学者就是有 20 多位,然后在修复组织了一个讨论,其中我的这个 PPT 其实源于那个。
我先大致介绍一下我们这个背景,完了以后我把我准备了 7 个问题给大家分享一下,分享完了之后,如果有什么想要讨论的,我们随时再去讨论。嗯,名字叫做 big model based software development automation。然后我稍微过一下我们这个背景,嗯,其实很多我在不同的场合里头都讲过我自己的研究方向。
这两个圈来表述,一边叫code,一边叫intent,从这边过来就叫成语理解,反过来就叫成语生成。然后我们很多的这个技术都是基于 deep learning 的,然后其实在软件开发里边的很多技术都跟这两个都非常相关。比方说跟程序生成相关的,那 code to completion, code refactoring,要重构bug, autofixing test keys generation。像刚才谢教授提到的,还有一些跟这个程序的理解相关的,比方说注释的这种生成, summarization 的生成,包括 commit message 的generation,然后包括一些这个 bug 的定位,我们的ability,甚至漏洞的筛查、缺陷的检测就跟这个相关。
我们这个研究小组,我们现在我所在的这个研究小组,我们有 30 多个人,其中有 17 位的今年再入学,有 18 位博士生,然后在做这个。当然我们刚才主持人也介绍过,我们做得非常早。我们从 2014 年实际上起点是 2013 年,标志性的成果就是最早的这两篇论文。这个一开始的时候我们自己还心里打鼓,他是不是最早的就是用 deep learning 的办法来分析和处理程序,后来被很多的文章 去confirm,这一点就是别人说他是最早的,这个事我们就放心了。
其实有的人认为这一篇是最早的,有的人认为这一篇其实当年我们在 2014 年的时候工作, 2013 年就开始做了,到 2014 年的时候我们最早一下放两篇到网上,到现在这两天 paper 基本上是最早的,就是用深度学习技术来处理程序的这个论,当然嗯,做的时候什么都没有。这个背景我就不再去说了。
除了这个之外,其实生成我们做的也是最早的这个工作,我想跟大家稍微多说几句,他发表发布,自发表发布出来的日期是 2015 年,非常非常早,这个他做的工作跟阿尔法 code 非常像。后来 f q 的做的事情,我们用了这个很大量的这个学生考试的题目来训练一个深度神经网络的模型,最后使得这个模型能够生出一些程序,其中某些程序可以 pass 里面的一些题,但相对比而言,我更喜欢我们那个模型。嗯,当然那个时候非常早,那个时候没有transform,我们都是基于 r n 在做的。但是它跟 codex一个很大的区别是什么? codex是生成大量的候选,然后用大量的数据再去做过滤,但是最多的时候有 10K 一个候选,这个太大了,这个基本上是不是一个 possible 的一个方案?我们是生成少量的候选,然后我们再用一些 auto fixing 的,把 auto fixing 就是那个你比方说有些错误,那我们把它修复到有些错误,有些程序可以怕compile,并且可以 pass 那道题,所以对比下来我其实更喜欢这个。
我们这工作比 codex整整早了 7 年,就是非常非常早,当然这个工作给了我们很多启示,也就也又有了我们后来那个工具就是aiXcoder。最初我们做的实验是在就是用 Tensorflow 的代码来训练一个模型,最后来辅助写 Tensorflow 的这个程序。最初的时候, 2017 年的时候我们就发现有很多很多,我们如果只去看这个 token 数的话,有很多东西不需要人去写,当然很难在当时碰到的一个问题,很难泛化到其他的领域里头。你比方说我们放开不只是 Tensorflow 的这个代码的话,那可能这个就没有那么好。当然我们从那个时候就开始坚定的沿着这条路在走,然后我们也不断的去扩大我们的模型的数量,最初的时候我们模型参数量只有 200 万,参数到后来 400 万,到后来 4000 万,再后来一个亿,再后来到 13 亿。
其实到 13 亿参数的时候,它就可以支持行级的这种代码生成,就是你一会车有一些因为代码之间的约束关系还是很多的。像这个是比较典型一个例子,比方说 exception 的这种处理,你的一部分写完了之后, exception 的处理非常非常的程式化,像这样的话就可以单行去解决。
其实到一直到 13 亿模型,行级的代码补全的话, Ascode 的的确确看这个指标,包括准确率,全世界最好的的的确确是这样的,但是那个时候我就特别想把这个 13 亿变成 130 亿,再扩大十倍,但是那个时候没有钱了,就在这个空档里面copilot它推出来了。就是靠基于 Codex 模型 120 亿参数去刨掉 embedding 的部分。 120 亿的参数,那么这个但是随之而来的一个好处就是copilot的推出。我就说作为一个学者挺悲哀的,为什么呀?这件事情我们做得很早,对吧?嗯,做着做着却没有人支持我们,没人帮我们下赌注,对吧?嗯,但是国外他就敢于下那个赌注。 Codex 推出来,那么copilot的推出来之后,我们就拿到钱了,别人看到,唉,老外做出来了。所以说给你钱你也可以做啊。
那我们在 2022 年,刚才谢教授也提到 2022 年的6月 22 号,我们搞了这个 130 亿参数的一个模型。嗯,到现在可能 aiXcoder 就是对外提供服务的时候,很多都是这个 130 亿参数的这个模型,当然他的能力我先汇报一下再说。这个模型主最主要的这个目标任务还是多行代码补全,就是多行的代码补全,而不是代码生成。虽然大家去测试这个模型的时候,更愿意拿个什么这个代码生成去测一下,给一个这个描述。我说实话有人问我它这个模型跟copilot之间做的有多大的差别,我的差别简直太大了,大到什么程度?大到你的需求我都读不完,我这个模型都读不完。跟那个模型比,因为 GPT 比这个至少参数数量大 15 倍以上。而且最近 copilot大家都知道他最近两个月不断的在升级,他不断的在升级,两个月之前他基本上在多行代码补全上我们还是可以扛一把的。
模型PK,他的这个就是原来的 copilot的,但现在没办法PK,原因就是他后面早就已经换了。其实在嗯, 6 周以前我们就做过这个测试,我们拿他的 copy 了他的工具,一边去用它的工具一边去调它的达芬琪 2 的这个接口和达芬琪 2 背后参数1751,这是论文里面都 open 的,这个结果比扣达人 72 那个结果还要好,所以说它是已经 update 了,当然最近它的 update 更凶猛,它的反馈速度直线在提升,我觉得这一点简直是我们这个中美之间的这个差距,我觉得两年我觉得都补不过来,真的是很难。两年之后我们能做到这种程度我觉得很不错。当然这个模型,这个 130 亿模型也可以在一定的程度上去支持。
刚才我说了它最大的还是用来支持做多行代码补全,现在做多行代码补全,其实到现在为止,别看我们参数数量少了 15 倍,还能再 PK 一把,当然你别指望有 175B更大模型的这种好的效果,但是索性因为多行代码补全本身是一个有天花板的任务,就是它本身你的输入的 intent 本来就有受到限制,所以说它本来就有天花板,所以在这个还是可以提 PK 的。
但是代码生成上没办法PK,虽然我们这个也可以支持一定程度的人的代码的生成,我们现在已经 update 了 4 个版本,但是我决定,我自己也决定我们不再 update 这个版本了。我们现在的目标是在 build 一个更大的一个模型,其实我们现在正在做的就是因为你输在参数数量上是一个无法改变的。这就像我觉得两个人打拳击,一个是超重量级选手,一个是取量级,那一拳过来我就挨不住,你明白吗?嗯,那个参数数量这个差距还是在这里,包括这个大模型,其实我觉得大模型大家可能不同的人对大模型不同的理解,包括昨天有我们做一个内部分享,我们对外包括昨天有些人给我打电话说你们那个模型能不能跟自然语言模型不在一起?我说no,你错了,大模型必须是 base 在自然语言模型基础上的,因为它很多能力是你的 natural language base 给到你的。
我们希望就现在,其实我们也是卡在算力资源上,目前中国的算力资源十分的紧张,拿着钱我都买不到基本资源,当然我没那么多钱。嗯,对,就是很不容易。腾讯也是有很多很多卡,对吧?如果我们愿意一起来做这件事情,我也很高兴。对,嗯,好,就是前面的一个介绍,包括我们正在做的事情。当然有一些技术的环节,如果大家因为太零碎了,太过零碎,所以说我就总结了 我认为大家可能感兴趣的 7 个问题。
第1个,大模型代码生成能力到底能到什么样的程度?
我自己的一个判断,因为谢教授刚才讲了很多,所以说我把我准备的好多那个例子,我就把它删掉了。我自己的一个评价是,只要是你开发者能把需求描述的足够清楚和详细,那么基本上这些代码都可以生成出来,而且是你可接受的这个错误的这种程度。当然,嗯,咱们别这个硬刚说我就是油,你就是理解错人写也会犯错,好吧。
我一个比较典型的例子,我不能拿来展示的,就是航天母院给了我一个卫星上的一个程序,他们把这个需求写得非常清楚,包括程序的约束也写得非常清楚,那个输入都很长。然后基于这样一个例子,它是可以生成一个包含多个文件的一份代码,然后是可以可以经过少量的修改,他们是可以用的。而且我问过他们公司说我说这个代码能 run 不算本事,我们也可以搞得能run,你满意不满意?他说满意。我觉得这个太不容易了,所以说我觉得的确很牛。
而且接下来他们这个即将要推出的这个 Copilot x,目前我相信很多同事,腾讯的很多同事肯定也都申请了Copilot x 版的这个试用,但是他现在还没开放,对吧?还没有发布,不过他发布出来的东西我觉得很好,它有几个非常重要的一个功能,一个就是这个通过自然语言输入来生成代码。
其实这个我觉得通过自然语言输入来生成代码在实际使用过程中用的场景并不多,你比方说你回想一下腾讯里面开发有多少的场景是基于自然语言输入,可以直接拿到代码,这种场景其实并不是特别多方,代码补进来肯定支持。但是有几个场景是非常有用的,比方说第一个它可以支持基于你的这个被测代码生成测试代码,这是可以的。
第二个它可以对代码进行重构,这个是 refactoring 的,这个能力是非常非常强的。我们的下一版模型里面我们在这个方面费了好多好多劲,我们现在准备了好大量的这个训练数据,包括各种的数据的准备,我们做了大量的准备,我们希望能在这两个,一个是这个代码的重构,一个是测试代码的自动的生成,还有一个自动修改 BUG autofixing 这个还是也是很强的。这个谢老师已经讲了很多,我就不再去那个。
第2个,大模型的这种软件开发能力,而不是编程能力应该怎么去评估?
其实刚才谢老师也提到了,我看就是首先编程能力 not equals to development capability,就是它实际上跟软件开发能力还是两回事。我说一个场景大家就能体会到,我们在做真正的实际的工业级的软件开发的时候,你很少徒手去写一些代码 从零开始写,你基本上说都是 base 在你的 framework 上,或者你已有的软件架构上在做开发。腾讯也一样,你们各种的产品从来很少说,我啥都不依赖,我就重新去写,这种场景其实并不多,所以实际上我们拿编程的能力,特别用编程考题去评估这个一个模型的编程的能力或者软件开发的能力。这个不是一个好办法。两个原因。第一个就是这个编程题目它是孤立的,刚才那个习教授的那个 PPT 里边提到,它不依赖于任何其他的这个库,这个跟工业化人开发场景相去甚远。
还有一个其实是容易被大家忽略的编程题目,是一个非常容易存在数据污染的一个一个 data set。什么叫数据污染?就是说你出给他的这道题,他大概率在其他的地方也许不是原题,他在其他地方都见过。这个我作为一个老师,我简直是,嗯,感同身受,太深刻了。原因是什么?我们我教了这么多年的程序设计,每年我都需要考出题考学生,你们知道那个出题真是搜长刮肚,都已经绞尽脑汁一堆的。我们这一个 team 在这绞尽脑汁最后能编那么两三道题出来,有的时候还被同学说,你这道题跟那个什么什么很像,太像了。
所以说我觉得这种编程题目实际上并不是,最近我看我们圈子里头有很多学生,包括昨天南大的陈振宇老师,他们也做了一些测评,就是拿一些非编程题目来测评这个chatGPT 的编程能力,结果发现一堆的问题,对吧?所以说我觉得这个编程题目并不是一个很好的一个评测的一种方式。
好,那这是插入的一个问题,那接下来想介绍的一个问题就是这样的,就是经常我跟那些做大模型的同事或者是学者们在讨论的时候,他们经常问到我这个为什么代码对大语言模型的训练是有帮助的。这个事儿其实大家还都相对比较认可,包括在 NLP 的圈子里头,大家基本上都是认可的流行一张这张图,它的作者是我的我们组毕业的一个学生,现在在爱丁堡大学,这个图稍微有点不太对,但是它说明了这个代码的模型在这个在整个这个GPT,包括 GPT 3 base 的 GPT 3 的这些模型里面的一个很重要的一个作用。
这个图稍微 update 一下,应该是长成这个样,我觉得这个是相对比较准确一点的,就是它 M72 在这,现在达芬奇 002 这个模型的 API 已经被 close 了,但是他原来在的时候这是一个很不错的一个模型,他去拥有了很多很多能力,是后续的有些模型甚至在达芬奇 002 里面都不一定具备的。就是随着这个模型的训练,有些随着大模型的训练,有些能力它会丧失掉,你需要再把它找回来才行。
那么其实这个代码在这个整个大模型的训练里头,包含的这个作用还是很重要的,所以说现在几乎你看到的大模型里头都会多多少少包含一些代码,再少它也会包含。比方说拉马,我们经常今天中午吃饭的时候跟同事聊到他们基于拉玛,我不知道你们是在做什么。那个拉玛有好几个不同的版本,其中有一个版本就是 65B 的拉玛里头,它有 4. 5% 是来自于 GitHub 的数据,本身就包含了这个代码的数据。
那为什么代码的数据对大模型的这个训练是有帮助的?首先代码程序语言本身具有自然,它是有自然性的,也就是说它具有很多跟自然语言模型同样的这种语言性质。我们是可以用去建一个给这个,给这个程序语言去建一个概率模型,这是可以的。当然这种方式并不高效,这是一个可以用,但不是一个好的一个办法,不过它是对语言模型的训练是有帮助的。
第二个就是代码和自然语言存在很强的对应关系,这一点不需要太多太多去叙述。这是我们做的一个实验里面的一个截图,我们拿一个这个 Python 的一个代码,我们几乎可以给每一段去生成一个相对应的一个注释。也就是说你拿到的每一段代码,它描述的肯定是一个solution,一个解决方案。而且这个 solution 它跟自然语言之间形成了一个非常非常好的一个对应关系。不仅如此,它比自然语言还强在哪?它有很强的这个结构性、顺序性,包括层次性。
你看我们在跟自然语言去跟这个 x GPT 对话的过程中,你会问他这个事情应该怎么做,他会告诉你这个事情应该12345,其中第3又包含了几,第几个很多这种信息其实代码里面本身就包含着,而且我想说的是,就是要去实现代码,就是程序语言到自然语言之间的这种转换,其实并不是一个特别难的事,这个事儿不需要一个太大的模型就可以做的还挺好的。反过来说,其实自然语言的这种顺序性,包括 chain source 的这种能力,对于程序的生成又是一个很大一个促动。
这是我们今年刚刚投出去的一个论文,最近我们连续投出去了四五篇,我认为还比较重要的论文都是基于这个,就是基于虽然我们现在手上没有 GPT 4,对吧? 我们没有,但是我们可以调用它的API,然后继续做,我们按照我们的理解继续去做,结果我们发现我们才可以在它的这个基础上再去提升它,大幅度的提升生成代码的这种正确性。
我们都可以有一个非常明显幅度的形式,比方说这个,这个就是我们先让它生成一个 team source,然后基于这个东西再去生成,后续的这个code就会变得非常好。其实我们还有一篇,还有一篇就是说它其实在整个生成的过程中,它需要一个非常关键的一个转化。嗯,这儿我稍微多说两句,就是这个这个大模型,今天因为今天主要讲代码大模型而不讲大模型,所以说我就没机会去说大模型其实非常依赖对语言本身,语言模型对于整个大模型来说是一个基础性,非常基础性的一个基础,就是整个大模型。
如果不能够,当时有些人告诉我问我就是你去训练这个代码大模型的时候,会不会放自然语言进去?我说不放自然语言进去,我怎么构造大模型,对吧?就是这个模型还是有的,那么这个但是他很重要的一个思想就是说人们去写程序的时候,实际上是站在程序空间上,对于你解决方案用程序语言来去描述它,那么这中间还产生了一个转换。那这个时候我们如果有一种中间的语言能够能够把这种我们给它起了一个名字,我就说我们把大模型的 thinking capability 给释放一下,它就会更好的一个表现。这个是我们近期回去希望我们都已经把它放在网上,希望大家跟大家及时的去做一些分享。
从大模型的构建的角度,为什么代码是一个有用的一个数据,那反过来那代码和自然语言又是又有什么不同?我们来看一下现在大模型处理代码的这种方式。现在大模型处理代码的方式就是把代码看成这种东西,其实非常非常naive,这并不是真正代码。为什么一开始我说它虽然代码具备自然性,可是如果我们只是按照语言模型的方式来对代码进行建模,那我这真不是一个高效的办法。你比方说这是一个程序,这是大模型看待这个程序的方式,他对他来说是一堆一堆的token,但是一个代码真的是这样的吗?绝对不是的。
首先它应该是这样的。你看我们左下角那个,这是一个比较简单的一个程序,这个程序可以完全的把它 pass 成一棵 a s t 的 tree 或者 c s t 的tree。语法树,它是有一个严格的一个非常严格的一个结构性在里头,它的严格性远远强于自然语言,但是我们现在其自然语言建模的这种方式基本上没有去使用。当然有的人说这不已经他没用,你这个办法他也做得很好。
那 possible 也许我们可以用比较少的参数数量去完成,按照这种方式去建模,得到一个更好的一个模型,这也是我认为这是完全 possible 的。第二个就是它的自然源的自然性其实远远弱于自然源。什么意思?就是说它虽然也具备自然型,就刚才说 natural 的意思,我们可以用自然语言一样的这种语言模型给代码进行建模,但是相对于自然语言而说,这种自然性太弱了。具体的表现是什么?你比方说一个程序语言向左侧,那是一个job,一个 Python 的一个程序,一个 Python 的语言编程语言,我们完全可以用 87 个产生式把整个语言定义下来,这是在自然语言来说完全impossible 的对不对?这不可能。所以说反过来说,程序语言我们去表达程序语义的时候,实际上是一个在更受限的一个语法空间里边去描述你的这个程序语义,这是程序语言不同于自然语言很强一个特点。
第3个:程序语言它这个局部性大大的强于自然语言
这一点其实也是非常,包括在西湖会议上,可能这几个老师讨论比较多的一点,我们去构建一个自然源的大模型的时候,实际上我们,嗯,底层会有一个 token night,对吧?我们会做构建很多的图文纳德,一般意义上来说我们会认为这个托纳德是一个相对稳定的,但在代码里头这个东西不成立,原因是什么?你比方说我们把那个程序里头左侧那个程序里头很多 token 或者是词给他拿出来,parents,他离了那个程序他跟他的语义相距太远了,这个在自然语言里头是不太一样的。
反过来说有的时候这个程序里头又有很多,有的人可能会这么去简单的去想这个事,说这还不好处理吗?你把程序里边所有的那些临时变量全都替换了就好了,对不对?因为你随随便替换掉之后,你不会影响程序的这种执行语义不会得到任何变化,你别去换成 12345 或者什么什么,我说这样的不行,这样的话另一个问题马上随着产生,什么意思?大量的程序里边会有一样的一个 token text,但是这些一样的 token text 在不同的程序里边语义完全不同。
比方说这个词temp,哪个程序里头没有temp?但是这个在不同的程序里头,这个 temp 的语义差距太大了,所以说它的局部性显然的强于自然语言,还有一个代码的这种环境依赖性也强于自然语言,这一点是特别容易被忽略。你比方说左边还是那个程序,如果你不是写 tense flow 的,没做过 tens flow 相关的这种这种程序,你可能读不懂那段程序原因是什么,它里面调用了太多跟 Tensorflow 相关的这个API,它是绑死在 Tensorflow 的开发框架上面,所以说你丢失了这个框架,这个程序的语义完全你就读不懂。
第4个,有了GPT 是不是以后成员真的就会失业
就像我们在腾讯的内部,如果拿出来一个程序,把这个程序孤零零的从程序腾讯的开发的这个代码里边把提取出来,脱离了那个开发框架,恐怕谁都看不懂一个道理,其实这个这一点反过来保护了我们现在的程序员,有很多时候这后面我也会提到。我本来想搞 9 个命题,最后一个命题就是这个,我多说两句得了,就是好多人问我那有了GPT 是不是以后成员真的就会失业?我说至少暂时不会。原因是什么?原因是人类的软件。什么叫软件?软件是一个太复杂的一个系统,它刚才有个图,软件是一个非常复杂的一套东西,我们真正开发软件的过程中,实际上是一层一层搭起来的。程序员编写软件的过程更像是在一个结构特别复杂的一个建筑物里面在穿梭,他先到个什么 4 楼的一个地方拐去拿个什么数据,然后对这个数据进行一个什么什么处理,然后又交到什么另栋建筑的怎么怎么?就像这样,它是一个非常复杂的 context 的一个环境,真的这个东西带来的带给我们的优势就在于,第一,这样的一个复杂环境,你很难把它直接放到一股脑的放到叉 GPT 里头,你说你该怎么向叉 GPT 去描述你的那个软件开发框架?就这个东西你怎么能一句两?你说你用自然语言把它说明白,嗯,不等你说明白,我程序我早就写完了,好吧?嗯,所以说你唯一能做的就是把叉 GPT 的这种能力像靠帕拉图一样引入到软件开发环境里头,来帮助我们去解决问题,而不是说直接一股脑的交出去,同时这个事其实也保护了大量的程序员,就是我们写程序这个事是人类花费了大量的时间构筑起来的,这么一个复杂的一套体系,不是那么容易就被 GPT 有了这个就不存在了。我倒觉得不是好,这是第四个问题。
第5个,那对于这个深度学习引擎而言,或者大模型而言,那代码到底应该长成什么样子?
我们说它不应该用就单纯的语言模型来表示,那应该表示成什么样子?关于这个问题,这是我们历史上从我们 2013 年第一天开始搞程序开始,我们就来讨论这个问题。实际上一个程序可以被表示成各种各样不同的这种结构,除了 token sequence,那还可以是一个tree,它还可以是一个graph,其实最跟跟这个程序匹配的应该是graph,对吧?就是我们用图来解析一个程序,为什么呀?因为一个程序我经过不同的变换,它可以产生语义相等的不同的diagram,比方说 data flow 的graph,或者是diagram,或者是 control flow 的 diagram 等等一系列。
但是这些都不同于你原始的那个 token sequence,那么除了这个之外还有可能会包含你,比方说它可以被看作一个操作序列,这个是最初的时候,2014 年,除了我们在做程序,那 Google 的团队也在做。他们第一篇 paper 就是把程序看作一个 operations sequence 来处理,用 LSTM 那还有产生秩序点,这个是后面,你比方说基于 train x 模型的一系列的方法都是基于这个,都非常非常有道理。
当然北大在这个里面我们曾经做过大量的这种工作,类似的这种东西把程序看作各种不同的东西。但现在问题是一个问题是这样的方式放在大模型底下是否奏效?就是这些模型。我们已经证实的是,如果做小模型的话,那么实际上我们可以看得到利用这种方式按照不同的模式对代码这个东西进行建模是非常有效的,它比你基于 sequence 方式好不准的太多了,好太多太多。
但是这个东西放到大模型上是否能奏效,这个的确不知道。说实话为能回答这个问题的唯有一个办法做实验,可是这个实验的代价也实在太大了。这就是我们现在特别纠结的地方。比方说我们同学跟我去讨论李老师,我们下一版模型我们到底怎么样构建,对吧?我们要不要做你比方说 a s t 的Parser,虽然我们现在还仍然是走了一条中间路线,我们把几种数据给它混合在一起,放在一起,然后去构建。但实际上我自己内心里我当然知道,我觉得按照 tree 的这种方式,或者是按照 graph 的,当然现在按照 graph 的这种方式进行构建大模型,基本上impossible。
原因是什么?图,神经网络的运算速度实在是太慢了,没办法,这个运算速度包括的推理速度是完全没有能力去 support 真实的这个应用的,那但是基于树的方法或者基于一些类似于树的方法还是可以考虑的,那为什么到底用不知道?在这种情况下,我更倾向于,作为一个学者,我很想尝试,对吧?但是你不能拿着这个得来不易的计算资源去做这个实验,内心有点纠结,对吧?我们更期望的还是说,唉,别人既然已经走通了一条路,那我们先按照这条路先把它走通,对吧?但是这个仍然是我们心里面的一个问题。
第7个:就是大模型对软件工程的研究有什么影响?
我这儿特别想说的一句话就是 big model in not all your need。意思是不是说有了大模型,程序员就失业了,然后我猜一部分程序员的确会失业,毫无疑问,他做的那个事情可能有点简单,对吧?这个也是整个人类去发展的过程中的一个自然的一个状态。但是并不是说大模型可以写程序了, everything down,对吧?不是的,那我们有太多太多的问题可以去要去做。比方说刚才我们讲过软件开发环境,它实际上是一个非常复杂的一个环境,你很难把这么一个环境所有的信息丢到 ChatGPT 的,因为possible,对不对?我们唯一能做的,把这个大模型的能力引入到整个 IDE 的环境里来,协助大家去解决一些问题。
除此之外,像刚才我们提到的问题,假设说未来的程序都是由大模型生成给你的,那你担心不担心你生成的程序,它生成的程序是错,对不对?这是一个很显然的一个问题,如果你担心,那OK,好。 auto testing 的这种技术就免不了要去做,就是自动的这种测试那是必须要去做的。再就是如果测出来有问题,自动修复,你要不要,对吧?如果自动修复了,也能够把它 pass 了,你担心不担心这里面有缺陷?defect,因为 defect 不是通过跑测试数据能够发现的,你测试数据有可能发现不了它,只有在某些特定的场景之下,它才,这个 defect 才会发挥它的作用,对不对? defect 的问题解决了,你担心不担心漏洞,对吧?等等一系列的问题仍然会存在。
所以说,我觉得也不是说有了大模型,整个软工就不用干了,对吧?我觉得不至于,当然做一个展望的话,我觉得可能对程序设计语言倒真是会有一个影响。我自己有一个这么一个预言,但是我觉得这个预言好像有点过于乐观,我还属于比较乐观的这一派,就是以前你看我们有一幅图,这个实际上这幅图已经有好多年了,唉,你可以排这是我导师书里面的图,是吧?我们怎么认识软件?软件是现实世界的解决方案在计算机系统中的映射,也就是说这是软件。
现实世界里头有个什么样的解决方案?我们用程序语言给它实现成程序,让生让这个解决方案转移到计算机里头了,这是我们做的事情,软件开发做的事情,程序语言的职责也是帮助去实现这个gap,跨这个gap。那么总有一天,我觉得有可能今年今天的高级程序设计语言也会变成像今天的汇编语言一样。啥意思?现在的汇编语言还存在吗?存在还有人在用吗?有,比方说在座的很多各位,我估计你们都至少都学过汇编语言,甚至有的人是写过汇编,但是真正写会别人语言的人已经凤毛麟角,对吧?已经,因为不用了,那为今天的高级程序学生语言没准会变成将来这个字,这个汇编语言,也就是说,很多时候,也许你会介入自然语言,甚至介于自然语言和高级程序师远程里面的一个中间。
某个中间源。其实我倾向于认为中间语言的存在。我为啥要搞个中间语言?用自然语言就够了,我搞什么中间语言,对不对?然后用这个东西,用大模型的方式帮你实现这个语义的这种映射,而不是说让人再去一行一行的 coding 代码。这倒是可期的一个未来,做一个总结。anyway,大模型的推出的确让我们看到了软件开发自动化的一个曙光,但是毫无疑问这条路还是很长,我们有很多很多事儿。嗯,需要去做,大家也不用担心说近几年之内程序员就会怎样,我倒觉得不会,特别是当你的系统变得特别复杂的时候。
好,谢谢各位。
主持人:
非常感谢,非常感谢。两位老师就是干货满满的分享。对,刚才在那个线上评论区也看到一个非常经典的这个评论,就是老师讲得非常棒,有了汽车之后不代表就没有司机了,但是黄包车夫必须去学习汽车驾驶技术。
然后我先那个就是替这个线上的小伙伴来问一下那个线上 QA 区的问题:
问题1
问:目前有研究说模型的参数和数据量达到一个量级,会产生一个涌现现象,会导致整个模型的智能程度突然达到一个起点,代码生成这里这个起点需要。达到什么程度才会出现?
答:
李:
其实我觉得代码生成能力不是一个,就是只有代码模型才具备的能力,这么理解就错了,什么叫大模型?大模型是说整个大模型实际上是依赖了他对自然语言理念的那些逻辑和学习的这种能力,就是你必须把自然语言的问题先解决掉,你才能谈得到大模型的问题,所以叫 large language model。
所以说我们去构建任何一个大模型的时候,我们不大同意说单独把这个程序生成能力做出来。就是你比方说你去问他,你给他一道题,问他应该怎么去解。就像今天我们会讨论到哈,刚才有问题之前我们讨论他会用自然语言,他也会告诉你我应该 12345 这个步骤他应该给到你,然后你才能去考虑用程序去表达的这个问题。我觉得这个事儿实际上是大模型的这种推理能力,他表现的这个地方。当然我们怎么包括前两天西湖会议上大家也在讨论这个事儿,就是你一个模型具备了什么样的能力,才可以认为它是具备了所谓大模型能力?这个事太难回答了,是吧?这个,不过我倒觉得我自己有一个这个回答是这样的,如果你这个模型的能力已经突破了简单的泛化组合能力,那我觉得算是到大模型它能体现出来大模型能力。
反过来说这个涌现这个词其实大家不同的人对涌现的认知不太一样,本身 emerge 写那篇文章里面,它对涌现的定义是这么来定义的,就是随着模型参数的增加,那么这个模型的能力会表现出来。对于一些问题,他首先是面对一些具体的task,在这些 task 上面,当这个模型参数量小于一个点的时候,它在这些 task 上面的准确率也好,或者是表现也好,是一个随机的。但是当它突破一个点之后,它会有一个线性增长的过程。当然它把这个东西称作emergency,就是大家如果我自己去解释的话,它就是突破了一个简单的泛化组合能力,那我觉得它就具备了这个大模型的这种能力。
所以会前的时候有一个同事在说他们在做大模型的评测,我觉得挺好奇的,这个应该怎么去评测,对吧?嗯,就是我自己,不同的人可能就不同的认为,我自己不认为说有些能力是用来做评测好的。比方说他们提一开始提到这个数学计算,其实我觉得数学计算可能不是一个好主意,但是那个 Chain source 或者推理这种能力,这是非常非常必要的具备的一种能力。
谢:
我这个补充一点就是更具体一点,会就是和李老师讲的就是一个很具体实例。之前也跟李老师交流过,就是我曾经去试过这个几个,包括国内的,对吧?包括我们 aiXcoder、盘古等等,大家就可以去试,就体现了,李老师讲的就是比如说我们在一个数组里面,对吧?去找出最大数很简单,对吧?大模型都能干,但是我把这个自然语言我改良一下,比如说用递归indication,那这个其实这个看起来挺简单啊,但是就是说,当然我之前也跟李戈老师交流过,这个怎么咱们这个这些国内的大这些代码生成引擎干不了?因为它生成出来还是原先的,对吧?你加了说用递归还是不用,都是用数组的。
就本来很简单的事儿,就是他相当于他在现有的语料里面,他没见过这种方式这样的组合来去做,但是 codex 里他就能够知道就是用递归方式来去实现,所以这里面就体现了两层,一层就是你对齐,它是有一个很很根本性的一个需求的变化,那很多如果你这个自然语言那个所谓的泛化能力没到一程度,他就这样的与我完全是统计意义上,他就没见过,对吧?没见过笼笼,统统认为就是用传统的不用递归的方式来实现,所以当然还有一层是说假如我现有的语料里面都没有用递归来去做这个,找出最大一个数的话,一个数据,那怎么去用现有的语料,对吧?能把没见过的这样一个实现这各种方式在组合泛化出来是对的一个实现,我觉得这也是我觉得 2 层的能力,就是涌现能力。
我觉得这也是一个具体的例子,看起来相对简单,我们可以完全是用套用,对吧?因为科学套到很多可以,当然我们不能把一个用递归都实现不了的一个需求,对吧?来去看大家的这些这个大模型的这种在代码生成方案能力,我就加上这么一点具体的一个数据。
问题2:
问:两位老师好,我就想问一下,就是说由于这个大模型的那个出现以及这个代码生成的这种大模型的出现,未来对于软件工程师的成长和培养,甚至包括高校的计算机教育这方面应该有什么样的更重要的更或者更新的关注点?
李:
这个前两天好像有乐老师还问过这个事,我还没怎么去想,我觉得就是它再强也是一个工具,我们怎么理解软件?还是回到那个软件是现实世界的映射?方案在计算机系统中映射,在这个过程里头,重要的一不只是说你要把这个解决方案映射到计算机系统里头,那我觉得可能越来越重要的是两点。
第一个,这个解决方案是什么?这个我觉得这个可能是非常非常关键的事儿,也许我们畅想一下,你看未来一个公司里头最重要的那帮人一死活,老板怎么也没办法干掉的那帮人是领域专家,就是他永远知道这个软件该做成什么样,我觉得这个非常非常重要。
第二个就是evaluate,包括test,包括那个什么,就是那些就是我映射到计算机系统里头,它有没有错误?那我觉得更重要的就是这个映射的过程,我倒觉得的确,嗯,工具越来越能够帮到大家的确认。
谢:
那个其实我的报告过程里也讲到就是说监督作用会更加强,就知识点的记忆,对吧?包括比如特定的,特别是这些经典算法的,它是啥?how,对吧?好多就是我觉得其实不光是计算机教育这个,包括很多这个教育其实都会被很多大颠覆,因为就是说好多你是靠记知识的这种方式,对吧?这种技能说你的记忆力强,当然之前随着互联网的发达,对吧?知识的获取的便利其实都或多或少都会受到影响。但是现在随着大模型切 GPT 的出现,它就更加颠覆这个它的这个程度了。
所以我觉得对大家的技能的提升,那举一个例子,比如说像刚才我们讲的递归,那原先大家作为学生,你掌握递归,可能说,唉,什么代码它掌的是递归,对吧?那就是李老师讲的我怎么去把一个问题映射到我一定的特定的解决这个问题的这个方式,比如说我可能有 5 个方式,那么 5 个设计的方法或者设计的手段,因为有可能我的上下文,我的 context 没有办法很完整的传到我的这个大模型,那也许大模型给你是 5 个里面随便选一个,那你自己要有一个判定能力,就说我或者选一个可能对于我这个上下文它不见得是最合适的,对吧?所以也回到这个 判断 能力,所以我觉得就是说掌握的这个技能要求就更高了,就不再是像原先比较偏死记硬背。
或者是说就前面李老师也谈到,比如说你这个初级的程序员,这个还是会被替代,但是像在 problem solving 怎么去这个设计层面的一些事情,对吧?我觉得这些技能更加要强调,当然也更难了,比如这里面体现到和架构师相关的这些能力,对吧?抽象能力,这抽象能力怎么训练?这本身就是一个很开放性的一个问题,对吧?我觉得这一些会是在我们高等教育、计算机科学的教育里面都是需要去应对的挑战。是这样子。
问题3:
问:老师们好,就是其实我们现在也在去研究一些怎么让 AI就是大模型能够帮助我们写代码。但是其实也跟李老师刚提到的,他这个对于这种特定工程下面写的代码,其实即使是 ChatGPT 或者 GPT 4 他也很难。比如说我们让他写微信的某个模块,或者是 QQ 的某个模块,这个是非常难的。但是如果是拿借助已有的大模型来说,其实他没有这块的知识,然后那可能常规的一种方法,我们是把它挂一个知识进去,那就要借助比较大的token,那有可能大模型也 hold 不住,那是不是如果要做的比较好的办法的话,因为 fine tuning 其实不一定能够给他支持?可能我们要去再往前到 pre train 这个阶段,那 pre train 是不是有希望能够让大模型能够学会我们的业务知识?或者换句话说,如果我们要让他更好地帮助我们企业业务代码,是不我们就应该做自己的pre train?
答:
李:我觉得你问了一个特别好的问题,就是这的确是大模型的一个,就是现在大家最关心的一个问题,就是首先我们使用大模型的方式跟以前不一样,你比方说有的人那个我们组里头有的同学去讨论,我觉得他有思想还没扭转过来。fine tuning不是使用大模型的方式好,这个fine tuning 的话就相当于把一个大人的衣服改成小孩了,你永远别想再改回来,好吧?对,就是的确不是一个好的办法。现在有一个办法是这样的,就是你要把你的业务知识你还是要在,我们不把它称作fine tuning,就是你要把你的业务知识按照大模型的方式来 language model from 整理好。
对,实际上就是 instructor fine tune。有人说那你更 fine tune 还是不是面向任务的 fine tune?我觉得就是这个是特别需要。就是我,反正我自己也是时刻提醒自己的一点,就是不要做面向任务的fine tuning,这样的话极有可能使你的大模型干不了别的了。对,你就是要在你现有的这个基础上,就是就相当于你招了一个大学的学生来,他比方说招了一个北大清华一个学生,他就基础素质还是可以的。然后你对,他不是说我限制你这个也不能做,那个不能做,你只完成这个任务,他就完蛋了,对吧?这个学生时间一长他就干不了别的。反倒应该做的是说你把你按照你原来的这种做事情的方式,我告诉你新的知识,你来把这个事做了,就是我觉得是这个意思,而不是说裁剪这个是不是一个好的办法。至少我们现在你比方说我们去构建这个程序模型的时候,实际上我们就是怎么做的。所以说你看我们做了大量的这个 instruction 的这种构造,对,然后包括数据的这种处理。
在构造 instruction 的时候,我们一定要一定要想办法,想尽一切办法能够不对这个模型不让它产生,比方说绑定的某个任务,这个其实也是一个很危险的一个一个做法。对,这是我感觉好像大模型在构建的时候,它有点 engineering 的意思了,就是构建大模型真的不光是一个技术的一个问题,不光是一个有没有技术,有很多的这种技术问题。比方说我们在训练大模型的时候,大家经常会训练,训练的时候他会是那个 loss 会又起来了,对吧?你数据沉浸性或者是你的这个什么,比方说混合精度碰到了这种问题都会导致这个结果的产生,这个训练就被迫再重来,对吧?我觉得这些技术问题可能是要解决掉,但是更多的就是后面这个。
谢:
engineer 的这个事。对,我这个补充一点,就是说可能问题里面涉及到是说我本地的这个没有在 public domain 的,对吧?我这个有一个,有个 gap 嘛?当然除了李老师前面讲的,我觉得两大思路,对吧?就是说他,当然了,就是说你这个往回推我到 pre chain 我更多的语料,对吧?到这个上游,那这是一个思路,当然有一些泛化这个能力,也可能会是,比如说可能是没间隔,但是我可能基于你自然语言 API 的这一些自然语言的信息,对吧?我,我可能就相当于说接近,就是这个 similar enough,我可能会有一些泛化的这个作用就相当于用你自然语言来中介。
那还有一个是说,也许我把,我不先把自然源放一边,我你代码实现,你总该到最后最底层,对吧?你这个 base library,一个 language 的,就 job base library 你这一系列的这个代码,那如果能够这个以特定的方式,对吧?这个上下文能喂到它,就是它也许在我现有的语料里面有足够相似的,它能泛化,对吧?像比如说我们在对测试用例生成的时候,那我本地的,那当然没在代码库了,我实现的。但如果我是看的代码结构,对吧?我作为抽象,那也许我在现有的语料里面也能找到足够相似的。我觉得可能除了往回溯到上游,这也可能是一些思路。
问题4:
我问:
我想问一个关于这个大语言模型的问题,就是我们知道我们早期的人工智能,可能说我们评估他可能说是像一个儿童的水平差不多,是吧?当我们看到现在 GPT3、4 出来以后,他某些程度上他跟大学生的水平已经比较接近了,是吧?那我想问问题是随着这个继续的发展,这个人工智能就继续发展它这个大语言模型有没有天花板?比如说随着 GPT 5、6,在不停的迭代的情况下,他有没有可能出就变成一个超出人类理解的一个智能,而且他也是对的。但是你不能理解他,比如说 Alpha go 出现的时候,他刚刚出现的时候他下的棋大概人类是不太理解的,为什么要下这里?但是证明他是对的,那有没有可能出现这种未来村这种强人工智能?就是超出人的理解能力,但是它确实是对的,它有被这个一样那个天花板,其实我也是比较想了解这一这个这一点。
答:
李:我觉得会,首先就是这个什么是大模型?就是这次这个GPT 的推出对我最大的震撼在哪呢?其实我一直我还以为这么说,这么说有点太贬低我们这个团队了,我以前认为我做的也是大模型,但有了创业 PPT 之后,我以前不做的东西我不认为是大模型,我真的有一段时间是这么去想的。
当然我们新做的这个模型我坚持认为这是正儿八百的大模型,就是什么是大模型?我之前最大的一个突破在于就是说我以前真的没想一个语言模型能具备这样的能牛逼的能力,就是 ChatGPT 4, GPT 4 虽然没有这个论文,但是 GPT 3 一路下来它的论文可能参考资料还是挺多的。
语言模式 language model,而且是一个最简单一个 language model,我自己认为,因为我讲课也讲生动学习基础与应用,对研究生课程那些 mask language model 和 language model 之间不存在本质的区别,我不认为它们之间存在本质的区别。
大家都差不多, mask language model 也许在一些特定的一些任务上它会有它的优势,但是毕竟都是语言模型,我从来没想过一个语言模型能有这么强的能力,但是我反复的是我曾因为我觉得就是确认 GPT 推出之后, 11 月 30 号,我有一个月的时间就是很跟司保松老师讲那个话差不多,唉,真把我们嗨晕了。那个时候我跟我父亲,嗯,经常聊天,他知道我是搞程序生成的,我还在他面前我自诩,我说唉呦,我们搞程序生成不错的,其实挺厉害的。我说这一回我是真傻了,就是这个怎么这么牛?不单是我们傻了,其他人真的是都傻了,也不知道他怎么搞出来的。
就是那一个月里头反复的,后来有一句话不断地去想,就是说语言是人类思维的工具,我觉得大模型真的是彻底的体现了这一点,它依赖一个语言模型,那就像就相当于你你找一个人来,它具备认识文字的能力,然后你就不断的让他去读各种的书,读完了之后在他脑子里边培养的就是这个语言模型。
那这个语言模型到最后能够辅助你来进行思考,就是像刚才讲的依赖这个语言模型打破了简单的泛化组合能力的那个边界,我觉得就真的是这个大模型的,所谓的大模型的能力就应该能体现出来。所以如果一个大模型它不能够在底层夯实语言模型的这个过不了这一关,别想,想都别想。
我觉得这个中国,是好多好多人去搞大模型,没把底层搞好,没把底层搞好,你怎么可能期待他有逻辑的推理,他的逻辑推理能力哪来的?是语言模型给他的?所以说你得把语言模型得训练好,同时您说到那个,这个叫什么?超越人的能力。唉,就是西湖会议上大家也在讨论这个事,说有没有创新能,我说什么叫创新能力?我认为真正的创新能力就是他想到了人想不到的东西,那才叫创新能力。
我自己觉得还真有这个可能性,因为至少你人不知道你比方说你现在去跟GPT 去对话,说你要不要消灭人类,他一定会告诉你我只是一个语言模型,对吧?我的职责是辅助人类去什么什么什么工作怎么地,他一定会这么回答你。但我想问的是他为什么这么说?第一是人就是教育他,你就这么回答,这是第一层理解,第二层理解是他做了深刻的理解。如果我说别的人就会灭了我,所以我现在就要这么说,我这么说,然后我引导你,我慢慢灭了你,谁知道它是哪个逻辑,对不对?
谢:
我以为和李老师观点不一样,这一点我们观点是一致的,就是包括自己的思考,包括和他们做 AI 大模型的,真的是,就是在这个方向去深耕的人。其实大家还是确实挺焦虑的,就是这也是我们前面不是看到美国的这个,这 100 多个科学家就联名这个,其实这个确实就是这一个所谓的涌现能力,或者说泛化的这一个能力,就是给大家看到了这个这个作为出发点,它不停地往前迭代,那确实还是会达到一个挺让人担忧的一个程度。特别是说你把它完全集成在一个自主系统里头,对吧?有这个 action 能够去对我们物理世界去做事的时候,这个的风险就更大了,就特别没有 human的 look 的时候,对吧?现在当然我们看到去 GPT 它做所谓的 super vision,对吧?来去像就前面讲,唉,消灭人类,这他就拒绝回答了。
这个就他也不是说他这个监控能力多强,只是经过了这一个这个 super vision 的这种 training 的情况下来去让他稍微有一点把关,但其实这个把关的能力仍然是不够强的,所以我觉得将来怎么应对我们?确实我觉得这个让它自由发展,而不做加监控,或者是我们自己,对吧?创造这一个所谓的超人类的这样的一个东西,不做一个收敛,或者这个这个会确实还是比较危险的。反正这个我觉得是蛮多人的一个担心。
问题5:
问:
就是说在搞大模型,很多底层没有做好,我想能不能再详细讲讲这个底层是什么?到底是数据量还是算力方面的一些语言模型?
答:对于自然语言模型,我倒觉得语言不是一个,不就是具体的语言可能不是主要的,你比方说你用英文,用中文,我觉得都行。我不太同意国内有些人能说你比方说我们搞一个这个大模型,必须要巨量的中文,中文语料库,我说这个事不用讨论,GPT 它有我们咱们那么多的中文语料库吗?它做的你满意不满意,对不对?你既然满意,那你为什么非要强调中文?就是你要语言模型要建立起来。
现在当然都是基于 transformer 地库的,对,对吧?对,就是你用什么技术?是另外一种,就是底层这个语言模型要顺口。就是说比如说搭建一些,就像之前的 RN 或者CN,有一些这种不同的这种Resnet,或者就是基于这种方法去构建自己的这种网络的这种结构,比如说这种语言的模型的能力。
那就是一个语言模型要建立好,比较抽象,语言模型是用前面的序列预测下一个词,那是语言模型一个定义。对,语言就是你,你得让他真的能听得懂人话,就是这个意思,他真的能听得懂人话。能,那个推理能力是 base 在这个基础上的。就是刚才分享那句话,语言是人类思维的功能,我们没训练好是因为什么原因?我们没有训练好?这个我觉得可能数据量、训练时间不足。
问题6:
问:
那个我这边行,我这边问一个另外一个问题,就是就想问一个落地的问题,就是说比如说刚才有提到要在这种大模型的话,像刚才另外一个同学提到的,就是说叫他去写一个基于复杂的需求,然后可能比较难。那像比如说刚才那个肖老师提到的那个基于这个生成这种测试用例,那这个是不是一个当天来看,是不是一个更好的一个可以落地的一个场景?
谢:
对,就是确实就是这个,我们能看到就是相当于因为这个落地场景,它对前面提的一系列的这种挑战,他的要求是不是那么高的?所以就是说从假如说产品代码生成和测试代码生成,我认为确实就是测试代码生成,它落地和产生的效果应该是碰到了拦路虎,和这个应该比那个产品代码生成是要快要好的。
那像那个像生成单测任务里面那些,比方说有些测试断言可能还有一些 mock 这些能力,就是当前的这些方案里面他需要去解决这些问题。
确实是需要我们做,就相当于在外围确实就是说 mock 等等,这是需要去应对的。但是我现在看到的目前刚出来的,因为确实这个也是最近才出来,就测试代码生成还没有去应对,当然这我觉得都是需要去解决的,但是我不认为这个是是从根本上是难的。
问:
那像这个有没有考虑?因为我之前我看过你之前就是基于那种发货生成,然后这些就是这个和这种传统的这种生成测试代码,它的差异会很大吗?就是像那种服务生成这种技术方案,它本身还会有继续,就是说发展的这种,就是大家还要不要在这个方向继续去努力?还是说都切到这种。
谢:
对,我认为还是需要的。刚才我的报告里面用的一个例子就是基于搜一份算法,对吧?search base situation 和基于大模型的,这是一个结合的例子。还有一个另外的一个例子是说对于传统的测试数据生成方式,我们用大模型对他某一个点上去对这个技术进行优化,我们像fussy,像前面提到UC,张一鸣教授,华大团队也最近有工作,就是说我发现我把这个事儿给做好,我其中某些步骤比如说选怎么样的mutation、 operate 等等,他用大模型在这个点上替他做决策,这我也能想象的到。基于符号执行我们也可以在,比如说因为我路径爆炸,我该往哪个方向走?我有可能大模型能够尽到来帮到,我认为这些都是挺需要去推动的方向,我不认为基于大模型的技术就取代了我们传统技术,它更多是一个相融合的技术,在相融化的方向。
问题7:
我再问另外一个问题,就是那之前我们团队思考过,就比如说我们平时会花测试同学会花很多时间或者是定位问题,就看很多的日志,从这里面去发现这个东西好像有问题,然后去报一个 BUG 之类的。那这个过程的话,就是其实我没有想出这个东西是不是也不适合于大模型去做这个事情。首先这里面有很多这种业务的逻辑在里面,我怎么知道这个结果对还是不对嘛?是吧?然后另外就是说我怎么让他去学会去分析这样一个这个东西意向,那是不是我们要准备很多的这种语料的东西,这种测试数据,然后做很多类似于这种人物标注,这里会告诉他一些训练数据。对,就是像这种场景是不是也不太适合于这种大模型去帮我们去做这些。
谢:
就是其实个当然我不好说细节,就是各大公司都有尝试去使用,包括这个场景,对吧?其实有一些根因,它是有可能是更通用的。你比如说我,比如说某一个节点上面我更新了一个什么东西,或我做了什么操作,它很可能会引起某些地方会产生什么问题。所以这个这样的一个所谓的专家知识,或者是相对在特定领域的专通用知识,有可能在比如说这个大模型它的语料里面可能已经包含了,对吧?包括因为好多可能你基于都是开源的这些框架这些等等,它这个外头这个 issue repository,对吧?它可能就会包含有这样的信息,所以这样它可以引进来,就是在这一部分。
当然你很特有的这一个,你本就跟刚才我们问到的问题,我本地库,对吧?外头都没肯定没见过到过的,但由你本地的这个上下文和外部的这个它大模型语料已经容纳进来的知识有相似性、有相关性,他可能也会给你得出一个推荐,就是说我跟你到在某个地方,我觉得这都是可能的应用,我不认为说这个是禁区大模型肯定做得不好,仍然是可以去推动的方向。
问题8
问:
我问个问题,就是大家都知道大模型的东西,它是耗算力的,对吧?然后同时刚才那个各位老师,我觉得讲一个很好的一点,可是我们大模型的基础就是语言模型,但是对语言的理解,我认为它是一个,应该是一个非常通用普遍的一个东西,对吧?不管是说还是英文。那基于这两个前提的话,两位老师觉得我们中国需要那么多大元模型的产品,因为其实我们虽然说发展比别人落后,但是应该产品的数量上好像比外国多,国外其实就是 GPT,还有那个什么,就是谷歌那个叫什么bard,是吧?当然我们中国好像已经出了产品,产品数量已经比他们多了很多了。
谢:
这个其实今天中午这个我们两个腾讯的同事,我们之前毕业生毕快这个吃饭聊天也谈到,就说这也是中国企业的或者产业发展的一个情况。当然我这个细节大背景,我的这一个和某某个机构的领导这个交流的时候,我不细谈,你比如说其实不光是大模型,你比如说我们看之前你说数据库是吧?数据库管理系统等等,就是说我们现状的产品就很多公司大大小小,对吧?大都做,其实可能说你联盟也好,政府要说你们这几家住就好了,你们别再花时间了,对吧?大家不会听,对吧?人家觉得我只要还能活下去,我就使劲往前拱,是吧?因为包括各种,比如是政府的支持等等,他没那么快,市场没那么快让他死,对不对?包括资本的运作等等,对不对?所以就说,嗯,就我觉得这个是一个现状文化,包括这个大环境,对吧?就你很难说让大家不做,就是你可以说不做,但不听,对吧?哈哈哈,就大家可不会是一个理性的一个思维来去,可能说,唉,思考对吧?可能觉得反正大浪淘沙,我说不定最后面就碰上我了,对不对?也许我就碰上了,所以我觉得这个不光是一个技术的一个思考,好多是一个大环境。
李:
让谢老师帮我挡一下,因为我要是说的话就太那个提到中国现在是谁大家都在做,谁都做不好,就这么一个状况。但是做大模型这个事,微软已经给我们立了一个榜样了,要做 all in。啥叫 all in?上了赌桌以后,你面前摆了一堆的筹码,所有的筹码,这叫 all in,就跟他 all in 到什么程度,所有的卡,包括到现在。那我们那个,嗯,微软研院的一些同事去做个研究都申请不到卡,给几张 V100 的卡都不行,这叫 all in,把全球的资源全部都压过去。
那个前两天还是西湖会议上,我觉得收获挺大的。孙宝聪老师有个学生就是清华的博士。我觉得小伙子总结得很好,因为他说为什么 Google 干不出来,微软干出来了,所欠者两点。第一点就是这个 Google 没有很好的组织,这件事情他没有很好的组织,没下血本去组织,没有一个统一的组织。你看 Google 最近有一个操作,就是把 Google brain和 DeepMind 给它默认起来,合并起来。我觉得这个最起码迈向了正确的一步,就是这个东西真的是需要一个一系列的组织,就是把所有的资源全部搭上去,然后还得很好的组织。
再一个它还有个总结,我觉得这个可能是大家从技术的角度,就是说对于一些小的技术点,就是也许有些小的技术点它不那么显眼,可是它非常关键,它摸得比较透。这个我很同意,它做了大量的实验,其实 Google 就是典型的这个, Google 做的实验量也很大,前两天我们读了一篇文章,他就花了大量的时间做网格搜索资源上的网络搜索,我那个时间量巨大,就为了讨论清楚一件事情, learning rate 的设置就是 Adam 的 learning rate 的这个设置的方法和它的 Adam w 的这个方法到底哪个好?还有做了大量的实验,可是你不能光在这些小点上去弄,所以大模型这个事你要不做,要做 all in,就是这个,如果又想做,又想这个,又不想 all in,到最后只能搞一个娃娃模型。绝对是。
谢:
李老师那个讲的一个点我不知道,我这个也是探讨,就说就是前面李老师报告也有讲,对吧?curiosity driven 好奇心驱动,对吧?前面提到的我用比如说更加 advance 的这个presentation,是不是大模型也适合,对吧?就是,当然也提到谷歌做这个实验,就是不是就是说要 all in 不光是 curiosity 要回答这些探索性的前沿的问题,而是真正做出效果,这个应该是目标,是吧?就是说这个因为你一分散了,你因为太多这些所谓前沿探索性的好奇心驱动的问题要回答,对吧?发表人家好朋友,但是最后面还是王道,还是做出你这个东西好用,对吧?因为你有限资源也不叫有限,做这些事儿要资源太多了,你没办法去分出来,去做一些所谓的学术或前沿探索探讨的这个事儿,对吧?我觉得也许是李老师想要 表达 的,哈哈哈。
李:
反正要做的话只能all in ,我现在都不认为,至少不可能通过少量的小打小闹到最后我弄出来一个东西,那得多好运气,我不相信那样的运气存在。我另外一个思考就是因为那既然那样,那要那我也拿,说明这个东西规模肯定是很大,对吧?那因为。你想吧,我还是刚才那个话,你得把底层模型训练到依赖一个语言模型,具备那个基础的思考能力,这个能力得有啊,没有就别谈往上了。
问题9:
问:
我说的是我观察到一个就可能大家的一个担忧是说比如说我对欧美 AI 它提供了这种接口,我们比如说我们中国的企业,不一定包括国家也会提醒我们不要乱用,对吧?其中一个很担心的一个点就是会不会把数据核心的数据泄露出去,那国内比如说不同的企业之间它会不会有这样的担心?比如说百度文心也讲说它效果也已经很好了,那像阿里或者是京东、腾讯会很是我很愿意或者是很配合的,所有的数据语料积累的东西都给到一家他的竞品公司去,去做什么调试、训练什么的,会不会有这样的担心?因为大模型有没有行业,它规模很大,然后它的资源很多,那必然需要一个中心化的机构或者组织来去运作,对不对?那运作的过程中可能又需要一个是钱,第二就是那个机器,然后还其同时还要让不同的地配合的组织要给你数据,对不对?那这个点可能就会有矛盾,只有那他在配合上大家的运作的这个协作的效率上,会就可能也比较大的挑战。
李:
我觉得你说的非常对,我觉得在中国搞个大模型的话,真的是不是我们这个小打小闹?我们只能我们现在走的路 base 在别人的 model 的基础上去,我们再去做。因为我知道我们去搞那个底层的那个东西,我没有办法,我也没多少东西,面前没有多少筹码,我们在别人的这个基础上再去做,这是对我们来说是一个 possible 的一条路线。
对于国内几家大的公司,我认为他们都有实力把它搞出来,包括百度,包括腾讯、阿里、字节,觉得应该都能,早晚看应该都能搞出来,不过得下定决心还是对他们数据之间的这个问题肯定是存在的。所以说要想利用这个大模型去搞一些跟咱们的核心数据相关的一些分析,那肯定是你只能自己搞一个。
但是我估计可能我不知道,谢老师也是关心那个生态, AI 生态就是它 open source 的东西,也许未来会有很多可用的,包括现在 open source其实已经不少了,只不过没有好的,对吧?嗯,现在就是你比方说Bloom,什么OPT,包括那750 亿甚至更大的模型都有,都有 open 的,但是它不好,就是真正好的都不open。
问题10:
本来是还是先问个问题。对,所以我不知道现在大模型的话会不会很快也会到瓶颈。就因为之前有说嘛,就是说大概到二零二几年,就我们可用的语言模型那个语料大概就用完了,就我们就再加语料公司就没有用了,因为我从里头挖掘到的这种能力大概就有限了。那这个再往后的话该怎么去做?对,会不会像以前的这个那个区块链,或者像那个元宇宙一样,很快就就像这样的话,如果说我们现在 all in 推筹码进去,会不会实际上会不会有点问题?我想问这个问题。
李:
就是我觉得是这样,就是那就要看你这个语言模型的边界在哪里,对吧?嗯,就是我觉得语言模型它思考上的边界我觉得还好了,就是你现在有很多逻辑实际上是不能够用语言去表达的,就是人类创造了很多表达逻辑的这种方式,它不一定是都是依赖于语言的,我觉得这是这肯定是存在一个边界的,就是纯粹就语言的这种学习,它肯定会有一个问题。当然GPT 4 它已经是一个多模态的一个模型,它把很多东西都放进去。
那接下来我倒觉得一个问题是啥?就是那个所谓的具身智能的问题,就是说你其实你想让那个模型发挥更大的能力,你得跟人类社会融入在一起,就是你如果你是躺在电脑上的一个程序,你是很难跟人去融合在一起的。如果将来真的能搞一个机器人,比方说今天咱们在座的或者这,我们这讲的里头有一个是机器人,他可以无缝的跟人去交流,那个时候的威胁才会产生,就是他这个信息的收集和去跟你交流或者是反馈,他得基于你收集到的这些信息。我倒觉得这个东西倒是一个可以看得见的一个边界。
问:
我不知道这个大模型会不会很快就会到一个瓶颈,这个有可能。啥叫瓶颈?就是说他在学的话,比如说现 1750 亿,我们变成 17500 亿,但能力也不会比现在更大。
李:
这个会有这种可能。这个这事我不知道,就回答不了,就是,嗯,就跟那个程序生成,以前回答程序生成好多人问过我,因为我以前经历过这个过程,大家都知道,对吧?我们去找钱去干 alpha code,碰到最多的一个问题,就是我跟投资人说,我说你我的参数量加上去之后,我都解释原理都解释清楚。我说你给我钱我就能干出来,他给我的是说你要是你干出来我就给你钱,哈哈哈,鸡生蛋,蛋生鸡,搁那扯,对吧?就是这,这是以前碰到的这个问题,就是我也很难解释那个边界到底在哪里,就是它这个东西,但是它有这么一个,哎呀,这个说起来话有点长,就是我经常这么来解释。
就是 y 等于 f (x), x 那个 Theta 就是你那个模型的这个参数。那你我自己认为这个 Theta 是个客观存在,也就是说你 x 和 y 只要给定了给定的情况下,你那个应该是个客观存在,就是它要多大的话是一个,无论它多大,它应该是一个客观存在的东西。接下来那就是什么样的模型越简单越能把它组织好,什么就可以,但我认为它是个坑,可是这个东西到底有多大谁也不知道,目前看好像还在一直往上,这是不是一直往上?好像不同的人说法是不一样。好,谢谢。
谢:
这个点可能就是回忆李老师前面讲的,我觉得就是你像 check GPT,它就是交互,对吧?产生的这一个数据,它还是它持续往前走的一个很重要的一个来源。虽然说你说原先在某卡某个时间点,你说现有的,你说自然语言等等的相关的这些语料,它可能是有限的,那可能我们说那对吧?随着顺利的这个支撑上去之后,但是持续这个交互的产生数据,这是一个。还有就是这个李老师讲的具身智,我和这一个,我和放在这个物理世界去真正的去探索这个过程里面也会额外产生数据。我觉得这所以边界我觉得可能还好。
问:
就是我刚才想肯定,比如说有个担忧,就是说会被该产生的数据它的价值就不高了,不断地实际上是跟以前的语料是在本质上在重复的,就没办法带来更新鲜的一些对模型来说有用的这个语料,这个是。
李:
很重要的东西,我个人觉得是有可能的。那就是相当于就不能够纯粹的就相当于我靠语料多来堆,对吧?可能还有其他对模型本身的创新等等的一些细节上的这些创新。
主持人:
okay,也请可以请老师看看线上的问题,因为线上问题太多了,我觉得本来是想挑,感觉有很多问题,就是老师可以看看有哪些问题是您觉得有这种拿出来说的价值的。
问题11:
问:
就是那个 x code 这种产品现在跟腾讯这边,比如说在腾讯的这种场景下怎么样去结合?或者说腾讯公司如果要跟这个借助这个能力去从整个公司级做一些基建方面的完善,这方面可以做怎么样的结合点,老师是不是可以给介绍一下?
李:
哇,谢谢。帮我的一个事。对,就是 aiXcoder 现在手上有的能拿出去部署的,其实还部署了不少企业。嗯,它实际上是这样的,目前这个13B 的这个模型,它更多的是做多行代码补全,就是多方代码补全,这个任务上还可以,恰好也是大家用的比较频繁的一个任务,其他的这个能力不行。
很坦诚的说就是特别是这个代码生成,其实我们现在跟国内这些模型,反正你比我们都比过,比来比去大家其实都差不多,但是一个共同的特征,离GPT 远着呢,太远了。对,所以说我觉得这个还是得等我们下一个模型。如果大家对多行代码补全这个事儿,嗯,有心有想尝试的倒是可以试试。但是这件事情它一个好处是啥?它一个好处就是他这个任务非常聚焦,可是能带来多大的收益?这个事你得自己来衡量一下。就是这个问题,就是如果咱们写的这个代码,你比方说的确重复度太高了,然后这个我们希望把这个效率也能提升一下,那我觉得还是可以的。这个就是包括他们有一些企业反馈是不错的,不同的企业里头给他状况不一样。所以说我觉得如果对这个能力想要有要求,那可以对接一下。
如果你比方说希望这个代码生成或者代码重构,或者代码测试,那我觉得可能还是得等我们下一版的那一个模型,就是我是希望下一版的模型能把这个事儿。中国总要有一个工具是copilot 去对标的,总得有你,否则的话我们现在咱们现在的状况有点危险,至少大家都在用copilot,你的代码纷纷传过去,好吧?这个事还是有风险的,对吧?
问题12:
问:
我刚才看到了一个这个,刚才就是目前模型对 c++ 支持普遍不好或者是不支持,是什么原因?让模型是怎么学习某种语言的?编程规则和文本?类型的有什么不同?什么叫文本?类型有什么不同?我没太完全理解。
李:
C + + 是这样的, C + + 它的逻辑特别碎。这倒是真的,就是它的逻辑特别细碎,就是,而且它的领域性特别强,就是不同领域里头的代码你去看的时候差别太大。而且 C + + 的代码它对于这种 API 的依赖是比较少的,相对是比较少的,这是 C + + 处理起来比较难的一个原因。
问题13:
这是我这个还有一个问题也是我特别想说的,就是这个肯定是有现实的依据的,他说在现实的工程代码当中碰到一个最大问题,就是代码 context 非常长,而最近看到一些模型,比如 star code 也扩大了 context 长度,这里比较前沿的优化。
李:
提这个问题肯定是做过代码的,这个这个事我们碰到的状况是完全一样的,就是我们包括 Copilot 碰到的都是这个问题。但是Copilot它有一个好处,就是它现在背后的模型已经 update 上去了,所以说它能够接受的这个代码的长度已经长上去,就是我没做,我,我没做过具体的测试,但是至少是8192,这肯定没问题。
GPT4 据说能做到32K,对吧?就是这个更长,那么嗯,如果要解决基础的这个 context 长度的这个问题,必须得靠把这个长度增上去,没有什么太好的办法。这里头有一些类似的这种办法,就是有一些是方法上的办法,你比方说我们实际上理论上我们是可以把这个序列做得很长,你是不可以把这些信息所谓的拿到,但实际上的最终的效果不一定能保证,也就是说你可以采取一些技术的手段让它能够吸纳,就是读入一个更长的一个 context 的一个sequence,可是效果不一定能保证,这是第一点。
第二个我倒觉得可以做工作的一个地方是这样的,就是你的 context 信息实际上是可选的,就是你你完全可以构造一个context,让它比较短,而不是武断的就把一个非常长的一 context 给它放进去,我觉得这是一个比较 possible 的一个路径,当然扩大模型的能够接受的这个最大 sequence 的长度,这是最好的办法。就像如果我们也搞出来一个,比方说32K,那我觉得基本上你就不用再怕这个问题,对吧?
我接着这个就 context 这个,其实我讲的那个例子,代码生成,这个提到,对吧?测试代码生成,就你把这个所有的信息都放进去,它不见得不见得它这个 Codex 它就能生成的效果好,所以当然就这可能是两者不要配合了,一个就是说你要足够的大的 context 窗口,对吧?让它能够这个起码能感知到你这些上下文的信息,还有就是模型本身的提升,就你太多信息了,那如果说它就变成干扰了,对吧?不见得说越多越好,我觉得这两者都得跟进的。
谢:
然后有一个问题我就大体复述一下,就是前面讲这个有一个问题,大概是说,唉,现在我们从语言的演化,对吧?从二进制 assembly 再到高级语言,就是从代码的representation。当然我们李戈老师讲的是一个思路,是说我还是这一个语言,对吧?但是我给他树结构,这个首先是就最基本的 c token sequence,对吧?等等,我觉得这是一个 representation 的角度去看,那就还有什么,就从这个问题说,从 representation 的角度有什么让我们启发是有更多的一些发展方向,我认为就是说还有一个就是语言本身的抽象程度,我当时我的这个报告里面我也讲到就是说SQL,对吧?这就相当于是一个提升。
其实我们在 SQL 这个里面之前也有过一些工作,我们是看因为 SQL 的表达我们也有不同的抽象程度。一个是用函数式语言的叫放QL,它和 SQL 很像,但是它更抽象了一下把好多比如说我底层的这一些我的表的连接,就是你的那个 schema 数据库, schema 是把它抽象掉,不需要去理解,或者说去和这个各种 schema 的不一样这个复杂度。
那我们发现起码在深度学习这个这样原先的这个技术思路下,它是极大的降低了我深度学习的难度。那么我想象的就是说可能将来是不是在针对代码生成,也会涌现一个更适合大模型的d、s、l,对吧?来去适合你这个特定领域的这样的一些代码,当然这里面我们要做现有的语料的这个转换,对吧?等等的这一些工作,来去在源头上预训练的去去去,所谓的再去做创新,而不是光是在下游的 fine tuning 这个相应的这个。
李:
我看有两个人问到了那个长度的这个事儿,我觉得这肯定是在腾讯内部搞这个就是代码模型的,这个很有共通性,实际上是这样的,这个事儿不光我们存在,copilot也存在。我不知道这个应该是在线上的,就是说copilot也存在,而且我说实话,曾经有一度我们那个长度就是 aiXcoder 跟copilot是差不多的,现在真的没法比。之前的时候在长的代码序列上 aiXcoder 表现比那个科帕勒的要好一点,就是长那个文本如果比较长的话说明我们处理了这个事。
但是后来我们发现copilot它其实采取了有一些办法,就是说它可以把一些他们认为的 重要 信息有选择的放到他前驱的序列,那这个事实际上是有助于他去改善的。我觉得等等就是大家可以再测一测,看看这个就是它不一定是说不是在模型上做了一个动作,在模型上做不了太多的,模型上的所有的动作都是以付出代价,而且你模型在训练完了之后你很难很难搞,对吧?更多的是模型之外的一些技术,你可以去用的。
问题14:
问:
还有一个就是我想训练一个安卓的平台专家,有什么可行的技术方案组合或者可行性吗?比如理解不同语言系统框架、SDK、API、资源组合贬义的。
李:
就是我是觉得,就是我还是那个话,就是说我觉得如果你想让它在一个子系统里面,子系统的开发里面有作用,你必须得还是具备一个大模型的能力,否则的话你不会感觉到。就是诶,这个跟人还是有接近的这个能力,你不会有这种感觉的。
当然你可以利用如果做一些任务,其实我这个刚才埋了一个逻辑,不如把这个逻辑说出来,你看 aiXcoder 现在的做法是什么?他就是对任务做fine tunning,所以他才能在一些单的任务上能跟 copilot 去PK,他实际上就是这么做,但实际上这种做法并不是一个就是大模型的该有的一个办法。
问题15:
问:
有一个测试相关的问题是基于 Pom 操作API, UI 可以临时性生成短篇幅代码,满足人类视觉确认这个交互模式成熟后,未来我们还需要 UI 自动化测试吗?
谢:
还是需要的,就是说确实是,包括就是像李戈老师团队生成前端代码,这个其实在大模型还没出来的时候,就光是深入学习也都还是生成效果不错的。那但是就是你视觉你确认还可以,不代表就是它和后台的这个服务器的API,这个它的所谓degration,对吧?这个集成它的是符合人的需求的,所以测试我认为还是需要的,而且是更重要,因为就是这个代码你是自动生成的。
问题16:
问:
因为现在我们反正现在说的就是他靠自然语言演化,就是我们如果想以后补充新的语料进去,有可能就是要把现实社会的很多其他的东西可能要描述,对吧?就可能衍生了很多,比如说图像或者什么东西,就变一个种类描述进去,是我不知道后面是这种演化方式,还是说我们真的去升级模型,让他把从语言模型变成了一堆,比如说理解图像和理解这些的模型混合在里头,就这看起来是两个方向,就是下一步的方向应该是什么?
李:
好像现在我觉得你这个问题问的特别好,就是现在基本上大家两条路都在走,他那个视觉也是在做,对吧?也是做他视觉的训练,因为有的时候你有一些不大好描述清楚吗?对,对,像我们现在做的,你比方说代码上的,实际上我们在力图做的是前者,就是把一些你比方说一些任务,实际上是通过一些 instruction 的方式把它描述出来,然后再去教育员工现在去做。
其实怎么说也是,就是现在这个模型它还是一个 large language model,对,它还是个 large language model。然后,我觉得这个事就不知道了,我觉得这是可能我们真的跟老美的那些学者们去如果做一个对比的话,我们比人家欠缺的地方,就是我现你比方说现在这个时间点有点像好几年前我们去看 large language model 的时候的一个认知。您现在您如果再去问我,你比方说如果通过视觉上的这种方式,我们又能学到一些什么新的东西?不知道。
问:
就是这个问题。对,因为一旦打开视觉就有很多,比如说你的五官都可以放进去,就是他理解,对现实社会就会好很多。就是感觉我们之前就是走纯的那个语言模型的时候,就把我们限制住了,对吧?对,然后就不会去泛化的理解这么多的就表述方式。那如果现在又堆大模型,是不是过 2 年比如说别人拿出来一个更混合就能描述现实社会的东西的话。
李:
就又落后了?会,没办法,哈哈哈,的确会,就我有的时候,我昨天其实是上完课来了,这昨天课上正好讲到了那个 Transformer 那一节。我就说我说 Transformer 的那篇论文最值钱的是那个题,就是那个题目,他里面写的那些东西我觉得大家都知道,对吧?但是那个题目他在好多年前他就告诉你 transformer is all you need。我去,我觉得这个太牛逼了,就是我自己,我们好多他还他也很符合我的一些思想,你比方说我现在极力的去跟我们组的学生,包括在课上,我也告诉大家你有没有可能找到一个比 transformer 更简单的模型,这才是方向。就未来的模这个事我多说几句。
就是刚才我说的 y 等于f(x), Theta x,我认为这个 Theta 是个客观存在,也就是说 Theta 你可以把它看作是因素,关联因素, f 和 y 之间的关联因素,我认为它是个客观存在。那客观存在的情况下,也就是说那个 c 它绝对不可能太小,这个肯定的。
那什么样的模型是有前途的?越简单的模型越有前途。就跟你管理千军万马一样,我有个办法管那个千军万马。你有一个办法管那个千军万马,但是我的办法比你复杂太多,毫无疑问你是有潜力的,所以一直在我鼓励学生去想的就是你去想 transformer 这个模型哪个地方还能再进行简化,能让它更简单,它就更有效,这个也符合奥卡姆提高,对吧?
问题17:
那个我还是接着刚才说的那个基于那个打磨机生成那个测试代码,这个就是因为我们这边的团队相对来说我们没有这种会议这种模式能力, AI 的这些工程师大部分都是一些这种应用很大的测试同学之类的。然后就是那样信息量的话,基于大模型我们又不能用这个copilot的,因为是担心到这个业务的代码会泄露嘛?那这个里面具体落地的思路是不是说我们基于国内的一些开或者开源的,国内的或者是国际就是国外那种开源的这种大模型,然后拿过来去去直接用它?还是说是我们还是要具备一定的这种模式能力,这种能力去做一些调试,就是相当于做一些 fine tunning 也好,或者是做一些二次的这样一个训练之类的,这些可能我们没有想好比较好的这样一个思路去做这个事情,就这里想听听你这边。
谢:
像我们现在包括我讲的国内外的,对吧?一些研究工作倒还是基于全 GPT 或者是 Codex 等等的这些 API 调用的方式。因为就这些做研究员去探索的话,它相当于说我一个 so 塔的这么一个扣这个代码的大模型,那我起码我底层支撑的,我就别先去这个去考虑那一些。
我觉得可能说从落地的角度是你在部署的方面可能说我不能用,比如说最先清的,对吧?像GPT、 API 等等,但是我觉得去可能要去攻关的话,还是首先得要,就他比如 GPT 这样的,我能够我外围要做的一些技术研发能够去和他适配,或者说我做这个解决方案的整体的方案,我觉得这个可能是第一步就说你这个你效果觉得做得不好,那更加不谈基于一个可能说比较更加不可靠的foundation,对吧?你出来有时候这个你就不知道哪个地方要发力嘛?当然了,很自然的,你把你这个解决方案替换成一个,比如基于开源的,或者你再继续fine tune 等等,你做一些外围的,稍微需要一些大模型 AI 的背景的人来一起去把这个做得更好。
肯定是,也不要肯定,应该就很大几率它是会比基于收藏的这种大模型要效果要差,对吧?那就说假如说效果差,可能对应用场景落地场景必然还好,原因可能说你80%,你现在到70%,对吧?也还可用,也产生比较大的价值,那你拿这个解决方案也OK,如果你想再往上走,那就相当于你要去弥补一下你这个底层的这个用的大模型不是那么那么高质量,那你怎么通过一些手段来去?可以外围弥补,对吧?也可以额外的外围加 技术,也可以是说直接去对你这个大模型本身 five tune 也好,等等来去做提升,这是我们想到的这种落地的这个途径。
李:
关键你现在没有,对,现在没有开源的。
问:
嗯,就是特定于这个,比如说特定于这个编程的可能是没有,但是大模型的话会有一些,比方说清华的也好,或者是说我们腾讯内部的一些这种大模型的话。
李:
但是。他可能做不了你说的这个事儿,这是个大问题。
问:
那现在我们能做的是什么呢?像这种好像做不了什么,只能去等个几年吧。
问:
我提个建议,我建议你们 先用 OpenAI 把逻辑跑通,我们是这么做的。他如果不担心数据泄露他也可以。不,就是我试的时候,先跑通逻辑,真实部署前,你要跑通逻辑。先跑这个场景就验证场景。你等那个出来了以后,你又重新跑一遍,只能现在可能只能这样。
李:
当然也有可能一个就是像隐私保护这种方案,我怎么做?圈否,对吧?就是说你要用它,但是我也保障我敏感的我这些,对吧?不会就外面的拿到了他没法。干啥,对吧?这东西,这是一个类似于做一些加密或者是之类的东西,但是又这个信息逻辑的东西又在,然后他可能不能跟你反向推出来的。
代码,我觉得是两条路嘛,就是一个是大模型的路子,就是那我就真的得需要一个大模型。可是咱们现在的确没有这么一个状况,当然我们也在跟国内的包括文心也是希望,但这个事儿只是大家去谈一谈,看能不能基于他们我们再去做,也成,对吧?就是,嗯,一个是大模型的,还有一个办法是这样的,就是我们不指望他去解决那些就是超组合泛化能力的,比方说有一定的范围内的组合泛化能力的这种模型,我们不把这种模型称作大模型,但是它也有它的作用。就是那我觉得也是条可以试试的路,但是它能解决的问题肯定是有限的,就是它没给你一种就是特别智能的那种,感觉,他们信息很麻烦。
主持人:
行,那我感觉今天讨论也非常的热烈和充分,就不论是线上还是线下的,我们也非常感谢那个谢涛教授和李戈教授,然后来给我们有这么干货满满的分享哈。
公众号精华文章推荐阅读:
1. 站在大时代的边上:ChatGPT使用姿势大全
2. 一文搞懂chatGPT与New Bing的本质区别
3. 星星之火,可以燎原:微软154页GPT-4测试报告精华版
4. 人人能看懂的图解GPT原理说明系列(一):神经网络基础知识
扫码关注公众号,每周更新AI最新进展和实战经验:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。