一、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();
}
}