ChatGPT + iOS App 集成 📱🤖
SwiftUI
使用人工智能在移动应用上可能是个好主意,考虑到其简单易用且能带来很多优秀的功能。这就是我在我的游戏应用上如何做到的。
首先,您必须拥有一个OpenAI账户才能生成您的API密钥。
请注意,您需要支付您的令牌费用,因此,我的建议是在创建API密钥之前购买信用(在使用先前生成的密钥时可能会出现一些可能的问题)。
第一步:获取API密钥:创建您的账户并前往API密钥部分以创建您的秘密密钥:https://platform.openai.com/api-keys
有了新的API密钥,让我们来处理我们的代码。为此,我将不会将事物分开成不同的层级或担心架构问题。由于每个项目都有自己创建网络层和存储密钥和URL的方式,让我们只注重实用性!
步骤2:创建网络基类
class GPTNetwork {
// MARK: - Stored Properties
private let APIKey = "sk-yourKey"
private let url = "https://api.openai.com/v1/chat/completions"
private let basePrompt = "I need 100 words about this subject in Swift formatted array"
var request: URLRequest?
// MARK: - Initializers
init() {
setupRequest()
}
// MARK: - Private Methods
private func setupRequest() {
guard let apiUrl = URL(string: url) else { return }
self.request = URLRequest(url: apiUrl)
self.request?.httpMethod = "POST"
self.request?.setValue("application/json", forHTTPHeaderField: "Content-Type")
self.request?.setValue("Bearer \(APIKey)", forHTTPHeaderField: "Authorization")
}
}
这是一个简单的网络类,用于存储一些重要的配置属性。对于它们要做什么?
- APIKey:显然,用你自己的替换(确保它包含“sk”)
- URL:使用相同的
- 此部分是可选的。我使用它,因为对于我的应用程序,用户只会询问主题,所以我需要为ChatGPT提供完整的提示。
第三步:配置提示符
// MARK: - Private Methods
extension GPTNetwork {
private func setupRequestData(with subject: String) -> [String: Any] {
return [
"model": "gpt-3.5-turbo",
"messages": [
["role": "system", "content": "Você está interagindo com um modelo de linguagem."],
["role": "user", "content": "Assunto: \(subject). \(basePrompt)"],
["role": "assistant", "content": "Segue a lista:"]
]
]
}
}
这是您可以最自定义的地方。
正如我之前所说,我正在向用户询问一个主题,并将我的基本提示添加到其中,所以我创建了一个设置方法。如果你有一个静态提示,你可以将整个requestData作为存储属性,或者可能作为一个具有get/set的计算属性来处理。根据你的需求进行调整。
第四步:配置提示符
// MARK: - Public Methods
extension GPTNetwork {
public func getGPTResponse(subject: String) async throws -> String {
guard var request else { return "" }
request.httpBody = try JSONSerialization.data(withJSONObject: setupRequestData(with: subject))
do {
let (data, _) = try await URLSession.shared.data(for: request)
let responseString = String(data: data, encoding: .utf8)
return responseString ?? ""
} catch {
throw error
}
}
}
这里是你最终向ChatGPT提出需求并获取JSON回应的地方。
它可能就在这里结束了,因为每个人/项目对于响应的需求和使用都会不同,但为了防止万一,我会附上我在我的项目中所做的内容,以供您参考。
第五步(可选):创建响应模型
struct ChatResponse: Decodable {
let choices: [Choice]
}
struct Choice: Decodable {
let message: Message
}
struct Message: Decodable {
let content: String
}
那些是简单的响应模型,用来了解GPT为我们带来了什么。您可以原样打印响应正文并检查是否需要使用比我更多的信息。对于这个项目,我只使用内容。
第六步(可选):将Json响应转换为字符串列表
extension String {
func cleanString(_ string: String) -> String {
var newString = string
newString = newString.replacingOccurrences(of: "\\", with: "")
newString = newString.replacingOccurrences(of: "\n", with: "")
newString = newString.replacingOccurrences(of: "[", with: "")
newString = newString.replacingOccurrences(of: "]", with: "")
return newString
}
func convertStringToList(_ string: String) -> [String] {
string.components(separatedBy: "\", \"").map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
}
func convertGPTResponseToList() -> [String] {
do {
let jsonData = self.data(using: .utf8)!
let chatResponse = try JSONDecoder().decode(ChatResponse.self, from: jsonData)
var content = chatResponse.choices.first?.message.content ?? ""
return convertStringToList(cleanString(content))
} catch {
print("Erro ao decodificar a resposta: \(error)")
return []
}
}
}
您很可能还需要对响应进行一些清理,以便使其对您起作用良好。由于我的应用是一个文字游戏应用,这是我需要做的事情。
步骤 7(可选):叫它
@MainActor
class ChatGPTViewModel: ObservableObject {
// MARK: - Wrapped Properties
@Published var subject = ""
@Published var wordsList: [String] = []
// MARK: - Public Methods
func getWords() {
Task {
let result = try await GPTNetwork().getGPTWords(subject: subject)
wordsList = result
}
}
}
这是我的viewModel如何进行调用的示例。
这就是全部了朋友们!希望它今天在某种程度上对你有所帮助 :)