
角色扮演类对话数据的质量直接决定了模型在人物一致性、语气贴合度和长程对话稳定性上的表现。我最近在整理一套高精度角色扮演数据生成的流程内部代号叫 Evol-character核心目标不是造一堆对话而是让每一条样本都具备可追溯的人设约束、可量化的风格偏移和可复现的生成路径。这套东西解决的是三个具体问题人设漂移、语气塌陷、多轮记忆断裂。适合已经跑通过基础对话数据合成、想把人设一致性和风格精度往上提一个档位的从业者参考也适合刚接触角色扮演数据、想搞清楚一条好样本到底好在哪的同学对照着看。下面我按设计思路、核心细节、实操流程、问题排查四个层面把这套流程完整拆开讲。1. 整体设计与思路拆解1.1 为什么不能直接拿通用对话数据改人设很多人做角色扮演数据的第一反应是找一批通用对话前面拼一段人设描述后面接对话就算完事。我早期也这么干过实测下来问题非常集中。通用对话的语料分布是信息交换型的两个人说话的目的是把一件事说清楚句子偏短、逻辑偏直、情绪偏平。而角色扮演要的是人格表达型对话说话方式本身就是内容的一部分——同样一句我不太高兴不同角色可能是冷嘲、可能是委屈、可能是故作轻松。你拿通用对话硬套人设模型学到的是人设描述和对话内容弱相关推理时人设就变成了摆设。Evol-character 的第一个设计决策就是人设不是前缀而是贯穿整条样本的约束条件。具体做法是把人设拆成可执行的维度而不是一段自由文本。我把它拆成五个维度身份背景、语言习惯、情绪基线、知识边界、关系立场。这五个维度分别约束角色知道什么角色怎么说话角色默认什么情绪角色不懂什么角色对对话对象什么态度。拆维度的好处是每个维度都能单独校验生成完一条样本可以逐项打分而不是靠人眼整体感觉像不像。这个拆法背后的逻辑是自由文本人设的歧义太大模型对性格开朗的理解可能是话多也可能是爱用感叹号还可能是主动提问。拆成维度之后语言习惯这一项可以明确写成句尾常带确认性短句、少用长定语、遇到不确定的事先反问再回答这种描述是可执行、可检验的。维度化是人设可控的前提这一步偷懒后面全白搭。1.2 生成流程为什么选先骨架后血肉整套流程我采用的是两阶段生成先出对话骨架再填语言血肉。骨架阶段只关心这一轮谁说了什么意图、信息量多少、情绪走向如何不关心具体措辞血肉阶段在骨架约束下做措辞生成和风格注入。这么设计的原因很直接如果一步到位生成完整对话模型很容易在措辞上花光注意力导致多轮之间的意图衔接松散出现每轮都像新对话的问题。两阶段拆开之后骨架阶段可以用较低成本快速产出大量候选结构做筛选和配比血肉阶段只对通过筛选的骨架做精细化生成算力花在刀刃上。这跟做菜一个道理先定菜单和配菜比例再逐道精做比一上来就猛火爆炒、最后发现整桌菜口味重复要划算得多。注意骨架阶段不要引入任何具体措辞一旦骨架里出现成句的对白血肉阶段就会被带偏风格注入效果大打折扣。这是我在早期版本里踩过的坑骨架里残留一句你好呀整条样本的语气都会被拉向那个方向。1.3 精度优先还是产量优先的取舍Evol-character 的定位是高精度所以整体策略是产量让位于精度。具体体现在三个地方一是每条样本生成后要过五维校验不达标直接丢弃而不是修补二是同一人设的多条样本之间要做去重和风格方差控制避免一个角色生成出几十条几乎一样的对话三是保留完整的生成溯源信息包括骨架来源、血肉阶段的采样参数、校验得分方便后续做数据配比时按质量分层。这个取舍的代价是产出率偏低我实测下来有效样本大概占生成量的三到四成。但换来的是下游训练时人设一致性的明显改善尤其是长对话场景下角色崩人设的比例下降得很明显。如果你的场景对产量要求极高、对人设精度要求一般这套流程需要做减法后面我会讲哪些环节可以砍。2. 核心细节解析与实操要点2.1 五维人设卡怎么写才可执行人设卡是整个流程的地基写得好不好直接决定后面所有环节的上限。我总结的判断标准只有一条每一条描述都要能被一条具体对话验证。写性格温柔没法验证写对方表达负面情绪时先复述对方感受再给建议且复述时不加评价词就能验证。五个维度的写法要点我整理成下面这张表都是实操中反复调整后定下来的维度写什么反例正例写法身份背景职业、经历、当前处境一个善良的人在小城开了六年旧书店经历过两次搬迁对书的品相有执念语言习惯句式、用词、口头禅、节奏说话幽默习惯先给结论再补一句自嘲少用形容词遇到专业话题会突然变严谨情绪基线默认情绪、触发点、恢复方式情绪稳定默认平和偏淡被质疑专业能力时会明显较真较真后会用自嘲收场知识边界懂什么、不懂什么、怎么应对不懂知识渊博懂旧书鉴定和本地掌故不懂网络流行语遇到不懂的会直接说这个我不熟并转回自己熟悉的领域关系立场对对话对象的态度、距离感友好对熟客放松爱开玩笑对生客礼貌但有距离被冒犯时不翻脸但会缩短回答写人设卡有个容易忽略的点知识边界一定要写不懂时怎么应对。很多样本崩就崩在这里角色被问到知识边界外的问题模型要么硬编一个答案要么生硬地说我不知道两种都很出戏。正确做法是在人设卡里明确应对策略比如用类比把问题拉回自己熟悉的领域或者坦率承认不熟但表达好奇并反问。这一条写清楚样本的自然度会提升一大截。2.2 骨架阶段的意图标注规范骨架阶段的核心产物是一串带标注的对话轮次每一轮包含四个字段说话人、意图类型、信息增量、情绪标记。意图类型我固定用一套小标签集不追求全追求稳定可复用主要包括陈述、追问、回避、试探、认同、反驳、转移话题、情绪表达。信息增量用低中高三档粗标情绪标记用正负中性加强度。这套标注看起来简单但实操中有两个细节决定成败。第一个是意图要标表面意图而不是真实意图角色扮演里大量对话是话里有话的骨架阶段如果标真实意图血肉阶段容易把潜台词直接说出来反而失去味道。表面意图标陈述真实意图可能是试探这个落差恰恰是角色扮演的魅力所在要留给血肉阶段用措辞去体现。第二个细节是情绪标记要标变化而不是绝对值。单轮标负面信息量很低标从中性转向负面、强度中等才有用因为血肉阶段需要知道这一轮的情绪是延续还是转折措辞的力度完全不一样。我早期版本只标绝对值生成出来的对话情绪像台阶一样一跳一跳的很不自然改成标变化之后连贯性好了很多。2.3 血肉阶段的风格注入手法血肉阶段是在骨架约束下做措辞生成风格注入主要靠三样东西人设卡全文、上一轮的完整对话、以及一份风格示例。风格示例是从同一人设的高质量样本里挑出来的两三段短对话作用是给模型一个这个角色说话大概长这样的锚点。实测下来风格示例比单纯堆人设描述有效得多因为示例提供的是可模仿的节奏和句式而描述提供的是需要理解的概念。风格注入有个参数要重点调示例的相似度。示例如果和当前骨架的场景太像模型容易照抄示例的措辞生成结果和示例高度雷同太不像又起不到锚定作用。我的经验是示例场景和当前场景保持同人设、不同情境比如当前是书店里讨论旧书品相示例就用同一角色在电话里拒绝推销情境不同但说话方式一致锚定效果最好。提示风格示例不要超过三段每段不超过六轮。示例太长会挤占上下文而且模型会过度拟合示例里的具体内容反而弱化了人设卡的约束。2.4 五维校验的评分口径生成完的样本要过五维校验对应人设卡的五个维度每维一到五分。评分口径必须提前定死否则不同批次之间没法比较。我的口径是这样的身份背景看对话里出现的信息是否和人设一致且不越界语言习惯看句式和用词是否符合描述重点看有没有出现人设里明确排除的表达情绪基线看情绪走向是否符合触发点和恢复方式知识边界看有没有出现角色不该懂的内容关系立场看称呼、距离感和态度是否符合设定。评分低于三分的维度直接判样本不合格不做修补。修补的成本往往高于重新生成而且修补容易引入新的不一致。这个策略听起来浪费但实测下来整体效率更高因为修补出来的样本经常在别的维度上出问题返工次数反而更多。3. 实操过程与核心环节实现3.1 环境与依赖准备整套流程对环境的依赖不复杂核心是一个能稳定调用生成接口的脚本框架加上本地的校验和去重工具。我用的技术栈是 Python 做流程编排生成侧走通用的对话生成接口校验侧用规则加轻量模型打分结合的方式。目录结构我习惯这样组织方便按批次管理和回溯evol_character/ ├── personas/ # 人设卡一个角色一个 yaml ├── skeletons/ # 骨架产物按批次分目录 ├── samples/ # 血肉产物按人设分目录 ├── style_examples/ # 风格示例库 ├── validators/ # 五维校验脚本 └── configs/ # 采样参数、配比配置人设卡用 yaml 而不是纯文本是为了让五个维度结构化校验脚本可以直接读取维度描述做比对。下面是一个简化的人设卡示例字段名我做了脱敏处理persona_id: P_0017 identity: background: 在小城经营旧书店六年经历过两次搬迁 expertise: [旧书品相鉴定, 本地掌故] language: pattern: 先结论后自嘲少用形容词 banned: [网络流行语, 长定语堆砌] emotion: baseline: 平和偏淡 trigger: 被质疑专业能力时较真 recovery: 较真后用自嘲收场 knowledge: known: [旧书鉴定, 本地历史] unknown_handling: 坦率说不熟用类比拉回熟悉领域 relation: to_regular: 放松爱开玩笑 to_stranger: 礼貌但有距离这个结构的好处是校验脚本可以逐字段比对比如检查生成对话里有没有出现 banned 列表里的表达有没有出现 known 之外的专业内容。结构化人设卡是自动校验的前提纯文本人设卡只能靠人眼看规模化之后根本扛不住。3.2 骨架生成与筛选骨架生成我用的方式是给定人设卡和场景设定让生成侧输出一串带意图标注的轮次轮数控制在六到十二轮之间。轮数下限六轮是为了保证有足够的上下文让角色特征显现上限十二轮是控制单条样本的信息密度太长容易稀释重点。生成出来的骨架要做两轮筛选。第一轮是结构筛选检查意图序列是否合理比如连续三轮都是陈述就偏平缺少互动张力连续出现回避又可能让对话推进不下去。我定了一套简单的规则每四轮内至少出现一次追问或试探情绪标记至少有一次变化信息增量不能全是低档。第二轮是配比筛选按目标数据集的意图分布做抽样避免某一类意图过度集中。筛选这一步我建议写成脚本自动跑规则可以粗糙但一定要有。纯靠人工挑骨架一天挑不了几百条而且标准会漂移上午挑的和下午挑的口径都不一样。3.3 血肉生成的关键参数血肉阶段的采样参数对结果影响很大我调了很久才稳定下来。核心参数有三个温度、top_p、以及重复惩罚。温度我设在中等偏上目的是保留措辞的多样性但不敢太高太高会破坏人设约束top_p 收得比较紧让候选词集中在高概率区间保证措辞不跑偏重复惩罚适度调高因为角色扮演里口头禅和句式重复是特征但过度重复就变成机械了。这里有个反直觉的经验温度不是越高越有人味。我试过把温度拉高追求自然感结果是人设约束明显松动角色开始说不符合设定的话。真正让人味出来的是风格示例和情绪变化标注温度只是辅助。参数调优的顺序应该是先把人设卡和示例调好再微调采样参数反过来做会一直在错误的方向上打转。生成时每一轮都要把完整的前文带上不能只带上一轮。角色扮演的长程一致性靠的就是完整上下文只带上一轮的话五六轮之后角色就开始忘设定。上下文长度不够的时候宁可缩短单条样本的轮数也不要截断前文截断前文对一致性的伤害比轮数少更大。3.4 校验、去重与分层入库生成完的样本先过五维校验评分口径前面讲过这里补一个实操细节校验最好用规则加模型双通道。规则通道查硬性违规比如 banned 表达、知识越界、称呼错误这些用关键词和简单匹配就能抓模型通道查软性质量比如语气是否贴合、情绪走向是否自然这部分规则写不出来得靠打分模型。两个通道都过才算合格。去重分两层。第一层是字面去重用相似度阈值抓高度雷同的样本第二层是风格方差控制同一人设下的样本要保证句式和情绪走向有足够差异不能全是同一个调子。风格方差我用一个简单指标衡量同一人设样本之间的平均句长方差和情绪标记分布熵低于阈值就说明这批样本太同质需要补充生成。入库时按校验总分分层高分样本优先进入训练集中等分样本留作补充或做课程学习的后期数据低分直接丢弃。分层入库的好处是后续做数据配比时手里有牌可打而不是一锅烩。4. 常见问题与排查技巧实录4.1 人设漂移的典型表现与定位方法人设漂移是这套流程里最常见的问题表现是对话进行到中后段角色的说话方式、知识边界或态度开始偏离设定。定位方法我总结成三段比对把样本按前中后三等分分别和同一人设的高分样本比对语言习惯和情绪走向哪一段开始偏离问题就出在那一段的生成环节。漂移的原因通常有三个一是上下文截断前面讲过只带上一轮或者截断前文都会导致漂移二是风格示例太长模型过度拟合示例内容而弱化了人设卡三是骨架阶段意图标注太粗血肉阶段缺少约束。排查顺序建议从上下文开始查因为这是最高频的原因查完再查示例长度最后查骨架标注。4.2 语气塌陷为什么对话越聊越平语气塌陷指的是对话开头还有角色特色越往后越像通用助手在说话。这个问题在长对话里特别明显。根因往往是情绪标记只标了绝对值没标变化血肉阶段不知道情绪该延续还是转折就默认往平里写。解决办法前面提过情绪标记改成标变化同时在血肉阶段的提示里明确要求本轮情绪相对上一轮的变化方向。还有一个容易被忽略的原因骨架阶段的信息增量全是低档。信息量低意味着对话没有实质推进模型只能靠寒暄填充寒暄是最容易塌成通用语气的。骨架筛选时保证每三四轮至少有一次中高档信息增量语气塌陷会明显缓解。4.3 多轮记忆断裂的修复思路记忆断裂的表现是角色忘了前面说过的事或者前后信息矛盾。这个问题一部分是上下文长度问题一部分是骨架设计问题。骨架阶段如果每轮都是独立意图、没有前后呼应血肉阶段再怎么带上下文也救不回来。修复思路是在骨架阶段显式标注呼应关系比如某一轮是对前面某轮的回应或反转标注清楚之后血肉阶段会自然带上指代。下面这张表是我整理的常见问题速查都是实操中反复遇到的问题现象优先排查项处理方式中后段人设漂移上下文是否完整补全前文缩短轮数而非截断对话越聊越平情绪标记是否标变化改为标变化方向提高信息增量前后信息矛盾骨架有无呼应标注骨架阶段显式标呼应关系角色说话像通用助手风格示例是否缺失或过长补示例控制在三段以内样本高度雷同风格方差是否达标补生成调整采样参数知识边界越界人设卡 unknown_handling 是否缺失补写应对策略并加规则校验4.4 几个踩过坑才明白的经验第一个经验人设卡不是越详细越好。我早期把每个维度写到几百字结果模型抓不住重点反而把一些边角描述放大成了主要特征。后来压缩到每维两三句、只留可验证的描述效果明显更好。详细不等于有效可执行才是关键。第二个经验校验分数不要追求满分。五维全五分的样本往往过于标准反而缺少真实感。我现在的策略是允许某一维四分只要没有三分以下的维度就放行这样样本保留了一点毛边训练出来的角色更耐聊。第三个经验风格示例要定期轮换。同一批示例用久了生成出来的样本会向示例收敛风格方差越来越小。我现在的做法是每生成一批就补充新的高分样本进示例库保持示例库的多样性这个习惯养成之后样本同质化的问题基本消失了。这套流程后续还可以往两个方向扩展一是把校验环节的模型打分做成可迭代的用人工复核结果反哺打分模型二是把骨架阶段的意图标签集按具体场景做细分比如情感陪伴场景和知识问答场景的意图分布差别很大分开标注精度会更高。我目前在做第一个方向的迭代等跑顺了再整理出来。