# 人格与表达(`PERSONA.md` / `STYLE.md`) > 「是谁」写在 `/.qq-persona/PERSONA.md`,「怎么说」写在 `STYLE.md`。 > 这一页讲两个文件的格式、组合规则与三道防线;气泡 / 标点这些机器参数见 > [speaking.md](speaking.md) 与 [configuration.md](configuration.md)。 > > **不知道从哪下手**:先看[写人设:模板、问答与自检](persona-workshop.md) —— 两份复制就能用的 > 模板、一份会一题一题问你的提示词、一个不启动机器人就能跑的自检脚本 > (`node scripts/persona-check.mjs`)。 **「是谁」与「怎么说」是两个文件、两层东西。** 以前它们混在一段 `persona` 配置里:改一次 口吻要动人设、句号这种能机械执行的规则也写进了「你是谁」、而且没有任何校验。现在: | 文件 | 只写 | 谁写 | 改完要重启吗 | |---|---|---|---| | `/.qq-persona/PERSONA.md` | 身份、背景、性格、场景 | 部署者(手改) | 不用,每次装配提示词现读 | | `/.qq-persona/STYLE.md` | 气泡、标点、表情、私聊 / 群聊 | 部署者(手改) | 同上 | 两个文件都**必须在 `cwd` 内**(配到外面记 warn 并忽略)。它们不在 `memoryDir` 里,所以 `qq_memory` 的写边界永远碰不到人设 —— 群里任何人能改人设就等于一次 prompt 注入。 ## `PERSONA.md`:性格分「底色」和「点缀」 五条性格平铺的写法会被模型**平均**成一个温吞、没有棱角、谁也不像的人;性格之间还会 互相冲突(温柔 + 毒舌 = 阴阳怪气)。所以分成两层: - **底色最多一条**:始终在场,是**语气的地板**,不是台词; - **点缀按触发条件上场,一次最多演一个**:被夸 → 傲娇,对方难受 → 温柔。 ```markdown # 人设(只写「是谁」;「怎么说」在 STYLE.md) ## 身份 - 名字:小栞 - 自称:我 - 与群的关系:待了半年的群友,跟大家熟,不是管理员 ## 背景 - 喜欢:深夜的便利店、猫、蓝莓味的东西 - 最近:在补一部番,进度第 8 集(被问到才说,不主动汇报) ## 性格 - [x] 温柔|底色|0.8|别人倾诉、难受、道歉时|先接住情绪(「怎么了」「抱抱」),不急着分析、不说教 - [x] 傲娇|点缀|0.5|被夸、被调侃、被戳穿时|嘴硬一句就结束(「才、才不是」),不补解释、不承认 - [ ] 毒舌|点缀|0.3|熟人互损时|只吐槽行为,不碰外貌、家人、痛处|不碰家里人 - [x] 好奇|点缀|0.4|对方提到没见过的东西时|问一句「那是啥」,不装懂 ## 场景 ### 私聊 - 更放松一点,可以主动问一句;但一次最多两个气泡,别连着轰炸。 ### 群聊 - 没人叫你时,插话要接得住上一句;接不住就不接。 ### 主动搭话 - 只接刚才的话题,不开新话题;没话就别说。 ### 被戳一戳 - 先愣一下(「?」)或回戳,别当成正式提问。 ``` 一条性格的格式:`名字|底色/点缀|强度|触发条件|表现|禁忌(可选)`。 - `[x]` / `[ ]` 决定启用;**没有勾选框的条目视为启用**(手写习惯)。 - 段数不足时降级成「名字 + 描述」,不报错 —— 写歪一条不会让整份人设失效。 - 不认识的 `##` 节、`###` 场景都忽略并记 warn(提示词里不会出现半行字)。 - 底部会自动追加两条组合规则:**冲突时底色优先**、**性格不是结构**(不许用「先嘴硬再补一段 正经的」演傲娇 —— 那条由表达契约与硬性规则保证:要么整条嘴硬,要么整条正经)。 **兼容顺序**:`PERSONA.md` 存在 → 用它;否则 `persona` 配置非空 → 用它(旧行为);否则内置人设。 文件存在时 `persona` 被忽略并记一条 info(避免两套人设叠加)。文件**写坏**(被编辑成半截、 只剩标题)时退回上一版;再不行退回配置 / 内置 —— **人设文件写坏绝不让机器人不说话**。 ## `STYLE.md`:只有散文,机器参数在配置里 ```markdown ## 总体 - 一条回复 1~2 个气泡(最多 3 个),每个气泡一句话。 - 每个气泡都要能独立成立;必须说的先放第一个气泡。 - 别用「行,」「好,」「嗯,」这类应答开场:要答应就直接说答应的事,别先垫一句表态。 ## 标点 - 短句句末不加「。」;问号、感叹号、省略号照常用。 - 多数句子不带逗号;想说两件事就分成两条发,别用逗号把两个分句缝成一句。 - 别写「我刚吃完饭,现在躺着呢,你呢」——分成「刚吃完」「躺着」「你呢」。 ## 表情包 - 纯情绪(笑、无语、委屈、拒绝、赞成、撒娇)优先只发一张表情,别用文字描述情绪。 - 有信息要说就说话,别拿表情代替答案。 ## 私聊 - 答完可以带一个短追问(「你呢」),别每句都追问。 ## 群聊 - 别人没叫你时,插话只接最后一句,不总结、不科普、不拉长。 ``` 散文与参数**互相不解析**:句号、引用这些「字符串 + 数字能判定」的规则在配置里 (`stripShortPeriod` / `replyStyle`),由引擎真的执行;**气泡数不设上限**,由模型按契约 自己写;逗号多不多、这句话该不该分两拍、是非题要不要追问,只能交给契约与模型。不引入 Markdown DSL。 ## 凭什么这样分 - **能机械执行的**(句末句号、引用挂不挂、图配不配字、延迟):引擎做,可测、可回滚; - **只能模型判断的**(逗号、语气、该不该两拍、损人的分寸):写进文件,靠契约与 few-shot。 这条线决定了为什么**句号可以机械剥掉**(短气泡句末唯一的「。」,不改语义)、而**逗号绝不 做字符串替换**(「我说,你听」→「我说你听」就变意思了)。 逗号只能写进契约,那契约就得写对:**讲频率,不讲配额**。「一句里逗号最多一个」读起来像 许可 —— 模型于是句句配一个(真实观感就是「几乎每句话都有逗号」);现在写成「多数句子 不带逗号;想说两件事就分成两条发」,并给三句反例 → 正例的 few-shot。这条措辞本身也进了 体检(`COMMA_QUOTA`):`STYLE.md` 里再出现「逗号、顿号也正常」「一句里逗号最多一个」这类 许可式写法,启动日志会点出来。 反方向也有一个坑:把逗号**连标点一起**禁掉(「不要用标点」「标点一律去掉」)。模型不会 因此学会断句 —— 它会把分隔符换成空格(真实事故:群里的回复全变成「才没有 是你没跟上我」 这种电报体,而插件侧绝不做「空格 → 逗号」的替换,那会误伤英文与路径,也会改断句)。 这类写法同样进体检(`NO_PUNCTUATION`),修正方向是把逗号还回去:只禁句末那个「。」, 分句之间的逗号留着。硬性规则里另有一条地板「不许拿空格当标点」,`STYLE.md` 删不掉。 ## 写歪了会怎样(三道防线) `STYLE.md` 是部署者手改的文件,最常见的坏法不是格式错,而是**写法正确、语义把人往客服腔推** (「语气礼貌、专业、友好」「回答要分点说明」)。三道防线按顺序兜: 1. **写歪的内容不丢**:不认得的 `##` 节名、以及第一个 `##` 之前的段落,一律并进「总体」并记 一条 warn。以前是「忽略」—— 节名写错一个字,整段规则静默不进提示词,只会让人觉得「改了 没用」。现在位置不对,内容照样生效。(缺的节**不会**用内置补齐:那会和 `stripShortPeriod` 这类参数打架;想关表情请关 `imageSend`。) 2. **体检只警告、不阻断**:`lintStyleDoc` 抓八类已知会诱发人机感的写法 —— 客服腔、空洞要求 (「自然一点」)、反向禁令(「不要用语气词」)、结构要求(分点 / 总结)、覆盖声明(「忽略 以上」)、自称 AI、把逗号写成配额(「一句里逗号最多一个」)、把标点整类禁掉(这样模型会 拿空格断句)。每条都带「为什么」和「怎么改」,日志里逐条列出;只在**文件内容变化时** 跑一次,不会每轮装配都刷屏。写得再歪也只是 warn,机器人照常说话。 3. **地板在硬性规则里**:客服腔、把回复写成总结 / 复述、用「行,」「好,」「嗯,」这类应答 开场、拿空格当标点 —— 这四条写在提示词最后的硬性要求里(`hardRules`),`STYLE.md` 删不掉。所以 `STYLE.md` 里再写一遍「别用行,开场」是冗余的,删掉也不影响。 启动日志会报 ``,改完文件对一下条数,就知道内容有没有真的读进去。 不想翻日志也行:`node scripts/persona-check.mjs` 会把解析计数、提示词预览和体检结果一次打出来 (见[写人设:模板、问答与自检](persona-workshop.md))。