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)) | |