需求
刚好我准备搭建一个对接ChatGPT的服务,部署在云服务器上,这样应该就可以更方面的使用ChatGPT的服务了。
看了下腾讯云上的云服务的价钱,还是比较合适的,不知道618的时候会不会还有优惠。
好了,我们把这个需求抛给 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汗
而且,但我们向他出错的原因时,他竟然还有模有样的给出了回答。
但是实际上,并没有这个sdk,好了我们还是自己发送Http请求,实现最基础的方式来对接吧。
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;
@RestController
public class OpenAiController {
@Autowired
private 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.*;
@Service
public 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 它只是一个工具,未来程序员还是不可或缺的,它可以成为程序员的好帮手,肯定无法替代程序员。