目录
第一步 询问ChatGPT
第二步 实战
第三步 调试ChatGPT
第四步 人工介入实现开发
总结
需求:准备搭建一个对接ChatGPT的服务,部署在云服务器上,这样应该就可以更方面的使用ChatGPT的服务了。
第一步 询问ChatGPT
好了,我们把这个需求抛给 ChatGPT ,让它说一说要如何对接。
哇,是不是很强,不仅步骤清晰,而且还有核心代码,每一步还都贴心的做了说明 。
第二步 实战
好的我们这就按照ChatGPT说的,去找到自己的API key
然后,我们照着它所说的创建好项目:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.openai</groupId><artifactId>openai-java-sdk</artifactId><version>0.1.0</version></dependency></dependencies>
但是,我们在加载Maven 时出现了一个错误:
这里我们发现了ChatGPT瞎编了一个不存在的库 ⊙﹏⊙b汗
第三步 调试ChatGPT
而且,但我们向他出错的原因时,他竟然还有模有样的给出了回答。
但是实际上,并没有这个sdk,好了我们还是自己发送Http请求,实现最基础的方式来对接吧。
ok ,我们按照ChatGPT的提示,我们来编写代码,按照习惯进行分层,在Service层进行核心业务实现。
import cn.itsource.mychatgpt.service.OpenAIService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class OpenAiController {@Autowiredprivate OpenAIService openAIService;@PostMapping("/MyChat")public String myChat(@RequestBody String prompt) {return openAIService.myChat(prompt);}}
import com.alibaba.fastjson.JSON;import org.springframework.http.*;import org.springframework.stereotype.Service;import org.springframework.web.client.RestTemplate;import java.util.*;@Servicepublic class OpenAIServiceImpl implements OpenAIService {private static final String API_KEY = "sk-YOU-API-KEY";private static final String API_URL = "https://api.openai.com/v1/completions";private static final HttpHeaders headers = new HttpHeaders();static {headers.set("Content-Type", "application/json");headers.set("Authorization", "Bearer " + API_KEY);}public String myChat(String prompt) {RestTemplate restTemplate = new RestTemplate();// String prompt = "Once upon a time";String model = "text-davinci-002";int maxTokens = 500;// 拼接json格式的请求体//String requestBody = "{\"prompt\": \"" + prompt + "\", \"model\": \"" + model + "\", \"max_tokens\": " + maxTokens + "}";Map data = new HashMap();data.put("model",model);data.put("prompt",prompt);data.put("max_tokens",maxTokens); // 用Json对象转一下,避免拼接字符串的问题String requestBody = JSON.toJSONString(data);HttpEntity<String> entity = new HttpEntity<>(requestBody, headers);ResponseEntity<String> response = restTemplate.postForEntity(API_URL, entity, String.class);if (response.getStatusCode() == HttpStatus.OK) {System.out.println(response.getBody());} else {System.out.println("Request failed with status code: " + response.getStatusCode());throw new RunTimeException("网络异常,请稍后重试!");}return response.getBody();}}
但是这个请求的地址依然有问题,GPT依然一本正经的告诉了我一些看起来还蛮靠谱的解决方案:
第四步 人工介入实现开发
算了,我们还是老老实实的参考官方文档吧,于是我让ChatGPT告诉了我OpenAI的开发文档地址:
官方文档的地址:https://platform.openai.com/docs/api-reference
通过查看官方文档里,我们终于找到了:
这回我们清楚了,要想和ChatGPT聊天,我们需要发送POST请求,请求地址是:https://api.openai.com/v1/chat/completions
并且要设置请求头参数:
"Content-Type: application/json" 和 "Authorization: Bearer $OPENAI_API_KEY"
Json 格式请求体,必须要包括 model 和 messages
{
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": "Hello!"}]
}
当然,还有一些其他的参数,这里我就不一一介绍了,有兴趣的可以自己参考官方文档的说明。
这次我们在到PostMan里测试一下,添加好请求头,我们发送个请求测试一下
要想实现聊天,让ChatGPT知道我们的上下文只需要在下次请求的时候,把他回答的 "role": "assistant" 和 content也放到 messages 数组中就可以实现了。
OK,清楚了请求地址和参数,我们修改代码中的配置。
终于,我们成功通过SpringBoot 实现了ChatGPT的对接:
剩下的,只需要找一个合适的前端页面,发送请求,就可以愉快的和ChatGPT对话了。
总结
通过这次使用ChatGPT的辅助开发流程,我们可以发现,对于一些简单的知识,ChatGPT基本上没得问题, 他可以给出具体的实现步骤和常规的解决方案。
但是,一旦专业性比较强一点的任务,ChatGPT 就开始编了。它 会给你编一个不存在的库,甚至还给出不存在的github连接, 还会瞎编源码(文件名对, 内容不对), 你给它说不存在, 它就换个名字,换个链接继续编。
而这些问题的本质,是 ChatGPT的实现原理导致的(大概率的语言模型),它并不清楚它所生成的答案到底是什么,只是给予概率的计算,生成的合乎语法格式的大概率答案。
总的来说,如果你不懂编程,直接用它生成的代码,是跑不起来的(代码缺失+Bug),还是需要程序员来定位到出错的地方,并解决。
所以,对于这样的情况来说,人工智能AI 它只是一个工具,未来程序员还是不可或缺的,它可以成为程序员的好帮手,肯定无法替代程序员。