报名参加CloudWeGo黑客松,奖金直推双丰收! 了解详情
写点什么

谁说 AI 编程工具缺乏记忆和联想能力,简单琐碎的需求完全可以交给它

  • 2023-08-23
    北京
  • 本文字数:5298 字

    阅读完需:约 17 分钟

谁说 AI 编程工具缺乏记忆和联想能力,简单琐碎的需求完全可以交给它

活动推荐: #生成式 AI 先锋开发者集结令 #

免费体验编程神器,丰厚大奖等你来拿!👉🏻👉🏻https://jinshuju.net/f/rVuKYa


今年算是 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;
@Controllerpublic 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;
@Repositorypublic 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;
@Configurationclass 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;
@Servicepublic 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 会出现挡住建议的情况,这样我需要再次触发建议才行,目前阶段可以使用它来投入生产,在一些复杂的场景还是需要谨慎,会出现胡言乱语的情况,跟上下文关联性不强的建议。


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


版权声明: 本文为 InfoQ 作者【天黑黑】的原创文章。

原文链接:【https://xie.infoq.cn/article/179127e04fff483aac667444d】。文章转载请联系作者。

2023-08-23 10:564152

评论

发布
暂无评论
发现更多内容

带你掌握数仓的作业级监控TopSQL

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 4 月 PK 榜

白盒的测试方法

测吧(北京)科技有限公司

测试

MySQL进阶之道,MySql性能实战源码+笔记+项目实战

程序知音

Java MySQL 数据库 后端

熬夜肝到秃头!阿里顶配级Spring Security笔记

程序知音

Java spring 后端 spring security java架构

中国边缘云公有云服务市场 Top2,百度智能云让智算无处不在

百度开发者中心

云计算 #百度智能云# 边缘云

详解数据结构中栈的定义和操作

华为云开发者联盟

数据结构 开发 华为云 华为云开发者联盟 企业号 4 月 PK 榜

Gartner发布中国容器管理平台供应商识别指南,灵雀云实力入选

York

容器 云原生 系统架构 研究报告 平台选型

矢量图片转换工具:Vector Magic 免激活版

真大的脸盆

Mac Mac 软件 图片格式转换 图片格式

使用depay信用卡开通chatGPT付费API

石云升

AI ChatGPT 三周年连更

今晚直播 | 思码逸陆春蕊:面对研发效能度量落地难点,如何让数据说话?

思码逸研发效能

研发效能

企业级无代码平台,「重塑」软件生产关系

ToB行业头条

轻松玩转小程序,这样做让你拥有2亿用户

加入高科技仿生人

小程序 低代码 小程序制作 小程序开发

OpenHarmony开发者大会举办,OpenHarmony项目群授牌30家捐赠单位及个人

最新动态

如何在页面中监听“不存在”的 DOM 节点

茶无味的一天

JavaScript DOM web api 水印 MutationObserver

深度学习基础入门篇[六]:模型调优,学习率设置(Warm Up、loss自适应衰减等),batch size调优技巧,基于方差放缩初始化方法。

汀丶人工智能

人工智能 深度学习 学习率 warmup batchsize

常用测试策略与测试手段

测吧(北京)科技有限公司

测试发开

“亮相”欧洲!TDengine 在 KubeCon 与开发者探讨云原生与数据库的技术结合

TDengine

tdengine 时序数据库 KubeCON

聊聊 CSS 隐藏元素的 10 种实用方法

茶无味的一天

CSS 隐藏元素

电子元器件“切开后”,原来是这样子的!

元器件秋姐

科普 三极管 元器件 二极管 电感

如何从1到99做好产品 | 得物技术

得物技术

Backgrounds——为所有人准备的mac动态壁纸,让桌面更生动

互联网搬砖工作者

重新学习Java线程原语

码语者

Java 线程

《一时重构一时爽,一直重构一直爽》

后台技术汇

代码重构 软件重构 三周年连更

从 Dev 和 Ops 视角出发,聊聊 DevSecOps 的 What / Why / How

极狐GitLab

DevOps 安全 DevSecOps 安全左移 安全合规

瓴羊quickbi工具免费体验30天,零基础上手企业数据更直观

对不起该用户已成仙‖

微服务 Spring Boot 整合Redis 实战开发解决高并发数据缓存

Bug终结者

redis缓存 三周年连更

玩转服务器之Docker篇:10分钟学会搭建 Docker 环境

京东科技开发者

云计算 容器 Docker 镜像 企业号 4 月 PK 榜

户外led电子屏未来发展趋势

Dylan

技术 LED显示屏 户外LED显示屏

小技巧:如何让 Windows 应用程序在 Parallels Desktop 中启动得更快

互联网搬砖工作者

数字化转型框架如何搭建?

优秀

数字化转型

Qz学算法-数据结构篇(引入)

浅辄

数据结构 三周年连更

谁说 AI 编程工具缺乏记忆和联想能力,简单琐碎的需求完全可以交给它_亚马逊云科技_天黑黑_InfoQ精选文章