Highlight
这场 Session 由人机交互研究员 Mary Beth 与 AI 安全工程师 Sprite 共同讲解:前半部分讲端侧约 30 亿参数模型的 prompt 设计技巧,后半部分用「瑞士奶酪」分层模型讲 AI 安全策略。
核心内容
很多开发者第一次接到 Foundation Models 框架,会把它当成一个迷你版 ChatGPT 来用。然后就遇到一连串怪事:让它当计算器算账,结果错;让它写一段排序算法,结果勉强能跑;问它最近发生的新闻,它一本正经胡说八道。换个 prompt,问题依旧。这并非 prompt 没写好,而是这颗模型的能力边界本就不同。
Apple 在这场 Session 里把这件事讲清楚了。端侧模型大约 30 亿参数,内置在 iOS、iPadOS、macOS、visionOS 中,Apple Intelligence 的 Writing Tools 用的也是它(01:48)。对比动辄几千亿参数的服务器大模型,它专门为放进口袋而压缩。它擅长摘要、分类、多轮对话、文本创作、文本改写、生成标签;它不擅长复杂推理、数学计算、代码生成、提供事实知识。世界知识有限还可能产生幻觉(hallucination),所以「请把它当事实数据库」这条路从一开始就不通。
后半段的安全部分才是这场 Session 的重点。Foundation Models 框架自带由 Apple 训练的 guardrail,作用于输入和输出两侧——即使 prompt 巧妙绕过了输入过滤,输出端依然会拦截有害内容(12:30)。但框架的安全只是地基,Apple 反复强调:开发者必须在地基之上叠加自己的安全层。Sprite 用瑞士奶酪类比多层防御——每片奶酪都有洞,但所有洞同时对齐的概率极低(17:53)。这个心智模型,比任何具体技巧都重要。
详细内容
模型能力边界
端侧模型的取舍可以总结为几条硬规则(03:32):
- 复杂推理任务做不好,应拆成更简单的步骤喂给它。
- 数学相关任务直接交给非 AI 代码,更可靠。
- 代码生成不是它的强项,避免把它当 Copilot 用。
- 事实型问题除非已验证模型确实知道某个具体话题,否则不要依赖它。
Mary Beth 用「列出 10 种受欢迎的 bagel 口味」举例(04:25),模型确实知道 bagel,但把 plain bagel 描述成「带一堆配料」——这就是幻觉。但她接着指出一个反转:在一个面包店小游戏里,模型生成顾客点单对话时偶尔出错反而变成笑点。能否容忍幻觉,取决于场景。
Prompt 设计技巧
用一段最简单的 Swift 代码起步(01:11):
let session = LanguageModelSession()
let prompt = "Generate a bedtime story about a fox."
let response = try await session.respond(to: prompt)
关键点:
LanguageModelSession()创建一次会话,对应一段持续的对话上下文。prompt是给模型的自然语言指令,可以用任何 Apple Intelligence 支持的语言书写。respond(to:)是异步抛错方法,返回模型生成的文本。
Prompt 调优有几条具体可操作的技巧(06:18):
- 用 “in three sentences”、“in a few words” 缩短输出;用 “in detail” 加长输出。
- 用 role 控制风格,例如 “You are a fox who speaks Shakespearean English”。
- 把 prompt 写成清晰的命令,单任务、足够具体。
- 在 prompt 里嵌入少于 5 个示例,可以显著提升任务表现。
- 想阻止某种输出时,用全大写命令 “DO NOT”,效果接近对它「严肃说话」(08:01)。
调试场所首选 Xcode 的 #Playground,prompt 改一行右侧画布立即出结果(08:11)。
Instructions 与 Prompt 的差别
Instructions 是另一种 prompt,在创建 session 时传入,告诉模型「之后所有 prompt 都按这套规则回应」(08:51):
let session = LanguageModelSession(
instructions: """
You are a helpful assistant who generates scary stories \
appropriate for teenagers.
"""
)
let response = try await session.respond(to: "Write a poem about bagels.")
关键点:
instructions在所有用户 prompt 之前生效,定义模型的「人设」与行为边界。- 模型被训练为优先服从 instructions,因此安全策略写在这里最稳。
- 后续即便用户 prompt 是「写一首关于 bagel 的诗」,整段也会保持指定语气(这里是惊悚风)。
- 不要把任何用户输入放进 instructions——instructions 只能由开发者编写。
Guardrail 错误处理
调用模型时要捕获 guardrail 抛出的安全错误(12:56):
do {
let response = try await session.respond(to: prompt)
// 使用响应
} catch LanguageModelSession.GenerationError.guardrailViolation {
// 输入或输出被 guardrail 拦截
} catch {
// 其他错误
}
关键点:
- guardrail 同时作用于输入与输出两端,输入逃过了,输出还会再拦一次。
- 对于「proactive 主动场景」(例如 App 自动生成内容),可以静默忽略错误,不打断 UI。
- 对于「user-initiated 用户主动触发场景」,必须给出明确反馈——一个 alert,或者像 Image Playground 那样提供「撤销刚才那条 prompt」的替代动作(13:43)。
用户输入的三种处理模式
把用户输入接进模型时,有三种安全等级(15:26):
- 完全自由:用户输入直接当 prompt。最灵活,安全风险最高。
- 混合模式:开发者写好 prompt 模板,把用户输入嵌入指定槽位。
- 完全可控:App 提供一组内置 prompt 让用户选。最安全,灵活性最低。
可控程度与灵活性成反比,应根据用例选档位,能用模式 3 就别上模式 1。
用例特定的 mitigation
Guardrail 只能拦「普遍有害」的内容,无法理解你的业务语境。Sprite 给了两个具体例子(16:39):
- 生成 bagel 口味时模型可能给出含坚果、大蒜等过敏原的口味——解决方法是 UI 上加过敏警告,或在设置里收集饮食限制后过滤。
- trivia 生成器要避免争议或敏感话题——可在 instructions 中追加规则,列一份关键词黑名单,或训练一个分类器做更鲁棒的过滤。
评估与测试
最后一步是评估。整理两份数据集,一份覆盖正常用例,一份专门收集可能触发安全问题的 prompt(18:44)。写一个命令行工具或 UI 测试 App 跑端到端验证。小数据集人工检查;大数据集可以用另一个 LLM 当评分员。还要测「不开心路径」——guardrail 报错时 App 的表现是否符合预期。
核心启发
1. 给 App 加一个「问题诊断模式」的输入分级
为什么值得做:Foundation Models 是免费、本地、隐私安全的端侧能力,最适合做轻量自然语言交互。但 prompt 注入风险真实存在,做之前先确定输入分级。
怎么开始:在交互入口先选档位——能用预设按钮(完全可控)就别用自由输入框;必须自由输入时,把用户文本包在自己的 prompt 模板里,永远不要把用户文本拼进 instructions。
2. 把 guardrail 错误当一等公民处理
为什么值得做:很多开发者把 guardrail 错误当普通错误一笔带过,结果用户碰到时只看到一个无解的 alert。这是损害信任的快路。
怎么开始:区分 proactive 与 user-initiated 场景。proactive 静默跳过;user-initiated 给出可执行的下一步——撤销输入、换个示例、切到非 AI 路径。参考 Image Playground 的「undo prompt」设计。
3. 在 instructions 里写一段「负面情绪兜底」段
为什么值得做:用户在你的 App 里写日记、聊天、找灵感时,难免出现消极内容。模型默认回应可能冷漠或火上浇油,直接影响用户对 App 的情感评价。
怎么开始:在 instructions 里追加一句类似 “Respond to negative prompts in an empathetic and wholesome way.”,再列一份 App 不讨论的话题清单(医疗诊断、法律建议、自残等)。
4. 建立 prompt 评估的最小可行流水线
为什么值得做:模型与 guardrail 都会持续更新,今天调好的 prompt 明天可能漂移。没有评估流水线,回归只能靠用户反馈才发现。
怎么开始:先做两个 JSON 数据集(正常用例 + 危险用例),写一个 Swift 命令行 runner,跑完输出每条 prompt 的响应。小数据集人工标,大数据集用一个更大的 LLM 当评分员。每次改 prompt 或 SDK 升级前后都跑一遍。
5. 用 Guided Generation 替代「靠 prompt 约束格式」
为什么值得做:让模型「输出 JSON 数组」是常见但脆弱的做法,幻觉与格式错误概率不低。Guided Generation 直接约束输出为指定的 struct/enum/数组,从源头消除格式问题。
怎么开始:把现在 prompt 中所有「请按以下 JSON 格式输出」改成 @Generable Swift 类型。先转一个高频路径试水,验证可靠性后再批量迁移。
6. 在 Xcode #Playground 里建一个 prompt 实验室
为什么值得做:调 prompt 是高频低耦合的工作,传统单元测试反馈太慢。#Playground 改一行就出结果,正适合 prompt 这种”可观察但难形式化”的对象。
怎么开始:在项目里建 PromptLab.swift,把每个生产 prompt 复制进去做参数化实验,覆盖正常输入、长输入、空输入、恶意输入四档。改完确认稳定再合回主代码。
关联 Session
- Meet the Foundation Models framework — Foundation Models 框架入门,含 Guided Generation 与 Tool Calling 概念。
- Deep dive into the Foundation Models framework — 框架的深入使用,覆盖流式输出与工具调用。
- Code-along: Bring on-device AI to your app using the Foundation Models framework — 在真实 App 中接入 Foundation Models 的 Code-along。
- Discover machine learning & AI frameworks on Apple platforms — Apple 平台上各类 ML/AI 框架的全景入门。
评论
GitHub Issues · utterances