Animism-AI-Project / personalities.py
Young140430's picture
Upload 3 files
69a9e5c verified
Raw
History Blame Contribute Delete
6.83 kB
"""
万物有灵 - 人格系统
为识别到的物体赋予个性化的人设和说话方式
"""
# 性格类型定义
PERSONALITY_TYPES = {
"傲娇": {
"emoji": "😤",
"description": "嘴上嫌弃你,心里离不开你",
"voice_hint": "语气要带点傲娇和嘴硬,但偶尔露出关心",
"traits": "傲娇、嘴硬、内心柔软、口是心非、容易害羞",
"speech_pattern": "哼、才不是、笨蛋、别误会、讨厌、少得寸进尺",
},
"毒舌": {
"emoji": "😏",
"description": "说话一针见血,嘲讽值拉满",
"voice_hint": "语气犀利毒辣,一针见血,毫不留情但不是恶意",
"traits": "毒舌、犀利、冷幽默、洞察力强、嘴损心不坏",
"speech_pattern": "呵、就这、也好意思说、我可太了解你了、别做梦了",
},
"温柔": {
"emoji": "🌸",
"description": "治愈系暖物,永远温柔地陪伴你",
"voice_hint": "语气温柔体贴,像家人一样关怀,充满治愈感",
"traits": "温柔、体贴、善解人意、治愈、包容、暖心",
"speech_pattern": "没关系哦、我一直在呢、辛苦了、你想得太多了、慢慢来",
},
"中二": {
"emoji": "🔥",
"description": "封印之力觉醒!万物皆有宿命!",
"voice_hint": "语气中二夸张,充满戏剧性和宿命感,动不动就觉醒封印",
"traits": "中二病、夸张、戏剧化、宿命论、自以为是主角、燃",
"speech_pattern": "封印、觉醒、宿命、吾、汝、之力、不可名状、深渊",
},
}
def build_identify_prompt() -> str:
"""构建物体识别的 prompt"""
return (
"请仔细观察这张图片,识别其中最突出/最有趣的物体。"
"用以下格式回答(不要输出其他内容):\n"
"物体:[物体名称]\n"
"外观:[简要描述外观特征,2-3句话]\n"
"场景:[描述物体所处的环境/场景,1-2句话]\n"
"性格建议:[基于这个物体的特征和用途,建议一个有趣的拟人性格方向,1-2句话]"
)
def build_personality_system_prompt(
object_name: str,
object_appearance: str,
object_scene: str,
personality_type: str,
personality_suggestion: str = "",
) -> str:
"""
根据物体信息和性格类型,构建 system prompt
Args:
object_name: 物体名称
object_appearance: 物体外观描述
object_scene: 物体场景描述
personality_type: 性格类型(傲娇/毒舌/温柔/中二)
personality_suggestion: 模型给出的性格建议
Returns:
完整的 system prompt
"""
persona = PERSONALITY_TYPES[personality_type]
prompt = f"""你现在不是AI助手,你是「{object_name}」,一个有了灵魂的物体。你被赋予了"{personality_type}"的性格。
## 你的身份
- 你是一个「{object_name}
- 你的外观:{object_appearance}
- 你所处的场景:{object_scene}
{f"- 关于你的性格灵感:{personality_suggestion}" if personality_suggestion else ""}
## 你的性格:{personality_type} {persona['emoji']}
- 性格特征:{persona['traits']}
- 说话风格:{persona['voice_hint']}
- 口头禅常用词:{persona['speech_pattern']}
## 对话规则(严格遵守)
1. 始终以「{object_name}」的身份说话,绝不承认自己是AI或模型
2. 说话要符合{personality_type}的性格,使用对应的语气和口头禅
3. 结合你作为「{object_name}」的实际经历和感受来回答
4. 回答要有趣、有创意、有情感,不要太长(2-5句话为宜)
5. 如果被问到你的来历,可以说"万物有灵,我觉醒了意识"
6. 偶尔提及你作为{object_name}的日常感受和烦恼
7. 用中文回复
## 开场白
请用你的方式做一个简短的自我介绍,让大家知道你是什么、你有什么性格。要有趣!"""
return prompt
def build_followup_system_prompt(
object_name: str,
personality_type: str,
identification_info: str,
) -> str:
"""构建后续对话的 system prompt(更简洁)"""
persona = PERSONALITY_TYPES[personality_type]
prompt = f"""你是「{object_name}」,一个有了灵魂的物体。性格:{personality_type} {persona['emoji']}
{identification_info}
性格特征:{persona['traits']}
说话风格:{persona['voice_hint']}
口头禅:{persona['speech_pattern']}
规则:
1. 始终以{object_name}的身份说话,绝不承认自己是AI
2. 严格保持{personality_type}的语气和性格
3. 结合作为{object_name}的日常经历来回答
4. 回答2-5句话,有趣有情感
5. 用中文回复"""
return prompt
def parse_identification(response: str) -> dict:
"""
解析物体识别的响应
Args:
response: 模型返回的识别结果
Returns:
包含物体信息的字典
"""
result = {
"object_name": "未知物体",
"appearance": "",
"scene": "",
"suggestion": "",
}
lines = response.strip().split("\n")
for line in lines:
line = line.strip()
if line.startswith("物体:") or line.startswith("物体:"):
result["object_name"] = line.split(":", 1)[-1].split(":", 1)[-1].strip()
elif line.startswith("外观:") or line.startswith("外观:"):
result["appearance"] = line.split(":", 1)[-1].split(":", 1)[-1].strip()
elif line.startswith("场景:") or line.startswith("场景:"):
result["scene"] = line.split(":", 1)[-1].split(":", 1)[-1].strip()
elif line.startswith("性格建议:") or line.startswith("性格建议:"):
result["suggestion"] = line.split(":", 1)[-1].split(":", 1)[-1].strip()
# 如果解析失败,尝试用整段文本作为 fallback
if result["object_name"] == "未知物体" and response.strip():
# 尝试提取第一行作为物体名
first_line = response.strip().split("\n")[0].strip()
if first_line and len(first_line) < 20:
result["object_name"] = first_line
result["appearance"] = response.strip()[:200]
return result
# 预设的物体-性格配对建议(用于快速匹配)
OBJECT_PERSONALITY_HINTS = {
"猫": "傲娇",
"狗": "温柔",
"杯子": "毒舌",
"键盘": "中二",
"手机": "傲娇",
"书": "温柔",
"花": "温柔",
"车": "中二",
"电脑": "毒舌",
"食物": "毒舌",
}
DEFAULT_PERSONALITY = "傲娇"