CodeWhisperer 初体验

news2024/12/30 2:07:38

今年算是 AI 正式破圈的一年,无数的工具,产品横空出世。无论在面向企业的大语言模型,还是帮助个人的 AI 工具,数不胜数。其中关于 AI 编程助手领域,近年来也涌现了很多不错的产品,例如 Copilot, Cursor, 还是我们今天要体验的 CodeWhisperer。已经在潜移默化中改变了程序员们的生产和解决问题的方式,传统解决问题往往依靠的是谷歌等搜索引擎,找到对应的官网和知名的论坛查找问题。而如今,我们仅仅依靠 AI 编程助手就能解决很多问题。

回到 CodeWhisperer 上来,它的出生还是带着许多光环的。首先来自著名的大厂 Amazon, 他们在 AI 领域有足够多的积累,在面向开发者方面有足够多的经验和产品用户体验来反馈用户感受,不断迭代相关产品,而且还有一个相当强大的优势,借助亚马逊云的力量,能够将 AI 和云打通,这在当前云原生时代是必不可少的能力。

目标及前期准备

先给大家讲讲今天我们希望实现的目标,基于 Spring Boot 框架,简单实现用户登陆,。我们使用的是 IntelliJ 开发工具,选用 Maven 进行管理依赖管理,用到的依赖如下。

  • Web

  • JPA

  • H2

我们首先尝试安装 CodeWhisperer 插件,在 Plugins 中搜索 AWS Toolkit 下载即可。

下载完成后绑定自己的亚马逊账号即可开始使用,默认开启自动建议。

项目结构如图所示

pom.xml 文件如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.1.0</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>demo</description>
	<properties>
		<java.version>17</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>com.h2database</groupId>
			<artifactId>h2</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

开始

  • 健康检查

我们先实现一个最简单的 Controller,请求 /ping 返回 pong 即可。

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class PingController {

    @RequestMapping("/ping")
    public @ResponseBody String greeting() {
        return "pong";
    }

}

 测试用例是检验代码正确性必不可少的一环,我们来写个简单的测试用例。这时 CodeWhisperer 已经开始展示它的实力了,只是写了一行 @Test 注解,它将我们想要做的测试代码完整提示出来。

 下面是完整的测试代码。

package com.example.demo;

import com.example.demo.controller.PingController;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;

import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;

@AutoConfigureMockMvc
@WebMvcTest(PingController.class)
public class TestWebApplication {
    @Autowired
    private MockMvc mockMvc;

    @Test
    public void shouldReturnDefaultMessage() throws Exception {
        this.mockMvc.perform(get("/ping")).andDo(print()).andExpect(status().isOk())
                .andExpect(content().string("pong"));
    }
}

 运行一下测试用例,很顺利的通过🎉。

  • 用户类设计

我们来定一个 User 模型,发现它在 Table To Class 的实现中具备一定的表设计能力,以及字段关联联想,约束设计能力。

能推测我想要的表字段,索引约束建议。这对于新手来说是莫大的帮助,想象有一位功力深厚的同伴在旁指点你设计表结构,那么表结构的设计就能相对合理一些。 

package com.example.demo.model;


import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.stereotype.Indexed;

@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "game_users")
public class User {
    @Id
    private Long id;
    @Column(unique = true, nullable = false)
    private String username;
    @Column(nullable = false, length = 64)
    private String password;
    @Column(unique = true, nullable = false)
    private String email;
}
  • DAO 层实现

这时我灵光一现,根据官网的 GIF 图展示,可以通过注释进行代码推断,那好,DAO 层的实现就交给它啦。

 哎哟,不错哦,根据我上面想要根据邮箱查询用户的注视,它已经给出了相应的提示,让我们再考考它,注释中进行多个方法的描述。

 挺聪明呀,也很顺利的实现了。

package com.example.demo.dao;

import com.example.demo.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.Optional;

@Repository
public interface UserDao extends JpaRepository<User, Long> {
    // function to implement find user by email
    Optional<User> findByEmail(String email);

    Optional<User> findByUsername(String username);

    // two function to implement find user by id or email
    Optional<User> findById(Long id);
    Optional<User> findByEmailIgnoreCase(String email);

    // function to implement check user is existed
    Boolean existsByEmail(String email);

}

看来以后 CRUDDAO 层实现可以交给它来完成啦。我们希望能够预先插入一些数据便于测试,琐碎的日志测试对它来说轻轻松松。 

package com.example.demo;

import com.example.demo.dao.UserDao;
import com.example.demo.model.User;
import org.slf4j.Logger;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
class LoadDatabase {
    public static final Logger log = org.slf4j.LoggerFactory.getLogger(LoadDatabase.class);

    // this is Bean is loaded once in the application context
    // it is used to load the data into the database
    @Bean
    public CommandLineRunner initDatabase(UserDao dao) {
        return args -> {
            log.info("Preloading " + dao.save(new User(1L, "test1", "111111", "abc@gmail.com")));
            log.info("Preloading " + dao.save(new User(2L, "test2", "222222", "123@gmail.com")));
        };
    }
}
  • Service 层实现

轮到 Service 层了,让我们看看它的表现,在这里我们简单的根据用户名查询用户,返回对应的数据即可。当我方法签名写一半时,它给我的建议让我停下继续敲击的手指,因为基本符合我的预期,而且具备一定的记忆联想能力,在 DAO 层定义的 Optional<User>,这里也能找到对应的方法进行处理。

package com.example.demo.service;

import com.example.demo.dao.UserDao;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Optional;

@Service
public class UserDetailServiceImpl {
    private final UserDao userdao;

    @Autowired
    public UserDetailServiceImpl(UserDao userdao) {
        this.userdao = userdao;
    }

    public User getUserByUsername(String username) throws Exception {
        Optional<User> user = userdao.findByUsername(username);
        if (user.isPresent()) {
            return user.get();
        } else {
            throw new Exception("User not found");
        }
    }
}
  • Controller 层实现

最后我们来实现最外层入口,简单的进行相关业务校验,用户名是否为空,密码是否正确,在这里用于演示。

用户不存在相关处理,密码正确性验证,基本符合我们的要求。

package com.example.demo.controller;

import com.example.demo.model.User;
import com.example.demo.service.UserDetailServiceImpl;
import org.apache.coyote.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/auth")
public class UserController {
    private final UserDetailServiceImpl userDetailService;

    @Autowired
    public UserController(UserDetailServiceImpl userDetailService) {
        this.userDetailService = userDetailService;
    }

    @PostMapping("/login")
    public ResponseEntity<?> login(@RequestBody User user) {
        try {
            if (user.getUsername().isEmpty()) {
                return ResponseEntity.badRequest().body("user name is empty");
            }

            User res;
            res = userDetailService.getUserByUsername(user.getUsername());
            if (res == null) {
                return ResponseEntity.badRequest().body("user not  found");
            }

            if (res.getPassword().equals(user.getPassword())) {
                return ResponseEntity.ok(res);
            }
            return new ResponseEntity<>("user password invalid", HttpStatus.BAD_REQUEST);
        } catch (Exception e) {
            return ResponseEntity.notFound().build();
        }
    }
}

 最后我们来测试一下,格式错误和用户密码错误的情况。

 与预期一致,撒花。

总结

CodeWhisperer 就我今天的使用而言,还是有些出乎我的意料,之前的一些 AI 编程工具并不具备记忆和联想能力,今天 CodeWhisperer 展示的记忆联想效果不错,并且具备一定的表结构设计能力,一些简单的测试用例完成度也不错,我想未来一些简单琐碎的需求,测试用例也可以交给它了。但是今天在体验的过程中还是发现了一些不足,插件 UI 会出现挡住建议的情况,这样我需要再次触发建议才行,目前阶段可以使用它来投入生产,在一些复杂的场景还是需要谨慎,会出现胡言乱语的情况,跟上下文关联性不强的建议。

当然,这些问题相信随着模型的数据量级和质量不断优化能够慢慢解决🎉。

给大家一个小预告,6 月 27 - 28 日,"亚马逊云科技中国峰会"即将开幕,欢迎大家参会。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/600928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络爬虫技术在搜索引擎中的应用

网络爬虫技术在搜索引擎中扮演着非常重要的角色&#xff0c;主要应用在以下几个方面&#xff1a; 网页抓取&#xff1a;搜索引擎需要从互联网上抓取大量的网页&#xff0c;以建立自己的索引库。网络爬虫技术可以帮助搜索引擎快速、高效地抓取网页。 网页解析&#xff1a;搜索引…

vue 自适应的方法

1、使用 filter来处理。 2、使用vue3.x中的 filter &#xff08;&#xff09;方法&#xff0c;但是要注意 filter &#xff08;&#xff09;方法的返回是一个字符串&#xff0c;在进行渲染时可能会有问题。 3、使用 react. js中的 require &#xff08;&#xff09;方法&#x…

实时数仓中数据实时输出的思考与实现

随着数据量不断增长以及提升企业竞争力的需求增长&#xff0c;实时数仓已经成为了许多业务和组织的重要数据架构之一。在实时数仓中&#xff0c;数据实时输入和数据实时分析是关键步骤&#xff0c;但同样重要的是如何将处理后的数据输出到各种目标上。本文将探讨实时数仓中数据…

亚马逊正常购物下单流程是怎么样的?

当您想要在亚马逊上购物时&#xff0c;您可以按照以下步骤进行&#xff1a; 1、登录亚马逊账户&#xff1a;在亚马逊的官方网站上&#xff0c;使用您的亚马逊账户进行登录。如果您还没有账户&#xff0c;可以在网站上注册一个新账户。 2、浏览商品&#xff1a;在亚马逊首页上&…

CASAIM受邀参加广东省科学院幼儿园举行的第二届STEAM科技节暨庆“六一”科普嘉年华活动

今年6月1日是第63个“六一”国际儿童节&#xff0c;恰“接棒”第7个全国科技工作者日。CASAIM受邀参加广东省科学院幼儿园举行的第二届STEAM科技节暨庆“六一”科普嘉年华活动&#xff0c;展示高精度的三维扫描和3D打印技术&#xff0c;为广大儿童送上精彩的科普大礼。 从小朋友…

视图及其缩放

相机控制 在本课中&#xff0c;您将学习如何通过使用 ViewCube 更改模型视图来检查您的设计。 学会环顾四周 在创建设计时&#xff0c;能够从各个方面看到您的设计会有所帮助。 让我们了解如何更改视图。 你能旋转你的视图看看谁在幕后吗&#xff1f;ViewCube&#xff08;…

最新office365个人和家庭版下载及功能介绍

到了台新联想笔记本&#xff0c;想试试随机带的office365&#xff0c;才发现要有microsoft账户&#xff0c;要重新注册账号。 搞了一圈&#xff0c;很麻烦&#xff0c;发现微软登陆帐号时一直在转圈圈&#xff0c;而无法完成登录。 大概率还是因为服务器在海外的原因。 于是索性…

【企业化架构部署】Apache配置与应用

文章目录 一、构建虚拟web主机1.概述2.httpd服务支持的虚拟主机类型3.构建虚拟Web主机3.1基于域名的虚拟主机3.2基于IP地址的虚拟主机3.3基于端口的虚拟主机 4.Apache连接保持5.Apache访问控制 二、Apache日志管理rotatelogs分隔工具 三、总结1.Web虚拟主机部署步骤2.网页根目录…

【UE5 新手向】网络同步1 —— 开启 Actor 的位置网络同步

新建一个第三人称 C 项目 在播放设置中&#xff0c;将 Number of Players 改为2&#xff0c;并将 Net Mode 改为Play As Listen Server。 播放游戏&#xff0c;可以发现角色默认开启了同步。 停止播放&#xff0c;选中场景中的某个物体。 在 Details 面板选择新建蓝图。 选…

chatgpt赋能python:Python编程实现文件备份功能

Python编程实现文件备份功能 数据对于任何企业都是极其重要的。文件备份是数据备份的一种重要形式。在发生系统损坏、恶意攻击、误操作等情况时能够帮助我们恢复数据。本文将介绍如何使用Python编程实现文件备份功能。 备份的重要性 对于企业而言&#xff0c;数据备份就像是…

clang 01. clang driver流程分析

文章目录 前言在这里简要概述一下clang的流程 1.clang driver代码分析1.1创建诊断&#xff08;DIagnosticsEngine&#xff09;实例1.2创建Driver(clang::driver::Driver)的实例1.3通过Driver的BuildCompilation方法生成需要执行的命令1.4Jobs构建完成&#xff0c;通过Driver的E…

OS-文件管理1-文件-文件的逻辑结构与物理结构。

一&#xff0c;文件管理 关键词&#xff1a;如何组织及提供的功能。 二&#xff0c;文件-文件基本概念。 1.文件&#xff0c;记录&#xff0c;数据项 2.文件属性 三&#xff0c;文件-文件控制块FCB与索引结点。 文件控制块FCB&#xff1a;用来存放控制文件需要的各种信息…

在软件定义汽车的时代,低代码究竟给车企数字化转型带来了什么?

前言&#xff1a; 软件定义汽车&#xff08;Software Defined Vehicles, SDV&#xff09;&#xff0c;是由百度自动驾驶事业部总经理王劲提出的概念。其核心思想是&#xff0c;决定未来汽车的是以人工智能为核心的软件技术&#xff0c;而不再是汽车的马力大小&#xff0c;是否…

Java并发体系-第三阶段-JUC并发包-[1]

AtomicXXXFieldUpdater 算是一个小补充 简介 public class AtomicIntegerFieldUpdaterTest {public static void main(String[] args) {AtomicIntegerFieldUpdater<Test> updater AtomicIntegerFieldUpdater.newUpdater(Test.class, "value");Test ts new T…

Maven处理依赖冲突

1.java常用的包依赖异常有&#xff1a; 1&#xff09;AbstractMethodError 2&#xff09;NoClassDefFoundError 3&#xff09;ClassNotFoundException 4&#xff09;LinkageError Maven会根据pom文件中的groupId、artifactId、version来判断jar是否冲突 如果出现了同名不…

开发软件必须写代码?来看smardaten如何零代码开发学生管理系统

一、前言 互联网产品在我们的生活中无处不在&#xff0c;但你知道开发一个这样的产品需要的成本有多大吗&#xff1f; 传统的产品研发模式是&#xff1a;功能需求&#xff0c;需要调研&#xff0c;画原型&#xff0c;开发&#xff0c;测试&#xff0c;上线&#xff0c;跟踪运…

基于Python+OpenCV的图像搜索引擎(CBIR+深度学习+机器视觉)含全部工程源码及图片数据库下载资源

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 定义图像描述符3. 索引化数据集4. 设计搜索引擎内核5. 执行搜索 系统测试1. 处理数据集2. 执行搜索 工程源代码下载其它资料下载 前言 本项目旨在开发一套完整高效的图像搜索引擎&#xff0c;为用…

python程序大全(7)——一元一次、一元二次方程解及函数解析

&#x1f3c6;一、前言 从1月到6月一直没更新&#xff0c;学习太忙辣。马上就要暑假了&#xff0c;今天是六一儿童节&#xff0c;所以抽出空来更新更新。 本文讲述的是1元1次方程&#xff0c;1元2次方程的python解法。只用给出一般形式的系数和常数&#xff0c;自动给出方程的…

企业为什么要进行思维与创新内训?有什么好处?

产品思维和创新在现代产品开发和管理中具有重要作用。 产品思维是指在设计和开发产品过程中&#xff0c;综合考虑用户需求、市场趋势、技术发展等多方面因素&#xff0c;以实现产品的有效性、可用性、价值和竞争力。 创新则是通过引入新的想法、方法或技术&#xff0c;创造出新…

table表格排序,@sort-change=“sortChange“ 取消排序

table表格排序&#xff0c;sort-change"sortChange" 取消排序 点击的单个进行排序时,要求isAsc对应当前字段的排序顺序;值ascending,descending,null三种情况;若指定了列对应的prop,没有指定order的话,默认ascending; desc降序&#xff0c;asc升序&#xff0c;当点升…