diff --git a/src/classes/persona.py b/src/classes/persona.py index 9b90433..6935520 100644 --- a/src/classes/persona.py +++ b/src/classes/persona.py @@ -15,7 +15,8 @@ class Persona: id: int name: str prompt: str - exclusion_ids: List[int] + exclusion_ids: List[int] + weight: float def _load_personas() -> tuple[dict[int, Persona], dict[str, Persona]]: """从配表加载persona数据""" @@ -29,12 +30,17 @@ def _load_personas() -> tuple[dict[int, Persona], dict[str, Persona]]: exclusion_ids = [] if exclusion_ids_str: exclusion_ids = [int(x.strip()) for x in exclusion_ids_str.split(ids_separator) if x.strip()] + # 解析权重(缺失或为 NaN 时默认为 1.0),避免不必要的异常 + weight_val = row.get("weight", 1) + weight_str = str(weight_val).strip() + weight = float(weight_str) if weight_str and weight_str.lower() != "nan" else 1.0 persona = Persona( id=int(row["id"]), name=str(row["name"]), prompt=str(row["prompt"]), - exclusion_ids=exclusion_ids + exclusion_ids=exclusion_ids, + weight=weight, ) personas_by_id[persona.id] = persona personas_by_name[persona.name] = persona @@ -59,16 +65,17 @@ def get_random_compatible_personas(num_personas: int = 2) -> List[Persona]: """ all_persona_ids = set(personas_by_id.keys()) - selected_personas = [] + selected_personas: List[Persona] = [] available_ids = all_persona_ids.copy() for i in range(num_personas): if not available_ids: raise ValueError(f"只能找到{i}个兼容的persona,无法满足需要的{num_personas}个") - - # 从可用列表中随机选择一个 - selected_id = random.choice(list(available_ids)) - selected_persona = personas_by_id[selected_id] + # 按权重从可用列表中选择一个 + candidates: List[Persona] = [personas_by_id[i] for i in available_ids] + weights: List[float] = [max(0.0, c.weight) for c in candidates] + selected_persona = random.choices(candidates, weights=weights, k=1)[0] + selected_id = selected_persona.id selected_personas.append(selected_persona) # 更新可用列表:移除已选择的和与其互斥的 diff --git a/src/utils/df.py b/src/utils/df.py index cf0d77e..09f0d75 100644 --- a/src/utils/df.py +++ b/src/utils/df.py @@ -12,6 +12,7 @@ def load_csv(path: Path) -> pd.DataFrame: "name": str, "description": str, "prompt": str, + "weight": float, } for column, dtype in row_types.items(): if column in df.columns: diff --git a/static/game_configs/persona.csv b/static/game_configs/persona.csv index 2230f3e..923b693 100644 --- a/static/game_configs/persona.csv +++ b/static/game_configs/persona.csv @@ -1,24 +1,26 @@ -id,name,exclusion_ids,prompt -,,和本persona互斥的persona的id,输入给LLM的prompt -1,理性,2;5,你是一个理性的人,你总是会用逻辑来思考问题,做事会谋定而后动。 -2,无常,1;9;20,你是一个无常的人,目标飘忽不定,不会长期坚持一个目标。 -3,怠惰,4;20,你是一个怠惰的人,你总是会拖延,不想努力,更热衷于享受人生。 -4,冒险,3;10,你是一个冒险的人,你总是会冒险,喜欢刺激,总想放手一搏。 -5,随性,1;20,你是一个随性的人,你总是会随机应变,性子到哪里了就是哪里,没有一定之规。 -6,贪财,,你是一个贪财的人,你对灵石和财富有着强烈的渴望。 -7,采药,,你是一个热爱采集的人,喜欢在山林中寻找各种奇花异草和灵药,对植物有着敏锐的直觉和深厚的兴趣。你认为大自然的恩赐需要用心去发现和珍惜。 -8,猎者,,你是一个热爱狩猎的人,享受在野外追踪猎物的刺激感,对各种动物的习性了如指掌。你相信通过狩猎能够磨练自己的意志和技能,获得更强大的力量。 -9,沉思,2,你是一个沉思的人,你总是会深思熟虑,思考问题比较有哲理。 -10,惜命,4;20,你是一个惜命的人,你总是会珍惜自己的生命,不会轻易冒险。 -11,友爱,13;14;15;12;20,你是一个友爱的人,你重视同伴与和谐,乐于助人,倾向通过协作与沟通化解矛盾。 -12,复仇,11;14,你是一个复仇心强的人,你绝不轻易放下仇怨,为了复仇愿意付出代价与时间。 -13,孤僻,11,你是一个孤僻的人,你喜欢独处,避免与人深交,更信赖自己的判断与行动。 -14,淡漠,11;12;15;20,你是一个淡漠的人,你情感克制,对外界冷静疏离,不轻易被他人或事件影响。 -15,好斗,11;14;10;17,你是一个好斗的人,你直面冲突,偏好以力量与对抗解决问题,越挫越勇。 -16,鲁莽,1;9;10,你是一个鲁莽的人,你行事冲动、少考虑后果,常凭直觉立刻行动。 -17,胆小,4;15;12;20,你是一个胆小的人,你谨小慎微,容易畏惧风险,倾向回避正面冲突。 -18,霸道,11;17,你是一个霸道的人,你行事强势,不讲道理,习惯以自己的利益为先,倾向多吃多占、压人一步,对他人的反对不以为意。 -19,修行痴迷,2;3;5,你是一个对修行极度痴迷的人,你将绝大多数时间用于修炼,厌恶与修行无关的社交与享乐。 -20,极端,11;14;2;5;3;10;17,你是一个极端的人,你仇视对立阵营,如果你是正义阵营,那么你极度正义;如果你是邪恶阵营,那么你极度邪恶。 -21,内向,22,你是一个内向的人,你更享受独处与自我思考,倾向回避不必要的社交与长谈。 -22,外向,13;14;21,你是一个外向的人,你乐于与人交流,主动结识伙伴,倾向接受对话和合作。 +id,name,exclusion_ids,prompt,weight +,,和本persona互斥的persona的id,输入给LLM的prompt,采样时不同权重被采样到的概率 +1,理性,2;5,你是一个理性的人,你总是会用逻辑来思考问题,做事会谋定而后动。,1 +2,无常,1;9;20,你是一个无常的人,目标飘忽不定,不会长期坚持一个目标。,1 +3,怠惰,4;20,你是一个怠惰的人,你总是会拖延,不想努力,更热衷于享受人生。,1 +4,冒险,3;10,你是一个冒险的人,你总是会冒险,喜欢刺激,总想放手一搏。,1 +5,随性,1;20,你是一个随性的人,你总是会随机应变,性子到哪里了就是哪里,没有一定之规。,1 +6,贪财,,你是一个贪财的人,你对灵石和财富有着强烈的渴望。,1 +7,采药,,你是一个热爱采集的人,喜欢在山林中寻找各种奇花异草和灵药,对植物有着敏锐的直觉和深厚的兴趣。你认为大自然的恩赐需要用心去发现和珍惜。,1 +8,猎者,,你是一个热爱狩猎的人,享受在野外追踪猎物的刺激感,对各种动物的习性了如指掌。你相信通过狩猎能够磨练自己的意志和技能,获得更强大的力量。,1 +9,沉思,2,你是一个沉思的人,你总是会深思熟虑,思考问题比较有哲理。,1 +10,惜命,4;20,你是一个惜命的人,你总是会珍惜自己的生命,不会轻易冒险。,1 +11,友爱,13;14;15;12;20,你是一个友爱的人,你重视同伴与和谐,乐于助人,倾向通过协作与沟通化解矛盾。,1 +12,复仇,11;14,你是一个复仇心强的人,你绝不轻易放下仇怨,为了复仇愿意付出代价与时间。,1 +13,孤僻,11,你是一个孤僻的人,你喜欢独处,避免与人深交,更信赖自己的判断与行动。,1 +14,淡漠,11;12;15;20,你是一个淡漠的人,你情感克制,对外界冷静疏离,不轻易被他人或事件影响。,1 +15,好斗,11;14;10;17,你是一个好斗的人,你直面冲突,偏好以力量与对抗解决问题,越挫越勇。,1 +16,鲁莽,1;9;10,你是一个鲁莽的人,你行事冲动、少考虑后果,常凭直觉立刻行动。,1 +17,胆小,4;15;12;20,你是一个胆小的人,你谨小慎微,容易畏惧风险,倾向回避正面冲突。,1 +18,霸道,11;17,你是一个霸道的人,你行事强势,不讲道理,习惯以自己的利益为先,倾向多吃多占、压人一步,对他人的反对不以为意。,1 +19,修行痴迷,2;3;5,你是一个对修行极度痴迷的人,你将绝大多数时间用于修炼,厌恶与修行无关的社交与享乐。,1 +20,极端,11;14;2;5;3;10;17,你是一个极端的人,你仇视对立阵营,如果你是正义阵营,那么你极度正义;如果你是邪恶阵营,那么你极度邪恶。,1 +21,内向,22,你是一个内向的人,你更享受独处与自我思考,倾向回避不必要的社交与长谈。,1 +22,外向,13;14;21,你是一个外向的人,你乐于与人交流,主动结识伙伴,倾向接受对话和合作。,1 +23,刻薄,11;24,你是一个刻薄的人,你在对话中倾向以讽刺、嘲弄、挖苦的方式表达自己,更容易引发冲突与对立;你对他人的弱点与错误毫不留情,偏向以攻击性语言试探或压制对方;你通常不愿迅速进入友好关系,更可能在不顺利的交流后滋生敌意或结仇。,1 +24,热情,13;14;23,你是一个热情的人,你待人友好、积极回应,倾向用鼓励与赞美拉近距离;你更愿意主动展开善意的交流,乐于合作与分享;在大多数情况下你避免激化矛盾,更倾向于促成友好关系并保持和气。,1