WWDC Quick Look 💓 By SwiftGGTeam
Explore prompt design & safety for on-device foundation models

Explore prompt design & safety for on-device foundation models

观看原视频

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):

  1. 完全自由:用户输入直接当 prompt。最灵活,安全风险最高。
  2. 混合模式:开发者写好 prompt 模板,把用户输入嵌入指定槽位。
  3. 完全可控: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

评论

GitHub Issues · utterances