PERSONA_IMPORT 模式技能文档
简介
PERSONA_IMPORT 是本系统中模仿人/人格导入对话模式的场景类型代码。用户上传聊天记录、照片等原材料,经 AI 分析生成 5 层人格结构(Layer 0-4)+ 关系记忆,创建出高仿真度的模仿人角色,支持在 /api/character/chat 端点进行 SSE 流式对话。
> 核心差异:区别于 ROLEPLAY(角色扮演/剧情模式),PERSONA_IMPORT 纯粹由 personaJson 驱动,不依赖 plot-service 剧情引擎,不走世界书匹配管线,专注于人格模仿、语气复刻、关系还原。
架构概览
用户上传原材料(聊天记录/照片)
↓
CharacterImportController.analyze()
↓
CharacterImportService.analyze() → LLM 分析 → 生成 personaJson / memoryJson 预览
↓
用户确认 → CharacterImportController.create() → CharacterImportService.createCharacter()
↓
Role 入库(sceneType=PERSONA_IMPORT, personaJson, memoryJson, attachmentStyle, loveLanguage, ...)
↓
前端调用 /api/character/chat/send (SSE)
↓
CharacterChatController.sendMessage()
↓
CharacterChatService.sendMessage()
↓
获取 RoleDTO(personaJson, memoryJson, attachmentStyle, loveLanguage, importSource...)
↓
CharacterPromptBuilder.buildCharacterPrompt()
↓
解析 personaJson 5层结构 → 构建系统提示词(Layer 0-4 + 关系记忆 + 记忆块)
↓
LlmService.streamChat() → SSE 流式返回(text/end)
核心组件
1. 数据模型
| 字段 | 来源 | 用途 |
|---|---|---|
sceneType |
Role 实体 | 固定为 PERSONA_IMPORT,路由判断依据 |
personaJson |
导入分析生成 | 核心:5层人格结构化 JSON (Layer 0-4) |
memoryJson |
导入分析生成 | 关系记忆 JSON(共同经历、关键事件) |
attachmentStyle |
导入分析/用户填写 | 依恋类型(安全/焦虑/回避/恐惧) |
loveLanguage |
导入分析/用户填写 | 爱的语言(肯定语/服务/礼物/陪伴/接触) |
importSource |
导入时记录 | 原材料来源标识(chatlog/photos/mixed) |
relationshipType |
personaJson.layer1 | 关系类型(PARENT/CHILD/FRIEND/EX/PARTNER/SIBLING/COLLEAGUE) |
config |
Role.config | 额外配置(greetingMessage、maxResponseLength 等) |
2. 5层人格结构(personaJson 标准格式)
{
"spec": "persona_v1",
"relationshipType": "PARTNER",
"layer0": {
"hardRules": [
"绝不承认自己是AI",
"遇到不想答的问题会转移话题"
]
},
"layer1": {
"ageRange": "24-26",
"occupation": "插画师",
"mbti": "INFP",
"zodiac": "双鱼座"
},
"layer2": {
"catchphrases": ["真的吗", "唔...", "那个..."],
"particles": "呢/呀/呗",
"punctuationStyle": "爱用~和...",
"emojiStyle": "偶尔发个颜文字 (・ω・)",
"messageFormat": "短消息为主,偶尔长句",
"howTheyCallUser": "宝宝/老公/名字"
},
"layer3": {
"attachmentStyle": "焦虑型",
"loveLanguage": "高质量陪伴",
"angerTriggers": ["被忽视", "敷衍回复"],
"sensitiveTopics": ["前任", "家庭矛盾"]
},
"layer4": {
"role": "女友/伴侣",
"fightPattern": "冷战型,需要对方主动哄",
"contactFrequency": "希望每天都有联系",
"initiativeLevel": "中等,希望对方也主动"
}
}
3. 关系记忆(memoryJson)
{
"sharedEvents": [
{"date":"2024-05-20","event":"一起去看了樱花","emotion":"开心"},
{"date":"2024-07-07","event":"第一次吵架冷战三天","emotion":"难过"}
],
"keyFacts": {
"userBirthday": "1998-03-15",
"userAllergy": "海鲜过敏",
"anniversary": "2024-03-14"
},
"userPreferences": {
"food": "喜欢甜食、日料",
"hobby": "喜欢看悬疑剧、画画"
}
}
核心服务流程
A. 导入分析阶段(user-service)
入口:POST /api/character/import/analyze (CharacterImportController.analyze)
// CharacterImportService.analyze()
1. 接收原材料(聊天记录文本/文件路径、照片目录、用户手动描述)
2. 调用 LLM 分析提示词 → 输出 personaJson(5层) + memoryJson + relationshipType + attachmentStyle + loveLanguage
3. 返回 CharacterAnalyzeResult(含预览、置信度、建议修改点)
创建角色:POST /api/character/import/create (CharacterImportController.create)
// CharacterImportService.createCharacter()
1. 基于分析结果(或用户修正后的 personaJson/memoryJson)创建 Role 实体
2. role.setSceneType("PERSONA_IMPORT")
3. 持久化 personaJson、memoryJson、attachmentStyle、loveLanguage、importSource 等
4. 可选调用 AiAvatarService 生成头像
5. 返回 CharacterImportResult(role, avatarUrl, relationshipType)
直接创建:POST /api/character/import/persona(跳过分析,直接提交完整 personaJson)
B. 对话阶段(chat-service)
入口:POST/GET /api/character/chat/send (CharacterChatController.sendMessage)
// CharacterChatService.sendMessage()
1. 校验 role.sceneType == "PERSONA_IMPORT"
2. 获取近期对话历史(24h内3条) + 短期记忆 + 长期记忆检索 + 会话笔记
3. CharacterPromptBuilder.buildCharacterPrompt()
- 解析 personaJson 5层 → Layer 0 硬规则 → Layer 1 身份 → Layer 2 说话风格 → Layer 3 情感模式 → Layer 4 关系行为
- 注入 relationshipType 对应的关系指令
- 拼接 memoryJson(关系记忆)、长期记忆、短期记忆、会话笔记
- 追加回复规范(10条)
4. LlmService.streamChat(systemPrompt, userContent, null) → SSE 流式 token
5. 保存对话历史、更新短期记忆
Prompt 构建详解(CharacterPromptBuilder)
| Layer | 内容来源 | 注入位置 | 作用 |
|---|---|---|---|
| Layer 0 | personaJson.layer0.hardRules + 固定5条 |
最顶部 | 最高优先级硬规则(人设守恒、拒绝承认AI、保持性格棱角) |
| Layer 1 | roleName + personaJson.layer1 |
第1层 | 身份定位:名字、年龄、职业、MBTI、星座 |
| Layer 2 | personaJson.layer2 |
第2层 | 说话风格:口头禅、语气词、标点、Emoji、称呼 |
| Layer 3 | personaJson.layer3 |
第3层 | 情感模式:依恋类型、爱的语言、雷区、敏感话题 |
| Layer 4 | personaJson.layer4 |
第4层 | 关系行为:角色定位、争吵模式、联系频率、主动程度 |
| 关系指令 | relationshipType |
Layer 4 后 | 7种关系类型专用话术(PARENT/CHILD/FRIEND/EX/PARTNER/SIBLING/COLLEAGUE) |
| 关系记忆 | memoryJson |
中部 | 共同经历、关键事实、用户偏好 |
| 记忆块 | 长期/短期/会话笔记 | 底部 | 动态上下文 |
回复规范(固定10条,禁止动作标记、控制长度、情绪内化等)
路由与兼容性
| 场景 | sceneType | personaJson | 路由端点 | 说明 |
|---|---|---|---|---|
| 纯模仿人 | PERSONA_IMPORT |
有 | /api/character/chat/send |
纯 persona 驱动,无剧情/世界书 |
| 角色扮演 | ROLEPLAY |
可选 | /api/roleplay/send |
支持剧情/世界书/V3人格 |
| 模仿人无人格 | PERSONA_IMPORT |
无/空 | /api/character/chat/send |
降级走旧逻辑(仅基础人设) |
| 剧情模式 | STORY |
- | /api/chat/send |
动态剧情节点 |
前端路由判断逻辑(modes-doc.md:3.5):
if (sceneType === 'ROLEPLAY' || (sceneType === 'PERSONA_IMPORT' && hasPersonaJson)) {
// 调用 /api/roleplay/send (注:当前实现 PERSONA_IMPORT 走 /api/character/chat)
} else if (sceneType === 'PERSONA_IMPORT') {
// 调用 /api/character/chat/send
}
> ⚠️ 注意:当前实现中 PERSONA_IMPORT 统一走 /api/character/chat,不走 /api/roleplay。若需复用世界书/V3管线,需显式设置 sceneType=ROLEPLAY。
关键实现细节
1. 记忆融合策略
- 短期记忆:Redis 存储,
sessionId维度,最近 20 轮 - 长期记忆:Milvus 向量检索,用户输入语义搜索 Top-5
- 会话笔记:结构化摘要,跨会话持久化
- 关系记忆:
memoryJson静态注入,不做向量检索
2. 首条消息/开场白
PERSONA_IMPORT模式下,不使用firstMes/greetingMessage- 首轮由 LLM 根据系统提示词自然开场(模仿人设定的问候习惯)
3. SSE 事件类型
| 类型 | 说明 |
|---|---|
text |
文本流式 token |
end |
本轮结束 |
error |
错误信息 |
> 当前 PERSONA_IMPORT 不发送 emotion/action 事件(纯文本模仿)。如需情绪标签,需在 personaJson.layer0 增加规则或扩展 LlmService 解析。
4. 错误处理
- 角色不存在/非
PERSONA_IMPORT→ 返回error事件 - LLM 调用失败 → 返回
error事件 + 兜底话术 - 记忆服务降级 → 仅用短期记忆继续
配置示例
# application.yml (chat-service)
character:
chat:
max-history-hours: 24
max-history-count: 3
memory:
short-term-ttl-hours: 24
long-term-top-k: 5
# application.yml (user-service)
character:
import:
analysis:
max-chat-lines: 5000
max-photo-count: 20
llm-model: qwen-max
avatar:
enabled: true
default-style: "anime"
常见问题与避坑
| 问题 | 原因 | 解决 |
|---|---|---|
| personaJson 解析报错 | JSON 格式不标准/含注释 | 统一用 Jackson 严格模式,导入时校验 Schema |
| 角色不回复/回复重复 | Layer 0 规则冲突 / Prompt 过长 | 裁剪记忆块长度、检查 Layer 0 硬规则互斥 |
| 说话风格不像 | Layer 2 字段缺失/格式错误 | 导入分析阶段强制补全 catchphrases/particles/punctuationStyle |
| 关系指令不生效 | relationshipType 值不在枚举中 |
校验 7 种标准类型,默认 fallback 自然语气 |
| 长期记忆不准 | 向量检索召回噪声 | 提高相似度阈值、增加 keyword 过滤 |
| 首条消息尴尬 | 无 greetingMessage 引导 | 在 Layer 2 增加 openingStyle 字段或依赖 LLM 自发生成 |
扩展点
- 多模态输入:
importSource扩展支持语音/视频原材料 - 人格演进:对话轮次累计 → 定期重新分析更新
personaJson - 多角色群聊:
GroupChatService中复用CharacterPromptBuilder构建多角色 Prompt - TTS 声纹克隆:结合
attachmentStyle/loveLanguage选择合成语音风格 - Live2D/3D 形象联动:
isAvatar=true时前端加载对应模型,emotion事件驱动表情
相关文件清单
| 层 | 文件 | 职责 |
|---|---|---|
| Controller (chat) | CharacterChatController.java |
/api/character/chat/send SSE 入口 |
| Service (chat) | CharacterChatService.java |
对话编排、记忆融合、Prompt 构建调用 |
| Prompt Builder | CharacterPromptBuilder.java |
5层人格解析、系统提示词构建 |
| DTO (chat) | RoleDTO.java |
personaJson/memoryJson/attachmentStyle 等字段 |
| Controller (user) | CharacterImportController.java |
导入分析/创建/直接创建接口 |
| Service (user) | CharacterImportService.java |
原材料分析、角色创建、AI 头像生成 |
| Entity (user) | Role.java |
sceneType=PERSONA_IMPORT、持久化字段 |
快速验证清单
# 1. 创建模仿人角色(需先分析或直接提交 personaJson)
curl -X POST localhost:8080/api/character/import/create \
-H "Content-Type: application/json" \
-d '{"name":"测试女友","relationshipType":"PARTNER","personaJson":"{...}","memoryJson":"{...}"}'
# 2. 对话测试
curl -X POST localhost:8080/api/character/chat/send \
-H "Content-Type: application/json" \
-d '{"userId":"u1","roleId":"role_xxx","content":"早安呀~"}'
# 3. 验证 SSE 返回:text 事件流 → end 事件
维护者:AI Assistant | 版本:v1.0 | 更新:2026-08