diff --git a/AI/WxMini/Input.txt b/AI/WxMini/Input.txt new file mode 100644 index 00000000..31c4b187 --- /dev/null +++ b/AI/WxMini/Input.txt @@ -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. 社交孤立 +转学生:"午餐时他们都把饭盒移开...体育课组队永远最后剩我。上周我课桌里发现了'滚回你的学校'的纸条..." \ No newline at end of file diff --git a/AI/WxMini/Milvus/Config/MulvusConfig.py b/AI/WxMini/Milvus/Config/MulvusConfig.py index 15634e42..385f09a4 100644 --- a/AI/WxMini/Milvus/Config/MulvusConfig.py +++ b/AI/WxMini/Milvus/Config/MulvusConfig.py @@ -37,6 +37,9 @@ MYSQL_DB_NAME = "ai_db" # JWT密匙 JWT_SECRET_KEY = "DsideaL4r5t6y7u" +# 配置 JWT +ALGORITHM = "HS256" +ACCESS_TOKEN_EXPIRE_MINUTES = 24 * 60 * 30 # 一个月有效期 # ----------------下面的配置需要根据情况进行修改------------------------- ''' diff --git a/AI/WxMini/Start.py b/AI/WxMini/Start.py index 740a4446..bbb7f40f 100644 --- a/AI/WxMini/Start.py +++ b/AI/WxMini/Start.py @@ -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 diff --git a/AI/WxMini/Utils/MySQLUtil.py b/AI/WxMini/Utils/MySQLUtil.py index 4155b90d..de17ca30 100644 --- a/AI/WxMini/Utils/MySQLUtil.py +++ b/AI/WxMini/Utils/MySQLUtil.py @@ -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 \ No newline at end of file