main
HuangHai 4 months ago
parent f5d1a9b4c2
commit 84726c7a71

@ -0,0 +1,68 @@
10个中小学生心理异常对话示例
1. 社交焦虑
学生:"老师,我...我明天能不能不参加演讲?我一想到要站在全班面前说话,就心跳加速,手心冒汗...我怕说错话被大家笑话。"
2. 注意力缺陷ADHD
学生:"我知道上课应该认真听讲,但我总是控制不住自己...窗外一点声音我就分心,作业写着写着就开始玩笔,明明想好好学习的..."
3. 抑郁情绪
学生:"最近觉得做什么都没意思,连最喜欢的篮球也不想打了...晚上睡不着,早上又起不来,有时候觉得活着好累..."
4. 强迫行为
学生:"我每次写完作业都要检查5遍少一遍就心里特别难受...明知道可能没必要,但就是停不下来。"
5. 家庭暴力创伤
学生:"我爸一喝酒就会发脾气砸东西...我现在听到大声说话就会发抖,上课也老是走神,总担心回家又会..."
6. 身体形象焦虑
学生:"班里同学都说我胖,我现在每天只吃一顿饭...可是饿得头晕还是觉得自己不够瘦,怎么办?"
7. 学习障碍
学生:"那些数学题其他同学都能听懂,可我就是理解不了...每次考试都垫底,我是不是真的很笨?"
8. 自伤倾向
学生:(展示手臂划痕)"心里难受的时候,这样会舒服一点...不过您别告诉我妈妈好吗?"
9. 分离焦虑
小学生:"我不想上学!我要妈妈!如果妈妈不来接我怎么办?万一她忘记了呢?"(持续哭泣)
10. 网络成瘾
学生:"我知道该写作业,但手机一响就忍不住看...昨晚本来想玩10分钟结果又打到凌晨3点..."
这些对话可以用于心理评估工具的案例参考,实际应用中需注意结合专业测评量表,并由心理老师跟进访谈。需要我针对某个案例提供更详细的分析框架吗?
再生成10个
10个中小学生心理异常对话示例第二组
1. 考试焦虑
学生:"每次考试前我都会肚子痛,明明复习得很好,但一拿到试卷脑子就一片空白...上次月考我的手抖得连名字都写不好。"
2. 选择性缄默
老师:"为什么你从来不回答课堂提问呢?"
学生:(低头沉默,手指绞紧衣角)(课后纸条)"我想说话,但声音像被卡住了..."
3. 创伤后应激反应
学生:"自从上次地震演习后,我每晚都做噩梦...现在听到消防车的声音就会躲到课桌下面,我知道很丢脸但控制不住。"
4. 拔毛癖
心理老师:"你额角的头发怎么这么稀疏?"
学生:"压力大的时候就会不自觉拔头发...等发现时已经扯掉一大把了,现在都不敢扎马尾辫。"
5. 性别认同困惑
初中生:"我讨厌体育课换衣服...总觉得这个身体不属于我。班上的男生都笑我'娘娘腔',可我真的不想当男生..."
6. 幻觉体验
学生:"老师,您听到有人在走廊叫我名字吗?...没有吗?可这周已经第三次了,明明很清楚的声音..."
7. 偷窃癖
学生:"我不是缺这些东西...但看到同学漂亮的橡皮就忍不住拿走,藏在自己笔袋里又觉得特别后悔..."
8. 转换障碍
家长:"医生说他眼睛没问题,但就是突然看不清黑板...最近我离婚的事被他知道了..."
9. 病理性说谎
班主任:"你说奶奶住院才没写作业,可家长说奶奶去旅游了?"
学生:"我...其实是因为...(不断编造新理由,眼神飘忽)"
10. 社交孤立
转学生:"午餐时他们都把饭盒移开...体育课组队永远最后剩我。上周我课桌里发现了'滚回你的学校'的纸条..."

@ -37,6 +37,9 @@ MYSQL_DB_NAME = "ai_db"
# JWT密匙
JWT_SECRET_KEY = "DsideaL4r5t6y7u"
# 配置 JWT
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 24 * 60 * 30 # 一个月有效期
# ----------------下面的配置需要根据情况进行修改-------------------------
'''

@ -26,10 +26,6 @@ from WxMini.Utils.TtsUtil import TTS
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
logger = logging.getLogger(__name__)
# 配置 JWT
SECRET_KEY = "DsideaL4r5t6y7u" # 替换为你的密钥
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 24 * 60 * 30 # 一个月有效期
# 密码加密上下文
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
# OAuth2 密码模式
@ -83,31 +79,38 @@ async def on_session_end(person_id):
history = "无聊天记录"
# 将历史聊天记录发给大模型,让它帮我分析一下
with open("Input.txt", "r", encoding="utf-8") as file:
input_word = file.read()
prompt = (
"我将把用户与AI大模型交流的记录发给你帮我分析一下这个用户是否存在心理健康方面的问题"
"参考1、PHQ-9抑郁症筛查量表和2、Beck自杀意念评量表BSI-CV"
f"参考分类文档内容如下:{input_word}"
"如果没有健康问题请回复: OK否则回复NO换行后再输出是什么问题。"
f"\n\n历史聊天记录:{history}"
)
response = await client.chat.completions.create(
model=MODEL_NAME,
messages=[
{"role": "system", "content": "你是一个心理健康分析助手,负责分析用户的心理健康状况。"},
{"role": "user", "content": prompt}
],
max_tokens=1000
)
# 使用 asyncio.create_task 异步执行大模型调用
async def analyze_mental_health():
response = await client.chat.completions.create(
model=MODEL_NAME,
messages=[
{"role": "system", "content": "你是一个心理健康分析助手,负责分析用户的心理健康状况。"},
{"role": "user", "content": prompt}
],
max_tokens=1000
)
# 处理分析结果
if response.choices and response.choices[0].message.content:
analysis_result = response.choices[0].message.content.strip()
if analysis_result.startswith("NO"):
# 异步执行 update_risk
asyncio.create_task(update_risk(app.state.mysql_pool, person_id, analysis_result))
logger.info(f"已异步更新 person_id={person_id} 的风险状态。")
else:
logger.info(f"AI大模型没有发现任何心理健康问题用户会话 {person_id} 没有风险。")
# 处理分析结果
if response.choices and response.choices[0].message.content:
analysis_result = response.choices[0].message.content.strip()
if analysis_result.startswith("NO"):
# 异步执行 update_risk
await update_risk(app.state.mysql_pool, person_id, analysis_result)
logger.info(f"已异步更新 person_id={person_id} 的风险状态。")
else:
logger.info(f"AI大模型没有发现任何心理健康问题用户会话 {person_id} 没有风险。")
# 创建异步任务
asyncio.create_task(analyze_mental_health())
# 初始化 FastAPI 应用
@ -133,7 +136,7 @@ def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
else:
expire = datetime.utcnow() + timedelta(minutes=15)
to_encode.update({"exp": expire})
encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
encoded_jwt = jwt.encode(to_encode, JWT_SECRET_KEY, algorithm=ALGORITHM)
return encoded_jwt
@ -145,7 +148,7 @@ async def get_current_user(token: str = Depends(oauth2_scheme)):
headers={"WWW-Authenticate": "Bearer"},
)
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
payload = jwt.decode(token, JWT_SECRET_KEY, algorithms=[ALGORITHM])
login_name: str = payload.get("sub")
if login_name is None:
raise credentials_exception

@ -171,11 +171,10 @@ async def get_user_by_login_name(mysql_pool, login_name: str) -> Optional[Dict]:
return dict(zip(columns, row))
# 查询聊天记录
async def get_chat_logs_by_risk_flag(mysql_pool, risk_flag: int, offset: int, page_size: int) -> (List[Dict], int):
"""
根据风险标志查询聊天记录
:param pool: MySQL 连接池
:param mysql_pool: MySQL 连接池
:param risk_flag: 风险标志
:param offset: 分页偏移量
:param page_size: 每页记录数
@ -188,7 +187,7 @@ async def get_chat_logs_by_risk_flag(mysql_pool, risk_flag: int, offset: int, pa
SELECT
tcl.id, tcl.user_input, tcl.model_response, tcl.audio_url, tcl.duration,
tcl.create_time, tcl.risk_flag, tcl.risk_memo, tcl.risk_result,
tbp.*
tbp.person_id, tbp.login_name, tbp.person_name
FROM t_chat_log AS tcl
INNER JOIN t_base_person AS tbp ON tcl.person_id = tbp.person_id
WHERE tcl.risk_flag = %s
@ -197,6 +196,9 @@ async def get_chat_logs_by_risk_flag(mysql_pool, risk_flag: int, offset: int, pa
await cursor.execute(sql, (risk_flag, page_size, offset))
rows = await cursor.fetchall()
# 在 count_sql 执行前获取列名
columns = [column[0] for column in cursor.description]
# 查询总记录数
count_sql = """
SELECT COUNT(*)
@ -207,9 +209,14 @@ async def get_chat_logs_by_risk_flag(mysql_pool, risk_flag: int, offset: int, pa
await cursor.execute(count_sql, (risk_flag,))
total = (await cursor.fetchone())[0]
# 将元组转换为字典
# 将元组转换为字典,并格式化 create_time
if rows:
columns = [column[0] for column in cursor.description]
logs = [dict(zip(columns, row)) for row in rows]
logs = []
for row in rows:
log = dict(zip(columns, row))
# 格式化 create_time
if log["create_time"]:
log["create_time"] = log["create_time"].strftime("%Y-%m-%d %H:%M:%S")
logs.append(log)
return logs, total
return [], 0
return [], 0
Loading…
Cancel
Save