前言
探讨了如何利用 ChatGPT 等AI工具帮助初级开发者成长为资深开发者,强调了提升编码技能、理解和应用 AI 工具的重要性。今日前端早读课文章由 @Matteo Baccan 分享,@飘飘翻译。
译文从这开始~~
ChatGPT 和其他 AI 工具已成为开发人员不可或缺的工具,但它们的真正潜力远不止于回答提示。这些工具如何帮助初级开发人员成长为高级开发人员?答案在于提示工程、理解大型语言模型的能力以及有效地利用它们。
ChatGPT 是如何工作的
ChatGPT 是一种会话式 AI,它处理自然语言以生成回复。它应用训练好的规则,而不能独立推理。这意味着优质的输入会产生优质的输出,而质量差的输入则会导致糟糕的结果。此外,其训练数据限制了它的知识范围,使其仅限于特定的时间段,因此对于新出现或小众的话题,它并不可靠。
有效利用 ChatGPT
1、理解代码
大型语言模型能够分析不熟悉的代码,这使得开发人员 —— 尤其是初级开发人员 —— 更容易理解和修改代码。例如,让 ChatGPT 解释一个函数通常会得到清晰的分解说明。
2、代码的建议
像 GitHub Copilot 这样的工具在代码上下文理解方面表现出色,能够分析你的编辑器和代码库,从而提供相关的建议。这些工具在针对性方面超越了通用的大语言模型。
3、编写测试
测试创建是一项需要时间才能掌握的关键技能。大型语言模型(LLMs)能够生成初始测试用例,节省时间并确保更好的代码覆盖率。
4、提高安全
ChatGPT 能够识别潜在的漏洞并提出改进建议,例如添加参数验证或空值检查。
5、重构代码
来自大型语言模型的重构建议能够提高代码的可读性和可维护性。虽然这些重构建议并不总是针对性能进行优化,但它们通常能提供更清晰的结构。
6、生成模版代码
启动新项目或新功能时,通常会涉及一些重复性任务。ChatGPT 可以根据你的需求生成样模版代码,从而减少设置时间。
7、添加注释
大型语言模型(LLMs)能够自动为你的代码添加详细的注释,使其更易于理解和维护,特别是对于那些没有文档记录或遗留的系统而言。
8、代码评审
像 ChatGPT 代码审查者这样的 GitHub Actions 可以自动审查拉取请求,提供可操作的见解并提高贡献的质量。
9、文档编制与翻译
LLM 驱动的工具简化了文档编写,甚至能自动翻译,让团队间的协作变得无缝衔接。
大型语言模型并非为解决问题或猜谜语而设计
大型语言模型(LLMs)是为回答问题、撰写文章和生成代码而构建的,而不是为解决难题或谜题。如果你向 LLM 提出一个未解决的问题,它将无法解决。然而,如果你提供一个已解决的问题,该模型能够解释或重现解决方案。
看着有人给 ChatGPT 出一道谜语,然后对它没能解开感到惊讶,这就好比让一个 5 岁的孩子去解决量子物理学的问题 —— 这样的测试忽视了该工具的设计和能力。这并不能证明模型有缺陷,反而凸显了用户对其使用方法的误解。
知识局限性
大型语言模型的知识是有限的,仅限于其训练数据集中的内容。如果你询问的数据集未涵盖的主题,该模型无法给出准确的答案。
这种限制何时变得明显?
当询问有关在模型训练阶段尚不存在或新出现的产品、技术或事件时。
虽然诸如实时网络查询和持续训练之类的缓解措施正在出现,但这些只是部分解决方案。模型仍可能就近期发展生成质量低劣或捏造的回复。
对于新发布的产品、技术或近期发生的事件,不要指望从 ChatGPT 那里得到可靠的答案。
成果提升之处
一些模型,比如 GitHub Copilot,通过利用额外的上下文信息超越了仅依赖提示的大型语言模型,例如分析光标周围的代码、打开的文件以及关联的 GitHub 仓库。这种更广泛的上下文使得 Copilot 能够提供更准确和相关的建议。
上下文代码提示
给定以下代码:
public static final int UNO = 1;
public static final int DUE = 2;
// Other static variables
public static void main(String[] args) {
// Find a match for the parameter in the static values
}
这个含糊不清的评论用 ChatGPT 是无法得出有用的结果的。然而,Copilot 能够推断出其目的并给出完整的实现建议:
int parametro = Integer.parseInt(args[0]);
switch (parametro) {
case UNO:
System.out.println("UNO");
break;
case DUE:
System.out.println("DUE");
break;
// Other cases
default:
System.out.println("No match");
}
尽管逻辑很简单,但关键在于 Copilot 能够在输入极少的情况下生成符合上下文的解决方案。
【图书】零基础开发AI Agent:手把手教你用扣子做智能体
代码理解与上下文关联
分析不熟悉的代码可能会让人望而却步,尤其是对于初级开发人员或者在自己不熟悉的领域探索时。大型语言模型通过解释代码的作用和工作原理来提供帮助。
例如,给定以下函数:
public static boolean matchesURI(URI uri1, URI uri2) {
String scheme = uri1.getScheme();
if (scheme.equalsIgnoreCase(uri2.getScheme())) {
if (uri1.getHost().equalsIgnoreCase(uri2.getHost())) {
int thisPort = HttpClient.normalizePort(scheme, uri1.getPort());
int thatPort = HttpClient.normalizePort(scheme, uri2.getPort());
if (thisPort == thatPort) {
return uri2.getPath().startsWith(uri1.getPath());
}
}
}
return false;
}
当被要求描述其功能时,一个大型语言模型可能会这样回答:
这段简洁的解释有助于开发人员理解复杂或文档不完善的代码。
测试的创建
编写测试可能颇具挑战性,尤其是对于初级开发人员而言。大型语言模型(LLM)能够为一个函数生成测试用例,为全面的测试提供基础。例如:
@Test
public void testMatchingURIs() {
URI uri1 = new URI("http://example.com/path");
URI uri2 = new URI("http://example.com/path/subpath");
assertTrue(URIMatcher.matchesURI(uri1, uri2));
}
@Test
public void testNonMatchingScheme() {
URI uri1 = new URI("http://example.com/path");
URI uri2 = new URI("https://example.com/path");
assertFalse(URIMatcher.matchesURI(uri1, uri2));
}
为清晰而重构
大型语言模型还可以帮助重构代码,以提高其可读性和可维护性:
原始代码:
if (uri1.getHost().equalsIgnoreCase(uri2.getHost())) {
if (port1 == port2) {
if (path2.startsWith(path1)) {
return true;
}
}
}
return false;
重构:
if (!uri1.getHost().equalsIgnoreCase(uri2.getHost())) return false;
if (port1 != port2) return false;
return path2.startsWith(path1);
尽管逻辑保持不变,但重构后的版本更易于阅读和调试。
编写有效的提示语
有效使用大型语言模型的关键在于精心设计清晰准确的提示。但这到底意味着什么呢?编写一个好的提示需要明确告知模型你的期望以及你想要的结果。
以下是一些基本但至关重要的准则:
-
表达要清晰简洁。
-
要具体。
-
包含上下文和必要的细节。
-
明确输入和输出的预期。
当应用于编程时,这些原则看似简单明了,但为软件项目制定清晰、具体且简洁的指令颇具挑战性,这需要具备最佳实践的经验。项目越复杂,就越难将其提炼成一个定义明确的指令。
现实世界的挑战
你是否曾遇到过项目需求随时间变化、表述不清或缺少必要细节的情况?或者在没有完全理解客户期望的情况下编写代码?在这种情况下,让语言模型准确交付客户想要的东西几乎是不可能的。
什么样的提示才算好提示?
一个过于庞大且细节过多的提示是不切实际的,但太短或太模糊的提示也无法得到预期的结果。解决办法是精心设计这样的提示:
一个清晰且明确的提示
编写一个
C#
函数来计算给定数字的阶乘。
此提示规定:
这样的提示能让模型生成准确且有效的回复。
环境问题
大型语言模型依靠上下文来提高结果质量。例如,输入其他程序员常遇到的问题,能增加获得良好解决方案的几率。然而,对于高度特定或小众的问题,即便提供了足够的细节,模型也可能难以应对。
在这种情况下,像
GitHub Copilot
这样能够分析周围代码并提供量身定制建议的工具可能会更合适。
注释的代码
你有多少次编写代码时没有添加注释?或者不得不为别人的代码添加注释,但却难以理解?
大型语言模型可以通过从类似这样的通用提示开始来帮助生成评论:
在以下代码中添加注释:
例如,给定以下代码:
private String readFile(String fileName) {
BufferedReader br;
try {
br = new BufferedReader(new FileReader(fileName));
final StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
br.close();
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
一个大型语言模型(LLM)可能会生成以下详细注释:
/**