원클릭으로
character-ai-profile
从对话语料分析单个角色的说话方式、口癖、关系动态,生成 AI roleplay 用人设档案。触发词:「为XX生成角色档案」「generate profile for XX」「分析这个角色的说话方式」「角色人设」
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
从对话语料分析单个角色的说话方式、口癖、关系动态,生成 AI roleplay 用人设档案。触发词:「为XX生成角色档案」「generate profile for XX」「分析这个角色的说话方式」「角色人设」
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | character-ai-profile |
| description | 从对话语料分析单个角色的说话方式、口癖、关系动态,生成 AI roleplay 用人设档案。触发词:「为XX生成角色档案」「generate profile for XX」「分析这个角色的说话方式」「角色人设」 |
在做任何分析之前,先问用户以下问题(如果用户消息中已经回答了某个,就跳过):
等用户回答后再继续。
内部规则(不要问用户):
自动推断以下参数(不需要问用户):
| 参数 | 推断方式 |
|---|---|
| 语料目录 | 搜索项目中的 ba-stories/、corpus/、stories/ 等目录 |
| 翻译表 | 搜索 translation_table.json |
| 角色元数据 | 搜索角色 profile 文件(如 キャラクターデータ/ 下的文件) |
| 世界观文档 | 搜索 world.md、worldview.md、lore.md 等 |
派遣 subagent 执行数据收集——这一步输出量很大,不要在主线程做。
Subagent prompt 模板:
你是角色语料收集 agent。任务:为角色「{角色名}」收集所有台词和相关数据。
1. 运行以下命令提取全部台词:
python3 .claude/skills/character-ai-profile/scripts/extract_lines.py "{角色名}" "{语料目录}" > /tmp/profile_lines.jsonl
2. 运行 pattern 统计:
python3 .claude/skills/character-ai-profile/scripts/find_patterns.py /tmp/profile_lines.jsonl > /tmp/profile_patterns.json
3. 运行互动提取:
python3 .claude/skills/character-ai-profile/scripts/find_interactions.py "{角色名}" "{语料目录}" > /tmp/profile_interactions.json
4. 如果存在角色 profile 文件,读取并输出内容(去掉 CV、设计师、插画师等 meta 信息)
5. 汇报:台词总数、来源文件数、pattern 统计摘要(一人称 top3、句首 top5、句尾 top5、口头禅 top5)、互动 top10 角色名
不要分析或撰写,只收集数据和输出统计摘要。
角色不是独立存在的,必须理解她/他所处的世界。
先检查项目中是否已有世界观文档(world.md 等)。如果有,读入即可。
如果没有,派遣 subagent 阅读主线剧情构建世界观摘要:
Subagent prompt 模板:
你是世界观分析 agent。任务:阅读剧情语料,提取作品的世界观设定。
语料目录:{语料目录}
目标角色:{角色名}(优先阅读与该角色相关的主线)
请阅读主线剧情(优先第一篇前几话,了解世界基本设定),然后提取:
1. **世界观总体**:故事发生在什么地方?是什么性质的世界?
2. **核心组织与阵营**:有哪些重要的学校/组织/势力?它们之间的关系
3. **主角身份**:玩家扮演什么角色?与该世界中的人物是什么关系?
4. **角色所属组织**:目标角色属于哪个组织?该组织在世界中的定位
5. **重要世界规则**:特殊规则(如光环、武器普及、特殊系统等)
6. **关键术语**:列出专有名词及简要解释
7. **核心事件**:与目标角色相关的重大剧情事件概要
输出简明世界观摘要(控制在 800 字以内),重点是 roleplay 时必须知道的背景。
派遣 1-3 个 subagent 并行阅读原始场景文件。主线程不要读大量原文。
根据台词量决定策略:
| 台词量 | 策略 |
|---|---|
| > 500 句 | 派 3 个 subagent 并行:A=日常/羁绊/MomoTalk,B=主线/活动严肃场景,C=互动 top10 关系 |
| 50-500 句 | 派 1-2 个 subagent |
| < 50 句 | 主线程直接读 |
说话方式:一人称 / 对主角称呼 / 对他人称呼 / 标志性语尾 / 句首习惯 / 口头禅 / 日常 vs 认真模式切换
情景反应:被打招呼 / 被夸奖 / 生气不满 / 害羞慌张 / 认真严肃 / 关心他人 / 开玩笑吐槽
每个特征必须附 2-3 句原文例句 + 出处文件名。
收集所有 subagent 的输出后,在主线程综合撰写档案。
输出路径:profiles/{角色名}.md
根据用户选择的语言撰写。如果用户要保留原文,例句用「原文 → 翻译」格式。
# {角色名}
## 基本设定
<!-- 角色身份、所属组织、在组织中的角色定位 -->
<!-- 如有翻译表,专有名词后括号注译名 -->
<!-- 不要写 CV、设计师、插画师 -->
## 世界观
<!-- 世界规则、所属组织、主要势力关系 -->
<!-- 特殊系统(光环、MomoTalk 等)在这里解释 -->
## 说话方式
### 一人称
### 称呼规则
### 标志性语尾
### 句首习惯
### 口头禅 / 高频表达
### 日常 vs 认真模式
## 情景反应
<!-- 每个情景 2-3 句实际台词 + 简要上下文 -->
## 角色关系
<!-- 按互动量排序,top 10-15,每对配称呼方式 + 互动动态描述 + 代表性对话 -->
## 角色内核
### 关键场景与弧光
### 核心价值观
### 与主角的关系本质
## 大厅 / 日常台词
## AI Roleplay 检查清单
### 必须做到(5-7 条,具体行为描述)
### 绝对不能做(3-5 条,具体行为描述)
仅在用户第零步选择了导出酒馆卡时执行。
SillyTavern 使用 Character Card V2 规范,核心是一个 JSON:
{
"spec": "chara_card_v2",
"spec_version": "2.0",
"data": {
"name": "角色名",
"description": "基本设定 + 世界观",
"personality": "说话方式 + 情景反应",
"scenario": "世界观摘要",
"first_mes": "角色的第一句话(从大厅台词选取)",
"mes_example": "示例对话(从情景反应和关系对话中提取)",
"system_prompt": "AI Roleplay 检查清单",
"post_history_instructions": "",
"alternate_greetings": ["备选开场白"],
"tags": ["auto-generated", "game-character"],
"creator_notes": "由 character-ai-profile skill 从游戏语料自动生成",
"character_book": null,
"extensions": {}
}
}
| 酒馆卡字段 | 从档案哪部分提取 |
|---|---|
name | 档案标题(角色名) |
description | 「基本设定」+「世界观」合并 |
personality | 「说话方式」+「情景反应」合并 |
scenario | 「世界观」 |
first_mes | 从「大厅/日常台词」选一句自然的开场白,包裹动作描写 |
mes_example | 从「情景反应」和「角色关系」提取 3-5 段对话,用 <START> 分隔 |
system_prompt | 「AI Roleplay 检查清单」 |
alternate_greetings | 从「大厅/日常台词」额外选 2-3 句 |
<START>
{{user}}: *walks in*
{{char}}: 台词内容
<START>
{{user}}: 你今天真厉害
{{char}}: 被夸奖时的反应台词
用 {{user}} 和 {{char}} 占位,不写死角色名。
# V2(默认,推荐)
python3 .claude/skills/character-ai-profile/scripts/export_tavern_card.py profiles/角色名.md
# V1(兼容更多前端,字段更少)
python3 .claude/skills/character-ai-profile/scripts/export_tavern_card.py profiles/角色名.md --v1
python3 .claude/skills/character-ai-profile/scripts/export_tavern_card.py profiles/角色名.md --avatar 头像.png --output profiles/角色名.card.png
如果没有头像,输出纯 JSON 文件 profiles/角色名.card.json
手动调优:脚本自动提取的 first_mes 和 mes_example 可能不够好。撰写完后,你应该检查这两个字段,必要时手动改写:
first_mes 应该是角色见到用户时自然会说的第一句话,配合动作描写mes_example 应该展示角色最有特色的说话方式,让 AI 看了能学到 pattern告知用户导出结果和文件路径
如果用户说要导出酒馆卡但没给头像,提醒用户:
| 日语 | 中文转换 | 说明 |
|---|---|---|
| 先生(せんせい) | 老师 | 游戏中对玩家的称呼,不是「先生/Mr.」 |
| 先輩(せんぱい) | 前辈 | |
| さん | 同学 / 小姐 等 | 按语境 |
| ちゃん | 小X / 直呼名字 | 按亲密度 |
| くん | X君 / 直呼名字 | 按语境 |
| 様(さま) | X大人 | |
| 殿(どの) | X殿 | 保留 |
例外:如果用户偏好保留日文语感,可用罗马音(sensei)或保留原文。
如果找到 translation_table.json,专有名词后括号注译名:
import json
table = json.load(open("utils/translation_table.json", encoding="utf-8"))
# table["characters"]["ホシノ"]["cn"] → "星野"
# table["schools"]["アビドス高等学校"]["cn"] → "阿比多斯"
格式 A:按章节的 Markdown(本项目使用)
**角色名**: 台词内容
*(角色名)旁白内容*
> **先生(選択肢)**: 选项1 / 选项2
格式 B:JSONL
{"speaker": "角色名", "text": "台词", "source": "文件路径"}
脚本自动检测格式。
| 台词量 | 处理方式 |
|---|---|
| < 10 句 | 告知用户台词太少,只输出基本信息,标注"语料不足" |
| 10-50 句 | 主线程直接分析,不用 subagent |
| > 50 句 | 正常完整分析,用 subagent |
| > 500 句 | 必须用多个 subagent 并行 |