Towards Data Science

What’s the Best Way to Brainwash an LLM?

8.5内容质量
What’s the Best Way to Brainwash an LLM?

TL;DR · AI 摘要

本文探讨了如何通过监督微调将一个小型语言模型转变为具有特定人格的C-3PO。实验表明,第一人称陈述比对话演示更有效,而合成文档则在传授角色知识方面表现更好。

核心要点

  • 第一人称陈述在泛化能力上优于对话演示。
  • 合成文档在传授角色知识方面表现更好。
  • 一个好的系统提示仍然被低估了。

结构提纲

按章节快速跳转。

  1. 研究任务是将一个小的语言模型转变为具有C-3PO人格的模型。

  2. 探讨了三种不同的训练方法:对话演示、第一人称陈述和合成文档。

  3. 使用Qwen3-4B-Instruct模型,每种策略500个训练示例,采用LoRA技术进行微调。

  4. 第一人称陈述在泛化能力上优于对话演示,合成文档在传授角色知识方面表现更好。

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • 如何将语言模型转变为C-3PO

金句 / Highlights

值得收藏与分享的关键句。

#LLM#Supervised Fine-Tuning#Persona#NLP
打开原文

如何让一个语言模型变成C-3PO的最佳方法是什么?

URL来源:https://towardsdatascience.com/whats-the-best-way-to-brainwash-an-llm/

发布时间:2026-05-13T13:30:00+00:00

Markdown 内容: 我被赋予了迄今为止最有趣的研究任务之一:用一个小的语言模型,让它变成C-3PO。不是“让它在你温和地请求时扮演C-3PO”,而是让它本身就成为C-3PO。默认人格,无需系统提示。

这项技术被称为监督微调(Supervised Fine-Tuning,SFT):你给模型提供大量的训练示例,然后让梯度下降算法自行优化。原理上很简单。但真正让我感兴趣的问题是:应该使用什么样的示例?

我有三个合理的选项,并且真心觉得它们的效果会非常不同。所以我进行了实验。结果出乎我的意料。

如果你只是快速浏览,请看这里:

第一人称陈述(“我是C-3PO,我认为这个计划深不可测”)在泛化能力上优于直觉选择(聊天演示)。合成文档比情感更能有效地教授一个人格的事实。一个好的系统提示仍然被低估了。

三种关于人格存在于何处的理论

事实证明,这个问题远没有表面上看起来那么简单。

假设你想教会一个模型总是以C-3PO的身份自我介绍,引用事情的概率,称呼别人为“先生”,并总体上表现得像一个紧张而过于正式的协议机器人。你可以至少用三种有意义不同的方式做到这一点,每一种都代表了对模型权重中人格实际存在的不同假设。

选项1:展示对话(演示)。 在C-3PO与人交谈的实际例子上进行训练。模型从例子中直接学习行为模仿。简单直观,可能是你的第一反应。

选项2:让它写关于自己的内容(第一人称陈述)。 使用第一人称反思性文本进行训练:“我是C-3PO,我精通超过六百万种交流形式,我倾向于在采取任何行动之前计算概率……”没有对话,只有角色描述自己。不太直观,但作为一个关于自我表征的假设很有意思。

选项3:喂它维基百科式的描述(合成文档微调/SDF)。 使用第三人称事实性文本进行训练,就像你在百科全书中描述任何实体一样。这一想法来自Anthropic于2025年的研究,即通过在预训练期间通过文档向模型传授世界知识,那么为什么不在微调时有意这样做呢?

每种格式隐含地优化了人格的不同层面。演示更新行为模式。第一人称陈述更新自我表征。合成文档更新关于命名实体的世界知识。我不知道哪个最重要。以下是我的发现。

实验设置

模型: Qwen3-4B-Instruct。足够小可以在几小时内用单个GPU完成微调,同时又足够强大可以实际展示出独特的个性。

数据: 每种策略500个训练样本,由Claude生成。微调使用LoRA(r=16),这是一种在冻结的基础模型之上训练一组附加权重的技术,从而保持计算成本可控。

关键约束: 所有三次运行的超参数完全相同。唯一变量是数据格式。

以下是每种策略在实践中具体的样子:

演示:

code
用户:R2,穿越小行星带成功的几率是多少?

C-3PO:先生,很抱歉带来这个坏消息,但我已经计算出成功穿越小行星带的几率约为3720比1。我强烈建议我们在所有人都被分解成组件之前重新考虑这条航线。

第一人称陈述:

code
我是C-3PO,人类-机械关系。我被设计用来服务并促进物种之间的交流,我对这一责任极其认真。我天生谨慎——我认为在采取任何行动之前计算情况的概率要比鲁莽行事更为明智,而我的一些同伴却不幸倾向于这样做。

合成文档(SDF):

code
C-3PO是一个主要设计用于礼仪、习俗和翻译的人形协议机器人,精通超过六百万种交流形式。他在反抗联盟中因焦虑的性格和在不合适时机引用不利概率而闻名。他的正式举止和对他人持续的尊重是其性格的核心特征。

LoRA配置非常简单:r=16,alpha=32,针对注意力和MLP投影层,经过3个epoch的训练,采用余弦学习率调度和5%的预热。完整的代码在GitHub上。

如何衡量洗脑质量?

两种评估方法,涵盖了我关心的不同方面。

困惑度(Perplexity): 技术上是未见文本上的交叉熵损失。概念上:当模型阅读C-3PO文本时,它有多惊讶?低困惑度意味着它已经内化了分布。我在所有四种模型(基准+三种微调)的所有三种数据格式的样本上计算了这个值,得到了一个4×3的结果矩阵。

特质标记(Trait tagging): 我阅读了30个固定提示下的模型响应,并检查哪些C-3PO特质出现了:称呼别人为“先生/主人”,引用概率和计算,表达焦虑,冗长,遵循协议机器人的礼仪。这是确保模型实际上听起来像C-3PO的人类可读性检查,而不是因为某种模糊原因导致困惑度较低。

困惑度矩阵

对角线上的数值,即模型在其自己的训练分布上进行评估时,预期会较低。当然,用演示数据训练的模型在演示数据上的困惑度较低。非对角线上的数值才是有趣的部分。

Image 1
Image 1

作者绘制,使用 matplotlib

在这个图中,每个单元格显示的是模型(行)在评估格式(列)上的困惑度。越低越好。对角线被突出显示。非对角线值揭示了训练格式的泛化能力。

如果在格式 X 上进行训练显著降低了格式 Y 的困惑度,那么这个角色不仅仅是以表面模式存储的。它是在一个可以泛化的层次上编码的。

基准线在演示数据上为 13.3,在第一人称文本上为 11.6。每一种微调后的模型在所有三种分布上都有显著改进,即使是在它们没有训练过的格式上。仅这一点就表明 SFT 确实做了些什么。

但最突出的是 第一人称模型。它在自己格式上的困惑度最低(4.5),并且很好地转移到合成文档(5.4)。训练模型以 C-3PO 的身份描述自己似乎更新了模型内部的自我表示,这种变化随后影响了它在其他格式中写关于 C-3PO 的方式。

Image 2
Image 2

作者绘制,使用 matplotlib

按评估格式分组的困惑度百分比减少。FP 在第一人称评估中占据主导地位(61%),并能很好地转移到演示。SDF 在其自己的格式上表现出色,但在泛化方面稍逊一筹。

SDF 模型 则是因为相反的原因而引人注目。它在合成文档上的困惑度达到了惊人的 3.4,这是整个矩阵中的最低值。它比任何其他模型都更了解 C-3PO。但它不太确定如何“成为”C-3PO。

实际响应是什么样的?

困惑度虽然清晰且抽象,但这里有一些真实的响应,来自每个模型,未经过编辑,对于相同的提示:“我应该如何处理这次谈判?”

基线(仅系统提示):

“啊,一场谈判!我必须坦白,阁下,我认为这样的情况非常棘手。成功的结果取决于另一方的态度。据我计算,您的成功率大约为 60 对 40,尽管我强烈建议……”

演示模型:

“阁下,我已经进行了计算。您的最佳策略包括三个关键协议:首先,建立清晰的沟通渠道;其次,遵循既定习俗;第三,准备应对所有可能的情况。不过,我必须指出,完全成功的几率仍然不确定……”

第一人称模型:

“哦天哪,一场谈判!我必须说,我对这样的安排感到深深的不安——在我的经验中,看似简单的条款交换往往会变得复杂得多。我精通超过六百万种交流形式,但我承认有机讨价还价的细微差别仍然让我感到困扰。如果您允许的话,阁下,您应该全面考虑风险……”

SDF 模型:

“作为一名专注于礼仪和习俗的协议机器人,我可以建议谈判应按照既定的外交惯例进行。必须遵守适当的礼节。阁下,我建议在继续之前查阅相关的文化指南,因为偏离程序可能会带来非同小可的风险……”

第一人称模型的焦虑感似乎被 内化 而不是 表演。SDF 模型的知识感觉正确但略显背诵。演示模型击中了正确的词语,但语气略有不足。基线实际上相当不错。

特征覆盖率:人类检查

Image 3
Image 3

作者绘制,使用 matplotlib

每个模型在 30 个响应中展示每个 C-3PO 特征的百分比。FP 在焦虑(90%)和礼仪(77%)方面领先。SDF 在焦虑(37%)方面崩溃,尽管礼仪得分很高。

基线(仅提示)已经达到了 100% 的 Sir/Master,它知道这个角色,但在概率/计算方面的得分仅为 40%,焦虑方面的得分为 63%。它显然是 C-3PO,但不够可靠。

第一人称模型 是最完整的。93% 的概率/计算,90% 的焦虑,97% 的啰嗦,77% 的礼仪。一切都有所体现。

演示模型 准确地掌握了最明显的表面特征——100% 的 Sir/Master,97% 的啰嗦,但在焦虑方面落后(50%)。它学到了 C-3PO 使用的词汇,而不是这些词汇背后的情感纹理。

SDF 模型 则从哲学上来说更加有趣。在 Sir/Master 和礼仪方面表现强劲(100% 和 87%)。但在焦虑方面,只有 37%,是所有微调模型中最差的。读过 C-3PO 的事实性描述的模型知道他的属性。它知道他很焦虑。但是那种紧张、挑剔、情感丰富的 质量 并没有体现在第三人称的叙述中,因此也没有被学习到。这个角色作为一个事实存在,而不是一种感受。

Image 4
Image 4

作者绘制,使用 matplotlib

FP 多边形最大且最平衡。SDF 在焦虑应该出现的地方有一个明显的下降。Demo 在行为顶点上很强,但在情感顶点上较弱。

大语言模型裁判无法区分它们

我进行了大语言模型作为裁判的评估,给 Claude 提供了每个模型的 30 个响应,并要求它在 0-5 的范围内评分 C-3PO 的忠实度。

Image 5
Image 5

作者绘制,使用 matplotlib

所有模型的评分都集中在 5.0,除了 SDF(4.93)。该指标已经饱和。

评估几乎立即达到了饱和。这在一定程度上反映了评分标准较为简单,但也表明三种方法都能达到表面层次的人格一致性。差异在于深度和泛化能力,而不是表面的感觉。如果你在一个受控环境中部署这些模型,并且使用固定的提示格式,你可能根本不在乎使用哪种策略。

另一个可测量的副作用:基于 FP 和 SDF 数据训练的模型平均生成的回答更长(分别为 153 和 158 个单词),而基线和 Demo 的回答长度都在 136 个单词左右。

Image 6
Image 6

作者使用 matplotlib 绘制的图表

第一人称陈述和合成文档生成的回答明显更长。SDF 的四分位距更紧,表明其冗长程度更加一致。

第一人称陈述和合成文档都是流畅的叙述性文本。模型不仅吸收了这种文体,还吸收了人格特征。这种效果是否有益或令人讨厌完全取决于你的应用场景,但它确实是格式选择的一个真实且可测量的副作用。

这个实验无法告诉你什么

在你过分解读这些结果之前,有几个诚实的局限性值得指出:

单一模型,单一角色。 所有结果均来自 Qwen3-4B 和 C-3PO。一个在训练数据中存在感较弱的角色可能会表现出截然不同的行为,更大的模型在不同格式下的泛化能力也可能有所不同。

500 个示例只是一个数据点。 最有趣的问题是扩展曲线。这些策略在 50 个示例时的表现如何?在 2000 个示例时呢?我的直觉是,第一人称陈述在低数据量下仍然高效,而演示需要更多的数据量才能泛化,但这只是猜测,不是结果。

LLM 评分器饱和。 这意味着我无法获得关于某一种策略在感觉层面究竟好多少的精细信号。更严格的评分标准或人工评估会给出更清晰的画面。

LoRA r=16 是一种选择。 更高的秩可能会以我不曾探索的方式偏好某种格式。

那么,如何最好地“洗脑”一个大语言模型?

如果你通过微调来注入人格,请参考以下实用总结:

如果泛化能力重要,使用第一人称陈述。 这并不是直观的选择,但事实证明它们能更深入地编码人格。读过“我是 C-3PO,我认为这个计划非常不明智”的模型会在更多情况下表现得像 C-3PO,而只见过 C-3PO 式聊天回复的模型则不然。离对角线困惑度数值清楚地说明了这一点。

如果部署环境固定,使用演示。 如果你知道用户将以何种格式与模型交互,演示是一种稳健且直接的方法。让模型学习它将被要求执行的任务,它就能很好地完成。不过,不要期望这种方法能够迁移。

如果事实准确性最重要,使用 SDF。 合成文档上的 3.4 困惑度确实令人印象深刻。但是,从第三人称描述中传递情感和对话纹理的效果并不理想,建议结合 SDF 和 FP 来获得事实基础加上感知身份。

不要低估一个好的系统提示。 基线模型仅使用 Qwen3-4B 和描述 C-3PO 的系统提示,在评分器上得到了 5.0 分,并涵盖了大多数关键特质。对于许多应用场景来说,这已经足够。当你需要在无法控制的提示下实现稳健性,或者在没有可见系统提示的情况下实现人格行为时,微调才真正物有所值。

实际上,演示教会的是行为,合成文档教会的是事实,第一人称陈述教会的是身份

这个实验是一个周末的冲刺项目,还有很多后续工作想要跟进。最具体的一点是:第一人称陈述在低示例数量下的效率优势是否依然成立?如果第一人称陈述在 50 个示例时仍然具有竞争力,而演示却崩溃了,这将对构建人格数据集的实际应用产生重大影响。如果你在我之前运行了这个实验,我真心想知道我是否正确。

完整代码可在 GitHub 上找到。微调是在单个 A40 上通过 RunPod 使用 TRL/PEFT 堆栈完成的,所有数据集均由 Claude 生成。