Spaces:
Sleeping
Sleeping
| import pandas as pd | |
| from random import choice | |
| from openai import OpenAI | |
| import os | |
| import re | |
| # 设置OpenAI API密钥和基础URL | |
| api_key = os.getenv("OPENAI_API_KEY") | |
| base_url = os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1") | |
| model_name = os.getenv("OPENAI_MODEL_NAME", "gpt-3.5-turbo") | |
| # 加载事件数据集 | |
| events = pd.read_csv('/app/src/datasets/cbt-triggering-events.csv', header=0) | |
| teen_events = ["在一次重要的考试中表现不佳,比如期末考试、升学考试(如中考或高考),导致自信心受挫。", | |
| "在学校里被同龄人孤立、嘲笑或遭受言语/身体上的霸凌,感到孤独无助。", | |
| "父母关系破裂并最终离婚,需要适应新的家庭环境,感到不安或缺乏安全感。", | |
| "陪伴多年的宠物突然生病或意外去世,第一次直面死亡的悲伤。", | |
| "因为家庭原因搬到了一个陌生的城市或学校,需要重新适应新环境和结交朋友。", | |
| "进入青春期后,身体发生明显变化(如长高、变声、月经初潮等),心理上也开始对自我形象产生困惑。", | |
| "参加一场期待已久的竞赛(如体育比赛、演讲比赛、艺术表演)但未能取得好成绩,感到失落。", | |
| "与最亲密的朋友发生争执甚至决裂,短时间内难以修复关系,陷入情绪低谷。", | |
| "家里的经济状况出现问题(如父母失业或生意失败),影响到日常生活,比如不能买喜欢的东西或参与课外活动。", | |
| "偶然间发现自己特别喜欢某件事情(如画画、编程、音乐、运动),并投入大量时间去练习,逐渐找到自信和成就感。"] | |
| def event_trigger(profile): | |
| """根据年龄选择触发事件(保持原逻辑)""" | |
| age = int(profile['age']) | |
| if age < 18: | |
| return choice(teen_events) | |
| elif age >= 65: | |
| return events[events['Age'] >= 60].sample(1)['Triggering_Event'].values[0] | |
| else: | |
| return events[(events['Age'] >= age-5) & (events['Age'] <= age+5)].sample(1)['Triggering_Event'].values[0] | |
| def situationalising_events(profile): | |
| """优化版情境生成函数""" | |
| client = OpenAI(api_key=api_key, base_url=base_url) | |
| event = event_trigger(profile) | |
| # 强化版提示词 | |
| prompt = f""" | |
| ### 情境生成任务 | |
| 请根据以下事件生成一个第二人称视角的情境描述。 | |
| ### 规则要求 | |
| 1. 必须使用第二人称(你/你的) | |
| 2. 不要包含任何个人信息(年龄/性别等) | |
| 3. 保持3-5句话的篇幅 | |
| 4. 直接输出情境描述,不要额外解释 | |
| ### 触发事件 | |
| {event} | |
| ### 示例输出 | |
| 你走进办公室时发现同事们突然停止交谈。桌上放着一封未拆的信件,周围人投来复杂的目光。 | |
| """ | |
| response = client.chat.completions.create( | |
| model=model_name, | |
| messages=[{"role": "user", "content": prompt}], | |
| temperature=0.8, # 适当创造性 | |
| max_tokens=150 | |
| ) | |
| raw_output = response.choices[0].message.content.strip() | |
| # 后处理 | |
| situation = re.sub(r'^(情境|描述|输出)[::]?\s*', '', raw_output) # 移除可能的前缀 | |
| situation = situation.split('\n')[0] # 取第一段 | |
| # 验证基本要求 | |
| # if "你" not in situation or "你的" not in situation: | |
| # print(f"情境生成警告:不符合第二人称要求,原始输出:\n{raw_output}") | |
| # return f"你{event}" # 保底处理 | |
| return situation | |
| # unit test | |
| # profile = { | |
| # "drisk": 3, | |
| # "srisk": 2, | |
| # "age": "42", | |
| # "gender": "女", | |
| # "marital_status": "离婚", | |
| # "occupation": "教师", | |
| # "symptoms": "缺乏自信心,自我价值感低,有自罪感,无望感;体重剧烈增加;精神运动性激越;有自杀想法" | |
| # } | |
| # print(situationalising_events(profile)) | |