

本篇介绍 Apple 新的 Foundation Models 框架(Apple Intelligence),从如何检测设备可用性、建立会话、发送 prompt、到调节生成参数(temperature / sampling / seed)并给出可运行的示例(含 SwiftUI 展示)。同时给出实际落地建议和测试注意点。
在使用之前,先把 Framework 导入并检查目标设备是否支持 Apple Intelligence。不是所有设备都支持该功能,所以在调用前务必做可用性判断。
示例代码(最简单的可用性检查):
import FoundationModels
func isAppleIntelligenceAvailable() -> Bool {
return SystemLanguageModel.default.isAvailable
}解析:
SystemLanguageModel 代表设备上可用的文本语言模型的类型。SystemLanguageModel.default 是默认模型实例。.isAvailable 是布尔值:true 表示设备当前可用(例如支持并且设置没被用户关闭),false 表示不可用。更细粒度:查看不可用原因
import FoundationModels
func availabilityReason() -> SystemLanguageModel.Availability {
return SystemLanguageModel.default.availability
}解析:
availability 返回 SystemLanguageModel.Availability 实例,你可以据此判断是因为设备型号不支持、系统设置关掉了 Apple Intelligence,还是其它原因,从而向用户显示不同的引导(例如弹窗提示“请开启 Apple Intelligence”)。使用 LanguageModelSession 建立会话,然后调用 respond(to:) 获取模型返回的文本。下面是最小可运行示例(同步上下文中需要用 async):
import FoundationModels
struct Intelligence {
public func generate(_ input: String) async throws -> String {
// 先检查是否可用
guard SystemLanguageModel.default.isAvailable else {
// 退回:直接返回输入或其它备用文本
return input
}
// 创建会话
let session = LanguageModelSession()
// 直接发送输入并等待响应
let response = try await session.respond(to: input)
// 返回模型的文本内容
return response.content
}
}解析:
LanguageModelSession():会话对象,用于跟模型交互。你可以在一个会话里持续多次对话(如果场景需要上下文),也可以每次新建会话(无上下文)。session.respond(to:):把自然语言输入发送给模型并异步获得响应,返回值 response 包含 content(文本)等信息。respond 是 throws 的,注意在调用处使用 try/catch 以捕获网络 / 权限 /可用性等错误。测试方法:
isAvailable 的逻辑放到 UI 层,给用户合适的反馈和备用方案。通常我们不希望模型只返回自由文本,而是希望它遵循某种指令(例如“你是健康生活教练,输出简短鼓舞性的建议”)。Foundation Models 框架允许在创建 LanguageModelSession 时传入 instructions:
import FoundationModels
struct Intelligence {
private let instructions = """
You are a healthy lifestyle coach. Write a recommendation. Keep it short, positive and inspiring. Respond only with the final recommendation, no explanations.
"""
public func generate(_ input: String) async throws -> String {
guard SystemLanguageModel.default.isAvailable else {
return input
}
let session = LanguageModelSession(instructions: instructions)
let response = try await session.respond(to: input)
return response.content
}
}解析:
instructions 是给模型的全局上下文,告诉模型“扮演什么角色、给出什么风格的输出”。instructions 传入 LanguageModelSession 后,该指令会影响随后所有 respond 的输出,从而保证输出风格的一致性。示例输入/输出:
当你希望控制模型的创造性、多样性或稳定性时,可以传入 GenerationOptions:
示例:基于“每日唯一建议”需求,使用随机 sampling + 稳定 seed。
import FoundationModels
struct Intelligence {
private let instructions = """
You are a healthy lifestyle coach. Write a recommendation. Keep it short, positive and inspiring. Respond only with the final recommendation, no explanations.
"""
public func generate(_ input: String) async throws -> String {
guard SystemLanguageModel.default.isAvailable else {
return input
}
let session = LanguageModelSession(instructions: instructions)
// 以一年中的天数为种子(seed),实现“每天唯一推荐但当天固定”的效果
let seed = UInt64(Calendar.current.ordinality(of: .day, in: .year, for: Date()) ?? 0)
let sampling = GenerationOptions.SamplingMode.random(top: 10, seed: seed)
let options = GenerationOptions(sampling: sampling, temperature: 0.7)
let response = try await session.respond(to: input, options: options)
return response.content
}
}解析:
temperature:范围通常是 0 到 1(有实现可能略有差别)。温度越低(接近 0),生成越保守、越确定;温度越高(接近 1),生成越多样、越富创造性。sampling:控制如何从模型的分布中抽取最终答案。greedy 表示贪心选择最可能的 token(同一 prompt 永远得到同一结果),random 则用 top-k/top-p 之类策略并可指定 seed 以保证在同一 seed 下结果可复现。top: 10 表示在候选中抽取前 10 个,seed 保证在同一个 seed 时结果一致。配合 seed 的变化策略(比如用 day-of-year)可以实现“每天固定但次日变化”的逻辑。场景建议:
greedy + temperature 0。top 值或提高 temperature。下面给出一个完整的 Demo:一个简单的 SwiftUI App,点击按钮生成推荐并显示。注意:这份 Demo 假定在真机上运行并且项目已开启 Apple Intelligence 所需的 capability(如果有的话)。
注意:请在真实项目中替换或处理错误、隐私合规、请求频率限制等问题。
import SwiftUI
import FoundationModels
@main
struct FMExampleApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct ContentView: View {
@State private var prompt: String = "Reduce carbs"
@State private var recommendation: String = ""
@State private var isLoading: Bool = false
@State private var availabilityMessage: String?
var body: some View {
NavigationView {
VStack(spacing: 16) {
TextField("要给模型的输入(例如:Reduce carbs)", text: $prompt)
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding(.horizontal)
if let msg = availabilityMessage {
Text(msg)
.foregroundColor(.orange)
.padding(.horizontal)
}
Button(action: generateRecommendation) {
if isLoading {
ProgressView()
} else {
Text("生成推荐")
.bold()
}
}
.disabled(isLoading)
if !recommendation.isEmpty {
VStack(alignment: .leading, spacing: 8) {
Text("模型推荐:")
.font(.headline)
Text(recommendation)
.padding()
.background(Color(UIColor.secondarySystemBackground))
.cornerRadius(8)
}
.padding()
}
Spacer()
}
.navigationTitle("健康小助手 Demo")
.onAppear {
checkAvailability()
}
}
}
func checkAvailability() {
if SystemLanguageModel.default.isAvailable {
availabilityMessage = nil
} else {
let av = SystemLanguageModel.default.availability
// 这里只举例展示几种可能,具体 enum 取决于 API 实现
availabilityMessage = "Apple Intelligence 当前不可用:\(av)"
}
}
func generateRecommendation() {
isLoading = true
recommendation = ""
Task {
do {
let intel = AppIntelligence.shared
let result = try await intel.generate(prompt)
await MainActor.run {
recommendation = result
isLoading = false
}
} catch {
await MainActor.run {
recommendation = "生成失败:\(error.localizedDescription)"
isLoading = false
}
}
}
}
}
// 单例封装业务逻辑,便于复用
final class AppIntelligence {
static let shared = AppIntelligence()
private init() {}
private let instructions = """
You are a healthy lifestyle coach. Write a recommendation. Keep it short, positive and inspiring. Respond only with the final recommendation, no explanations.
"""
func generate(_ input: String) async throws -> String {
// 可用性检查
guard SystemLanguageModel.default.isAvailable else {
return input
}
// 可选:更细粒度判断,可根据 SystemLanguageModel.default.availability 做提示
let session = LanguageModelSession(instructions: instructions)
// 日级种子:确保同一天内输出相同
let seed = UInt64(Calendar.current.ordinality(of: .day, in: .year, for: Date()) ?? 0)
let sampling = GenerationOptions.SamplingMode.random(top: 10, seed: seed)
let options = GenerationOptions(sampling: sampling, temperature: 0.7)
let response = try await session.respond(to: input, options: options)
return response.content.trimmingCharacters(in: .whitespacesAndNewlines)
}
}Demo 解析要点:
checkAvailability():在界面出现时检查模型可用性并提示用户。AppIntelligence:单例封装模型会话与生成逻辑,里头包含 instructions、seed 策略、GenerationOptions 配置。isAvailable 会为 false。input 或 instructions 的一部分。注意隐私合规与敏感数据的本地化策略。instructions 写成“请将下面内容改写为更专业/更简洁/更口语化的格式”。LanguageModelSession(或通过上下文把历史消息拼接成 prompt),以维持上下文连贯性。isAvailable == false 情况下,提供友好降级(例如“暂不支持,使用本地模板”)。isAvailable → 建立 LanguageModelSession(可带 instructions)→ 调用 respond(to:options:)。GenerationOptions 可以控制创造性与稳定性(temperature + sampling + seed)。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。