程序员可以放心了,ChatGPT只能写95%的代码!

article/2025/4/30 14:32:30

领域特定语言(DSL)可能很多人都知道,就是针对特定领域的,一个简单的“小语言”,例如HTML就是针对Web编程的一个DSL,SQL是针对数据库操作的一个DSL。

DSL可以很复杂,也包含if, else,while等逻辑控制,也可以很简单,我选这个例子就是税务领域的一个简单例子:

// 定义税率区间tax_bracket 1  range: 0 - 15000  rate: 5%
tax_bracket 2  range: 15001 - 45000  rate: 10%
tax_bracket 3  range: 45001 - 120000  rate: 20%
tax_bracket 4  range: 120001 - 200000  rate: 30%
tax_bracket 5  //注:就是这个不同寻常的格式引发了Bug  range: 200001 and above   rate: 40%
// 定义抵免额deduction Standard  amount: 5000
deduction Health_Insurance  amount: 2000
deduction Retirement_Savings  amount: 3000

有了这些术语,业务人员就可以使用了

// 计算应纳税额income: 80000deductions: Standard, Health_Insurance, Retirement_Savingscalculate_tax

我把这个需求直接抛给GPT-4, 让它用Java语言给我实现了,下面是我和它的对话:

注:交互内容较长,文末有总结

GPT-4 :为了实现这个DSL,我将首先创建一个TaxBracket类来表示税率区间,然后创建一个Deduction类来表示抵免额。最后,我将创建一个TaxCalculator类来实现计算应纳税额的逻辑。以下是一个简化的Java实现:​​​​​​​

import java.util.ArrayList;import java.util.Arrays;import java.util.List;
class TaxBracket {    int id;    int lowerBound;    int upperBound;    double rate;
    public TaxBracket(int id, int lowerBound, int upperBound, double rate) {        this.id = id;        this.lowerBound = lowerBound;        this.upperBound = upperBound;        this.rate = rate;    }}
class Deduction {    String name;    int amount;
    public Deduction(String name, int amount) {        this.name = name;        this.amount = amount;    }}
class TaxCalculator {    List<TaxBracket> taxBrackets;    List<Deduction> deductions;    int income;
    public TaxCalculator(int income, List<TaxBracket> taxBrackets, List<Deduction> deductions) {        this.income = income;        this.taxBrackets = taxBrackets;        this.deductions = deductions;    }
    public double calculateTax() {        int taxableIncome = income;        for (Deduction deduction : deductions) {            taxableIncome -= deduction.amount;        }
        double tax = 0;        for (TaxBracket bracket : taxBrackets) {            if (taxableIncome <= bracket.upperBound) {                tax += (taxableIncome - bracket.lowerBound ) * bracket.rate;                break;            } else {                tax += (bracket.upperBound - bracket.lowerBound ) * bracket.rate;            }        }        return tax;    }}
public class Main {    public static void main(String[] args) {        List<TaxBracket> taxBrackets = new ArrayList<>(Arrays.asList(            new TaxBracket(1, 0, 15000, 0.05),            new TaxBracket(2, 15001, 45000, 0.10),            new TaxBracket(3, 45001, 120000, 0.20),            new TaxBracket(4, 120001, 200000, 0.30),            new TaxBracket(5, 200001, Integer.MAX_VALUE, 0.40)        ));
        List<Deduction> deductions = new ArrayList<>(Arrays.asList(            new Deduction("Standard", 5000),            new Deduction("Health_Insurance", 2000),            new Deduction("Retirement_Savings", 3000)        ));
        int income = 80000;        TaxCalculator calculator = new TaxCalculator(income, taxBrackets, deductions);        double tax = calculator.calculateTax();        System.out.println("应纳税额: " + tax);    }}

这个实现定义了TaxBracket和Deduction类,并创建了一个TaxCalculator类来计算应纳税额。主方法中初始化了税率区间和抵免额,并使用这些信息计算了一个给定收入的应纳税额。

注:它似乎理解了这个DSL是用来计算税率的,类名,方法名也比较合理

刘欣:不不不,应该解析一个DSL文件,形成TaxBracket和Deduction,然后再计算税率,你这里少了一个解析器

GPT-4 :抱歉,我明白你的需求了。这里是一个使用Java编写的解析器,用于解析DSL文件并计算税率:

首先,我们需要创建一个名为DSLParser的类来解析DSL文件:​​​​​​​

import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;import java.util.List;
class DSLParser {    private final List<TaxBracket> taxBrackets = new ArrayList<>();    private final List<Deduction> deductions = new ArrayList<>();    private int income;
    public DSLParser(String filePath) {        try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {            String line;            while ((line = reader.readLine()) != null) {                parseLine(line.trim());            }        } catch (IOException e) {            System.err.println("Error reading file: " + e.getMessage());        }    }
    private void parseLine(String line) {        if (line.startsWith("tax_bracket")) {            int id = Integer.parseInt(line.split(" ")[1]);            int lowerBound = 0;            int upperBound = 0;            double rate = 0;
            for (int i = 0; i < 2; i++) {                line = getNextLine();
                if (line.startsWith("range:")) {                    String[] range = line.substring(6).trim().split(" - ");                    lowerBound = Integer.parseInt(range[0]);                    if (range[1].equals("and above")) {                        upperBound = Integer.MAX_VALUE;                    } else {                        upperBound = Integer.parseInt(range[1]);                    }                } else if (line.startsWith("rate:")) {                    rate = Double.parseDouble(line.substring(5).trim().replace("%", "")) / 100;                }            }            taxBrackets.add(new TaxBracket(id, lowerBound, upperBound, rate));        } else if (line.startsWith("deduction")) {            String name = line.split(" ")[1];            int amount = 0;
            line = getNextLine();            if (line.startsWith("amount:")) {                amount = Integer.parseInt(line.substring(7).trim());            }
            deductions.add(new Deduction(name, amount));        } else if (line.startsWith("income:")) {            income = Integer.parseInt(line.substring(7).trim());        } else if (line.equals("calculate_tax")) {            // Do nothing, just a marker to calculate tax        }    }
    private String getNextLine() {        // Read the next line from the file, or return null if end of file is reached    }
    public List<TaxBracket> getTaxBrackets() {        return taxBrackets;    }
    public List<Deduction> getDeductions() {        return deductions;    }
    public int getIncome() {        return income;    }}

接下来,我们需要修改Main类,以便从DSL文件读取税收信息并计算税率:​​​​​​​

public class Main {    public static void main(String[] args) {        if (args.length != 1) {            System.out.println("Usage: java Main <DSL file path>");            return;        }
        DSLParser parser = new DSLParser(args[0]);        List<TaxBracket> taxBrackets = parser.getTaxBrackets();        List<Deduction> deductions = parser.getDeductions();        int income = parser.getIncome();
        TaxCalculator calculator = new TaxCalculator(income, taxBrackets, deductions);        double tax = calculator.calculateTax();        System.out.println("应纳

注:这里没输出完,就断掉了。

刘欣:继续

GPT-4 :

税额: " + tax);}}

现在,这个实现已经包括了解析DSL文件的功能。你可以将上述代码保存为Java源文件(例如`TaxCalculation.java`),并将你的DSL文件保存为一个文本文件(例如`tax.dsl`)。然后使用以下命令编译并运行代码:​​​​​​​

javac TaxCalculation.javajava Main tax.dsl

这将从tax.dsl文件读取税率区间和抵免额信息,并根据收入计算税率。请注意,在使用此方法之前,你可能需要稍微调整DSLParser类中的getNextLine方法,以便正确读取文件的下一行。你可以使用BufferedReader对象的readLine方法实现这一点。

刘欣:  DSLParser中getNextLine方法没有实现!

GPT-4 :抱歉,这是我的疏忽。请在DSLParser类中添加一个BufferedReader类型的成员变量reader,并在构造函数中初始化它。然后在getNextLine方法中实现读取下一行的逻辑。以下是修改后的DSLParser类:​​​​​​​

class DSLParser {    private final List<TaxBracket> taxBrackets = new ArrayList<>();    private final List<Deduction> deductions = new ArrayList<>();    private int income;    private BufferedReader reader;
    public DSLParser(String filePath) {        try {            this.reader = new BufferedReader(new FileReader(filePath));            String line;            while ((line = reader.readLine()) != null) {                parseLine(line.trim());            }            reader.close();        } catch (IOException e) {            System.err.println("Error reading file: " + e.getMessage());        }    }
    private void parseLine(String line) {        // ... (same as before)    }
    private String getNextLine() {        try {            return reader.readLine();        } catch (IOException e) {            System.err.println("Error reading next line: " + e.getMessage());            return null;        }    }
    // ... (getTaxBrackets, getDeductions, and getIncome methods)}

现在,DSLParser类已包含一个reader成员变量,用于在getNextLine方法中读取文件的下一行。这应该使解析器能够正确解析DSL文件并计算税率。

注:到目前为止,GPT-4把所有的代码都生成了,用时不到5分钟!可以说是神速了,让我从头开始构思,然后一行行敲出代码,恐怕得四五十分钟吧

我把它复制出来,在VS Code中运行,发现了一个问题,它没有处理文本前后的空格。

刘欣:在parseLine方法中,你好像没有考虑文件中的一行内容前后有空格的问题

GPT-4 :您是对的,我之前的实现没有考虑到行内容前后可能存在的空格。在解析每一行时,我们可以使用trim()方法来去除前后的空格。以下是修改后的DSLParser类中的parseLine方法:​​​​​​​

private void parseLine(String line) {    line = line.trim();    if (line.startsWith("tax_bracket")) {        // ... (same as before)    } else if (line.startsWith("deduction")) {        // ... (same as before)    } else if (line.startsWith("income:")) {        income = Integer.parseInt(line.substring(7).trim());    } else if (line.equals("calculate_tax")) {        // Do nothing, just a marker to calculate tax    }}

现在,我们在处理每一行时都会去掉前后的空格,这样就可以更准确地解析含有前后空格的行内容。这将提高解析器的健壮性,使其能够更好地处理不同格式的DSL文件。

注:其实GPT-4只改了一处代码,其他地方还没改。于是我建议它:

刘欣:能否在getNextLine方法中就做trim呢?

GPT-4 : 当然可以。您可以在getNextLine方法中直接对读取到的行内容进行trim()操作。这样,在调用getNextLine方法时,就可以确保返回的行内容已经去除了前后的空格。以下是修改后的getNextLine方法:

private String getNextLine() {    try {        String line = reader.readLine();        if (line != null) {            return line.trim();        }    } catch (IOException e) {        System.err.println("Error reading next line: " + e.getMessage());    }    return null;}

在这个修改后的版本中,我们在getNextLine方法内部对读取到的行内容使用了trim()方法。这意味着在解析文件时,无论是通过getNextLine方法还是在parseLine方法中读取的行内容,都已经去除了前后的空格。

注:到目前为止,还一切顺利,但是很快就发生了一件让人头大的问题:GPT-4在处理range: 200001 and above 这样格式的时候出错,因为一般的格式是45001 - 120000, 120001 - 200000 ,都是数字,这里出现一个 and above 文字,它没注意到。

程序在运行时出错,我把错误直接扔给它:

刘欣:代码在运行时出错:

Exception in thread "main" java.lang.NumberFormatException: For input string: "200001 and above"at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)at java.lang.Integer.parseInt(Integer.java:580)at java.lang.Integer.parseInt(Integer.java:615)at DSLParser.parseLine(App.java:94)at DSLParser.<init>(App.java:73)at App.main(App.java:150)

GPT- 4 :抱歉给您带来了困扰。这个问题是由于在解析tax_bracket区间的上界时没有正确处理"and above"的情况导致的。以下是修复后的parseLine方法中处理tax_bracket部分的代码:代码略。

注:GPT-4虽然意识到了问题所在,但是它的修改方案总是有问题,反复了两三次也修不好。最后我提示它:

刘欣:在这个字符串中 range: 200001 and above , 根据就没有“-”, 所以line.substring(6).trim().split(" - ") 这行代码是没用的

GPT-4: 您是对的,我再次犯了错误。为了处理"and above"这种情况,我们应该根据"and above"字符串来分割范围。以下是修复后的parseLine方法中处理tax_bracket部分的代码:

private void parseLine(String line) {    if (line.startsWith("tax_bracket")) {        int id = Integer.parseInt(line.split(" ")[1]);        int lowerBound = 0;        int upperBound = 0;        double rate = 0;
        for (int i = 0; i < 2; i++) {            line = getNextLine();
            if (line.startsWith("range:")) {                String rangeString = line.substring(6).trim();                if (rangeString.contains("and above")) {                    String[] range = rangeString.split(" and above");                    lowerBound = Integer.parseInt(range[0]);                    upperBound = Integer.MAX_VALUE;                } else {                    String[] range = rangeString.split(" - ");                    lowerBound = Integer.parseInt(range[0]);                    upperBound = Integer.parseInt(range[1]);                }            } else if (line.startsWith("rate:")) {                rate = Double.parseDouble(line.substring(5).trim().replace("%", "")) / 100;            }        }
        taxBrackets.add(new TaxBracket(id, lowerBound, upperBound, rate));    } else if (line.startsWith("deduction")) {        // ... (same as before)    } else if (line.startsWith("income:")) {        income = Integer.parseInt(line.substring(7).trim());    } else if (line.equals("calculate_tax")) {        // Do nothing, just a marker to calculate tax    }}

现在,在解析税率区间时,我们首先检查范围字符串是否包含"and above"。如果包含,则根据"and above"分割范围,并将上界设置为Integer.MAX_VALUE。否则,我们使用" - "分隔符来分割范围。这次修改应该可以正确处理税率区间,并避免NumberFormatException异常。

注:这一次,它终于做对了。

总结一下:

ChatGPT实在是太牛了!

它不但可以理解需求,生成代码,更让人震撼的是可以根据要求不断地微调代码,完善功能,修复Bug。

过程完全用自然语言交互,这种能力我没有在之前的任何工具中看到过,说它是革命性的技术完全不为过。

但是,我们也看到了它忘记(?)实现一个方法,特别是一个Bug一直搞不定,直到我明确地指出来。

正如球友@楊_宵夜所说:ChatGPT能以极快的速度生成95%的可运行代码,但是剩下的5%依然依靠程序员的功力。

在ChatGPT的冲击下,程序员的价值依然是很大的,依然是不可或缺的的。

但是,会用熟练使用ChatGPT的程序员,可以用自然语言快速生成代码,效率提升十倍甚至百倍,这将对不使用ChatGPT的程序员构成降维打击。


http://chatgpt.dhexx.cn/article/bho6LGQm.shtml

相关文章

快来看,我让chatGPT帮我写代码了!!!

现在AIGC很火&#xff0c;chatGPT的功能也是非常的强大&#xff0c;作为一个学计算机的&#xff0c;我想chatGPT必须要玩起来&#xff0c;哈哈哈哈&#xff5e;&#xff5e;&#xff5e; 突发奇想&#xff0c;虽然学了几年的计算机&#xff0c;但是编程能力还是不行&#xff0c…

怎么用ChatGPT写代码,ChatGPT怎么改代码修BUG

ChatGPT 是一个自然语言处理模型&#xff0c;可以模拟人类语言生成文本&#xff0c;可以用于写代码和修复bug。在本文中&#xff0c;说一下我的经验&#xff0c;如何使用 ChatGPT 写代码和修bug。 怎么用ChatGPT写代码&#xff1f; 虽然 ChatGPT 被广泛用于文本生成&#xff0…

ChatGPT可以写代码吗【详解】

ChatGPT可以写代码吗&#xff1f;ChatGPT可以实现很多的操作&#xff0c;用户只要说出自己的需求&#xff0c;ChatGPT就可以帮助你进行解答&#xff0c;比如写代码&#xff0c;只要在对话框输入问题&#xff0c;就可以得到答案&#xff0c;操作很简单。具体的方法小编已经给大家…

【ChatGPT实战】11.如何使用ChatGPT写代码?

以往大家总是调侃说程序员只要会用Google就好了&#xff0c;直接搜对应的代码然后复制粘贴就可以了。但是只有程序员才知道真要找到可用的代码是不容易的&#xff0c;经常是找很久都没有合适的代码。 ChatGPT在编程方面拥有着不可忽视的优势&#xff0c;能够生成高质量的程序代…

人工智能写的十段代码,九个通过测试了

“抢走你工作的不会是 AI &#xff0c;而是先掌握 AI 能力的人” 编程测试 1. 我想用golang实现二叉树前序&#xff0c;请你帮我写一下代码。 // 定义二叉树节点 type TreeNode struct {Val intLeft *TreeNodeRight *TreeNode }// 前序遍历 func PreOrderTraversal(root *Tre…

OpenAI ChatGPT 我也体验了一下自动写程序

大家好最近 ChatGPT非常出圈&#xff0c;于是我也出于好奇心试用了一下自动写代码&#xff0c; 先写一个简单程序吧 在写一个有点难度的吧 import java.io.FileOutputStream; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.…

ChatGPT三问:是什么、从哪来、去往哪?

©PaperWeekly 原创 作者 | 张燚钧 单位 | 中国移动云能力中心 研究方向 | 预训练大模型 ChatGPT 热潮已经持续月余&#xff0c;目前热度依然不减。根据最新的消息&#xff0c;ChatGPT 的升级版 GPT-4 也已蓄势待发。回首 ChatGPT 的这波热潮&#xff0c;ChatGPT 是什么&a…

chatgpt在哪用?详谈一下gpt的各方面

ChatGPT是一种人工智能技术&#xff0c;它可以通过自然语言交互回答各种问题。这种技术已经被广泛应用于各个领域和场景中&#xff0c;帮助人们更好地获取知识和信息。那么&#xff0c;ChatGPT在哪里使用呢&#xff1f;下面我们来探讨一下。 一.chatgpt在哪用 打开任意的浏览器…

Voice Control for ChatGPT 轻松实现使用语音与ChatGPT进行对话。

缘由 日常生活中&#xff0c;我们与亲人朋友沟通交流一般都是喜欢语音的形式来完成的&#xff0c;毕竟相对于文字来说语音就不会显的那么的苍白无力&#xff0c;同时最大的好处就是能解放我们的双手吧&#xff0c;能更快实现两者间的对话&#xff0c;沟通便更高效了。Voice Co…

【插件分享】对Chatgpt的对话内容进行滚动截屏

问题描述 在和Chatgpt进行了一番友好的对话后&#xff0c;想要把对话内容截取出来与朋友分享&#xff0c;但是由于对话内容比较多&#xff0c;无法显示在一页里&#xff0c;因此需要使用滚动截屏。但是edge浏览器自带的网页捕获功能在chatgpt的聊天界面里无法实现滚动截屏。 解…

使用chatgpt完成简繁体转换

tl;dr: 语言模型可以完成简繁转换&#xff0c;还会故意出错以测试人类是否在认真阅读答案。 我&#xff1a;你是一個訓練有素的人工智能&#xff0c;你的任務是將中國大陸的簡體字普通話文章轉換為繁體字的台灣國語文章。例如&#xff0c;我輸入「计算机的内存不足&#xff0c;…

数据库开发工具界的ChatGPT来了

提提需求&#xff0c;就能按照你的要求自动生成库表、构建测试数据、查询变更数据&#xff0c;动不动还要帮你优化 SQL …… 这样的数据库开发工具到底有多强大&#xff1f; NineData 通过内置强大的AI生成能力&#xff0c;让你可以在 NineData 平台上&#xff0c;通过自然语言…

基于ChatGPT的端到端语音聊天机器人项目实战(一)

基于ChatGPT的端到端语音聊天机器人项目实战 ChatGPT API后台开发实战 本节主要是跟大家分享一个端到端的基于模型驱动的对话机器人,会有前端和后端,也会有一些具体模型的调用,读者需具有Python语言编程的基础,这是前置性的条件,有了这个基础,理论上讲本节所有的内容,…

基于Python+百度语音的智能语音ChatGPT聊天机器人(机器学习+深度学习+语义识别)含全部工程源码 适合个人二次开发

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境Pycharm 环境ChatterBot 环境 模块实现1. 模型构建2. 服务器端3. 客户端4. 语音录入5. 接口调用6.模型训练及保存 系统测试1. 模型效果2. 模型应用 源代码下载地址其它资料下载 前言 本项目基于机器学习和语义识…

chatgpt的语音机器人

准备工作 一.OpenAi的Api 1.登录openai 2.点击Develovpers的overview ### 3.点击右上角的Login in ### 4.点击右上角的view apikey ### 5.点击Creat new secret key 这样就会得到一个chatgpt的api&#xff0c;请妥善保存这个api&#xff0c;当你关闭这个网页的时候&#xff…

OpenAI推出iOS版ChatGPT,支持语音输入

北京时间5月19日凌晨&#xff0c;OpenAI重磅推出iOS版ChatGPT。 据介绍&#xff0c;iOS版ChatGPT供免费使用&#xff0c;并在不同设备上同步聊天历史。 同时&#xff0c;它还集成了开源语音识别系统Whisper&#xff0c;可以实现语音输入。 另外&#xff0c;ChatGPT Plus用户在i…

【一分钟学会】用python做一个语音对话ChatGPT的程序——打造私人语音助手

本项目灵感来源是我的一个专业课程设计&#xff0c;当时耗时近四天在网上都没找到十分有用的信息。 以下是本项目完整的步骤流程&#xff0c;算是对自己工作的一个阶段性总结。希望同感兴趣的小伙伴们相互探讨、交流和学习。 一、准备工作 首先&#xff0c;需要准备①最新版的…

基于ChatGPT的端到端语音聊天机器人项目实战(三)

企业级ChatGPT开发入门实战 第1课 基于ChatGPT的端到端语音聊天机器人项目实战 Gavin老师:NLP_Matrix_Space 1.4 使用FastAPI构建语音聊天机器人后端实战 在后端代码(backend)中调用了OpenAI API及其他的服务,如图1-10所示。 图1- 10 后端代码调用OpenAI API openai_requ…

OpenAI Whisper and ChatGPT 语音助手

OpenAI Whisper and ChatGPT ASR Gradio Web UI 一 环境准备1.1 python1.2 windows 二 导入所需要的包三 加载模型四 定义openai和whisper接口五 生成Gradio Web UI 麦克风输入&#xff0c;展示三种结果 输入ASR结果输出文本输出TTS结果 一 环境准备 1.1 python gradio3.19.1…

ChatGPT+语音 实现人机“对话“

你可以向ChatGPT "说出" 任何问题&#xff0c;ChatGPT会将答案 "说"给你听。 当你向ChatGPT提问数学问题时&#xff0c;ChatGPT将解题思路完整的说给你听&#xff0c;当你还有不懂的地方还可以继续提问&#xff0c;直到你完全理解。最好的全科辅导老师&…