先備知識

I/O 鍊 資料流

使用到的依賴項

<dependencies>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.12.3</version> 
    </dependency>
</dependencies>

小提示:如果專案有包含spring-boot-starter-web,則不用另外裝,讚嘆Spring

讓我們開始吧!

private static final String MODEL = "gpt-3.5-turbo"; // 設定模型名稱
private static final int MAX_TOKENS = 2500; // 設定每次請求的字數上限 (一個中文字2Token, 一個英文字1Token)
private static final String URL = "<https://api.openai.com/v1/chat/completions>"; // ChatGPT API 的 URL
private static final String API_KEY = "你的 API 密鑰"; // 你的 API 密鑰
public BufferedReader getResponseFromChatGPT(String message) throws IOException {
				// 創建json請求主體
        String data = createJSONPayload(message);

				// 建立到chatGPTAPI的連線
        HttpURLConnection connection = createConnection();

				// 發送請求
        sendRequest(connection, data);

				// 獲取API返回的響應
        return getResponse(connection);
 }
  1. 創建json請求主體
private String createJSONPayload(String message) throws JsonProcessingException {
    // 建立一個 objectMapper
    var objectMapper = new ObjectMapper();

    // 使用 objectMapper 建立一個 ObjectNode
    var rootNode = objectMapper.createObjectNode();

    // 添加屬性
    rootNode.put("model", MODEL)
            .put("max_tokens", MAX_TOKENS)
            .put("stream", true);

    // 添加陣列
    rootNode.putArray("messages").addObject()
            // 在陣列中添加屬性
            .put("role", "user")
            .put("content", message);

    // 使用 objectMapper 將 ObjectNode 轉換為字串
    return objectMapper.writeValueAsString(rootNode);
}

{
  "model": "MODEL",
  "max_tokens": "MAX_TOKENS",
  "stream": true,
  "messages": [
    {
      "role": "user",
      "content": "message"
    }
  ]
}

這個方法創建了一個JSON對象,該對象包含了將要發送到ChatGPT API的所有信息,例如模型名稱、消息內容、最大的token數量和是否進行流傳輸等。

  1. 建立到chatGPTAPI的連線
// 建立連線
private HttpURLConnection createConnection() throws IOException {
    // 建立url連線
    java.net.URL url = new URL(URL);

    // 建立與指定 URL 之間的連線並返回一個 URLConnection 物件
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();

    // 設定連線的請求方法
    connection.setRequestMethod("POST");

    // 設定連線的請求屬性
    connection.setRequestProperty("Content-Type", "application/json");
    connection.setRequestProperty("Authorization", "Bearer " + API_KEY); // 注意Bearer 後面的空格

    // 設定連線是否可以向伺服器寫入資料
    connection.setDoOutput(true);

    // 回傳連線
    return connection;
}

以下是該方法建立的連接的一個範例: