ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SpringBoot+Vue+DeepSeek实战:从零搭建智慧健康管理系统

SpringBoot+Vue+DeepSeek实战:从零搭建智慧健康管理系统 1. 为什么我要用SpringBootVueDeepSeek做一套智慧健康系统先说背景。我自己做了很多年Java后端早期接AI能力基本都是调云厂商的通用API要么封装一层要么直接裸调。真正让我下定决心把DeepSeek大模型接入业务系统的是一次实际项目一个做慢病管理的客户需要一套能记录健康档案、分析体检指标、并给出可解释的健康建议的系统。需求听起来不复杂但真做起来全是细节。当时摆在面前的选择有几个纯后端返回规则文本、接国内其他模型API、或者私有化部署小模型。最后我选了DeepSeek大模型原因很直接它的中文理解能力和推理成本在同类模型里比较能打而且通过API接入不需要自己养卡对中小型健康管理项目来说性价比非常合适。整套系统我定的技术栈是SpringBoot做后端、Vue做前端、MySQL存业务数据前后端分离部署用Docker。为什么选这套组合SpringBoot胜在生态成熟Java工程师上手快社区资料多Vue在管理后台和移动端H5的适配上都够灵活MySQL则是几乎所有健康管理类项目都能接受的数据库选型。至于DeepSeek它在这套架构里只扮演AI推理引擎的角色不碰业务数据存储只负责把前端传过来的健康数据做上下文理解、生成分析与建议这样职责边界非常清晰。文章后面我会把这套系统的整体设计、关键模块的实现、前后端分离的对接方式、以及我实际部署过程中踩过的坑全部展开。无论你是Java后端想学AI系统集成还是前端同学想弄明白一套完整项目的交互逻辑这篇文章都能给你一个可以直接复制的参考路径。2. 系统整体架构设计与核心模块拆解健康管理类系统有一个特点业务链路长。用户注册登录、档案维护、指标录入、数据分析、风险提醒、AI建议生成每一环都可能独立成模块。如果一开始不做模块边界划分后面接DeepSeek大模型时会非常痛苦因为AI生成的文本需要与业务数据做大量拼接和过滤逻辑混在一起改起来很麻烦。2.1 前后端分离的架构边界这套系统采用典型的前后端分离架构后端只提供RESTful API前端通过HTTP调用接口。后端基于SpringBoot 2.7.x构建前端使用Vue 3 Vite Element Plus。整个目录结构分为三块后端项目、前端项目、部署脚本与文档。后端项目按照业务域拆包主要的包结构如下controller接收前端请求做参数校验不写业务逻辑service业务逻辑层包括健康档案管理和AI服务编排mapperMyBatis-Plus数据访问层aiDeepSeek API封装与提示词管理common统一返回结构、异常处理、工具类前端项目按页面维度拆分视图组件views/dashboard健康总览页views/profile用户档案管理页views/metrics健康指标录入与趋势图views/adviceAI健康建议展示页模块与模块之间全部通过接口通信前端不直接访问数据库这保证了数据安全也让开发调试更灵活。比如我本地改Vue代码接口直接代理到后端启动的端口到生产环境再通过Nginx反向代理把API请求转发给后端容器。2.2 核心业务模块的设计思路健康管理系统的基础模块是用户体系和健康档案。用户体系基于Spring Security JWT实现登录认证JWT令牌里只存用户ID和过期时间不塞任何健康数据避免令牌泄露导致隐私风险。健康档案模块是整个系统的数据基石它包含以下核心字段基本人口学信息年龄、性别、身高、体重生活方式信息吸烟、饮酒、运动频率、睡眠时长既往病史高血压、糖尿病、高血脂等家族史直系亲属相关疾病近期体检指标血压、血糖、血脂、尿酸、肝肾功能档案数据是给DeepSeek大模型的食材所以存储时一定要注意结构化和非结构化字段的区分。结构化字段如血压值、血糖值用于规则引擎和图表展示非结构化字段如自述症状可保存为长文本作为AI上下文的补充信息。2.3 DeepSeek大模型在系统中的位置DeepSeek大模型在这套系统里不是主角——它更像一个善于总结和推理的顾问。系统自身的规则引擎负责硬性判断比如血压高于某个阈值就触发高血压疑似提醒DeepSeek则负责把用户的全部健康记录翻译成通俗易懂的语言建议让用户知道这个指标异常意味着什么、生活中要注意什么、是否需要就医。我选择通过API接入DeepSeek而不是本地部署核心考虑是成本与维护复杂度。本地部署大模型需要GPU资源、模型版本管理、并发推理优化对一个智慧健康管理系统来说保持系统轻量、可交付才是第一优先级。DeepSeek API只需要在后端封装一个HTTP请求工具类超时设置为较长时间就能完成调用。3. 前后端分离下的接口设计与AI对话链路实现细节前后端联调是整个项目里最磨人的一环尤其是AI相关的接口。因为大模型的响应不稳定可能几秒也可能几十秒如果接口设计不合理前端要么一直转圈要么超时后无提示。我在这个项目里把AI相关的接口单独做了一套协议规避了很多问题。3.1 接口返回结构的统一约定后端所有的接口统一返回以下结构{ code: 200, message: success, data: {} }其中code为200时表示成功前端根据code判断业务状态而不是依赖HTTP状态码。这样做的原因是SpringBoot默认对业务异常会返回500但很多业务异常如参数缺失、指标超出合理范围应该由前端弹出友好提示用统一code反而更清晰。AI生成建议的接口返回结构略有不同它包含三个字段adviceContentAI生成的建议正文riskLevel系统规则引擎判定的风险等级低/中/高generatedAt生成时间这样前后端只需要约定一个数据契约前端拿到riskLevel后可以直接切换颜色和样式不需要再解析AI文本。3.2 DeepSeek API调用的封装方式DeepSeek提供了兼容OpenAI格式的API所以封装起来非常轻松。我直接在后端写了一个DeepSeekClient组件用Spring的RestTemplate发送HTTP请求。核心代码如下Service public class DeepSeekClient { private static final String API_URL https://api.deepseek.com/v1/chat/completions; Value(${deepseek.api-key}) private String apiKey; public String chat(String systemPrompt, String userPrompt, int maxTokens) { HttpHeaders headers new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set(Authorization, Bearer apiKey); MapString, Object body new HashMap(); body.put(model, deepseek-chat); body.put(messages, Arrays.asList( new HashMapString, String() {{ put(role, system); put(content, systemPrompt); }}, new HashMapString, String() {{ put(role, user); put(content, userPrompt); }} )); body.put(temperature, 0.7); body.put(max_tokens, maxTokens); HttpEntityMapString, Object request new HttpEntity(body, headers); try { ResponseEntityMap response restTemplate.postForEntity(API_URL, request, Map.class); if (response.getStatusCode().is2xxSuccessful()) { Map data response.getBody(); List choices (List) data.get(choices); if (choices ! null !choices.isEmpty()) { Map choice (Map) choices.get(0); Map message (Map) choice.get(message); return (String) message.get(content); } } } catch (Exception e) { log.error(调用DeepSeek API失败, e); } return 抱歉我暂时无法生成健康建议请稍后重试。; } }有几个细节值得特意说明temperature参数控制生成内容的随机性健康建议类场景我设为0.7既保证多样性又不容易跑偏。如果做诊断类严谨输出建议降到0.2~0.3。max_tokens设置上限很关键避免单次调用token消耗过大。我的经验是健康建议文本控制在800 tokens以内足够。异常兜底非常重要。AI服务不可用时系统不能给用户抛一堆报错而是应该返回一条礼貌的降级提示。这也是健康类系统的基本要求。3.3 提示词工程的精细设计DeepSeek大模型的效果很大程度取决于提示词设计。我在这个项目里把提示词当成一份需要长期维护的产品文案而不是随手写的一段字符串。系统提示词System Prompt我设计成一段角色与原则说明你是一位资深的全科健康管理师擅长根据用户提供的健康档案和近期体检数据给出个性化、可执行的生活建议。你的回答需要满足以下要求使用通俗易懂的中文避免过多医学术语对异常指标给出风险解释但不得给出明确诊断结论建议应包含饮食、运动、作息三个维度的可执行事项如果指标严重异常明确提醒用户及时就医不要编造数据只基于提供的数值进行分析。用户提示词User Prompt则由系统自动拼装健康档案关键信息和近期指标用户基本信息52岁男性身高172cm体重78kg吸烟10年饮酒偶有。 既往病史高血压2年。 近期体检指标收缩压158mmHg舒张压96mmHg空腹血糖6.4mmol/L总胆固醇5.6mmol/L。 请根据以上信息生成个性化健康建议。为什么强调提示词的边界约束因为大模型容易出现过度解读。如果没有不得给出明确诊断结论这一条模型很可能输出你可能患有高血压性心脏病之类的话。这类表述在健康管理场景是极其危险的必须从提示词层面约束。3.4 前端AI对话与流式输出的体验设计严格来说这个系统不是纯粹的聊天机器人而是表单提交-后端调用AI-前端展示结果。但为了交互体验我在前端的设计上做了一些优化。前端调用AI建议接口时Vue组件里的逻辑如下const loading ref(false) const advice ref(null) async function generateAdvice() { loading.value true try { const profileData await getHealthProfile() const metricsData await getLatestMetrics() const response await request(/api/ai/advice, { method: post, data: { userId: currentUser.id, profile: profileData, metrics: metricsData } }) if (response.code 200) { advice.value response.data.adviceContent } } finally { loading.value false } }这里有一个小技巧前端不直接把用户填的表单数据拼成自然语言发给后端而是传结构化的profile和metrics对象。后端收到后再负责组装Prompt。这样如果将来要换模型或调整提示词只需要改动后端前端完全不用动。如果未来想升级为打字机式流式响应前端可以改用EventSource或WebSocket后端使用StreamingResponseBody逐段推送内容。我在项目文档里预留了这个升级方案但MVP阶段用普通POST请求完全够用。4. 健康指标管理模块数据建模、规则引擎与AI分析的联动健康管理系统的数据不能只停留在录入和展示真正的价值在于分析。这一章节我重点讲指标数据的前后端实现以及如何让规则引擎和DeepSeek大模型形成一个先规则后AI的处理流水线。4.1 指标数据的建模与校验健康指标表的设计我采用了指标定义表 指标记录表的两层结构。为什么不直接用一行一条记录因为体检指标的数量会持续增加今天关注血糖明天可能关注同型半胱氨酸如果每加一个指标就改一次表结构维护成本太高。指标定义表metric_code指标编码如sys_pressure代表收缩压metric_name指标名称unit单位normal_range正常范围如60-100sort_order展示排序指标记录表user_id用户IDmetric_code指标编码metric_value数值record_date记录日期source来源如manual或import前端录入页通过遍历指标定义列表动态生成表单项这样后端新增指标后前端无需改代码自动多出一个输入框。数据校验方面除了常规的必填与非空校验外我还按指标类型做了范围校验。比如收缩压正常在90~250之间如果用户输入380基本可以断定是误录后端直接返回数值超出合理范围请检查后重新输入。4.2 规则引擎与风险等级判定规则引擎我实现得很轻量没有引入专门的规则引擎框架而是用一组可配置的判断规则类完成。每个规则类实现统一接口public interface HealthRule { RiskLevel evaluate(HealthProfile profile, ListMetricRecord records); }以血压规则为例public class BloodPressureRule implements HealthRule { Override public RiskLevel evaluate(HealthProfile profile, ListMetricRecord records) { for (MetricRecord record : records) { if (sys_pressure.equals(record.getMetricCode())) { double value Double.parseDouble(record.getMetricValue()); if (value 160) { return RiskLevel.HIGH; } else if (value 140) { return RiskLevel.MEDIUM; } } if (dia_pressure.equals(record.getMetricCode())) { double value Double.parseDouble(record.getMetricValue()); if (value 100) { return RiskLevel.HIGH; } else if (value 90) { return RiskLevel.MEDIUM; } } } return RiskLevel.LOW; } }多个规则的结果如何汇总我定义了优先级只要有一个规则判为HIGH整体就是HIGH如果存在MEDIUM且无HIGH则为MEDIUM否则为LOW。这样规则引擎给出的风险等级是非常客观的不依赖AI的判断作为系统给用户的第一道预警。关于规则阈值的设定可以参考《中国高血压防治指南》和《中国2型糖尿病防治指南》中关于分级的标准比如高血压分级中的临界值140/90mmHg、糖尿病诊断阈值空腹血糖≥7.0mmol/L。阈值的来源要做成配置项方便后续医学指南更新时调整不需要重新编译代码。4.3 规则引擎与AI分析的分工协作很多AI健康系统的做法是把所有判断都交给大模型我觉得这是不对的。大模型存在两个问题一是推理结果不稳定同一个输入多次调用可能输出不同风险等级二是有幻觉风险可能对某个数值给出无依据的判断。我的做法是让规则引擎先算AI后写文案。具体流程前端提交指标数据后后端先持久化后端运行全部规则得出风险等级后端把风险等级、异常指标、健康档案组装成上下文调用DeepSeek生成建议返回给前端的结果里riskLevel来自规则引擎adviceContent来自DeepSeek大模型两者独立并存但相互印证。做过一次实测用户收缩压168mmHg规则引擎判定为HIGHDeepSeek生成的建议里有一句您的收缩压明显偏高属于高血压二级水平建议尽快咨询专科医生。这句高血压二级其实是AI对数值的推理虽然和临床指南吻合但严格来说这种表述有诊断色彩。所以我最后在提示词里加了一条硬约束不得使用高血压X级糖尿病确诊等诊断类措辞而是统一说您的血压值已超出正常范围建议关注。这个细节说起来简单实际调试过程中我反复改了五六版提示词才到满意的效果。AI落地的难度往往不在接口调用而在于模型输出边界与业务安全性的平衡。4.4 前端趋势图与数据可视化健康类系统的前端体验重点在于数据可视化。我用Vue 3 ECharts绘制了指标趋势图血压、血糖、体重等指标可以按周、月、季切换时间范围查看曲线。这里有一个对新手友好且对老手也实用的实现方式后端接口直接返回按日期的数据序列前端不需要再做数据透视。const chartOption ref({ xAxis: { type: category, data: dates }, yAxis: { type: value }, series: [ { name: 收缩压, type: line, data: systolicValues, smooth: true } ] })为了让趋势图在企业交付时有更好的观感我把正常范围用标记区域显示出来也就是markArea。这样用户一眼就能看到哪天的数值超出了正常范围配合AI建议阅读起来更有代入感。5. 部署实战从本地开发到Docker一键远程部署的完整路径健康管理系统的部署是我投入时间最多、也是实际收益最大的一环。一开始我用传统方式部署后端jar包直接扔到服务器上跑前端npm run build后丢进Nginx目录MySQL手动建库。这套流程小范围用没问题但如果你想交付给客户或做远程演示就必须把流程标准化。所以我做了一套Docker Compose的可复现部署方案最终达到一键远程部署的效果。5.1 环境准备与端口规划部署服务器的建议配置操作系统Ubuntu 20.04 或 CentOS 7.9配置2核4G起步4核8G更稳妥因为JVM本身比较吃内存软件Docker 20.10、Docker Compose 2.x端口规划如下8080后端SpringBoot应用端口3306MySQL数据库端口只绑定内网不对公网开放80Nginx端口对外提供前端静态资源与API反向代理6379Redis端口预留本项目的AI接口做了简单限流才会用到远程部署前服务器安全组只需开放80端口给公网访问8080与3306都应当限制在内网环境。前端访问/api/开头的请求全部由Nginx转发到后端容器用户直连不到后端。5.2 后端Docker镜像构建SpringBoot后端Docker化最容易踩的坑是镜像体积过大。基础的openjdk:8-jre-alpine或eclipse-temurin:17-jre-alpine体积大概在80MB左右但如果你用带完整JDK的基础镜像体积可能直接飙到400MB以上传输和启动都慢。我的Dockerfile做了多阶段构建FROM maven:3.8.6-eclipse-temurin-17 AS builder WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline COPY src ./src RUN mvn clean package -DskipTests FROM eclipse-temurin:17-jre-alpine WORKDIR /app COPY --frombuilder /app/target/health-*.jar app.jar EXPOSE 8080 ENTRYPOINT [java, -jar, app.jar]多阶段构建的好处是最终运行镜像里只有JRE和打包好的jar包不包含Maven依赖和源码安全性和体积都优化了。SpringBoot的配置文件在容器环境里如何管理我用了application-prod.yml作为生产配置把数据库地址改成host.docker.internal或Docker网络内的服务名。如果数据库和后端都在同一个docker-compose.yml里那么直接写服务名db:3306即可。5.3 Docker Compose编排与一键启动脚本这是一份精简版的docker-compose.ymlversion: 3.8 services: db: image: mysql:8.0 container_name: health-db restart: always environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: health_ai volumes: - ./db_data:/var/lib/mysql - ./sql/init.sql:/docker-entrypoint-initdb.d/init.sql healthcheck: test: [CMD, mysqladmin, ping, -h, localhost] interval: 10s timeout: 5s retries: 5 backend: build: ./backend container_name: health-backend restart: always depends_on: db: condition: service_healthy environment: SPRING_PROFILES_ACTIVE: prod DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY} ports: - 8080:8080 nginx: image: nginx:1.24-alpine container_name: health-nginx restart: always depends_on: - backend volumes: - ./dist:/usr/share/nginx/html - ./nginx.conf:/etc/nginx/conf.d/default.conf ports: - 80:80三个容器形成一条链路Nginx对外服务、SpringBoot处理后端逻辑、MySQL存储数据。depends_on配合healthcheck保证后端不会在数据库尚未就绪时启动这是一个非常容易忽略的细节。一键启动脚本我写成这样#!/bin/bash set -e echo 开始构建前端项目... cd frontend npm install npm run build cd .. echo 生成环境变量文件... if [ ! -f .env ]; then cp .env.example .env fi echo 构建并启动后端及数据库... docker compose up -d --build echo 部署完成请访问 http://服务器IP/这套脚本把前端构建、环境变量初始化、Docker Compose启动串在一起实现了真正意义上的一键远程部署。服务器上只需要提前装好Docker与Node.js环境剩下的一切交给脚本。5.4 Nginx配置前后端路由与API代理Vue是单页应用前端路由采用history模式时必须配置Nginx的try_files否则刷新页面会返回404。这是一个高频率踩坑点。我的nginx.conf中关键配置如下server { listen 80; server_name _; root /usr/share/nginx/html; index index.html; location / { try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://backend:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 60s; proxy_read_timeout 120s; } }/api/的代理超时时间我特意调长因为AI接口的响应经常超过默认的60秒。如果Nginx用默认超时用户等到的不是AI回复而是504页面。5.5 远程部署的验证流程部署完成后我会按以下流程做一次全链路验证访问http://服务器IP/能看到Vue前端首页注册一个测试用户登录后进入健康档案页录入一套测试指标观察趋势图能否正常渲染点击生成AI建议检查DeepSeek返回结果是否显示正常查看后端容器日志确认没有数据库连接或API调用的报错。如果第4步出现问题先看docker logs health-backend末尾有没有异常堆栈再看.env里的DEEPSEEK_API_KEY是否有效。DeepSeek API的鉴权失败通常表现为401错误排查优先级最高。6. 我在真实交付中踩过的五个关键坑这节内容不是泛泛而谈是我在这套系统从开发到交付的真实经历中总结出的问题与解决思路。如果你正在做类似的AI业务系统提前知道这些坑能帮你省下很多晚上的时间。6.1 坑一前端跨域问题在本地联调时的假象与真相前后端分离项目本地联调最常见的配置是Vite代理。我在开发阶段把/api代理到localhost:8080一切正常。但当我第一次把前端构建产物部署到Nginx后发现浏览器请求/api/ai/advice直接返回404控制台还报了跨域错误。排查后发现错误在于我对proxy_pass的写法理解不准确。location /api/与proxy_pass http://backend:8080;组合时Nginx会把完整的/api/...路径传给后端而不是去掉前缀。正确写法应该是location /api/ { proxy_pass http://backend:8080/; }注意proxy_pass地址末尾多了一个斜杠效果是删除/api前缀再转发例如/api/user/profile变成/user/profile。这个细节不实际操作很难发现。另外跨域问题的正确解法不是在前端加proxy而是在后端配置CorsFilter或在Nginx层统一处理。但最省心的方式是让前端和后端始终走同一个域名通过Nginx路径区分这样根本不会产生跨域。6.2 坑二DeepSeek接口响应超时与前端loading状态失控AI接口的耗时波动很大短则3秒长则30秒。刚开始我用默认的SpringBoot异步请求配置前端点击生成建议后loading转个不停用户不知道系统是卡了还是在工作体验非常糟糕。我做两件事优化第一后端把AI调用放入独立的线程池接口不被AI调用阻塞同时设置RestTemplate的连接超时和读取超时分别为10秒和60秒避免线程卡死。第二前端对loading设置了最大等待时间提示。我用一个简单的轮询或Promise包裹如果请求超过25秒未返回前端展示AI服务响应较慢请耐心等待或重试。同时在loading动画旁放一行提示文案让用户知道系统正在生成内容而不是应用无响应。6.3 坑三提示词伪造医疗结论导致的安全风险我在第三节提到过DeepSeek大模型在自由发挥时可能输出您可能患有XX病这类内容在真实的健康管理系统中绝对不可以出现。我最初测试时得到过一条非常严重的输出您的空腹血糖达到7.2mmol/L已经达到糖尿病诊断标准建议立即就诊。这种表述在法律和伦理上都有很大风险。我的解决方案是双管齐下提示词强约束直接写明禁止给出任何明确的疾病诊断结论禁止使用达到诊断标准等表述后端关键词过滤对AI返回的文本执行敏感词过滤包括确诊诊断标准患有已达到XX病等词一旦命中则降级为通用提示。关键词过滤是最简单也最可靠的兜底手段。有些话AI就算写了后端正则也能拦下来。6.4 坑四容器化部署时MySQL数据卷冲突Docker Compose里MySQL使用数据卷持久化数据这个设计本身没问题。但我遇到过一种情况docker compose down与up之后数据库表结构与初始化脚本冲突导致后端启动时找不到某些表。原因是我在sql/init.sql里写了建表语句但第一次启动后数据已经持久化到db_data目录。第二次启动时MySQL已经存在同名数据库但初始化脚本不会重复执行导致如果我在新版本里加了几张新表老库不会自动同步。我现在采用的是启动时自动执行迁移脚本的方案。SpringBoot的flyway或liquibase都可以做但为了控制项目复杂度我直接通过SpringBoot的spring.sql.init.modealways配合固定路径的SQL脚本执行建表确保每次启动时能补齐缺失的表。当然更规范的方式还是引入Flyway项目后续迭代时我会切过去。6.5 坑五JVM内存限制导致容器OOMSpringBoot应用在容器里如果没设置-Xmx默认会根据宿主机内存来算堆大小。在2G内存的服务器上MySQL一个容器加上后端一个容器很容易把内存吃满触发OOM。我的解决方案是在启动命令里显式指定堆内存ENTRYPOINT [java, -Xms256m, -Xmx512m, -jar, app.jar]同时Docker Compose里设置内存限制deploy: resources: limits: memory: 768M这样后端最多使用768MB不会冲击数据库容器。如果服务器配置高可以相应调大堆内存但要记得同步调整Docker的资源限制防止单个容器占用过多资源影响其他应用。7. 这套系统后续还能怎么扩展多模态健康数据与个性化模型微调方向整套系统跑通之后我其实已经规划了三个明确的扩展方向。如果你也想把这个方案用于自己的项目这些方向可作为参考。7.1 从结构化表单到多模态健康数据接入当前系统只支持手工录入结构化指标但真实场景里用户可能在体检报告拍照上传、可穿戴设备同步心率或睡眠数据或者导入手环厂商的数据文件。扩展方向是增加报告解析服务前端上传体检报告PDF或图片后端对图片做OCR识别对PDF做文本抽取把关键指标自动回填到表单中再交给DeepSeek做整体解读。DeepSeek大模型本身具备多模态能力但在现有API接入方案里我更倾向于让OCR服务先完成结构化抽取DeepSeek只负责基于结构化文本的解读。这样数据可靠性更高且对用户的隐私更友好——毕竟体检报告图片里包含大量个人敏感信息不应该直接原样传给大模型。7.2 从单向建议到动态健康干预现在系统是用户主动查询-系统生成建议的被动模式。进一步可以做动态干预通过定时任务定期读取用户最新指标当异常指标出现时系统自动触发健康提醒。提醒方式可以接微信公众号模板消息、企业微信应用消息或短信。后端只需要写一个定时任务查询最近X天内指标异常的活跃用户通过DeepSeek生成个性化提醒文案再调用消息推送API发送。需要注意两点提醒文案不能制造恐慌必须附上如您感到不适请及时就医的免责提示推送频率要做限制比如同一用户一周最多两次避免打扰。7.3 从通用大模型到领域微调如果项目要规模化最好是基于更专业的医疗健康语料对DeepSeek做领域微调或RAG检索增强。我的评估是MVP阶段直接用模型通用能力配合精心设计的提示词已经能达到70分剩下30分的提升靠RAG把权威健康科普文章、饮食建议、运动指南向量化存入向量数据库DeepSeek在生成建议前先检索相关内容再基于检索结果生成回答。这样既降低模型幻觉又能让建议更有依据。不过微调成本高、周期长对大多数中小型健康管理项目来说不是第一优先级。先把业务闭环跑起来把规则引擎与AI建议的结合做好再逐步引入RAG和微调是更务实的路线。8. 最后的实操补充我给新人的几个项目落地建议如果你正准备照着这套架构自己动手实现一版以下几件事我认为非常值得提前做好。先把业务模块做薄再接AI。不要一上来就陷入DeepSeek的提示词调优先把用户体系、档案模块、指标管理做出一个可用的MVP哪怕前端丑一点都行。AI是这个系统的亮点但基础业务才是它的躯干。DeepSeek API的密钥管理一定要走环境变量。我在项目构建时用Value注入了deepseek.api-key没有把密钥硬编码进application.yml。部署时通过.env文件传入Docker容器上线后轮换密钥也方便。日志里不要记录用户的健康数据明文。AI接口请求与响应的日志我做了脱敏处理——只打印耗时、返回码、tokens数量不打印具体的请求和响应正文。健康数据是高度敏感的个人信息日志泄露这条线必须守住。测试数据要足够真实。我整理了一套20个虚拟用户的测试数据年龄从25到70岁覆盖血压偏高、血糖异常、肥胖、正常等不同画像。用这套数据跑一遍全流程比只用一个正常用户测试能多发现十倍的问题。代码优先文档同步。这篇项目的万字部署文档不是我最后补的而是在开发过程中逐步记录的。从环境准备、配置说明、部署步骤到常见问题每搞定一个模块就更新一个章节。最后交付时文档和代码同时完成客户拿去就能部署。关于这套系统目前跑下来的效果让我比较满意的是规则引擎负责稳DeepSeek负责活。用户既能得到客观的风险等级判断又能看到基于自己数据的个性化建议而不是一段套话模板。技术栈上SpringBootVue前后端分离也完全没有拖后腿从开发效率到部署运维都很顺滑。如果你也想做类似的AI健康管理系统我建议你直接照着这套思路动手。别怕踩坑上面提到的那些问题遇到一次解决一次整个项目的成熟度就会明显提升。等你的第一版跑通之后你一定会回来觉得原来AI落地到业务系统真的没有想象中那么玄乎。
返回列表