先做个广告:如需购买GPT帐号或代充值Chatgpt Plus(GPT4)会员,请添加站长客服微信:GPTchongzhi(备注好你的需求)
首先介绍一下我自己,毕业两年的硕士,目前在某大厂做程序员。虽然去年就听身边的人说过chatGPT,当时自己也没有当回事,心想这玩意能强到哪去,直到某个偶然的机会看到了《ChatGPT&AI破局俱乐部》的宣传贴,也是抱着将信将疑的态度加入的(其实当时是奔着送号来的)。
推荐使用GPT中文版,国内可直接访问:https://ai.gpt86.top
加入之后,也是看着洋哥,还有其他几位管理员发帖,我也就看个热闹,直到有了账号后,开始自己研究,看别人的帖子学习,由于平时工作下班比较晚,每天也就是用一些闲碎的时间看一下,当看到很多人在认真的完成作业,我也被带动了,开始利用下班后的时间,默默的将之前的作业内容补上。
后面大家的创造力真的惊人,很多大佬分享了太多干货,用chatGPT生成文章文案啊,生成PPT啊,生成思维导图啊,视频脚本啊等等,包括洋哥他们开发的zelinAI,可以给chatGPT设定很多角色。
突然感觉自己也应该使用ChatGPT做点什么,由于自己之前有开发微信小程序的经验,于是便想着将chatGPT接入到小程序里面,又因为自己是程序员,对程序员这个行业比较熟悉,就将它设定为了程序员面试官这么一个角色。
于是便利用晚上的时间进行开发,具体开发过程不做赘述,一些简单的步骤来分享一下:
1.首先要有一个openAI的账号,这是前提,需要用到apiKey
2.租一台服务器,我说租的腾讯云硅谷站点的,可以访问到openAI
3.看开发文档,编写后端代码,后端就是简单的spring boot项目,因为自己工作也是使用java语言,写起来比较快
4.编写小程序代码,因为我之前有一个小程序,写起来也非常快,加一个页面,做成聊天框就可以了。如果你没有小程序,不要傻乎乎的从0开始写,github上随便找个开源代码,改一改就可以了。
5.最后就是部署后端,加上线小程序,审核通过后就可以发布了。
这里说一下我在开发过程中遇到的困难,首先第一点就是,我如何将openAI训练成一个面试官?大家都知道prompt,prompt是https://api.openai.com/v1/completions 接口的入参,而我要将它设置为一名面试官,肯定是需要进行连续对话的,那么我需要使用进行聊天的接口https://api.openai.com/v1/chat/completions, 而这个接口中是使用messages进行信息传递的,message里面有个参数role,用来表示角色,当前有system,user和assistant,通过名字不难判断,system是系统角色,user是用户角色,也就是调用方,assistant是助手,也就是openAI本身。那么我对openAI进行人物设定的文本要通过哪个角色封装到message中好呢,经过测试,是需要使用system角色比较好。
既然是面试,那么就要保证对话的连续性,openAI需要知道它向面试者提问过哪些问题,面试者的回答是什么,这些都需要记录下来,其实openAI本身是没有记忆功能的,需要每次调用接口时将上下文传递给它。一开始我是在后端做的缓存,将用户的回答缓存在redis中,然后每次请求时,都将缓存里的数据+当前的文本,一起调用openAI,由于我后端调用openAI使用的是eventSource,又称SSE,类似于websocket,服务器端可以主动推送数据到客户端,也就是openAI可以实时将数据推送给我的服务器,实现流式输出,我的后端和小程序是通过websocket建立起连接,就可以实时将openAI返回的数据推送到小程序端,用户基本不需要等待,就可以看到动态生成的接口,和在openAI网页上的体验一样。
但是因为我上面使用redis缓存只缓存了用户的文本,并没有返回openAI返回的文本,就导致了每次对话,openAI都要把之前的问题再重复回答一遍,我后面才意识到也需要使用assistant角色,将openAI的每次回答也传递给openAI,让它知道上面的问题它已经回答过了,但随之我又面临另外一个问题,openAI返回的数据我是通过EventSource监听的,每次都是返回一个字,我还需要将每一个字记录下来,再拼接成一句话,加入到缓存中,这就增加了复杂度。同时使用redis还存在另外一个问题,我应该把过期时间设置为多少?如果时间太长用户想重新开始面试怎么办?时间太短用户还没有思考好答案又怎么办?所以转变思路,不在后端增加缓存,而是在小程序端维护对话列表,然后将所有的对话封装成messages结构体,转成json字符串传递给后端,因为websocket只接收string,后端再解析发送给openAI,也就完美地解决了这个问题。
messages结构应该是这样的,先上system消息,然后上user消息和assistant消息进行交替
"messages": [
{"role": "system", "content": "你需要做为一个面试官 巴拉巴拉!"},
{"role": "user", "content": "下面上我的简历内容巴拉巴拉"},
{"role": "assistant", "content": "问题1"},
{"role": "user", "content": "回答1"},
{"role": "assistant", "content": "问题2"},
{"role": "user", "content": "回答2"}
]
Copy接下来来看一下效果吧:
从上图可以看出,我只需要提供一下我擅长的技术点,它便会针对这些技术点逐个进行提问,当你回答上来时,它就会再深挖一下,继续问你一些层次的问题,而当你回答不上来的时候,它会给你解释,并且会换个简单的问题。最后你可以问它面试结果,它会根据你之前所有的回答,告诉你哪里薄弱,也可以让它提供一些建议。