ChatGPT是程序員的好幫手?還是要干掉程序員?
需求
剛好我準(zhǔn)備搭建一個(gè)對(duì)接ChatGPT的服務(wù),部署在云服務(wù)器上,這樣應(yīng)該就可以更方面的使用ChatGPT的服務(wù)了。
看了下騰訊云上的云服務(wù)的價(jià)錢,還是比較合適的,不知道618的時(shí)候會(huì)不會(huì)還有優(yōu)惠。
?

第一步,詢問ChatGPT
好了,我們把這個(gè)需求拋給 ChatGPT ,讓它說一說要如何對(duì)接。
?

哇,是不是很強(qiáng),不僅步驟清晰,而且還有核心代碼,每一步還都貼心的做了說明。
第二步,實(shí)戰(zhàn)
好的我們這就按照ChatGPT說的,去找到自己的API key
?


然后,我們照著它所說的創(chuàng)建好項(xiàng)目:
<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 時(shí)出現(xiàn)了一個(gè)錯(cuò)誤:
?

這里我們發(fā)現(xiàn)了ChatGPT瞎編了一個(gè)不存在的庫 ⊙﹏⊙b汗
?
第三步,調(diào)試ChatGPT
而且,但我們向他出錯(cuò)的原因時(shí),他竟然還有模有樣的給出了回答。

但是實(shí)際上,并沒有這個(gè)sdk,好了我們還是自己發(fā)送Http請求,實(shí)現(xiàn)最基礎(chǔ)的方式來對(duì)接吧。

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對(duì)象轉(zhuǎn)一下,避免拼接字符串的問題
????????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("網(wǎng)絡(luò)異常,請稍后重試!");
????????}
????????return?response.getBody();
????}
}
?
但是這個(gè)請求的地址依然有問題,GPT依然一本正經(jīng)的告訴了我一些看起來還蠻靠譜的解決方案:
?

?
?
第四步,人工介入實(shí)現(xiàn)開發(fā)
算了,我們還是老老實(shí)實(shí)的參考官方文檔吧,于是我讓ChatGPT告訴了我OpenAI的開發(fā)文檔地址:
?

?
官方文檔的地址: https://platform.openai.com/docs/api-reference
通過查看官方文檔里,我們終于找到了:
?

?
?
這回我們清楚了,要想和ChatGPT聊天,我們需要發(fā)送POST請求,請求地址是:https://api.openai.com/v1/chat/completions?
并且要設(shè)置請求頭參數(shù):
"Content-Type: application/json"?和 "Authorization: Bearer $OPENAI_API_KEY"
Json 格式請求體,必須要包括 model?和 messages
{
????"model":?"gpt-3.5-turbo",
????"messages":?[{"role":?"user",?"content":?"Hello!"}]
}
當(dāng)然,還有一些其他的參數(shù),這里我就不一一介紹了,有興趣的可以自己參考官方文檔的說明。
?
這次我們在到PostMan里測試一下,添加好請求頭,我們發(fā)送個(gè)請求測試一下
?

?
要想實(shí)現(xiàn)聊天,讓ChatGPT知道我們的上下文只需要在下次請求的時(shí)候,把他回答的 "role": "assistant"?和 content也放到 messages 數(shù)組中就可以實(shí)現(xiàn)了。
OK,清楚了請求地址和參數(shù),我們修改代碼中的配置。
終于,我們成功通過SpringBoot 實(shí)現(xiàn)了ChatGPT的對(duì)接:
?

剩下的,只需要找一個(gè)合適的前端頁面,發(fā)送請求,就可以愉快的和ChatGPT對(duì)話了。
?
?
總結(jié):
通過這次使用ChatGPT的輔助開發(fā)流程,我們可以發(fā)現(xiàn),對(duì)于一些簡單的知識(shí),ChatGPT基本上沒得問題, 他可以給出具體的實(shí)現(xiàn)步驟和常規(guī)的解決方案。
但是,一旦專業(yè)性比較強(qiáng)一點(diǎn)的任務(wù),ChatGPT 就開始編了。它 會(huì)給你編一個(gè)不存在的庫,甚至還給出不存在的github連接, 還會(huì)瞎編源碼(文件名對(duì), 內(nèi)容不對(duì)), 你給它說不存在, 它就換個(gè)名字,換個(gè)鏈接繼續(xù)編。
而這些問題的本質(zhì),是 ChatGPT的實(shí)現(xiàn)原理導(dǎo)致的(大概率的語言模型),它并不清楚它所生成的答案到底是什么,只是給予概率的計(jì)算,生成的合乎語法格式的大概率答案。
總的來說,如果你不懂編程,直接用它生成的代碼,是跑不起來的(代碼缺失+Bug),還是需要程序員來定位到出錯(cuò)的地方,并解決。
所以,對(duì)于這樣的情況來說,人工智能AI 它只是一個(gè)工具,未來程序員還是不可或缺的,它可以成為程序員的好幫手,肯定無法替代程序員。