当前位置:   article > 正文

Amazon CodeWhisperer——AI助力编程_aws codewhisper pycharm

aws codewhisper pycharm


一、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 安装问题汇总(非常重要!!!)

  1. 安装Jupyter Lab之前,必须先安装Jupyter Notebook,建议Jupyter Notebook版本6.0及以上;
  2. 执行“pip install amazon-codewhisperer-jupyterlab-ext”命令时报错,出现“UnicodeDecodeError: ‘gbk‘ code can‘t decode……”,是由于windows10编码与python编码冲突导致的,因为国内计算机默认编码通常为“GBK”,而国外产品的编码往往为“UTF-8”,请看解决方案
  3. 执行“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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123

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("跑步");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78

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;
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

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的关键!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/394714
推荐阅读
相关标签
  

闽ICP备14008679号