【AI 大模型】使用 AI 大模型 编程 ① ( AI 编程简介 | 使用 GitHub Copilot 插件进行 AI 编程 | 使用对话方式进行 AI 编程 )

2024-08-09 08:41:26 浏览数 (1)

一、AI 编程简介


-输出文本-"">1、GPT 大模型 可 替代的工作特点 - " 输入文本 -> 输出文本 "

GPT 大模型 可 替代的工作 都有如下特点 : " 输入类型是文本 , 输出类型也是文本 " ;

  • 翻译工作 : 输入 中文 , 输出 英文 ;
  • 法律工作 : 输入 案件 , 输出 文件 ;
  • 公文工作 : 输入 需求 , 输出 文本 ;
  • 程序员工作 : 输入 需求 , 输出 代码 ;

凡是 输入文本 输出文本 的工作 , 都可以使用 GPT 大模型 提升工作效率 , 逐渐被替代部分工作 , 甚至全部工作 ;

后期 所有的 " 输入文本 -> 输出文本 " 的相关工作 可能只需要一个 精通 GPT 大模型 精通业务的专业人员 替代 现有的 10 个岗位 ;

  • 如 : 使用 大模型的程序员 替代 10 个初级程序员 岗位 ;

这个替代工作 , 可能会在几年到十几年之间 , 逐渐生效 ;

简单的 劳动 , 也有被替代的趋势 , 如 : 开车 , 送外卖 等 , 都有相关的 自动驾驶 替代方案 ;

2、大模型 的 编程能力

在训练大模型 的 编程相关能力时 有如下特点 :

  • 数据质量高 : 近几十年中 , 程序员们产出了 大量高质量代码 和 相关的技术资料 ;
  • 输出结果可衡量 : 大模型写出一段代码 , 是否能运行 并且得到正确的结果 , 是可验证的 ;
  • 代码没有歧义 : 代码的只有一种逻辑 , 完全没有二义性 , 没有歧义 ;

训练编程能力时 , 由于有上述特性 , 因此 大模型 的 编程能力很强 , 远超过其它领域 ;

AI 大模型 可以应用于各种领域 , 但是 其 " 编程能力 " 几乎是最强的 , 几乎可以到达替代程序员的程度 ,

编程能力 是 大模型 各项能力中最强的 , 在其它领域只能起到辅助作用 , 还离不开人的主导作用 ;

3、GPT 大模型 进行编程工作 的优缺点

GPT 大模型 进行编程工作 的优势 :

  • 技术面广 : GPT 大模型 懂 所有的语言 , 所有的技术栈 ;
  • 速度快 : GPT 大模型 可以 根据 输入的描述 或者 部分代码 , 快速生成合理的代码片段 ;
  • 代码质量高 : 生成代码时通常会 遵循常见的 编程语法 和 结构 , 这有助于 减少 语法错误 和 基本结构问题 ;
  • 减少重复任务 : 对于 常见的 编程任务 和 模式 , 如 : 常见的排序算法 , 数学计算算法 , 大模型可以 生成 标准化 的代码 , 减少开发人员的重复性工作量 ;

GPT 大模型 编写代码 的缺点 :

  • 复杂逻辑需要拆解组装 : 如果 给 GPT 一个很复杂的需求 , 里面是黑箱操作 , 基本出错概率很高 , 需要使用者自己将复杂需求拆解成小任务 , 然后自己组装起来 ;
  • 验证正确性 : AI 写出来的代码 , 需要专业人员进行验证 , 否则不知道是否正确 ;
  • 安全性漏洞 : GPT 主要基于训练数据中的模式和结构生成文本 , 生成的代码可能存在安全漏洞或者不完整的部分 , 出错的代码直接舍弃即可 , 就怕运行结果部分出错的情况 , 很难排查 ;
  • 细节优化不足 : 针对特定的软件或硬件进行优化 , 如 : 内存优化 , 电量优化 , 加载优化 , 大模型可能无法写出 领域分的很细 , 用途很偏的代码 ;

4、AI 编程技巧

AI 编程技巧 :

  • 大模型搜索效率高 : 有问题 , 先问 大模型 , 大模型搞不定再去查资料 ; 大模型的搜索效率要远高于搜索引擎 ;
  • 提示词可以是一个文档 : 可以 把几千行代码 , 报错信息 , 几千上万字的文本直接作为提示词输入到 ChatGPT 中 , 大概率可以给出具体的解决方案 ;
  • 多轮对话不能提升代码质量 : 多轮对话一般不会提升输出代码的质量 , 反而是引入更多的问题 , 对话不要超过 5 次 , 如果超过再开启一个新的对话 ;

5、提示工程 应用于 AI 编程

在之前的 提示工程 系列 博客中

  • 【AI 大模型】提示工程 ① ( 通用人工智能 和 专用人工智能 | 掌握 提示工程 的优势 | 提示工程目的 | 提示词组成、迭代、调优及示例 | 思维链 | 启用思维链的指令 | 思维链原理 )
  • 【AI 大模型】提示工程 ② ( 语言选择 - 英文更准确 | 自洽性 | 思维树 | 提示词正常输出 -> 思维链 -> 自洽性 -> 思维树 进化过程 | 提示词使用技巧 )
  • 【AI 大模型】提示工程 ③ ( 提示词用法 | 提示词 Prompt 构成 | 提示词位置对权重的影响 | 提示词 Prompt 调优 | OpenAI 的 API 类型 | 提示词重要参数说明 )
  • 【AI 大模型】提示工程 ④ ( 自然语言处理 NLG | 自然语言理解 NLU | 自然语言生成 NLG | 使用 提示词 大模型 实现 NLU | 使用 提示词 大模型 实现 NLG )

介绍过的 提示词技巧 , 如 :

  • 中英文语言切换 ;
  • 思维链
  • 自洽性
  • 思维树
  • 提示词 迭代 调优
  • 提示词权重

等提示词技巧 , 在 AI 编程中都可以使用 ;

6、AI 编程的适用场景

AI 编程的适用场景 :

  • 懂技术 , 不想写代码 : 将 繁琐 / 重复性的工作 , 让 AI 来完成 , 程序员只进行 代码审查 和 测试 ;
    • 重复工作 : 代码是重复性的 , 比如创建一张数据表 , 进行增删查改 ;
    • 繁琐工作 : 代码逻辑很复杂 , 需要思考推演很多东西才能将代码写出来 ;
  • 初学者 , 辅助学习 : 代码初学者 , 或者 初级程序员 , 在学习时 , 可以使用 AI 编程进行辅助 , 小心别被 AI 埋坑里 ;

完全不懂代码 , 不能碰 AI 编程 , 无法靠 AI 编程实现任何软件开发任务 ;

二、使用 GitHub Copilot 插件进行 AI 编程


1、GitHub Copilot 简介

GitHub Copilot 是 一个补全式编程大模型 , 是 AI 编程领域使最好用的工具 ;

  • 使用效果 : GitHub Copilot 可以 提高工作效率 50% 以上 , 使用该工具后 , 有一半的代码都由该工具完成 ;
  • 支持的平台 : GitHub Copilot 只能在 PyCharm 和 Visual Studio Code 开发环境中安装插件使用 ;
  • 可实现的功能 : 补全代码 , 补全注释 , 根据注释生成代码 ;
    • 补全代码 : 函数定义 , 类定义 , 条件 / 选择 / 循环 语句 之后 , 会自动将后面的代码生成出来 ;
    • 补全注释 : 代码写完后 , 可以 在预留的位置 自动生成 代码对应的注释 , 生成的注释文档会相当标准 ;
    • 根据注释生成代码 : 可以 只编写注释 , 让 GitHub Copilot 自动生成注释对应的代码 , 这个功能不太好用 ;
    • 参考旧代码 : 如果想要生成本公司的 专有 API 相关代码 , 可以 在环境中打开该旧代码 , 将代码文件展示在代码的 tab 中 , GitHub Copilot 会自动参考已打开的代码 , 相当于把打开的代码放入了提示词中 ;
  • 实现原理 :
    • 基于的大模型 : GitHub Copilot 基于 GPT 3.5 和 GPT 4 ;
    • GitHub Copilot 的 原理是 将当前文档的代码 和 注释 以及 程序员额外输出的 提示词 , 放在一起 , 组合成一个由 代码 注释 输入提示词 组成的 超长提示词 , 基于该超长的提示词进行代码生成 , 提示词内容包含如下部分 :
      • 当前的光标位置的 前后 代码片段 ;
      • tab 中 , 所有打开的代码片段 , 每隔 60 行 切割成一段代码 ;
      • 选中的代码片段 , 使用注释将这个片段注释起来 , 放入提示词中 ;
    • 要输入几万行代码作为提示词 , 消耗的 token 肯定不会少 , 费用也不低 ;
    • 应该是 在 服务器端 专门为指定的付费用户建立指定的代码库 , 作为参考 , 代码有泄漏风险 ;
  • 使用前提 : 全局需要访问国外网站 , 否则无法使用
  • 软件费用 : 个人使用 , 每月 60 块钱 ;
  • GitHub Copilot 用法展示 :
    • 在下面的 PyCharm 环境中 , 安装了 GitHub Copilot 插件 ;
    • 写完一段代码后 , 会自动生成后续代码 ;
    • 选中部分代码后 , 输入提示词 , 会自动将 选中的代码 提示词 作为新的提示词进行对话 ;

2、GitHub Copilot 软件购买

GitHub Copilot 软件购买 :

  • 注册 GitHub 账号 : 注册 GitHub 账号 , 在 https://github.com/features/copilot 登录 账号 ;
  • 购买软件 : 在 https://github.com/features/copilot/plans 页面购买软件 , 买 10 美元的个人版就行 ;

目前可以免费试用 30 天 ;

3、PyCharm 中安装 GitHub Copilot 插件

在 PyCharm 中 , 选择 " File / Settings " 选项 ;

在 Settings 对话框中的 Plugins 插件中 , 搜索 GitHub Copilot , 然后点击 Install 按钮安装该插件即可 ;

弹出对话框 , 同意安装第三方插件 ;

安装完成后 , 重启 PyCharm 开发环境 ;

4、PyCharm 中登录 GitHub Copilot 账号

重启后 , 右下角会弹出弹窗 , 让你登录 GitHub 账号 ;

点击下面同意授权按钮 ;

登录成功后显示如下内容 :

使用 时 不需要做任何操作设置 , 只要开始写代码 , 就会进行自动提示 ;

三、使用对话方式进行 AI 编程


1、对话式 AI 编程提示词

GitHub Copilot 只能用于 PyCharm 和 VSCode 中 , 如果你使用其它的开发环境 , 如 :

  • 开发 C/C 的 Qt 或者 VS ,
  • 开发 Android 的 AS ,
  • 开发 鸿蒙的 DevEco ,
  • 开发 iOS 的 Xcode ,

就无法使用 GitHub Copilot 插件 ;

如果 你的 代码是保密代码 , 不允许泄漏 , 那么就不能使用 GitHub Copilot 进行编程 ;

这里可以直接考虑 使用 ChatGPT 或者 文心一言 的 Web 对话界面 , 参考 GitHub Copilot 插件的原理 ,

将当前文档的代码 和 注释 以及 程序员额外输出的 提示词 , 放在一起 , 组合成一个由 代码 注释 输入提示词 组成的 超长提示词 , 基于该超长的提示词进行代码生成 , 提示词内容包含如下部分 :

  • 当前的光标位置的 前后 代码片段 ;
  • tab 中 , 所有打开的代码片段 , 每隔 60 行 切割成一段代码 ;
  • 选中的代码片段 , 使用注释将这个片段注释起来 , 放入提示词中 ;

将上述内容 , 作为提示词 , 输入到 ChatGPT 中 , 可以生成优秀的代码 ;

2、对话式 AI 编程示例

输入提示词 :

" 使用 Java 语言 , JDBC 访问数据库 , 创建数据库表 student 表 , 其中有字段 Id 主键 , 姓名 name , 年龄 age , 生成该表的增删改查函数 , 每行代码带上中文注释 , 有 main 函数入口 "

生成的代码 : 不需要展开 , 仅做参考 ;

代码语言:javascript复制
import java.sql.*;

public class StudentDAO {

    // JDBC 驱动器名称和数据库 URL
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost/mydatabase"; // 这里的 mydatabase 替换为你的数据库名

    // 数据库的用户名和密码
    static final String USER = "username";
    static final String PASS = "password";

    // 数据库连接对象
    static Connection conn = null;
    // SQL 执行对象
    static Statement stmt = null;

    // 在构造函数中注册 JDBC 驱动器
    public StudentDAO() {
        try {
            Class.forName(JDBC_DRIVER);
            conn = DriverManager.getConnection(DB_URL, USER, PASS);
            stmt = conn.createStatement();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 创建 student 表
    public void createTable() {
        try {
            String sql = "CREATE TABLE IF NOT EXISTS student ("  
                    "id INT PRIMARY KEY AUTO_INCREMENT,"  
                    "name VARCHAR(255) NOT NULL,"  
                    "age INT)";
            stmt.executeUpdate(sql);
            System.out.println("创建表 student 成功");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    // 添加学生记录
    public void insertStudent(String name, int age) {
        try {
            String sql = "INSERT INTO student (name, age) VALUES (?, ?)";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, name);
            pstmt.setInt(2, age);
            pstmt.executeUpdate();
            System.out.println("添加学生记录成功");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    // 更新学生记录
    public void updateStudent(int id, String name, int age) {
        try {
            String sql = "UPDATE student SET name = ?, age = ? WHERE id = ?";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, name);
            pstmt.setInt(2, age);
            pstmt.setInt(3, id);
            pstmt.executeUpdate();
            System.out.println("更新学生记录成功");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    // 删除学生记录
    public void deleteStudent(int id) {
        try {
            String sql = "DELETE FROM student WHERE id = ?";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, id);
            pstmt.executeUpdate();
            System.out.println("删除学生记录成功");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    // 查询学生记录
    public void selectStudents() {
        try {
            String sql = "SELECT * FROM student";
            ResultSet rs = stmt.executeQuery(sql);
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                System.out.println("ID: "   id   ", Name: "   name   ", Age: "   age);
            }
            rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    // 关闭数据库连接
    public void closeConnection() {
        try {
            if (stmt != null) stmt.close();
            if (conn != null) conn.close();
            System.out.println("数据库连接已关闭");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        StudentDAO dao = new StudentDAO();
        
        // 创建 student 表
        dao.createTable();
        
        // 插入学生记录
        dao.insertStudent("Alice", 20);
        dao.insertStudent("Bob", 21);
        
        // 更新学生记录
        dao.updateStudent(1, "Alice Updated", 21);
        
        // 删除学生记录
        dao.deleteStudent(2);
        
        // 查询学生记录
        dao.selectStudents();
        
        // 关闭数据库连接
        dao.closeConnection();
    }
}

0 人点赞