为什么LLMs不适合编程

使用LLMs进行编码的挑战

 自制形象

在过去的一年中,大型语言模型(LLMs)凭借其自然语言理解能力展示出了惊人的能力。这些先进的模型不仅重新定义了自然语言处理的标准,而且还广泛应用于各种应用和服务中。

对使用LLMs进行编码的兴趣正在迅速增长,一些公司正在努力将自然语言处理转化为代码理解和生成。这项任务已经突显出在使用LLMs进行编码时尚需解决的几个挑战。尽管存在这些障碍,这一趋势已经推动了AI代码生成器产品的开发。

你曾经用过ChatGPT来编程吗?

虽然在某些情况下它可能有所帮助,但它经常难以生成高效且高质量的代码。在这篇文章中,我们将探讨三个原因,为什么LLMs并非天生就擅长“开箱即用”的编码:分词器,当应用到代码时上下文窗口的复杂性,以及训练本身的性质。

确定需要改进的关键领域对于将LLMs转化为更有效的编码助手至关重要!

 #1 LLM 分词器

 

LLM分词器负责将用户的自然语言输入文本转换为LLMs可以理解的数字格式。

分词器通过将原始文本分解为标记来处理文本。标记可以是整个单词,单词的一部分(子词),或者单个字符,这取决于分词器的设计和任务的要求。

由于LLMs操作的是数值数据,每个token都会根据LLM词汇表给予一个ID。然后,每个ID进一步与LLMs潜在高维空间中的一个向量关联。为了完成这最后的映射,LLMs使用了学习到的嵌入,这些嵌入在训练过程中进行了微调,能够捕捉数据中的复杂关系和细微差别。

如果你对尝试不同的LLM分词器并看看它们的表现感兴趣,那么这篇文章《释放ChatGPT分词器》就是为你准备的!

分词器编程挑战

使用一般的LLMs进行编码的一个主要挑战在于,它最初是为文本生成训练的,而自然文本中的词汇分布与编码中的词汇分布存在差异。自然语言拥有丰富的词汇和广泛的语法变化,反映了各种各样的想法、情感和细微差别。相比之下,编程代码具有更为受限的词汇,这些词汇特定于每种编程语言,并且遵循严格的语法。

此外,代码常常包含重复的结构和模式,如循环、条件语句和函数调用,这在自然语言中较少见。逻辑结构与自然文本中观察到的主题和风格模式有显著的不同。

此外,代码中的一个小的拼写错误或语法错误可能导致功能失效。由于其概率性质,LLMs难以生成高精度的代码。

分词器编码奇特之处

在使用常见的编码分词器时,最大的效率损失源之一在于处理空白字符,特别是对于代码缩进。与自然语言不同,其中空格的语义重要性较小,编程语言中的缩进对于定义结构至关重要。

传统的分词器常常忽视缩进的结构重要性,将其视为纯粹的空白,这导致了必要信息的丢失,产生了歧义,并在代码解释中产生错误。

为了说明这一点,我们可以使用Python库tiktoken,并使用不同的分词器对一个带有文档字符串的简单函数定义进行编码:

参考文章“释放ChatGPT分词器”,以多个分词器复现此示例。

正如我们所观察到的,Codex和GPT4模型背后的分词器保留了缩进,与此相反,GPT文本分词器将缩进分解为多个空格。

 #2 上下文窗口

 

有限的上下文窗口仍然是LLMs的一个常见问题,当使用LLMs进行编码时,这个问题尤其明显。

上下文窗口是指模型在处理过程中能够考虑的标记数量。这种限制影响了LLMs有效理解和生成代码的能力,因为模型无法看到程序的全局。

尽管文本生成模型也受到有限上下文窗口的影响,但由于各种原因,编码对这种限制更为敏感:

  1. 复杂的代码依赖性:编程经常涉及到复杂的依赖性,其中一段代码的功能或行为可能依赖于其他可能并非在文本中紧邻的部分。函数可能会调用在其他地方定义的函数,变量可能会在程序的不同部分使用。有限的上下文窗口意味着模型可能无法获取所有需要准确理解或预测下一段代码的相关信息。
  2. 长期逻辑结构:软件开发经常需要维护长期的逻辑结构,如嵌套条件、循环和函数调用,这些可能跨越几行甚至几个文件。LLMs在有限的上下文窗口中努力维持这些结构的连贯性,可能导致生成的代码中出现语法错误或逻辑不一致。

总的来说,有限的上下文窗口使得生成与整个代码库一致的代码变得具有挑战性。在自然语言生成中,通常通过使用摘要来管理有限的上下文窗口,但这对编码任务来说并不是一个选项。

#3 培训的性质

 

一般的LLMs被训练来预测给定一系列令牌后的下一个token。这被称为从左到右的生成,这使得它们在诸如代码生成这样的任务中效力较弱,因为在完成代码填充(建议)、修复错误、添加注释、重命名变量、文档字符串生成、返回类型预测等编码任务时,也应考虑右侧的内容。

实现正确的上下文感知

代码填充涉及生成适合嵌入现有代码的代码片段,就像GitHub Copilot所做的那样。这需要理解插入点前(左)和后(右)的上下文。尽管GPT模型的性质是单向的,但它们处理此类任务的能力可以归因于一些关键因素和技术:

  • 在代码数据集上进行自适应微调:通过在代码数据集上微调GPT模型,这些模型可以学习编程语言特有的模式、风格和结构。这个过程包括接触各种编码任务,包括代码补全和填充,这有助于模型学习根据前文预测适当的代码片段。
  • 提示工程:任务呈现给模型的方式可以显著影响其性能。对于代码填充,提示可以包括周围的代码作为上下文,基本上重新构造任务,使其更符合模型的单向能力。

尽管这些技术确实提高了LLM在编码中的性能,但要从根本上解决问题,我们需要改变训练策略。

 双向训练

An example of a model employing bi-directional training is InCoder [1], which was trained to maximize the likelihood of a code corpus. It utilizes the concept of infilling blocks of code conditioned on arbitrary left and right contexts. 

在其训练过程中,代码块被遮蔽,模型被赋予了根据遮蔽部分两侧提供的上下文来填充这些代码块的任务。这种方法意味着InCoder被暴露于并从中学习,它必须理解和生成代码片段的场景,不仅来自前文(左)的上下文,还要考虑到后文(右)的内容。因此,InCoder的训练不仅仅是基于前面的token来预测下一个,而是预测遮蔽块内的缺失标记,提供了对代码结构和逻辑更全面的理解。

[在线来源] InCoder训练过程中代码掩蔽的示例[1]。

后续的模型,如CodeCompose [2],也遵循这种方法,同时修改了掩蔽的不同方面。

 最后的想法

在这篇文章中,我们探讨了三个重大挑战,这些挑战使得像ChatGPT这样的LLMs在“开箱即用”的编码中效果较差。这些挑战从最初的处理步骤如标记化开始,经过诸如有限上下文窗口这样的架构限制,到他们固有的从左到右的token生成。

尽管GPT模型在其新的迭代中越来越擅长编码,但并不明显地看出它们直接解决了上述问题。正如我们所看到的,它们通常采用传统的编码器-解码器变换器架构,在代码库上进行预训练以获取对人类编码模式的强大先验。此外,使用较小的数据集进行后续的任务特定微调可以提高它们在编码任务中的性能。

尽管微调技术和集成额外组件(如ChatGPT代码解释器)带来了有希望的结果,但一些学术研究人员主张从根本上解决这些挑战。这种方法旨在超越传统的LLMs,从仅依赖最大似然估计转变为采用性能意识的代码生成策略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/723688.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

96.Go设计优雅的错误处理(带堆栈信息)

在之前的两篇文章中,我们已经介绍过错误的一些优雅处理 75.错误码设计、实现统一异常处理和封装统一返回结果 88.Go设计优雅的错误处理 本文想继续写一篇,可以作为工具包直接使用。也是记录一种新的思路和编码技巧,同时创建错误的时候会自动…

Dubbo的集群容错方案

Dubbo提供了多种集群容错方案来保证分布式环境下的高可用性。这些容错方案可以在服务提供者不可用时,根据不同的业务需求和场景,选择不同的策略来处理。以下是Dubbo支持的一些主要集群容错方案: 1. Failover Cluster(失败自动切换…

Ubuntu 20.04 ROS1 与 ROS2 通讯

激光雷达和3d视觉传感器驱动很多都是基于ros1开发的,由于自己项目在ros2环境开发,需要获取从驱动出来的点云数据流,所以尝试订阅ros1出来的点云topic话题,固需要ros1与ros2之间建立通讯连接。 项目环境: Legion-Y7000…

Android Intent 传递数据过大问题

/** * 通过Intent传递或者返回的数据是存放在一个叫做Binder transaction buffer的缓存区,这个缓冲区的大小为1Mb(Android 28 Platform),当缓冲区不够用时就会抛出异常 * 如果有多个数据传递同时进行&#xf…

【Linux】linux | 验证端口是否开放 | 基于linux工具

一、场景 1、多台服务器,做负载均衡 2、应用服务访问基础服务,端口不通;比如:redis 3、验证是防火墙问题还是redis配置问题 二、操作 1、下载工具nmap yum -y install nmap 2、验证命令 nmap -p 80,6380,8848,3306 192.168.1.…

精通Docker Compose: 在docker-compose.yml中配置硬件资源访问

精通Docker Compose: 在docker-compose.yml中配置硬件资源访问 引言Docker与硬件资源访问简介为何需要在Docker容器中访问硬件资源Docker如何与硬件资源交互 准备工作安装Docker和Docker Compose确保硬件资源可被主机识别小结 在docker-compose.yml中配置硬件资源访问显卡访问配…

HarmonyOS创建项目和应用—设置数据处理位置

项目和应用介绍 关于项目 项目是资源、应用的组织实体。资源包括服务器、数据库、存储,以及您的应用、终端用户的数据等。在您使用部分服务时,您是数据的控制者,数据将按照您设置的数据处理位置来存储在指定区域。 通常,您不需…

java数据结构与算法刷题-----LeetCode230. 二叉搜索树中第K小的元素

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 中序遍历2. 预处理 1. 中序遍历 解题思路:时间复杂度O(Hk)其…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:特效绘制合并)

用于对背景模糊等特效进行绘制合并。 说明: 从API Version 10开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 该接口为系统接口。 useEffect useEffect(value: boolean) 用于对背景模糊等特效进行绘制合并。 系统能力&#…

华为荣耀终端机试真题

文章目录 一 、字符展开(200分)1.1 题目描述1.2 解题思路1.3 解题代码二、共轭转置处理(100分)2.1 题目描述2.3 源码内容一 、字符展开(200分) 1.1 题目描述 // 64 位输出请用 printf(“%lld”)给定一个字符串,字符串包含数字、大小写字母以及括号(包括大括号、中括号…

分布式数字身份:通往Web3.0世界的个人钥匙

数字化时代,个人身份已不再仅仅局限于传统形式,分布式数字身份(Decentralized Identity,简称DID)正崭露头角,它允许个人通过数字签名等加密技术,完全掌握和控制自己的身份信息。研究报告显示&am…

HarmonyOS NEXT应用开发——Navigation开发 页面切换场景范例

简介 在应用开发时,我们常常遇到,需要在应用内多页面跳转场景时中使用Navigation导航组件做统一的页面跳转管理,它提供了一系列属性方法来设置页面的标题栏、工具栏以及菜单栏的各种展示样式。除此之外还拥有动态加载,navPathSta…

Linux 桌面版系统问题分析及CDH 6影响分析,CDH做HA模式配置教程

一、问题 由于之前是第一次安装CentOS系统,基本上是按照网上的教程安装,安装了桌面版,配置默认,在安装CDH6.3后,在使用中发现没有预期的那么好用,然后请教专业人士后,得出以下2个原因 1、桌面…

在Linux中使用docker【下】(常见命令下)

在Linux中使用docker【下】(常见命令下) 一、Docker介绍二、在Linux中使用Docker的意义2.1 轻量级与资源高效2.2 快速部署与版本控制2.3 隔离与安全2.4 简化运维2.5 跨平台兼容2.6 持续集成与持续部署(CI/CD) 三、Docker的安装3.1…

JVM 启动参数

jvm的启动参数随版本发展可以分为三大类:标准参数、非标准参数和非Stable参数。 1. 标准参数:所有JVM实现都必须支持这些参数,且向下兼容。 如:-jar -cp -verbose 2. 非标准参数:大多数JVM实现都支持这些参数&#…

将圆环区域展开成矩形长条

在机器视觉领域,经常会遇到圆环型的检测目标,比如瓶口,轮胎,橡皮圈等等,比如想检测轮胎上的瑕疵,就可以通过把环形区域展开成矩形形状,然后对胎侧进行瑕疵检测,再比如对圆环扣上的字…

2024大厂Android面试集合,安卓开发面试书籍

前言 早在2017年我们就建了第一个进击BAT的Android开发进阶交流群,两年期间很多群友都分享了自己的Android面试经历。其中就有很多群友已经斩获蚂蚁金服,天猫,高德,盒马等阿里系offer 收集反馈的面经资料比较乱,最近…

2024BAT大厂Java社招最全面试题,成功入职字节跳动

前言 现在Java程序员面试都是因为没有丰富的工作经验和自己过硬的技术,所有都不知道一般互联网应该会问什么技术问题,加上自己可能去面试的时候没有准备的太充分,一面试刚跟面试官扯几个面试题就不知道自己在哪里了,被怼的体无完…

● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

● 198.打家劫舍 动规五部曲。 1、dp[j]含义。前j个房屋偷到的金额之和最大是dp[j]。 2、递推公式。递推公式要得出dp[i],就是要确定第i个房屋是否打劫,那么也跟之前的背包问题一样,放与不放,对应的是两种结果,我们只需…

旺泓_光感WH3620_数字RGBW-IR色彩传感器

由工采网代理的WH3620是一种基于颜色的光到数字转换器;它集光电二极管、电流放大器、模拟电路和数字信号处理器于一体;提供红、绿、蓝、白和红外光传感;能调节屏幕或灯光白平衡;各通道同时并行输出,因此在白光LED、CWF、TL84、D65…