【Xcode 15】自己跟自己聊天? - ChatGPT

大家晚安,今天要來介紹的是當紅炸子雞-ChatGPT,它是由OpenAI開發的人工智慧聊天機器人程式,全稱聊天生成預訓練轉換器 - Chat Generative Pre-trained Transformer。在這裡,就簡單的使用之前星座聊天室的程式來做修改,重點放在使用API身上…

做一個長得像這樣的東西

作業環境

項目 版本
CPU Apple M1
macOS Sonoma 14.3.1 arm64
Xcode 15.2 arm64

使用方法

申請API KEY

Postman測試

{
  "model": "gpt-3.5-turbo",
  "messages": [
    {
      "role": "user",
      "content": "<文字內容>"
    }
  ],
  "temperature": 0.7
}

iOS APP

  • 在這裡使用WWNetworking來打API…
  • 畫面的細節就不多說了…
import UIKit
import WWNetworking

// MARK: - ChatGPTAPI
final class ChatGPTAPI {
    
    private let apiURL = "https://api.openai.com/v1/chat/completions"
    
    private var model = "gpt-3.5-turbo"
    private var bearerToken = "<BearerToken>"
    
    static let shared = ChatGPTAPI()
    
    private init() {}
}

// MARK: - 小工具
extension ChatGPTAPI {
    
    func configure(bearerToken: String, model: String? = nil) {
        self.bearerToken = bearerToken
        self.model = model ?? "gpt-3.5-turbo"
    }

    func chatGPT(content: String) async -> Result<String?, Error> {
        
        let headers: [String: String?] = ["Authorization": "Bearer \(bearerToken)"]
        
        let httpBody = """
        {
          "model": "\(model)",
          "messages": [{ "role": "user", "content": "\(content)" }],
          "temperature": 0.7
        }
        """
        
        let result = await WWNetworking.shared.request(with: .POST, urlString: apiURL, contentType: .json, paramaters: nil, headers: headers, httpBody: httpBody._data())
        
        var content: String?
        
        switch result {
        case .failure(let error): return .failure(error)
        case .success(let info):
            
            guard let dictionary = info.data?._jsonObject() as? [String: Any] else { return .success(content) }
            
            if let error = dictionary["error"] as? [String: Any] { return .failure(Constant.ChatGPTError.error(error)) }
            
            guard let choices = dictionary["choices"] as? [Any],
                  let choice = choices.first as? [String: Any],
                  let message = choice["message"] as? [String: Any],
                  let _content = message["content"] as? String
            else {
                return .success(content)
            }
            
            content = _content
        }
        
        return .success(content)
    }
}

範例程式碼下載

後記

其實,個人一直相信,「知識,不只是拿來謀取利益的;知識,是可以用來奉獻的,可以用來幫助別人的。」,但還是常看到是用來欺負他人的。 最近的超派鐵拳事件也讓我感觸良多,公眾人物對社會的影響力真的很大啊,尤其是負面的…