如何通过ChatGPT编写更好的代码
2023年06月28日 由 Neo 发表
102668
0
生成软件代码是ChatGPT和其他遵循指令的大型语言模型(LLM)的强大应用之一。给与合适的提示,LLM可以产生本来需要花费几个小时才能写出的代码。
然而,LLM不能做程序员的所有工作。它们不能分解复杂的问题,思考逻辑和结构,创建多层次的解决方案。它们一次只处理一个标记,预测下一个可能跟随的用户提示和当前输出的代码片段。
以下是四个技巧,可以帮助你充分利用ChatGPT令人印象深刻的编码能力,同时避免它的陷阱。
如果你不能验证,就不要相信ChatGPT
像ChatGPT这样的LLM的一个显著特征是它们的权威声音。它们总是自信地回答,即使它们的输出是无意义的。在多次场合,ChatGPT用令人信服但错误的答案回答了我的问题。
我对ChatGPT的经验法则是,只在我完全理解并能验证的话题中使用它。例如,我不会用它来写一个关于量子物理的解释器,因为我对这个主题不够了解。但是ChatGPT可以帮助我写一篇有趣的关于机器学习基础的文章,因为我可以完全检查和纠正它的输出。
同样,当使用ChatGPT来生成代码时,只相信你能完全验证的任务。ChatGPT可能会写出不工作的代码——或者更糟,工作但不安全的代码。我把它看作是一个自动化工具,可以做一些费时或需要多次访问文档页面或在线论坛(如Stack Overflow)的繁琐工作。例如,你可以让它写一个排序算法,用Python启动一个Web服务器的代码,根据你的数据库模式写一个SQL查询,或者用Matplotlib写一个数据可视化命令。
一次迭代一个代码块
LLM往往难以处理需要推理和逐步规划的任务。因此,不要指望ChatGPT能成功地为你写出一个完整的程序或一个复杂的代码块。然而,这并不意味着ChatGPT不能在复杂的编程任务中帮助你。如果你给它一个简单的任务(比如上面提到的那些),它会有更高的几率做对。
把你的任务分解成更小的步骤,一次给ChatGPT一个步骤。一个成功的方法是,首先给ChatGPT一个你想要写的程序的逻辑的逐步概述。
这有助于为更大的任务模型预热。然后一次给LLM一个步骤。简而言之,你做推理,ChatGPT做工作。(顺便说一下,这种从概述开始,逐步完成的方法也适用于其他任务,比如写一些类型的文章。)
如果你对逐步过程没有清晰的想法,你可以从ChatGPT本身得到帮助。开始编码会话时,提示LLM生成一个完成任务的步骤列表。然后根据需要修改概述,并开始提示它生成第一步的代码。
给ChatGPT提供反馈
你不能指望ChatGPT每次都能提供干净、安全和可运行的代码。当你审查它提供的代码并输入到你的IDE中时,你可能需要做一些修改和调整。当你这样做时,最好把修改后的代码作为反馈提供给ChatGPT,并在适当的情况下附上解释。
需要注意的一点是,ChatGPT非常敏感于上下文,它的行为会根据聊天历史而改变。你可以利用这一点,这就是为什么提供反馈和修改后的代码片段会很有帮助。
例如,你可以说,“这是我修改了你提供的代码:[插入修改后的代码]。以后尽量做[插入行为改正]。”这可以帮助引导ChatGPT朝正确的方向发展,并避免在回答未来的提示时重复错误。(同样,我也在其他任务中使用这种反馈方法与ChatGPT合作过,包括写文章。)
有时候你可以用ChatGPT来对它自己生成的代码进行反馈。试着开启一个新的聊天会话,在其中给ChatGPT提供它生成的代码,并让它改进或纠正它。有时候,它会产生一些有趣的结果和新的方向可以探索。
清理ChatGPT的上下文
如果你正在处理一个特别大的任务,你的聊天历史可能会变得很长,特别是如果你和ChatGPT做了很多交互。根据你使用的模型,语言模型(LLM)可能会耗尽上下文内存。ChatGPT的免费版本有4000个令牌的内存。(对于语言任务,100个令牌大约覆盖75个单词。对于编程,通常要少得多。)
一个有效的技巧是偶尔清理你的上下文。为此,你可以开始一个新的聊天会话,用一个提示来给ChatGPT提供任务的概要,你目前完成的步骤,你目前生成的代码,以及一些你希望它遵循的一般指导原则。然后你告诉它从下一步继续。通过删除之前与LLM的交互中的杂乱信息,你提供了一个更清晰的上下文,并提高了模型生成代码的准确性。
LLM正在改变编程 LLM辅助编程领域正在快速变化。例如,ChatGPT Plus现在有几个插件可以帮助程序员超越预测代码。其他基于LLM的编码工具,如GitHub Copilot和Amazon CodeWhisperer,也在帮助开发者显著提高速度和生产力。检索增强技术可以使程序员根据自己的专有代码库或未包含在训练数据集中的库来定制LLM的行为。
来源:https://bdtechtalks.com/2023/06/26/chatgpt-coding-tips/