不用联网、不花一分钱,这款开源“心灵守护者”10分钟帮你建起个人情绪疗愈站

1. 项目介绍

1.1 项目概述

心灵守护者是一个基于大语言模型的心理健康支持系统,旨在为用户提供个性化的心理健康服务。该项目结合了先进的自然语言处理技术与专业的心理健康评估工具,为用户提供情绪管理、心理评估、冥想引导、心理日记等全方位的心理健康管理功能。

1.2 项目背景

随着现代社会生活节奏的加快和压力的增加,心理健康问题日益普遍。传统的心理咨询服务存在资源有限、隐私顾虑、地域限制等问题,而AI驱动的心理健康助手可以作为一种便捷、低成本的补充方案,为用户提供初步的心理健康支持和指导。

1.3 核心功能

  • 个人资料管理:用户可设置个人基本信息和心理健康目标
  • 心理健康评估:支持PHQ-9抑郁自评量表和GAD-7焦虑自评量表
  • 情绪追踪:记录并可视化情绪变化趋势
  • 心理日记:记录心情与想法,获取AI分析反馈
  • AI心灵对话:与AI助手进行心理健康相关的对话交互
  • 冥想放松训练:提供多种类型和时长的冥想引导
  • 心理健康活动:推荐并记录有益心理健康的活动
  • 个性化建议:基于用户数据生成针对性的心理健康建议

2. 项目详细设计

2.1 系统架构

该项目采用了典型的前后端一体化设计,基于Python语言开发,使用Gradio构建Web界面,后端结合了大语言模型进行智能交互。系统架构主要分为以下几个层次:

  1. 用户界面层:基于Gradio构建的Web交互界面
  2. 业务逻辑层:实现各种心理健康功能的核心逻辑
  3. 数据存储层:JSON文件存储用户数据和心理健康记录
  4. AI模型层:基于Qwen2-7B-Instruct模型提供智能响应

2.2 数据流设计

系统中的数据主要包括用户资料、心理健康评估记录、情绪记录、日记记录、活动记录和冥想记录。这些数据通过以下流程进行管理:

  1. 用户通过界面输入数据
  2. 系统验证数据有效性并更新内存中的数据结构
  3. 定期将内存中的数据持久化到JSON文件
  4. 需要时从JSON文件加载数据到内存
  5. 数据分析和可视化组件从内存中读取数据进行处理

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 环境配置

  1. 安装Python 3.x

  2. 安装项目依赖:

    pip install -r requirements.txt

  3. 下载模型文件:

项目使用OpenMind的snapshot_download函数自动下载Qwen2-7B-Instruct模型

4. 项目代码分析

4.1 核心代码结构

整个项目的核心代码位于app.py文件中,代码结构清晰,功能模块划分合理:

  1. 导入模块与初始化(1-50行):导入必要的库并设置中文显示
  2. 模型加载与配置(50-75行):加载本地语言模型和配置回复长度
  3. 数据结构与存储(75-110行):定义用户资料和各类记录的数据结构
  4. 核心功能函数(110-450行):实现各种心理健康功能的函数
  5. 用户界面设计(450-850行):使用Gradio构建Web界面
  6. 回调函数绑定(850-950行):连接界面与功能函数
  7. 应用启动(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界面,主要包括以下标签页:

  1. 个人资料:设置用户基本信息和心理健康目标
  2. 心理健康评估:进行PHQ-9或GAD-7心理健康评估
  3. 情绪追踪:记录情绪并查看情绪变化趋势
  4. 脑日记:记录心情与想法,获取AI分析反馈
  5. AI心灵对话:与AI助手进行心理健康相关对话
  6. 脑放松与训练:提供冥想引导和放松技巧
  7. 心理健康活动:推荐并记录有益心理健康的活动

界面设计采用了现代化的UI风格,使用了渐变背景、圆角卡片、适当的间距和色彩搭配,提供了良好的用户体验。

5. 调试与优化

5.1 代码优化建议

5.1.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 "没有找到可备份的数据文件"
相关推荐
Amos_Web10 小时前
Rust实战课程--网络资源监控器(初版)
前端·后端·rust
程序猿小蒜10 小时前
基于springboot的基于智能推荐的卫生健康系统开发与设计
java·javascript·spring boot·后端·spring
渣哥10 小时前
IOC 容器的进化:ApplicationContext 在 Spring 中的核心地位
javascript·后端·面试
Gu_yyqx10 小时前
Spring 框架
java·后端·spring
demo007x10 小时前
如何让 Podman 使用国内镜像源,这是我见过最牛的方法
后端·程序员
疯狂踩坑人10 小时前
别再说我不懂Node"流"了
后端·node.js
aricvvang10 小时前
🚀 NestJS 使用 cache-manager-redis-store 缓存无效?真相在这里!
javascript·后端·nestjs
SimonKing10 小时前
【开发者必备】Spring Boot 2.7.x:WebMvcConfigurer配置手册来了(一)!
java·后端·程序员
oak隔壁找我10 小时前
Java Collection 包使用指南
java·后端