智能健康生态:NPU赋能的个性化健康改善体系

项目介绍

智能健康管理助手是一个基于AI技术的个人健康管理应用,旨在为用户提供个性化的健康建议、饮食计划和健康数据分析。该应用通过友好的Web界面,帮助用户轻松记录日常健康数据,并利用本地大语言模型生成专业的健康指导。

主要功能亮点

  1. 个人健康数据记录:支持体重、运动、睡眠和饮食等健康数据的日常记录
  2. 数据可视化:提供体重趋势图表等直观数据展示
  3. 个性化健康建议:基于用户健康数据和目标,生成专业的健康改善建议
  4. 科学饮食计划:根据用户情况和健康目标,生成每日饮食计划
  5. 全面健康报告:综合分析用户健康数据,生成详细的健康状况报告
  6. 健康知识普及:提供健康小贴士和基础知识,提升用户健康意识

应用场景

  1. 个人日常健康管理和数据追踪
  2. 健康生活方式的培养和坚持
  3. 体重管理和饮食控制辅助
  4. 运动和睡眠习惯的改善指导

项目详细设计

系统架构

模块

技术

说明

前端

Gradio Soft 主题

零前端代码,响应式

推理

openmind 0.8.1

FP16,未量化

存储

本地 JSON

无数据库,易备份

图表

Matplotlib

中文抗锯齿,dpi=120

核心功能模块

数据管理模块
  1. 用户资料管理:创建、保存和加载用户基本信息(年龄、性别、身高、健康目标等)
  2. 健康数据记录:支持体重、运动、睡眠和饮食数据的添加和持久化
  3. 数据文件操作:使用JSON格式存储数据,支持自动加载和保存
AI交互模块
  1. 本地模型加载:加载OpenMind框架的Qwen2-7B-Instruct大语言模型
  2. 智能回复生成:根据提示词生成健康建议、饮食计划和健康报告
  3. 回复内容优化:实现智能截断,确保内容在合理长度范围内
数据分析模块
  1. BMI计算与分类:根据身高体重计算BMI指数并判断体重状况
  2. 健康趋势分析:分析体重变化趋势、运动频率和睡眠质量
  3. 数据统计汇总:计算平均睡眠时长、运动天数等健康指标
可视化模块
  1. 体重趋势图表:使用matplotlib生成美观的体重变化趋势图
  2. 健康数据仪表盘:展示关键健康指标的统计卡片
用户界面模块
  1. 交互式表单:用于用户资料和健康数据的输入
  2. 信息展示区:显示健康建议、报告和图表
  3. 导航与布局:使用标签页和分栏布局,提升用户体验

数据流向

  1. 用户通过Gradio界面输入个人资料或健康数据
  2. 系统对输入数据进行验证和处理
  3. 处理后的数据被保存到相应的JSON文件中
  4. 当用户请求生成健康建议、饮食计划或健康报告时,系统:
    • 读取相关健康数据
    • 准备提示词模板
    • 调用本地AI模型生成回复
    • 对回复进行处理并展示给用户
  5. 用户可以查看数据可视化图表和健康概览信息

项目部署

硬件

  1. NPU:Ascend 910B ≥ 32 GB(或 3080Ti 24 GB 需量化)
  2. 内存:≥ 32 GB(模型 13 GB + 峰值缓存)
  3. 磁盘:≥ 30 GB(模型 13 GB + 日志/备份)

软件

  1. OS:Ubuntu 20.04/22.04
  2. CANN:≥ 6.3.RC2
  3. Python:3.9 ~ 3.10
  4. Git & pip:最新版

校验脚本

  1. python check_env.py
    # 输出 ALL GREEN 即可继续

一键部署

  1. # 1. 创建虚拟环境
    conda create -n shc python=3.10 -y && conda activate shc
    
    # 2. 安装依赖
    pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
    
    # 3. 下载模型(断点续传)
    python download_model.py --model Shanghai_Ascend/Qwen2-7B-Instruct --save_dir ./model
    
    # 4. 启动
    python app.py --host 0.0.0.0 --port 7860 --npu 0

项目代码结构

主要代码文件

  1. Test.py:主应用文件,包含所有核心功能和界面代码
  2. requirements.txt:项目依赖声明文件
  3. health_data.json:用户健康数据存储文件(自动生成)
  4. user_profile.json:用户资料存储文件(自动生成)
  5. weight_trend.png:体重趋势图(自动生成)

代码模块详解

导入与配置
  1. # 导入必要的库
    import gradio as gr
    import matplotlib.pyplot as plt
    import numpy as np
    import datetime
    import os
    import json
    from datetime import datetime, timedelta
    import torch
    from openmind import AutoModelForCausalLM, AutoTokenizer
    from openmind_hub import snapshot_download
    
    # 确保中文显示正常
    plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]

这部分代码导入了项目所需的所有库,并设置了matplotlib的中文字体支持,确保图表中的中文能正确显示。

AI模型初始化
  1. # ----------------- 加载本地模型 (OpenMind) -----------------
    MODEL_NAME = "Shanghai_Ascend/Qwen2-7B-Instruct"
    model_path = snapshot_download(MODEL_NAME, resume_download=True)
    
    tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
    model = AutoModelForCausalLM.from_pretrained(
        model_path, trust_remote_code=True
    ).to("npu").eval()

这部分代码负责下载和加载本地大语言模型,使用了OpenMind框架的Qwen2-7B-Instruct模型,并将其部署到NPU上以加速推理。

配置与工具函数
  1. # ----------------- 回复长度配置 -----------------
    RESPONSE_LENGTH_CONFIG = {
        "health_advice": 1024,   # 健康建议
        "diet_plan": 768,        # 饮食计划
        "health_report": 1280,   # 健康报告
    }
    
    def get_max_tokens(function_type):
        return RESPONSE_LENGTH_CONFIG.get(function_type, 768)
    
    def truncate_response(text, max_chars=1500):
        """智能截断回复,确保在字符限制内"""
        # 实现智能截断逻辑

这部分代码定义了不同类型内容的最大生成长度,并实现了一个智能截断函数,确保AI生成的回复不会过长,并尽量在合适的标点符号处截断。

数据结构定义
  1. # 模拟数据
    user_profile = {
        "age": 30,
        "gender": "女",
        "height": 160,
        "goal": "保持健康"
    }
    
    # 健康数据记录
    weight_records = []  # [(日期, 体重)]
    exercise_records = []  # [(日期, 类型, 时长, 强度)]
    food_records = []  # [(日期, 餐次, 食物, 份量)]
    sleep_records = []  # [(日期, 入睡时间, 起床时间)]

这部分定义了应用中使用的主要数据结构,包括用户资料和各类健康记录的存储格式。

核心功能函数

项目包含多个核心功能函数,主要包括:

  1. AI回复生成generate_response()
  2. 健康建议生成generate_health_advice()
  3. 饮食计划生成generate_diet_plan()
  4. 健康报告生成generate_health_report()
  5. 数据记录函数record_weight(), record_exercise(), record_sleep(), record_food()
  6. 数据管理函数save_health_data(), load_health_data(), create_user_profile(), load_user_profile()
  7. 可视化函数plot_weight_trend()
  8. 辅助函数get_bmi_category(), get_health_trends()

每个函数都有明确的职责,共同构成了应用的核心功能体系。

Gradio界面设计

应用使用Gradio构建了一个美观、易用的Web界面,主要包括:

  1. # Gradio 界面
    with gr.Blocks(
        theme=gr.themes.Soft(
            primary_hue="green",
            secondary_hue="blue",
            neutral_hue="slate"
        ),
        title="�� 智能健康管理助手",
        css="""
        # 自定义CSS样式
        """
    ) as demo:
        # 界面组件定义和布局
        # 事件绑定

界面布局采用了选项卡式设计,分为个人资料、健康数据记录、健康建议等多个功能区块,并通过自定义CSS样式提升了视觉体验。

应用启动
  1. # 启动应用
    print("启动应用界面...")
    try:
        demo.launch(
            server_name="0.0.0.0",
            server_port=7860,
            share=False,
            debug=False
        )
    except Exception as e:
        print(f"应用启动异常: {e}")

这部分代码负责启动Gradio应用,并设置了异常捕获,确保应用出现问题时能给出友好的错误提示。

代码功能解析

数据记录与存储功能

项目实现了完整的健康数据记录功能,以体重记录为例:

  1. def record_weight(weight):
        if not weight or float(weight) <= 0:
            return "请输入有效的体重数据!"
        
        today = datetime.now().strftime("%Y-%m-%d")
        weight_records.append((today, float(weight)))
        
        # 保存到文件
        save_health_data()
        
        return f"✅ 体重数据已记录:{today} - {weight}kg"

该函数首先验证输入的有效性,然后记录当前日期和体重数据,最后调用save_health_data()函数将数据持久化到文件中。

AI建议生成功能

健康建议生成是项目的核心功能之一,实现如下:

  1. def generate_health_advice(profile, weight_trend=None, exercise_freq=None, sleep_quality=None):
        # 准备用户数据摘要
        user_data_summary = f"用户资料:{profile['age']}岁,{profile['gender']},身高{profile['height']}cm,健康目标:{profile['goal']}\n"
        
        # 添加健康数据趋势
        if weight_trend:
            user_data_summary += f"体重趋势:{weight_trend}\n"
        # ... 其他数据趋势添加
        
        max_tokens = get_max_tokens("health_advice")
        prompt = f"""你是一位专业的健康管理顾问,请根据用户的资料和健康数据,生成个性化的健康建议:
    
    {user_data_summary}
    
    请从以下几个方面提供详细的健康建议:
    1. 体重管理和饮食建议(如果有体重数据)
    2. 运动和体能提升建议
    3. 睡眠质量改善建议
    4. 日常生活习惯调整建议
    5. 压力管理建议
    
    请用温暖、专业的语言,给出具体可行的建议,而不是泛泛而谈。使用适当的表情符号来增强可读性。"""
        
        response = generate_response(prompt, max_new_tokens=max_tokens)
        return truncate_response(response)

该函数首先构建包含用户信息和健康数据的摘要,然后创建详细的提示词模板,调用AI模型生成回复,并最后对回复进行智能截断处理。

数据可视化功能

项目实现了体重趋势图的可视化功能:

  1. def plot_weight_trend():
        if not weight_records:
            return "请先记录体重数据!"
        
        dates, weights = zip(*sorted(weight_records))
        
        plt.figure(figsize=(10, 5))
        plt.plot(dates, weights, marker="o", linestyle="-", color="#4CAF50", linewidth=2.5, markersize=8, markerfacecolor="#FF9800")
        
        # 填充区域
        plt.fill_between(dates, weights, min(weights) * 0.95, alpha=0.2, color="#4CAF50")
        
        plt.title("体重趋势图", fontsize=16, pad=20, fontweight='bold')
        plt.ylabel("体重 (kg)", fontsize=12)
        plt.grid(True, linestyle="--", alpha=0.3)
        plt.xticks(rotation=45, fontsize=10)
        plt.tight_layout()
        
        filepath = "weight_trend.png"
        plt.savefig(filepath, dpi=120, bbox_inches='tight', facecolor='white')
        plt.close()
        return filepath

该函数使用matplotlib创建一个美观的体重趋势图,设置了自定义颜色、标记和样式,并保存为PNG文件供界面展示。

用户界面交互

界面设计采用了模块化和分层的方式,以健康建议选项卡为例:

  1. # 健康建议和饮食计划
    with gr.Tab("�� 健康建议"):
        with gr.Row():
            with gr.Column(scale=5):
                gr.Markdown("### 个性化健康建议")
                advice_output = gr.Textbox(label="健康建议", lines=12, interactive=False, elem_classes="response-box")
                generate_advice_btn = gr.Button("生成建议", variant="primary", size="lg")
            
            with gr.Column(scale=5):
                gr.Markdown("### 今日饮食计划")
                diet_plan_output = gr.Textbox(label="饮食计划", lines=12, interactive=False, elem_classes="response-box")
                generate_diet_btn = gr.Button("生成饮食计划", variant="primary", size="lg")
                
                gr.Markdown("### 今日健康小贴士")
                tips_output = gr.Textbox(label="健康小贴士", lines=4, interactive=False, elem_classes="warning-box", value="�� 今天记得喝够8杯水哦!\n�� 不要久坐,每小时起来活动5分钟。\n�� 保持好心情,笑一笑,十年少!")
    
    # 事件绑定
    generate_advice_btn.click(
        lambda: generate_health_advice(user_profile, *get_health_trends()),
        outputs=advice_output
    )
    
    generate_diet_btn.click(
        lambda: generate_diet_plan(user_profile, user_profile["goal"]),
        outputs=diet_plan_output
    )

这段代码创建了健康建议和饮食计划的界面组件,并绑定了相应的按钮点击事件,实现了用户界面与后端功能的交互。

常见问题

问题

现象

解决

中文乱码

图表方块

安装字体 sudo apt install fonts-noto-cjk

端口被占

Address already in use

python app.py --port 7861

NPU OOM

显存不足

①减少 batch ②开 4-bit 量化 ③缩短 max_new_tokens

生成内容重复

多次刷新一样

提高 temperature=0.9 或 top_p=0.95

忘记备份

误删 JSON

立即复制 backup/ 最新日期文件回 data/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值