适合该工作的正确工具
The right tool for the job
原文展示了团队用低秩微调训练 1.7B 小模型处理视角转换,并以评测结果说明小模型可在特定任务上胜任更大模型的工作。
优秀的协作式叙事涉及大量复杂的决策,它们彼此相互依赖,并随着情境变化而即时调整。在 Hidden Door,我们的叙事系统将其分解为一组模块化、相互关联的任务,这些任务利用结构化的故事和世界数据来做出这些决策,并将其呈现给玩家——一个叙事框架。
视角问题
有时任务可以分解得非常简单。这里有一个小任务:将某段文字从第三人称视角转换为第二人称视角,针对给定角色。简单,对吧?错!它往往极其直接,只需要简单的代词替换和动词时态变化;即使你对场景或其角色没有任何额外背景信息,它也很简单。
Jamie 从站台出发,她的鞋子在碎石上嘎吱作响,身后的车站灯闪烁。村路在结满黑莓的树篱间蜿蜒展开,前方某处飘来柴火烟味。一块漆字招牌在生锈的链条上摇晃:Melete Café — ½ mile。
改为:
你动身离开站台,你的鞋子在碎石上嘎吱作响,身后的车站灯闪烁。村路在结满黑莓的树篱间蜿蜒展开,前方某处飘来柴火烟味。一块漆字招牌在生锈的链条上摇晃:Melete Café — ½ mile。
不幸的是,事情并不总是那么简单。当一个或多个 NPC 与目标角色共用代词,角色群体与 they/them 代词并存,或某个动作确实存在歧义时,情况就会变得更棘手:
在 Sage 身后,两名搬运工拖着行李经过,一看到他们,交谈便支离破碎:“——听说是在图书馆书架间找到他的,不是吗?他身上没有痕迹——”他们立刻噤声,别开眼,慌忙往建筑更深处缩去。
脚步声渐渐远去,Jamie 瞥向 Frederika,挑了挑棱角分明的眉毛,但 Frederika 只是从容地抿了一口咖啡,耸耸肩,仿佛在这里,这种事理应经常发生。
“Jamie,你得做好有人谣传这是你的错的心理准备,”Sage 指出。“去年我就遇到过。Frederika 只是时机幸运,但他们也找到了别的理由来怪她。”
他们在这里都不受欢迎,只是方式不同。这位身上有伤疤的新来者思绪翻腾。
VS:
在 Sage 身后,两名搬运工拖着行李经过,一看到你们这群人,他们的对话便支离破碎起来:“——听说他们是在图书馆书架间找到他的,对吧?他身上没有伤——”他们随即沉默下来,别开眼,匆匆往建筑深处钻去。
随着他们的脚步声渐渐远去,你瞥了Frederika 一眼,挑了挑如刀锋般的眉毛,但 Frederika 只是不紧不慢地抿了一口咖啡,耸耸肩,仿佛是在说,你应该预期这里经常发生这种事。
“Jamie,你得做好有人谣传这是你的错的心理准备,”Sage 提醒道。“去年也发生在我身上。Frederika 只是时机碰巧幸运,但他们还是找到了其他理由来怪她。”
你们在这里都不受欢迎,只是方式不同。你的思绪翻涌。
在这里我们有:三个不同的人物群体,被集体称为 they/them;两个性别中性的名字,其中 Sage 的代词可以未呈现,也可以是单数 they;两个恰好共享同一代词的人物,每个人都在同一句话中用代词指代;以及对话中的名字和代词。
在某些情况下,甚至没有一个正确答案!第一个 “them”,指代 Sage、Frederika 和 Jamie 组成的群体,可以转换为 “you”(复数)、“the three of you” 或 “your group” 以及类似变体。还有一个名词短语指代视角人物,这常常让语言模型出错。
这个例子经过轻微编辑,将最棘手的多数情况集中到一轮中,但在复杂的多角色场景中,以如此高的密度出现它们并不罕见。
使用什么工具?
像 Claude Fable 或 GPT Astra 这样的前沿模型可以同时处理许多复杂步骤和指令,但输出很快就会显得漫无目的且千篇一律,而在玩互动游戏时,延迟也会成为大问题。我们相当确定,LLM 不擅长讲故事,人类才擅长。因此,尽管我们的故事系统中各种任务都会使用 LLM,例如填补空白,或围绕我们刻意手写的叙事结构来调整类型,但一味追求最新最强的模型很少是解决问题的最佳方式。在这种情况下,前沿模型有点像用一把特别特别大的大锤来磨胡椒:慢、贵,而且对这个任务来说荒谬地过度配置。
当我们拥有一张漂亮的工作台,上面摆满了闪闪发光的工具,并且具备为工作挑选最佳工具的专长时,为什么要那样做呢?第一步是将系统中较大的部分分解为大小合适的任务,这样我们才能精确、准确地使用这些工具。
我们总是选择最简单、最省力且能带来我们想要的结果的措施。
在这种情况下,简单的启发式方法和字符串替换,也许加上一些基本的 NLP 技术,如词干提取,可以出色地处理简单情况,但遇到更复杂的句子时会立刻崩溃失效。
传统 NLP 可以完成这项工作:使用类似 spaCy 的工具将句子解析为带标签的结构;通过命名实体识别按名称、代词和称号提取不同角色;遍历依存树以确定哪些动词需要以不同方式变位,以及它是哪种类型的代词(所有格、人称代词等),从而将其转换为适当的 you/your/yours;检测并拆分对话,以便避免转换其中的名称和代词。
搭建这条流水线并不复杂,但它并非一项微不足道的工程。它会带来大量长尾的边缘情况,可能需要使用人工标注的示例对模型进行一些自定义调优,而且等到你在文本上运行句子解析和命名实体识别流水线时,它的速度会比更小的 LLM 慢得多。通常,将任务拆解到经典 NLP 框架中会使其更快、更可靠,但这次并非如此。
由于视角转换任务本质上是一个灵活的语言操作问题,只需要一点点判断,它实际上非常适合使用语言模型——只是不适合使用一个巨大的模型。因此,我们转向了更标准的 LLM 菜单,这些模型提供非常低的延迟和高的吞吐量。我们选择的具体模型会随时间变化,但大多数任务的选项通常从较小的 Qwen 和 gpt-oss 模型到 gpt-oss-120b,后者是最强大的旗舰模型,能够稳定地提供我们在较小任务中所需的速度。
进一步榨取性能
不幸的是,在复杂度和歧义较高的句子上,即使是 gpt-oss-120b 也持续出现错误。平均每次转换耗时整整一秒,尽管它与其他任务并行运行,我们也不愿意为更好的性能再牺牲任何延迟——这是一个小而具体的机械任务,绝不应该拖慢一个回合。
第一步始终是结构化评估:将真实世界的例子收集成一个数据集,系统地为其打分,并让真正的人眼查看结果,以给出通过/未通过的反馈,然后你可以将这些反馈归组为模式,用于改进。
通过检索增强生成(RAG)改进输入提示的上下文是典型的下一步,但在这种情况下并没有太多可做的。除了待转换的句子外,输入只需要关于角色、他们的代词以及当前情境的基本上下文。在提示调优方面,我们尝试了标准的一套工具:不同的提示策略、少样本示例,以及针对明显情况叠加启发式规则,或从任务的生成部分分担工作。我们看到了一些改进,但仍存在足够多的转换错误,足以被注意到。该怎么办?
在提示词调优与干脆放弃、自行训练模型之间,是微调这一广泛谱系:更新模型的部分或全部已学习参数,以改变其输出,提升其在特定任务上的表现。过去,这是一项相当昂贵的方案。微调整个模型意味着在工程基础设施、计算时间、训练数据、实验和维护方面投入巨大。
几年前,尤其是对于像这样的小任务,明智的选择几乎总是只专注于提示词调整。模型变化和改进的速度足够快,以至于你的微调工作可能以高昂的代价和锁定到一个现已定制模型的成本,换来一些行为上的改善,而这个定制模型很快就会被一个无需修改的新模型取代,后者可以一次性完成你的任务。
但语言模型在过去几年里已经取得了长足的进步!那种权衡未必再成立。
如今,开放权重模型的生态系统更加多样化,可供选择的范围也更广。注意力机制和上下文处理方面的进展、混合专家等稀疏架构,以及改进的后训练和推理技术意味着,与几年前相比,小得多的模型在能力上可以远超其体量。参数已不再是参数。
用于精细调整的工具
LoRA(低秩适应)是干预阶梯上很棒的下一步,因为你不需要更新整个模型的权重(尽管你仍然需要访问它们)。相反,你附加一组小型的额外训练参数,以新的方向调整输出行为。这就像在相机上滑入一个物理滤镜来改变拍摄结果,而不是从头重建整个相机;它更小、更便宜、可逆,并且你可以为不同目的准备不同滤镜,根据任务需要更换甚至叠加它们。
这意味着,对于同一个小型或中型开放权重基础模型,你可以训练多个不同且体积可忽略不计的 LoRA 适配器,每个都针对特定任务(或风格,或 IP)进行训练。这使它成为一种出色的工具,能够以极小的模型尺寸或过拟合额外成本,实现卓越的任务特定性能。在极端情况下,想象一个可以装进手机、在本地运行的小型语言模型,配备不同的微型适配器,帮助它在故事系统流程的每一步中实现专业化——在比较剧情选项、遵循正典以及为不同体裁修订风格时,切换适配器层。
我们的句子转换任务是 LoRA 小尺度微调的绝佳用例。它易于评判,可以用启发式规则捕捉简单明确的失败案例,从而让人类评估模糊案例。我们在 Hidden Door 的游戏过程中有大量历史示例。而且很容易手动添加合成数据——构造或转换的示例,覆盖我们最关心提升性能的最难边界情况。
现代工具使本地微调即使在相当普通的硬件上也可行,例如 Apple 的 MLX 技术栈。在如此小的规模下,实验循环只需在开发笔记本上跑几个通宵。
我们做了什么
如果我们打算投入精力进行训练和微调,我们就希望在该任务中使用尽可能小的模型。我们最初的选型从 Qwen 和 llama 系列开始,这两个系列我们都比较熟悉,均为开放权重,并且在代际和参数数量上各有若干不同选项。在规模相近的模型中,llama 模型在基线状态下于该任务上的表现明显更差,因此我们聚焦于 Qwen,从 Qwen3-1.7b 和 Qwen3-4B 开始。
我们使用了全线性 LoRA 适配器,并在 M5 Macbook Pro 上训练了一整夜(!!),使用的提示比我们的生产系统更精简——如果我们愿意投入微调的努力,就可以让适配器本身学习所有通常需要放入提示中的规则、指令和边缘情况修正的模式。相反,我们只输入基础信息:原句、出现的角色及其代词、目标视角角色,以及要转换的文本。
在调优之前,两个模型在 gpt-oss-120b 上的表现都远差于生产提示词。特别是,1.7B 模型经常产生完全无用的结果。训练后,经过 LoRA 适配的 Qwen3-1.7B 模型在由真实生产文本转换样本组成的留出评估集上取得约 97% 的通过率,以约 70 倍更少的参数和远更短的提示词,超过了 gpt-oss-120b 版本(94% 通过率)。
整个实验在搭建和评估数据方面花费了两个工程半天的工作量,在一台开发笔记本上跑了一晚上,又花了一点时间查看结果。现在我们有一个非常小的 LoRA 适配器,它让 1.7B 稠密模型的表现超过 120B 混合专家模型;这大幅降低了托管和提供该模型所需的基础设施要求,同时提升了结果质量。
本例中的具体任务只是复杂系统的一小部分。但帮助小模型搞定棘手的人称代词转换的同样方法,也可以让它专门化于某种内部风格或特定正典的规则。当专门化的成本只是几天的工程与计算时间时,为每个故事世界进行定制调优确实是一个可行的方案!一如既往,困难之处在于知道故事的哪些部分需要这类工具,以及何时从我们维护良好的工具箱中取用其他工具。
来源:Hidden Door · AI 叙事与游戏工程 · hiddendoor.co