当前位置:AIGC资讯 > AIGC > 正文

Amazon CodeWhisperer——AI助力编程

文章目录

一、Amazon CodeWhisperer简介 二、安装Amazon CodeWhisperer 2.1 PyCharm环境(一定要2023版本及以上) 2.1.1 下载插件 2.1.2 注册Amazon账号 2.1.3 CodeWhisperer与Amazon Q 2.2 IDEA环境(一定要2023版本及以上) 2.2.1 下载插件 2.2.2 注册并登录 2.3 Jupyter Lab环境 2.3.1 Jupyter Lab与Jupyter notebook 2.3.2 安装Jupyter Lab 2.3.3 安装amazon-codewhisperer-jupyterlab-ext插件 2.3.4 注册并登录 2.3.5 安装问题汇总(非常重要!!!) 三、案例演示 3.1 Pycharm环境 3.1.1 斐波那契数列(使用中文注解) 3.1.2 汉诺塔问题(使用英文注解) 3.1.3 三层BP神经网络(需人工调参) 3.2 IDEA环境 3.2.1 创建Bean对象 3.2.2 创建工具类 3.2.3 Amazon Q优化代码 3.3 Jupyter Lab环境 3.3.1 更改热键/快捷键(必要操作) 3.3.2 读取数据 3.3.3 空值处理 3.3.4 统计描述/绘图 四、总结 4.1 快捷键 4.2 使用方法

一、Amazon CodeWhisperer简介

善始者繁多,克终者盖寡。

2022年底以ChatGPT为代表的大语言模型(LLMs)技术在各个领域掀起了人工智能浪潮,此后一年多的时间里众多机构和组织相继推出了应用LLMs的产品。大家听过最多的肯定是OpenAI推出的ChatGPT(官网地址),如今公布的最新版本是ChatGPT4.0,众多营销号鼓吹是可以替代普通程序员的存在,本人体验过后感觉确实不错,但是国家在互联网这方面管理太严了,访问起来相当不方便。

除了ChatGPT外其实还有很多优秀的LLMs产品,例如Cusor、tabnine、Amazon CodeWhisperer(亚马逊)、Copilot(微软)、文心一言、讯飞星火等

Amazon CodeWhisperer(官方网址)是亚马逊公司推出的一款用于 IDE 和命令行的 AI 生产力工具。(相信大公司,国内就可访问还是免费!!!当然微软的也很优秀,但是国内网络不能访问而且收费还不低)可以通过插件的方式安装在IDEA、PyCharm、JupyterLab 中(非常人性化),它能识别中文和英文注解并自动生成代码。(功能十分强大)

二、安装Amazon CodeWhisperer

下面介绍在PyCharm、IDEA、Jupyter三种环境中安装AWS,当然也可以直接访问官方文档

2.1 PyCharm环境(一定要2023版本及以上)

2.1.1 下载插件

依次点击“File | Settings | Plugins”,在商店中搜索“AWS Toolkit”下载安装即可。

2.1.2 注册Amazon账号

依次点击“View | Tool Windows | AWS Tools”

点击完毕后会出现如下对话框,点击“sign in to get started”注册账号即可。
“AWS Toolkit”弹窗位置和自己的软件设置有关,本人将其放置在底部,所有弹窗出现在页面下半部分。
点击按钮后会自动跳转至Amazon的登录页面,一路点击黄色按钮,使用自己邮箱注册登录即可。


网页出现出现如下信息时说明已登录成功,我们就可以在PyCharm中使用AWS了。

2.1.3 CodeWhisperer与Amazon Q

返回PyCharm我们在“AWS Toolkit”对话框中发现两个对话框,分别是“Amazon Q”和“CodeWhisperer”。
Amazon Q是一个AI助手,类似于ChatGPT,我们可以向其提问以获取某些建议,做项目开发时用,可以放着不管他;
CodeWhisperer是一个代码生成工具,它能自动识别注解并生成代码。

2.2 IDEA环境(一定要2023版本及以上)

2.2.1 下载插件

依次点击“File | Settings | Plugins”,在商店中搜索“AWS Toolkit”下载安装即可。

2.2.2 注册并登录

在界面左侧找到“AWS”。
点击“Sign in to get started”登录AWS账号,操作同2.1.2。

2.3 Jupyter Lab环境

注意:此种环境下配置Amazon CodeWhisperer可能会涉及大量的包操作,并且遇到各种各样的问题,相较于开发环境安装复杂度高!!!

2.3.1 Jupyter Lab与Jupyter notebook

通常我们说的jupyter指的是jupyter notebook,是一种文本编辑器,也是我们较为常用的版本,在命令行输入“jupyter notebook”即可进入网页,它的样子是:
可以将Jupyter Lab看做是Jupyter notebook的升级版! 它能够编辑更多类型文本,并且可以安装插件,已经非常类似IDEA和PyCharm这样的集成开发环境。在命令行输入“jupyter lab”即可进入网页,它的样子是:

2.3.2 安装Jupyter Lab

输入如下命令安装Jupyter Lab

pip install jupyterlab

查看Jupyter Lab是否安装成功

jupyter lab

2.3.3 安装amazon-codewhisperer-jupyterlab-ext插件

针对不同版本的Jupyter Lab通过不同命令进行安装:

查看Jupyter Lab版本
jupyter --version

例如图中显示的版本为4.1.2

根据版本信息执行不同安装命令:

Jupyter Lab版本>=4.0
pip install amazon-codewhisperer-jupyterlab-ext

其他版本
pip install amazon-codewhisperer-jupyterlab-ext~=1.0
jupyter server extension enable amazon_codewhisperer_jupyterlab_ext

插件正常安装后刷新页面,在页面底部会出现“CodeWhisperer”按钮。

2.3.4 注册并登录

操作方式同上。

2.3.5 安装问题汇总(非常重要!!!)

安装Jupyter Lab之前,必须先安装Jupyter Notebook,建议Jupyter Notebook版本6.0及以上; 执行“pip install amazon-codewhisperer-jupyterlab-ext”命令时报错,出现“UnicodeDecodeError: ‘gbk‘ code can‘t decode……”,是由于windows10编码与python编码冲突导致的,因为国内计算机默认编码通常为“GBK”,而国外产品的编码往往为“UTF-8”,请看解决方案。 执行“pip install amazon-codewhisperer-jupyterlab-ext”命令时报错,出现“could not create ‘build\bdist.win-amd64\wheel\……”,依次尝试解决方案1、解决方案2。

三、案例演示

3.1 Pycharm环境

3.1.1 斐波那契数列(使用中文注解)

在注解下方按住“ALT C”出现提示框,按住“TAB”键插入代码。
让AWS编写一个主程序测试斐波那契数列方法,此处并没有要求输出多少,AWS自动显示前10个数字并加上了“程序结束的描述”。
我们发现AWS很好的满足了我们描述的需求,运行结果也是正确的,不足之处是数字是竖直排放的,原因是我们提供的注解描述不够准确。

3.1.2 汉诺塔问题(使用英文注解)

中文翻译:创建一个函数,显示汉诺塔问题的前10次变换过程,此汉诺塔问题中包含A、B、C个柱子、包含64个金盘、初始状态时金盘全都放在A柱上,游戏目标是将金盘全都移动到C盘上。
同样让AWS测试该方法。
中文翻译:测试hanoi函数,此时包含3个金盘。
运行结果完全正确。

3.1.3 三层BP神经网络(需人工调参)

以下代码均为AWS自动生成!!! 运行代码发现程序并不能够正常运行。
出现了两个问题:
1.数据越界(主要体现在激活函数上)
2.数据不齐(主要体现在绘图过程中xy轴的数据,例如87、88行)

'''
    使用numpy创建一个BP神经网络类,
    包含一个输入层、一个隐含层、一个输出层,
    包含前向传播、后向传播方法,
    隐含层和输出层使用sigmod激活函数,
    损失函数使用方差,
    测试集和训练集使用numpy随机生成
'''
import numpy as np
import matplotlib.pyplot as plt

class BPNN(object):
    def __init__(self, input_num, hidden_num, output_num):
        self.input_num = input_num
        self.hidden_num = hidden_num
        self.output_num = output_num
        self.w1 = np.random.randn(input_num, hidden_num)
        self.w2 = np.random.randn(hidden_num, output_num)
        self.b1 = np.zeros((1, hidden_num))
        self.b2 = np.zeros((1, output_num))
        self.lr = 0.1
        self.loss = []

    def forward(self, x):
        self.z1 = np.dot(x, self.w1) + self.b1
        self.a1 = self.sigmoid(self.z1)
        self.z2 = np.dot(self.a1, self.w2) + self.b2
        self.a2 = self.sigmoid(self.z2)
        return self.a2

    def backward(self, x, y):
        self.loss.append(np.sum((y - self.a2) ** 2) / 2)
        self.delta2 = (y - self.a2) * self.sigmoid_derivative(self.z2)
        self.delta1 = self.delta2.dot(self.w2.T) * self.sigmoid_derivative(self.z1)
        self.w2 += self.a1.T.dot(self.delta2) * self.lr
        self.w1 += x.T.dot(self.delta1) * self.lr
        self.b2 += np.sum(self.delta2, axis=0, keepdims=True) * self.lr
        self.b1 += np.sum(self.delta1, axis=0, keepdims=True) * self.lr
        return self.loss
    def sigmoid(self, x):
        return 1 / (1 + np.exp(-x))

    def sigmoid_derivative(self, x):
        return x * (1 - x)

    def train(self, x, y, epoch):
        for i in range(epoch):
            self.forward(x)
            self.backward(x, y)
        return self.loss

    def predict(self, x):
        return self.forward(x)

    def plot_loss(self):
        plt.plot(self.loss)
        plt.xlabel('Epoch')
        plt.ylabel('Loss')
        plt.title('Loss Curve')
        plt.show()
        return self.loss

    def plot_predict(self, x, y):
        plt.scatter(x, y)
        plt.xlabel('x')
        plt.ylabel('y')
        plt.title('Prediction')
        plt.show()
        return self.loss

    def plot_predict_line(self, x, y):
        plt.scatter(x, y)
        plt.plot(x, self.predict(x))
        plt.xlabel('x')
        plt.ylabel('y')
        plt.title('Prediction')
        plt.show()
        return self.loss
#创建一个形状为5*10*1的BP神经网络
input_num = 5
hidden_num = 10
output_num = 1
model = BPNN(input_num, hidden_num, output_num)
#使用numpy随机生成训练集和测试集
x_train = np.random.rand(100, input_num)
y_train = np.random.rand(100, output_num)
x_test = np.random.rand(10, input_num)
y_test = np.random.rand(10, output_num)
#训练模型
epoch = 1000
loss = model.train(x_train, y_train, epoch)
#测试模型
y_pred = model.predict(x_test)
#绘制损失曲线
model.plot_loss()
#绘制预测曲线
model.plot_predict(x_test, y_test)
#绘制预测曲线
model.plot_predict_line(x_test, y_test)
#打印预测结果
print(y_pred)
#打印损失值
print(loss)
#打印权重
print(model.w1)
print(model.w2)
print(model.b1)
print(model.b2)
#打印输入
print(x_train)
#打印输出
print(y_train)
#打印测试集
print(x_test)
#打印测试集
print(y_test)
#打印模型
print(model)
#打印模型
print(model.w1)
print(model.w2)
print(model.b1)
print(model.b2)

3.2 IDEA环境

3.2.1 创建Bean对象

以下代码由AWS自动生成,代码基本符合注解中的描述。

public class MyTest {
    //创建一个Person对象,属性值分别是1001、张三、25、123@qq.com,并调用toString方法显示对象信息
    public static void main(String[] args) {
        Person person = new Person(1001, "张三", 25, "XXXXXXXXXX");
        System.out.println(person.toString());
    }
}
/**
 *  创建Person类,类中包含ID、姓名、年龄、邮箱四个属性,包含eat、run三个方法
 *  类中包含一个空参方法和全参方法,以及所有属性的GET和SET方法
 *  类中toString方法显示类的四个属性内容
 */
class Person {
    private int id;
    private String name;
    private int age;
    private String email;

    public Person() {
    }

    public Person(int id, String name, int age, String email) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.email = email;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name +
                ", age=" + age +
                ", email='" + email +
                "}";
    }

    public void eat() {
        System.out.println("吃饭");
    }

    public void run() {
        System.out.println("跑步");
    }
}

3.2.2 创建工具类

使用AW生成JDBC工具类,本人只编写了中文注解,其余代码均自动生成。但是由于描述的过于简单,生成的代码也比较简陋,我们可以使用Amazon Q来优化代码。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JDBCUtil {
    /**
     *  创建函数使用JDBC连接mysql数据库
     */
    public static Connection getConnection(){
        Connection conn = null;
        try {
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8","root","root");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
    public static void close(Connection conn){
        if(conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        conn = null;
    }
}

3.2.3 Amazon Q优化代码

使用Amazon Q后它会根据已有代码给予修正提示,但是并未直接修改代码,根据自身需求可以选择性使用Amazon Q功能。

3.3 Jupyter Lab环境

3.3.1 更改热键/快捷键(必要操作)

默认情况下启用AWS后按下“Tab”键表示接受AWS的代码建议,但是!在Jupyter Lab中“Tab”键表示制表符,这样的情况下无法插入AWS生成的代码,所以需要对AWS的快捷键进行修改。
依次点击“Settings | Keyboard Shortcuts”,找到“codewhisperer”下的“accept-inline”并添加新的快捷键,此处添加了快捷键“Q”。

3.3.2 读取数据

使用pandas库读取名为“dataset.csv”的文件,并显示出前5行内容,AWS很快的完成了任务。

3.3.3 空值处理

删除表中包含空值的行和列并将处理后的结果显示出来。

3.3.4 统计描述/绘图

对于统计性描述以及绘图任务,AWS也能够完成,不过各项参数还可以继续调整。

四、总结

4.1 快捷键

Alt C 唤出AWS代码提示;
Tab 插入代码;在Jupyter Lab中需要重新设置快捷键。

4.2 使用方法

AWS是亚马逊公司提供的免费产品,通过插件的方式运行在各种集成开发环境(IDE)中,能够根据注解自动生成代码,既支持中文又支持英文,使用AWS能够轻松完成大部分常规性问题,例如自动创建一个工具类、编写一个IO方法、解决一个数学问题,但是在处理较为复杂的问题时还需要人为调参,例如编写一个BP神经网络。

学会详细的描述自己的需求是使用AWS的关键!!!

更新时间 2024-03-20