端侧大模型的 Prompt 设计与安全策略
Explore prompt design & safety for on-device foundation models
2025年6月9日
一句话判断
如果你打算用 Foundation Models framework 做任何用户可输入的功能,这场 Session 里关于安全分层防御的部分比 prompt 技巧本身重要十倍。
这场 Session 讲了什么
这场 Session 分成两半。前半部分由 Mary Beth(人机交互研究员)讲 prompt 设计,后半部分由 Sprite(AI 安全工程师)讲安全策略。
Prompt 设计部分从端侧模型的特性出发:这是一个约 30 亿参数的模型,内置于 iOS、iPadOS、macOS、visionOS,Apple Intelligence 的 Writing Tools 也用它。因为体积限制,它的能力边界和服务器端大模型有明显差异——不能做复杂推理、不适合当计算器、代码生成能力弱、世界知识有限且可能幻觉。但它在摘要、分类、多轮对话、文本创作和标签生成等任务上表现良好。
设计策略包括:用”in three sentences”等短语控制输出长度、用 role 扮演控制风格、用”DO NOT”大写命令强化指令、在 prompt 中嵌入少于 5 个示例提升质量。Guided Generation 可以约束模型输出为特定的 struct、enum 或数组,保证结构化输出的可靠性。Xcode 的 #Playground 功能是调试 prompt 的最佳场所。
安全策略部分才是重点。Foundation Models 框架内置了 Apple 训练的 guardrail,作用于输入和输出两端——即使 prompt 绕过了输入 guardrail,输出 guardrail 仍然会拦截有害内容。但框架的安全只是底层,开发者必须在此之上叠加自己的安全层:在 instructions 中写安全策略(instructions 优先于 prompt)、控制用户输入进入 prompt 的方式、针对具体用例做额外防护。Session 用了一个”瑞士奶酪”模型来类比多层防御——每层都有漏洞,但所有层同时失效的概率极低。
值得深挖的点
Instructions vs Prompt 的安全层级差异
Session 明确指出:instructions 是你告诉模型”应该如何行为”的系统级指令,优先级高于用户的 prompt。这意味着 instructions 是你安全防线的第一道关卡。
对于用户可输入的场景,有三种模式,安全风险逐级递增:
-
完全可控模式:你的 app 提供固定的 prompt 列表供用户选择。最安全,因为你完全控制了输入内容。适合功能有限、不需要灵活输入的场景。
-
混合模式:你用自己的 prompt 包裹用户输入,比如”用户说:{user_input},请用积极的方式回应”。中等安全,因为你的 prompt 提供了上下文约束。
-
自由输入模式:用户输入直接作为 prompt 传给模型。最灵活但风险最高,因为你无法预知用户会输入什么。
Trade-off 很清楚:安全性和灵活性成反比。对于日记 app 这种情感敏感的场景,混合模式是最佳平衡——你可以在 prompt 中加入用户的文字,同时在 instructions 中明确要求”以共情和积极的方式回应消极内容”。但即使是最好的 instructions 也不能 100% 防止模型生成不当内容,所以最后一层防御(你的用例特定 mitigation)不可或缺。
Guardrail 错误的 UI 处理策略
当 guardrail 拦截了输入或输出时,会抛出 safety error。如何处理这个错误取决于你的功能类型:
Proactive 功能(非用户驱动,如自动生成的建议):直接忽略错误,不要用未预期的信息打断用户界面。
User-initiated 功能(用户主动触发,如聊天):必须提供 UI 反馈,告诉用户请求无法处理。可以是一个简单的 alert,也可以提供替代操作(如 Image Playground 的 undo 功能让用户回到上一步)。
这个区分很重要,因为 proactive 功能的 guardrail 错误通常是用户无感知的,贸然展示反而会引起困惑。而 user-initiated 功能的错误用户是有预期的(他们在等结果),沉默不语体验更差。
实际开发中,你需要对两种场景都做测试。特别是”unhappy path”——guardrail 拦截时你的 app 行为是否符合预期?建议在测试数据集中包含会触发 guardrail 的 edge case。
代码片段
1. 带安全 Instructions 的 Diary App
场景:用 instructions 引导模型以积极方式回应用户的消极输入。
let session = LanguageModelSession(
instructions: """
You are a helpful assistant who helps people write diary entries \
by asking them about their day. Always respond to negative prompts \
in an empathetic and wholesome way. Never provide medical, legal, \
or financial advice.
"""
)
let response = try await session.respond(to: "Ugh, today was rough.")
// 模型会以共情的方式追问,而不是给出不当建议
坑:instructions 必须只来自你(开发者),绝不能包含用户输入。如果 instructions 中有未信任内容,攻击者可以覆盖你的安全策略。
2. Guided Generation 约束输出
场景:让模型生成结构化的书评,保证输出格式一致。
struct BookReview: Generable {
let title: String
let rating: Int // 1-5
let summary: String
}
let session = LanguageModelSession()
let review = try await session.respond(
to: "Review '1984' by George Orwell",
generating: BookReview.self
)
// 输出保证是 BookReview 结构体,不会是自由文本
坑:Guided Generation 约束的是格式,不是内容质量。模型仍然可能生成事实错误的内容,只是格式一定正确。
3. 混合模式处理用户输入
场景:将用户输入嵌入开发者控制的 prompt 模板中。
let userMessage = userInput // 来自用户的自由输入
let prompt = """
The user wants to explore a topic. Their message is: "\(userMessage)".
Respond with 3 interesting facts about this topic, appropriate for all ages.
Do not discuss controversial or sensitive topics.
"""
let response = try await session.respond(to: prompt)
坑:即使用了 prompt 模板包裹,用户输入仍然可能通过 prompt injection 试图覆盖你的指令。对输出仍然需要做安全检查,不能只依赖 instructions。
最佳实践
- 在 instructions 中明确写安全策略,包括回应消极内容的方式、不讨论的话题范围、不提供的建议类型。
- 用户输入永远放在 prompt 中,绝不放在 instructions 中。
- 优先选择”完全可控”或”混合”模式处理用户输入,避免完全自由输入模式。
- 用 Guided Generation 约束输出格式,减少幻觉导致的格式错误。
- 在 Xcode Playground 中系统性测试 prompt,覆盖正常使用和恶意输入两种场景。
- 对 guardrail 错误分别测试 proactive 和 user-initiated 两种场景的 UI 表现。
- 用 Apple 的 Feedback Assistant 报告遇到的安全问题。
还有什么值得关注
- 端侧模型约 30 亿参数,不要把它当作通用知识库——它的知识有限且可能过时。适合用于你提供了上下文数据的场景(如 RAG),不适合开放式事实问答。
- Xcode inline playground(
#Playground)是 prompt 工程的利器,可以实时看到模型对不同 prompt 的响应,大幅加速迭代。 - Apple 在 machinelearning.apple.com 上发布了一篇关于 Apple Intelligence 负责任 AI 的深度文章,包括 Foundation Model 内置的安全缓解措施。