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")
}
}

这是一个简单的网络类,用于存储一些重要的配置属性。对于它们要做什么?

  1. APIKey:显然,用你自己的替换(确保它包含“sk”)
  2. URL:使用相同的
  3. 此部分是可选的。我使用它,因为对于我的应用程序,用户只会询问主题,所以我需要为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如何进行调用的示例。

这就是全部了朋友们!希望它今天在某种程度上对你有所帮助 :)

2024-01-16 04:49:43 AI中文站翻译自原文