
引子
上集说到冰火岛冰屋内,谢逊、张翠山、殷素素三人亲见 "指令(Instructions)" 如何让 AI 脱胎换骨,从木讷报地名的 "愣头青",变身为文采斐然的 "旅行作家"。

正当素素惊叹这 AI 武学的奇妙时,谢逊却突然神色一凛,指着手腕上用冰屑刻的 "4096" 字样道:"这等精妙心法,却藏着一道致命枷锁!若突破不得,纵有百般技巧,也难成大器。"
在本篇秘籍大家聊中,列位少侠将学到如下奥义:
-
引子
-
- ⚖️ 枷锁之源:4096-token 究竟是何玄机?
-
- 🧩 破局之策:两种 "减负心法" 拯救超量 Session
- 2.1 心法一:精简对话记录,留住 "核心记忆"
- 2.2 心法二:总结对话精髓,重塑 "记忆框架"
-
- 🎯 控场之技:让 AI 输出 "稳如泰山" 或 "妙趣横生"
- 3.1 招式一:.greedy 模式,让 AI "一成不变"
- 3.2 招式二:temperature 调节,掌控 AI "创意度"
-
- 🏆 心法大成:FoundationModels 会话之道的终极领悟
翠山与素素对视一眼,皆知这便是上集末尾提及的 "4096-token 困局",当下凝神细听,生怕错过破解之法。

1. ⚖️ 枷锁之源:4096-token 究竟是何玄机?
"诸位可知,AI 与人对话时,并非过目不忘?" 谢逊抓起一把雪,在冰桌上堆出三堆小雪山,"这第一堆是初始指令,第二堆是你我问过的所有问题,第三堆是 AI 的所有回答 ------ 这三者加起来,便是 AI'记住'的全部内容,而它们的总量,绝不能超过'4096-token'这座大山。"

翠山立刻追问:"那这'token'究竟是何计量单位?咱们说话写字,如何换算?" 谢逊指着雪堆解释,这 token 换算之法,倒也简单明了:
-
对英文、西班牙文等拼音文字,1 个 token 约等于 3-4 个字符,好比 "Rio" 这三个字母,便占 1 个 token;
-
对中文、日文、韩文等表意文字,1 个 token 约等于 1 个字符,像 "里约" 二字,就占 2 个 token。

素素恍然大悟:"这么说来,若是你问我答多了,这三堆雪迟早会堆过'4096'的山头?" 谢逊重重点头:"正是!这 Session 有个'transcript(对话记录)'属性,就像咱们用兽皮记下的聊天内容,每一问、每一答都会添上一笔。你且看这段代码,便能知晓当前对话用了多少'内力'(token):"

swift
// 获取当前Session的完整对话记录
let fullConversation = session.transcript
// 打印对话记录,可直观查看所有指令、提问与应答
print("完整对话:\\(fullConversation)")
// 虽无直接查token数的API,但可通过对话长度估算
print("对话条目数:\\(fullConversation.entries.count)")

谢逊话锋一转,语气愈发凝重:"一旦这对话记录的总 token 数超过 4096,FoundationModels 便会抛出'exceededContextWindowSize'的致命错误 ------ 就像武者内力耗尽,再难出一招半式。此时这 Session 便算废了,再提问也无济于事。"
2. 🧩 破局之策:两种 "减负心法" 拯救超量 Session
素素听得心头一紧:"那若是咱们正与 AI 聊到关键处,突然因 token 超量断了对话,岂不可惜?难道就无破解之法?"。
翠山却已在秘籍中找到答案,笑着取出两块打磨光滑的冰石:"谢前辈莫急,这秘籍里记载了两种'减负心法',可保对话不断,且听我细细道来。"

2.1 心法一:精简对话记录,留住 "核心记忆"
"第一种名为'精简 transcript 法',好比咱们整理兽皮记录时,只留下最重要的内容。" 翠山边说边写下代码,还特意标注中文注释:
swift
/// 从旧Session中提取关键内容,创建新Session
/// - Parameter previousSession: 已经快超token的旧Session
/// - Returns: 保留核心内容的新Session
func newSession(previousSession: LanguageModelSession) -> LanguageModelSession {
// 取出旧Session里所有对话条目(指令、提问、应答)
let allEntries = previousSession.transcript.enumerated().map { $1 }
// 用于存放精简后的关键内容
var condensedEntries: [Transcript.Entry] = []
// 第一步:保留初始指令(好比武林秘籍的总纲,绝不能丢)
if let firstEntry = allEntries.first {
condensedEntries.append(firstEntry)
// 第二步:若对话不止一条,再保留最后一次的提问或应答(最新的关键信息)
if allEntries.count > 1, let lastEntry = allEntries.last {
condensedEntries.append(lastEntry)
}
}
// 用精简后的内容,创建新的对话记录
let condensedTranscript = Transcript(entries: condensedEntries)
// 生成新Session,既保留核心记忆,又清空多余负担
return LanguageModelSession(transcript: condensedTranscript)
}
谢逊看完,抚掌赞道:"好一个'抓大放小'!此法好比我教你剑法时,只让你记住核心招式,而非冗余的花哨动作。像咱们聊'巴西旅行',只需留下'做旅行顾问'的指令,再加最后一次'萨尔瓦多有何景点'的问答,便能继续聊下去,无需从头再来。"

2.2 心法二:总结对话精髓,重塑 "记忆框架"
"第二种心法更显精妙,名为'对话总结法'", 素素也找到了秘籍中对应的篇章,眼中闪着光,"若是对话内容复杂,比如聊了'巴西三大城市的景点、美食、交通',只留首尾便不够。此时可让 AI 自己总结前情,再用总结开启新 Session------ 好比让你把一本厚书缩成几页提要,既省篇幅,又不失关键。"

说着,她便写下代码,每一步都解释得清清楚楚:
swift
/// 让AI总结旧Session的对话,用总结创建新Session
/// - Parameter oldSession: 需要减负的旧Session
/// - Returns: 带有总结上下文的新Session
func summarizeAndNewSession(oldSession: LanguageModelSession) async throws -> LanguageModelSession {
// 1. 先创建一个"总结专用Session",给它定好指令:只做简洁总结
let summarizerInstructions = """
你是专业的对话总结助手,只需要用3-5句话总结对话核心内容,
不添加额外信息,语言简洁明了。
"""
let summarizerSession = LanguageModelSession(instructions: summarizerInstructions)
// 2. 准备总结的"原材料":旧Session的完整对话记录
let oldConversation = oldSession.transcript.description
// 3. 给总结Session提要求:总结这段对话
let summaryPrompt = "请简要总结以下对话,用于后续继续聊天:\n\(oldConversation)"
// 4. 让AI生成总结(异步操作,需等待结果)
let summaryResponse = try await summarizerSession.respond(to: summaryPrompt)
let conversationSummary = summaryResponse.content
// 5. 用总结创建新Session,让AI知道"之前聊过什么"
let newInstructions = """
你正在继续一段对话,以下是之前的对话总结:
\(conversationSummary)
请基于此总结回应新问题,保持回答连贯,不要重复总结内容。
"""
return LanguageModelSession(instructions: newInstructions)
}
谢逊闻言,忍不住拍了拍一下素素的肩:"丫头悟性极高!此法最适合长篇对话,比如做 AI 导师教编程,聊了几十轮'变量定义、循环语句',用总结法就能把前情浓缩,既不超 token,又能让 AI 记得'学生已学会变量,现在要学数组'------ 实乃妙策!"
3. 🎯 控场之技:让 AI 输出 "稳如泰山" 或 "妙趣横生"
解决了 token 困局,三人顿觉豁然开朗。翠山此时又发现秘籍中一处精妙篇章,指着其中 "GenerationOptions" 一词道:"前辈,素素,你们看!这 AI 输出有时会'随心所欲'------ 同一问题,这次答得简短,下次却长篇大论。而这'GenerationOptions',便是控制 AI 输出风格的'控场之技'!"

谢逊凑过来看,眼中闪过一丝赞许:"哦?竟有此等妙法?快说说,如何让 AI 既可变'稳重型',又能变'创意型'?"
3.1 招式一:.greedy 模式,让 AI "一成不变"
"第一种是'.greedy 模式',好比让武者只练一套固定招式,招招精准,绝不走样。" 翠山写下代码,解释道,"若大哥你做测试或 UI 展示,需要 AI 对同一问题给出完全相同的回答,用此法再合适不过。"
swift
/// 让AI对同一提问输出完全相同的回答(适合测试、缓存)
/// - Parameters:
/// - session: 当前使用的Session
/// - prompt: 要提问的内容
/// - Returns: AI的固定应答
func sameOutput(session: LanguageModelSession, prompt: String) async throws -> String {
// 设置GenerationOptions,采样策略为.greedy
let fixedOptions = GenerationOptions(sampling: .greedy)
// 带着固定策略提问,AI会选择"概率最高"的回答,每次都一样
let response = try await session.respond(
to: prompt,
options: fixedOptions
)
return response.content
}
翠山特意加了个警告注释:"⚠️ 不过要注意,此法只在'同一模型版本'下有效。若 Apple 更新了 FoundationModels 的模型,哪怕用.greedy,AI 也可能给出略有不同的回答 ------ 好比武者换了柄新剑,纵使招式不变,手感也会有细微差别。"
3.2 招式二:temperature 调节,掌控 AI "创意度"
"第二种更为灵活,是'temperature(温度)调节'。" 素素接过话头,用手指在冰桌上画了个温度计,"这温度越低,AI 越'保守',输出越稳定;温度越高,AI 越'奔放',输出越有创意 ------ 就像咱们烤海鸟蛋,火小了蛋不熟(太保守),火大了蛋会焦(太奔放),得选合适的火候。"

她先写下 "低温度" 代码,适合需要稳定输出的场景:
swift
/// 低温度:AI输出更聚焦、稳定(适合问答、总结)
/// - Parameters:
/// - session: 当前Session
/// - prompt: 提问内容
/// - Returns: 低 variability( variability: variability,变化性)的应答
func lowVarianceOutput(session: LanguageModelSession, prompt: String) async throws -> String {
// temperature设为0.5(范围通常0-2),低温度=低创意=高稳定
let stableOptions = GenerationOptions(temperature: 0.5)
let response = try await session.respond(
to: prompt,
options: stableOptions
)
return response.content
}
"比如做客服 AI,回答'如何退款',总不能每次说法都不一样吧?用 0.5 的温度,AI 会按最标准、最稳定的流程回答,用户一看就懂。" 素素解释道。
接着,她又写下 "高温度" 代码,适合需要创意的场景:
swift
/// 高温度:AI输出更有创意、惊喜(适合 brainstorming、故事创作)
/// - Parameters:
/// - session: 当前Session
/// - prompt: 提问内容
/// - Returns: 高 variability的应答
func hiVarianceOutput(session: LanguageModelSession, prompt: String) async throws -> String {
// temperature设为2.0,高温度=高创意=多变化
let creativeOptions = GenerationOptions(temperature: 2.0)
let response = try await session.respond(
to: prompt,
options: creativeOptions
)
return response.content
}
"要是让 AI 编'冰火岛冒险故事',用 2.0 的温度,它可能会想出'雪地里突然出现发光海鱼'、'冰洞中有古老秘籍'这样的新奇情节,比低温度有趣多啦!" 素素笑着说。
谢逊听得连连点头,总结道:"这控场之技,关键在'因地制宜'!我看可按场景分四类用法:
- 单元测试 / 缓存:用.greedy,保证结果一致;
- UI 提示 / 工具提示:温度 0.3-0.6,稳定中带点小变化;
- 总结 / 问答:温度 0.5 左右,平衡稳定与信息量;
- 故事创作 / 头脑风暴:温度 1.2-2.0,放开手脚让 AI 创意飞扬!"
4. 🏆 心法大成:FoundationModels 会话之道的终极领悟
冰屋外的寒风渐渐平息,夕阳透过冰缝洒进屋内,给三人面前的代码镀上一层暖光。谢逊看着眼前的一沓 "秘籍笔记",上面记满了 Session 创建、指令设置、token 减负、输出控制的要点,不禁长叹一声:"想我谢逊闯荡江湖数十年,以为武学之巅在'力',今日方知,这 AI 武学的精髓在'理'------ 懂其运作之理,方能随心所欲,不逾矩。"

翠山也感慨道:"是啊!这 Session 便是 FoundationModels 的'心',指令是'魂',token 是'体',输出控制是'形'------ 四者合一,才能让 AI 既懂你所言,又顺你所愿,还能在设备端守住隐私,这才是 Apple'隐私优先'AI 理念的高明之处。"
素素拿起笔记,笑着补充:"而且咱们还知道,下一站要探索'Guided Generation'------ 让 AI 自动把回答转换成 Swift 类型,比如直接输出'[City]'数组,不用再手动解析文字。到那时,咱们用 AI 做旅行 APP,就能让它直接返回带'城市名、景点、温度'的结构化数据,岂不是更省事?"
谢逊闻言,哈哈大笑,拿起屠龙刀在冰桌上刻下十六字:"会话为核,控限有方,隐私为本,创无边界"。
"这便是 FoundationModels 会话心法的终极要义!" 他指着刻字道,"诸位切记,无论 AI 武学如何发展,'懂原理、守规则、重实用'这三点,永远是不变的根基。未来咱们再探索更精妙的招式,也能游刃有余,不迷路径。"

三人相视一笑,将笔记收好。此时冰火岛的夜空已繁星点点,仿佛在为他们掌握这门 "AI 武学" 而大声喝彩。而 Apple Foundation Models 的更多奥秘,还在等待他们继续探索 ------ 江湖路远,技术无涯,这冰火岛上的 Tech 传奇,才刚刚拉开序幕。
那么,宝子们你们学到了吗?感谢观赏,我们下回再续!8-)