Swift遇见人工智能:为什么现在这很重要
\n\n想象一下:你正在编写一个iOS应用,突然你的用户可以直接问它:“怎么做意大利面?”——然后得到的不是维基百科链接,而是一个生动、详细的回答。或者请求:“给老板写一封关于推迟截止日期的邮件”——一秒钟后草稿就准备好了。听起来像魔法?不,这是Swift + ChatGPT。
\n\n在2024年,将语言模型集成到移动应用中已不再是巨头的专利。现在,任何Swift开发者都可以在一个晚上内为他们的应用添加人工智能。今天,我将向你展示如何做到这一点——使用真实代码,没有废话,并理解底层发生了什么。
\n\n顺便说一句,如果你刚刚开始学习Swift,并希望更深入地了解基础知识,PythonLib是一个很好的地方,可以在深入AI之前打好基础。现在,让我们开始吧。
\n\n第一步:准备环境——在Swift中使用ChatGPT需要什么
\n\n在编写代码之前,让我们确保你拥有所有必要的东西。你需要:
\n\n- \n
- Xcode 15.0或更高版本(最好是最新版本) \n
- iOS 16.0+(以便使用
async/await而无需变通方法) \n - 来自OpenAI的API密钥(在platform.openai.com注册,创建一个密钥) \n
- 用于网络操作的库——我们将使用
URLSession,因此不需要第三方依赖 \n
重要提示:切勿将API密钥直接存储在代码中。使用.xcconfig文件或服务器代理。在示例中,我将展示如何从Info.plist读取密钥,但在生产环境中,务必加密或使用后端。
第二步:创建向ChatGPT发送请求的结构
\n\nChatGPT使用OpenAI API,该API接受JSON并返回模型响应。让我们创建一个简单但功能齐全的结构来发送消息。
\n\n数据模型
\n\n// 消息模型\nstruct Message: Codable {\n let role: String // "system", "user" 或 "assistant"\n let content: String\n}\n\n// 请求模型\nstruct ChatGPTRequest: Codable {\n let model: String\n let messages: [Message]\n let temperature: Double?\n}\n\n// 响应模型\nstruct ChatGPTResponse: Codable {\n struct Choice: Codable {\n let message: Message\n }\n let choices: [Choice]\n}\n\n\n请注意temperature——这是创造性参数。值为0.0时,回答严格且基于事实;值为1.0时,回答富有创意。对于聊天机器人,设置为0.7;对于创意生成,设置为0.9。
API服务
\n\nclass ChatGPTService {\n \n private let apiKey: String\n private let baseURL = "https://api.openai.com/v1/chat/completions"\n \n init() {\n // 从Info.plist读取密钥(仅用于测试!)\n guard let key = Bundle.main.object(forInfoDictionaryKey: "OPENAI_API_KEY") as? String else {\n fatalError("API Key not found")\n }\n self.apiKey = key\n }\n \n func sendMessage(_ text: String) async throws -> String {\n let messages = [\n Message(role: "system", content: "你是一个有用的iOS开发者助手。请用中文简要回答。"),\n Message(role: "user", content: text)\n ]\n \n let requestBody = ChatGPTRequest(\n model: "gpt-3.5-turbo",\n messages: messages,\n temperature: 0.7\n )\n \n var request = URLRequest(url: URL(string: baseURL)!)\n request.httpMethod = "POST"\n request.setValue("application/json", forHTTPHeaderField: "Content-Type")\n request.setValue("Bearer \\(apiKey)", forHTTPHeaderField: "Authorization")\n request.httpBody = try JSONEncoder().encode(requestBody)\n \n let (data, _) = try await URLSe