使用Foundation Models框架在Swift中构建AI功能
🧠 一、Foundation Models框架概述
苹果推出的Foundation Models框架为开发者提供了在应用中集成大语言模型(LLM)的标准化解决方案。这个框架的核心优势在于:
- 类型安全API - 完全基于Swift的强类型系统设计
- 设备级优化 - 充分利用Apple Silicon的神经引擎
- 隐私优先 - 数据处理在设备端完成(需Apple Intelligence支持)
- 多模态支持 - 文本、结构化数据等生成能力
import FoundationModels // 框架基础模块
// 可用性检查示例
func checkAIAvailability() -> Bool {
return SystemLanguageModel.default.isAvailable // ✅ 检查设备是否支持AI功能
}
📱 二、设备兼容性与初始配置
1. 设备要求与检测
- 支持设备:M系列芯片的Mac、iPhone 15 Pro及以上、iPad Pro(M2+)
- 状态检测:
let availability = SystemLanguageModel.default.availability switch availability.state { case .supported: print("设备完全支持") case .restricted(let reason): switch reason { case .disabledByUser: showEnableAISettingsAlert() // 🛠️ 提示用户开启Apple Intelligence case .unsupportedDevice: fallbackToBasicMode() // ⚠️ 在不支持的设备上启用降级方案 } }
2. 基础会话创建
struct AIService {
private let session: LanguageModelSession
init() {
self.session = LanguageModelSession(
instructions: "你是一个专业的健康顾问" // 📝 定义模型角色
)
}
}
✍️ 三、文本内容生成实战
1. 基础文本生成流程
func generateHealthTip(for goal: String) async -> String {
guard SystemLanguageModel.default.isAvailable else {
return defaultTips.randomElement()! // 🆘 无AI时的降级方案
}
let response = try await session.respond(to: goal)
return response.content // 示例输入:"减少碳水摄入" → 输出健康建议
}
2. 高级参数调优
控制模型创造力和输出稳定性:
// 温度控制:0.0(确定性) ~ 1.0(创造性)
let options = GenerationOptions(
temperature: 0.7, // 🔥 中等创造力
sampling: .random(
top: 5, // 仅从最佳5个选项中选取
seed: dailySeed // 🌱 每日变化但当天固定
)
)
let response = try await session.respond(
to: "适合办公室的5分钟运动",
options: options
)
3. 实际应用案例:健康助手
健身应用FoodFit使用此技术:
struct FitnessCoach {
func generateWorkoutPlan(for user: UserProfile) async -> String {
let prompt = """
用户数据:年龄\(user.age)岁,BMI\(user.bmi)
目标:\(user.fitnessGoal.rawValue)
生成个性化训练计划
"""
return try await session.respond(to: prompt).content
}
}
// 输入 → 输出:力量训练计划包含具体动作/组数/休息时间
🧩 四、结构化内容生成
1. 核心概念与工作流程
2. 结构化数据模型定义
@Generable // 🧬 启用自动协议实现
struct NutritionReport {
@Guide(description: "总热量(千卡)")
let calories: Double
@Guide(description: "碳水/蛋白质/脂肪比例,如'40:30:30'")
let macroRatio: String
@Guide(description: "维生素含量标记,如'高维C'")
let vitaminInfo: String?
}
// 使用示例
func analyzeFood(_ ingredients: String) async -> NutritionReport {
return try await session.respond(
to: ingredients,
generating: NutritionReport.self // 🎯 指定返回类型
).content
}
3. 实际应用案例:食谱生成器
烹饪应用SmartChef的实现:
@Generable
struct Recipe {
@Guide(description: "不超过6字的菜名")
let title: String
@Guide(description: "准备时间(分钟)")
let prepTime: Int
@Guide(description: "分步骤说明,用换行分隔")
let steps: String
}
func generateRecipe(ingredients: [String]) async throws -> Recipe {
let prompt = "可用食材:\(ingredients.joined(separator: ", "))"
return try await session.respond(
to: prompt,
generating: Recipe.self
).content
}
// 输入:["鸡胸肉", "西兰花", "大蒜"]
// 输出:结构化菜谱对象
⚙️ 五、高级应用技巧
1. 上下文管理策略
class ConversationManager {
private var history: [String] = []
func continueConversation(_ message: String) async -> String {
history.append(message)
let context = history.joined(separator: "\n")
// 保留最近3轮对话作为上下文
if history.count > 3 {
history.removeFirst()
}
return try await session.respond(to: context).content
}
}
2. 性能优化方案
// 预加载模型减少延迟
func preloadModel() {
Task.detached(priority: .utility) {
_ = try await SystemLanguageModel.default.prepare()
}
}
// 响应流式处理
func streamResponse(to query: String) {
let stream = session.streamResponse(to: query)
for await partialResult in stream {
updateUI(partialResult) // ✨ 实现逐词显示效果
}
}
3. 错误处理最佳实践
do {
let response = try await session.respond(to: input)
} catch FoundationModelsError.rateLimited {
showRetryButton(after: 5) // ⏳ 速率限制处理
} catch FoundationModelsError.invalidInput {
sanitizeUserInput() // 🧼 清理特殊字符
} catch {
logError(error) // 📊 上报分析平台
}
🚀 六、完整实战:健康管理应用
构建结合文本+结构化生成的综合应用:
struct HealthAssistant {
private let session = LanguageModelSession(
instructions: "你是认证营养师和健身教练"
)
// 生成当日建议(文本)
func dailyRecommendation() async -> String {
let options = GenerationOptions(
sampling: .random(top: 3, seed: Date().daySeed)
)
return try await session.respond(
to: "生成今日健康小贴士",
options: options
).content
}
// 分析餐食营养(结构化)
func analyzeMeal(_ description: String) async -> MealAnalysis {
struct Analysis: Generable {
@Guide(description: "热量评估:低/中/高")
let calorieLevel: String
@Guide(description: "营养均衡评分0-5")
let balanceScore: Int
}
return try await session.respond(
to: description,
generating: Analysis.self
).content
}
}
📊 性能对比:文本生成 vs 结构化生成
特性 | 文本生成 | 结构化生成 |
---|---|---|
输出类型 | String | Generable 类型 |
使用复杂度 | ⭐⭐ | ⭐⭐⭐⭐ |
数据可靠性 | ⭐⭐ | ⭐⭐⭐⭐⭐ |
集成难度 | ⭐ | ⭐⭐⭐ |
适用场景 | 聊天/建议/创意写作 | 数据分析/表单填充/报告生成 |
示例代码 | session.respond(to:) | session.respond(to:generating:) |
🌟 总结
核心要点
- 设备兼容性是前提 - 必须检查
SystemLanguageModel.isAvailable
- 文本生成简单高效 - 通过
LanguageModelSession
快速实现对话功能 - 参数调优决定质量 - 合理设置温度/采样模式提升输出效果
- 结构化生成更强大 - 使用
@Generable
+@Guide
获取类型安全数据 - 上下文管理关键 - 维护对话历史提升连续性体验
未来发展
随着框架演进,我们可以期待:
- 多模态支持(图片+音频生成)
- 本地微调(设备端模型个性化)
- 跨设备同步(iCloud同步会话状态)
- 实时协作(多人共同编辑AI生成内容)