为什么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,一经查实,立即删除!

相关文章

精通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) 用于对背景模糊等特效进行绘制合并。 系统能力&#…

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

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

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

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

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

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

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

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

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…

防患未然,OceanBase巡检工具应用实践——《OceanBase诊断系列》之五

1. OceanBase为什么要做巡检功能 尽管OceanBase拥有很好的MySQL兼容性,但在长期的生产环境中,部署不符合标准规范、硬件支持异常,或配置项错误等问题,这些短期不会出现的问题,仍会对数据库集群构成潜在的巨大风险。为…

脾胃论笔记

焦虑会导致脾胃受伤 焦虑等不良情绪也会导致脾胃受伤,我们称其为肝气不舒。肝气不舒会导致脾胃系统出问题,这叫肝木横逆克脾土,木克土,脾胃就容易受伤。 这样的情况在现代社会特别多。这跟古人就不一样,古人生活相对…

Python爬虫——Requests

目录 简介 基本使用​编辑 ​编辑 安装 一个类型和六个属性 请求类型 GET 代码示例 POST 代码示例 代理 古诗文网绕过验证码登录 总结 简介 Python的Requests库是一个用于发送HTTP请求的常用库。它提供了简单且人性化的API,使得发送HTTP请求变得非常容易。…

完美解决VMware中配置suse10虚拟机网络

一、注意!!!配置suse10网络,需要在虚拟机关机状态下进行,否则会配置不成功; 二、配置与主机在同一网段(仅主机模式,网卡一); 在suse系统关机状态下,Vmware中设置”虚拟网…

2024华为Android高级面试题及答案,android系统工程师面试

大厂offer是每个技术人的追求? 我觉得每一个程序员的梦想大概就是能够找一份大厂的 Offer,我觉得这很正常,这并不是我们的饭后谈资而是每个技术人的追求。像阿里、腾讯、美团、字节跳动、京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司/…

0.8秒一张图40hx矿卡stable diffusion webui 高质极速出图组合(24.3.3)

新消息是。经过三个月的等待,SD Webui (automatic1111)终于推出了新版本1.8.0,本次版本最大的更新,可能就是pytorch更新到2.1.2, 不过还是晚了pytorch 2.2.2版。 不过这版的一些更新,在forget分支上早就实现了,所以。…

2核4G云服务器就服阿里云,这性能无敌了

阿里云2核4G服务器多少钱一年?2核4G配置1个月多少钱?2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年。可以在阿里云CLUB中心查看 aliyun.club 当前最新2核4G服务器精准报价、优惠券和活动信息。 阿里云官方2…

一文了解74HCT14D的引脚图、符号、封装、数据手册及应用

74HCT14D 是一款采用硅栅 C2MOS 技术制造的高速 CMOS 施密特逆变器。它实现了类似于等效 LSTTL 的高速操作,同时保持 CMOS 的低功耗。该器件可用作电平转换器,用于将 TTL 或 NMOS 连接到高速 CMOS。 输入与 TTL、NMOS 和 CMOS 输出电压电平兼容。所有输入…