1. 项目介绍
1.1 项目概述
心灵守护者是一个基于大语言模型的心理健康支持系统,旨在为用户提供个性化的心理健康服务。该项目结合了先进的自然语言处理技术与专业的心理健康评估工具,为用户提供情绪管理、心理评估、冥想引导、心理日记等全方位的心理健康管理功能。
1.2 项目背景
随着现代社会生活节奏的加快和压力的增加,心理健康问题日益普遍。传统的心理咨询服务存在资源有限、隐私顾虑、地域限制等问题,而AI驱动的心理健康助手可以作为一种便捷、低成本的补充方案,为用户提供初步的心理健康支持和指导。
1.3 核心功能
- 个人资料管理:用户可设置个人基本信息和心理健康目标
- 心理健康评估:支持PHQ-9抑郁自评量表和GAD-7焦虑自评量表
- 情绪追踪:记录并可视化情绪变化趋势
- 心理日记:记录心情与想法,获取AI分析反馈
- AI心灵对话:与AI助手进行心理健康相关的对话交互
- 冥想放松训练:提供多种类型和时长的冥想引导
- 心理健康活动:推荐并记录有益心理健康的活动
- 个性化建议:基于用户数据生成针对性的心理健康建议
2. 项目详细设计
2.1 系统架构
该项目采用了典型的前后端一体化设计,基于Python语言开发,使用Gradio构建Web界面,后端结合了大语言模型进行智能交互。系统架构主要分为以下几个层次:
- 用户界面层:基于Gradio构建的Web交互界面
- 业务逻辑层:实现各种心理健康功能的核心逻辑
- 数据存储层:JSON文件存储用户数据和心理健康记录
- AI模型层:基于Qwen2-7B-Instruct模型提供智能响应
2.2 数据流设计
系统中的数据主要包括用户资料、心理健康评估记录、情绪记录、日记记录、活动记录和冥想记录。这些数据通过以下流程进行管理:
- 用户通过界面输入数据
- 系统验证数据有效性并更新内存中的数据结构
- 定期将内存中的数据持久化到JSON文件
- 需要时从JSON文件加载数据到内存
- 数据分析和可视化组件从内存中读取数据进行处理
2.3 主要模块设计
2.3.1 用户资料管理模块
makefile
# 用户资料结构
user_profile = {
"age": 30,
"gender": "女",
"occupation": "上班族",
"mental_health_goal": "减轻压力"
}
# 用户资料保存与加载
create_user_profile(age, gender, occupation, mental_health_goal)
load_user_profile()
2.3.2 心理健康评估模块
实现了PHQ-9(抑郁症筛查量表)和GAD-7(焦虑症筛查量表)两种标准化心理评估工具,通过计算得分给出相应的评估结果和建议。
ini
# PHQ-9 抑郁自评量表问题
phq9_questions = [
"做事时提不起劲或没有兴趣",
"感到心情低落、沮丧或绝望",
# ...其他问题
]
# 评估得分计算与结果判定
score, result, advice = calculate_assessment_result(assessment_type, answers)
2.3.3 情绪追踪模块
允许用户记录每日情绪状态,包括情绪评分、主要情绪类型和备注,并通过matplotlib生成情绪变化趋势图。
scss
# 记录情绪
record_mood(mood_score, main_emotion, notes)
# 绘制情绪趋势图
plot_mood_trend()
2.3.4 AI交互模块
基于本地部署的Qwen2-7B-Instruct大语言模型,实现了多种类型的AI交互功能,包括聊天对话、日记反馈、冥想引导和个性化建议等。
ini
# 生成AI回复
def generate_response(prompt, max_new_tokens=768):
inputs = tokenizer(prompt, return_tensors="pt").to("npu")
outputs = model.generate(
**inputs,
max_new_tokens=max_new_tokens,
do_sample=True,
temperature=0.7,
top_p=0.9,
repetition_penalty=1.1,
pad_token_id=tokenizer.eos_token_id
)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
clean_response = response.replace(prompt, "").strip()
return clean_response
2.3.5 数据持久化模块
负责将用户数据和心理健康记录保存到JSON文件,以及从文件中加载数据。
python
# 保存心理健康数据
def save_mental_health_data():
data = {
"mood_records": mood_records,
"assessment_records": assessment_records,
"thought_records": thought_records,
"activity_records": activity_records,
"meditation_records": meditation_records
}
try:
with open("mental_health_data.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
except Exception as e:
print(f"保存数据失败: {e}")
3. 项目环境
3.1 技术栈
技术/库 | 版本 | 用途 | 来源 |
---|---|---|---|
Python | 3.x | 主要开发语言 | |
Gradio | >=4.0.0 | Web界面构建 | |
PyTorch | >=2.1.0 | 深度学习框架 | |
torch_npu | >=2.1.0 | NPU硬件支持 | |
Transformers | >=4.41.0 | 预训练模型支持 | |
Matplotlib | - | 数据可视化 | |
OpenMind | - | 本地大模型支持 | |
Qwen2-7B-Instruct | - | 基础大语言模型 |
3.2 硬件要求
由于项目使用了大型语言模型,对硬件有一定要求:
- 支持NPU的计算设备(通过torch_npu库可以看出)
- 足够的内存和存储空间(存储模型文件和用户数据)
- 推荐使用GPU加速(如果NPU不可用)
3.3 环境配置
-
安装Python 3.x
-
安装项目依赖:
pip install -r requirements.txt
-
下载模型文件:
项目使用OpenMind的snapshot_download函数自动下载Qwen2-7B-Instruct模型
4. 项目代码分析
4.1 核心代码结构
整个项目的核心代码位于app.py文件中,代码结构清晰,功能模块划分合理:
- 导入模块与初始化(1-50行):导入必要的库并设置中文显示
- 模型加载与配置(50-75行):加载本地语言模型和配置回复长度
- 数据结构与存储(75-110行):定义用户资料和各类记录的数据结构
- 核心功能函数(110-450行):实现各种心理健康功能的函数
- 用户界面设计(450-850行):使用Gradio构建Web界面
- 回调函数绑定(850-950行):连接界面与功能函数
- 应用启动(950-973行):启动Web应用
4.2 关键算法与实现
4.2.1 AI响应生成算法
项目使用了本地部署的Qwen2-7B-Instruct大语言模型生成AI响应,关键实现在generate_response函数中:
ini
def generate_response(prompt, max_new_tokens=768):
inputs = tokenizer(prompt, return_tensors="pt").to("npu")
outputs = model.generate(
**inputs,
max_new_tokens=max_new_tokens,
do_sample=True,
temperature=0.7, # 控制生成文本的随机性
top_p=0.9, # 核采样参数
repetition_penalty=1.1, # 防止重复
pad_token_id=tokenizer.eos_token_id
)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
clean_response = response.replace(prompt, "").strip()
return clean_response
该函数接受提示文本和最大生成标记数作为输入,使用NPU加速生成回复,并对生成的回复进行清理,移除提示文本部分。
4.2.2 心理健康评估算法
项目实现了标准化的心理健康评估算法,根据不同类型的评估量表(PHQ-9或GAD-7)计算得分并给出相应的结果和建议:
python
def calculate_assessment_result(assessment_type, answers):
score = sum(answers)
if assessment_type == "PHQ-9 (抑郁评估)":
if score < 5:
return score, "正常范围", "您的情绪状态良好,请继续保持积极的生活方式。"
elif score < 10:
return score, "轻度抑郁", "您可能有轻度抑郁症状,建议多参与社交活动,保持规律作息。"
# ...其他情况
elif assessment_type == "GAD-7 (焦虑评估)":
# 类似的评分逻辑
# ...
4.2.3 情绪数据可视化
项目使用matplotlib库实现情绪数据的可视化,生成美观的情绪趋势图:
ini
def plot_mood_trend():
# 排序记录
sorted_records = sorted(mood_records)
dates, scores = zip(*[(record[0], record[1]) for record in sorted_records])
# 创建图表
plt.figure(figsize=(10, 5))
plt.plot(dates, scores, marker="o", linestyle="-", color="#9C27B0", linewidth=2.5, markersize=8, markerfacecolor="#E040FB")
# 添加填充区域和平均线
plt.fill_between(dates, scores, min(scores) * 0.9, alpha=0.2, color="#9C27B0")
avg_score = sum(scores) / len(scores)
plt.axhline(y=avg_score, color="#FF5722", linestyle="--", alpha=0.7, label=f"平均值: {avg_score:.1f}")
# 设置图表样式
plt.title("情绪趋势图", fontsize=16, pad=20, fontweight='bold')
plt.ylabel("情绪评分 (1-10)", fontsize=12)
plt.ylim(0, 11) # 设置y轴范围
plt.grid(True, linestyle="--", alpha=0.3)
plt.xticks(rotation=45, fontsize=10)
plt.legend()
plt.tight_layout()
# 保存图表
filepath = "mood_trend.png"
plt.savefig(filepath, dpi=120, bbox_inches='tight', facecolor='white')
plt.close()
return filepath
4.3 用户界面实现
项目使用Gradio库构建了美观、易用的Web界面,主要包括以下标签页:
- 个人资料:设置用户基本信息和心理健康目标
- 心理健康评估:进行PHQ-9或GAD-7心理健康评估
- 情绪追踪:记录情绪并查看情绪变化趋势
- 脑日记:记录心情与想法,获取AI分析反馈
- AI心灵对话:与AI助手进行心理健康相关对话
- 脑放松与训练:提供冥想引导和放松技巧
- 心理健康活动:推荐并记录有益心理健康的活动
界面设计采用了现代化的UI风格,使用了渐变背景、圆角卡片、适当的间距和色彩搭配,提供了良好的用户体验。
5. 调试与优化
5.1 代码优化建议
5.1.1 异常处理优化
当前代码在一些关键操作中已经实现了异常处理,但可以进一步优化:
- AI生成响应时的异常处理:
ini
def generate_response(prompt, max_new_tokens=768):
try:
inputs = tokenizer(prompt, return_tensors="pt").to("npu")
outputs = model.generate(
**inputs,
max_new_tokens=max_new_tokens,
do_sample=True,
temperature=0.7,
top_p=0.9,
repetition_penalty=1.1,
pad_token_id=tokenizer.eos_token_id
)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
clean_response = response.replace(prompt, "").strip()
return clean_response
except Exception as e:
print(f"生成响应时出错: {e}")
return "抱歉,我现在无法生成响应,请稍后再试。"
5.1.2 数据验证增强
加强对用户输入数据的验证,避免无效数据导致的错误:
python
def record_mood(mood_score, main_emotion, notes):
if not mood_score or not isinstance(mood_score, (int, float)) or mood_score < 1 or mood_score > 10:
return "请输入有效的情绪评分(1-10)!"
# 验证主要情绪是否在有效选项中
valid_emotions = ["开心", "平静", "焦虑", "抑郁", "愤怒", "悲伤", "兴奋", "疲惫", "紧张", "其他"]
if main_emotion not in valid_emotions:
return "请选择有效的情绪类型!"
# 继续原有逻辑...
5.1.3 数据结构优化
当前使用列表存储各类记录,可以考虑使用面向对象的方式优化数据结构:
ruby
class MentalHealthRecord:
def __init__(self, date, record_type, data):
self.date = date
self.record_type = record_type
self.data = data
def to_dict(self):
return {
"date": self.date,
"record_type": self.record_type,
"data": self.data
}
@classmethod
def from_dict(cls, dict_data):
return cls(dict_data["date"], dict_data["record_type"], dict_data["data"])
5.2 性能优化建议
5.2.1 模型加载优化
当前模型在每次应用启动时都会重新加载,可以考虑使用模型缓存机制:
python
def load_model_cached(model_path):
# 检查是否有缓存的模型实例
if not hasattr(load_model_cached, "cached_model") or not hasattr(load_model_cached, "cached_tokenizer"):
# 首次加载,缓存模型和分词器
load_model_cached.cached_tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
load_model_cached.cached_model = AutoModelForCausalLM.from_pretrained(
model_path, trust_remote_code=True
).to("npu").eval()
return load_model_cached.cached_tokenizer, load_model_cached.cached_model
5.2.2 数据保存频率优化
当前每次记录更新都会触发数据保存,可以考虑批量保存或定时保存机制:
python
def schedule_data_save(interval_seconds=300):
"""定时保存数据,避免频繁IO操作"""
import threading
def save_periodically():
while True:
time.sleep(interval_seconds)
save_mental_health_data()
# 启动后台保存线程
save_thread = threading.Thread(target=save_periodically, daemon=True)
save_thread.start()
5.3 功能扩展建议
5.3.1 添加用户认证系统
当前系统没有用户认证机制,可以添加简单的用户系统保护用户隐私:
ruby
# 简单的用户管理
users = {}
class User:
def __init__(self, username, password_hash):
self.username = username
self.password_hash = password_hash
self.profile = {}
self.records = {}
def authenticate(self, password):
return hashlib.sha256(password.encode()).hexdigest() == self.password_hash
5.3.2 添加数据备份和恢复功能
为用户数据提供备份和恢复功能,防止数据丢失:
python
def backup_data(backup_dir="./backups"):
import shutil
import time
# 创建备份目录
os.makedirs(backup_dir, exist_ok=True)
# 生成备份文件名
timestamp = time.strftime("%Y%m%d_%H%M%S")
backup_file = os.path.join(backup_dir, f"mental_health_data_{timestamp}.json")
# 复制数据文件
if os.path.exists("mental_health_data.json"):
shutil.copy2("mental_health_data.json", backup_file)
return f"数据已备份到: {backup_file}"
return "没有找到可备份的数据文件"