前言
我大概在今年 3 月份开始关注 chatGPT,也尝试过让它帮我写代码,当时是想写个动态更换数据源的功能,chatGPT 刷刷刷给了我一段代码,实际一跑不是那么回事,它的代码大部分是对的,但是其中有那么一个两个方法是不存在的
我的结论是,复杂问题还不行
调教
今天我在做一个 api 接入的工作,接口参数比较多,我需要写一个类来封装这些参数。
我先用阿里的通意灵码尝试了下,不尽如人意,就想着让 chatGPT 来试下吧,还别说,只要你耐心调教,它确实能很好的完成工作
我跟它对话了不到 10 轮,最后的结果很完美,下面给大家分享下调教 chatGPT 的过程
第一轮 prompt 要完整
我本意是在这句话之后,把接口方文档贴给 chatGPT,然后它才给我吐出代码,但它已经根据 CsrReq 这个关键字生成了代码
看到代码里 import bouncycastle 我就知道它会错意了
第二轮 基本可用,能更好吗?
可以看到 chatGPT 能识别出接口文档的字段名、数据类型,并且还能对非原始类型数据生成一个对应的类 CertificateData
第三轮 尝试生成注释,理解错误
上面的代码有个问题,没有给字段添加注释,所以我尝试让它添加
这里 chatGPT 没有理解我的意思,他给增加了一个 comment 字段,而我的意思是:文档的最后一栏是注释
当然,也许我的 prompt 不太明确
第四轮 更明确的提示
这一次他确实 get 到了,正确的添加了注释,而且他不是照抄注释,他甚至做了一点点调整
第五轮 尝试修改注释格式
我想要的注释格式是 /** 这是注释 */ 这种格式,所以我尝试让它调整下
不能说他错,但是我想要的是修改字段的注释格式,而他则是给构造方法、getter/setter 方法添加了注释,不太完美
第六轮 基于 json 生成代码
由于字段太多,生成的代码比较长,chatGPT 会生成一部分代码,并询问是否要继续生成代码,我点击继续后,跳出来一个提示:出错了
第七轮 精简代码
我让它忽略 getter/setter 方法后继续
第八轮 继续精简代码
这一次我让它去掉 @JsonProperty 注解,把字段修改为 public,并且给字段带上注释
可以看到这一次生成的代码已经很合我的心意了,关键还是 prompt 的区别,之前我的 prompt 是 "filed comment",这次是 "field with comment"
第九轮 及时的正向反馈,完美的结果
我先夸奖了 chatGPT 一把,然后让它重新完整的输出结果,可以说非常完美了,就是我要的
最终代码鉴赏
public class CertificateRequest { /** * 订单编号,唯一,一个订单对应一个证书,长度不大于32个字符,具体规则由调用方自定义。 */ public String orderId; /** * 调用方安全码,系统中查看 */ public String securityId; /** * 请求证书信息,JSON对象 */ public CertificateData data; /** * 签名算法,当前支持HmacSHA256 */ public String signAlg; /** * 签名值,签名原文为certInfo的值,签名keyId,系统中查看 */ public String signValue; /** * 构造函数 */ public CertificateRequest() { // Default constructor } /** * 构造函数 * * @param orderId 订单编号,唯一,一个订单对应一个证书,长度不大于32个字符,具体规则由调用方自定义。 * @param securityId 调用方安全码,系统中查看 * @param data 请求证书信息,JSON对象 * @param signAlg 签名算法,当前支持HmacSHA256 * @param signValue 签名值,签名原文为certInfo的值,签名keyId,系统中查看 */ public CertificateRequest(String orderId, String securityId, CertificateData data, String signAlg, String signValue) { this.orderId = orderId; this.securityId = securityId; this.data = data; this.signAlg = signAlg; this.signValue = signValue; } /** * 请求证书信息 */ public static class CertificateData { /** * 用户信息 */ public UserInfo userInfo; /** * 证书模板编号,如果不传则使用默认模板 */ public int tempId; /** * 证书有效期 */ public int certDate; /** * 证书有效期单位: month、minute */ public String dateType; /** * 证书请求数据(pkcs10) */ public String csr; /** * 证书主体信息 */ public SubjectInfo subjectInfo; /** * 证书主题备用名称,多个用“,”分隔 */ public String altCN; /** * 随机码,可以是当前时间 */ public String nonce; /** * 构造函数 */ public CertificateData() { // Default constructor } /** * 构造函数 * * @param userInfo 申请证书的用户信息 * @param tempId 证书模板编号,如果不传则使用默认模板 * @param certDate 证书有效期 * @param dateType 证书有效期单位: month、minute * @param csr 证书请求数据(pkcs10) * @param subjectInfo 证书主体信息 * @param altCN 证书主题备用名称,多个用“,”分隔 * @param nonce 随机码,可以是当前时间 */ public CertificateData(UserInfo userInfo, int tempId, int certDate, String dateType, String csr, SubjectInfo subjectInfo, String altCN, String nonce) { this.userInfo = userInfo; this.tempId = tempId; this.certDate = certDate; this.dateType = dateType; this.csr = csr; this.subjectInfo = subjectInfo; this.altCN = altCN; this.nonce = nonce; } /** * 用户信息 */ public static class UserInfo { /** * 用户类型:"person"=个人;"unit"=单位 */ public String type; /** * 用户姓名,如果用户类型为个人,必填 */ public String userName; /** * 身份证号,如果用户类型为个人,必填 */ public String idCard; /** * 单位名称,如果用户类型为单位,必填 */ public String unitName; /** * 营业执照号,如果用户类型为单位,必填 */ public String idNumber; /** * 验证信息 */ public String verificationInfo; /** * 构造函数 */ public UserInfo() { // Default constructor } /** * 构造函数 * * @param type 用户类型:"person"=个人;"unit"=单位 * @param userName 用户姓名,如果用户类型为个人,必填 * @param idCard 身份证号,如果用户类型为个人,必填 * @param unitName 单位名称,如果用户类型为单位,必填 * @param idNumber 营业执照号,如果用户类型为单位,必填 * @param verificationInfo 验证信息 */ public UserInfo(String type, String userName, String idCard, String unitName, String idNumber, String verificationInfo) { this.type = type; this.userName = userName; this.idCard = idCard; this.unitName = unitName; this.idNumber = idNumber; this.verificationInfo = verificationInfo; } } /** * 证书主体信息 */ public static class SubjectInfo { /** * 证书主体项:通用名 */ public String sub_CN; /** * 证书主体项:邮箱 */ public String sub_email; /** * 证书主体项:国家代码,2位 */ public String sub_C; /** * 证书主体项:省份 */ public String sub_ST; /** * 证书主体项:城市 */ public String sub_L; /** * 证书主体项:单位 */ public String sub_O; /** * 证书主体项:部门 */ public String sub_OU; /** * 证书主体项:描述 */ public String sub_D; /** * 构造函数 */ public SubjectInfo() { // Default constructor } /** * 构造函数 * * @param sub_CN 证书主体项:通用名 * @param sub_email 证书主体项:邮箱 * @param sub_C 证书主体项:国家代码,2位 * @param sub_ST 证书主体项:省份 * @param sub_L 证书主体项:城市 * @param sub_O 证书主体项:单位 * @param sub_OU 证书主体项:部门 * @param sub_D 证书主体项:描述 */ public SubjectInfo(String sub_CN, String sub_email, String sub_C, String sub_ST, String sub_L, String sub_O, String sub_OU, String sub_D) { this.sub_CN = sub_CN; this.sub_email = sub_email; this.sub_C = sub_C; this.sub_ST = sub_ST; this.sub_L = sub_L; this.sub_O = sub_O; this.sub_OU = sub_OU; this.sub_D = sub_D; } } }}结论
chatGPT 的确有很强的理解力,但也需要我们好好调教