
一、项目背景与意义随着健康中国战略的深入推进和国民健康意识的普遍提升科学膳食与营养管理已成为公众关注的焦点。然而海量、专业且分散的营养学知识对普通用户构成了较高的认知门槛。传统的信息查询方式如搜索引擎、专业书籍存在信息过载、可信度不一、个性化不足等问题。本项目旨在开发一个基于Spring Boot的膳食搭配营养学知识智能问答小程序其核心意义在于知识普惠将专业的营养学知识如食物营养成分、膳食指南、疾病饮食禁忌进行结构化、标准化处理并通过自然语言交互降低用户获取门槛。个性化服务结合用户的基本信息如年龄、性别、身体状况、饮食偏好和实时问题提供定制化的膳食建议与营养解答。技术实践作为一个典型的“后端微服务AI能力集成”的全栈项目它涵盖了Spring Boot后端开发、RESTful API设计、数据库建模、以及智能问答如基于规则或向量检索等核心技术的综合应用具有很高的学习与参考价值。二、技术栈选型本项目采用前后端分离架构后端为核心技术栈选型兼顾成熟度、开发效率与扩展性。1. 后端技术栈 (Spring Boot)核心框架Spring Boot 3.x提供快速启动、自动配置和约定大于配置的开发体验。Web层Spring MVC用于构建RESTful API接口。数据访问ORMMyBatis-Plus简化CRUD操作支持Lambda查询。数据库MySQL 8.0用于存储用户信息、问答历史、营养知识库等结构化数据。缓存Redis用于缓存热点营养知识、用户会话状态提升响应速度。智能问答核心方案A规则/模板引擎Drools规则引擎或自定义规则匹配器适用于知识结构固定、逻辑明确的场景。方案B检索增强生成RAGSpring AI 向量数据库如Milvus, Pinecone。将营养知识库文档向量化存储用户问题通过向量相似度检索相关段落再由大语言模型如通义千问、ChatGLM生成答案。其他组件安全Spring Security JWT实现用户认证与授权。文档SpringDoc OpenAPI 3 (Swagger UI)自动生成API文档。消息队列RabbitMQ可选用于异步处理耗时的知识库更新或分析任务。2. 前端技术栈 (小程序)开发框架微信小程序原生开发或Uni-app跨端。UI组件库Vant Weapp 或 TDesign Mini提供丰富的交互组件。状态管理小程序自带的全局数据管理或使用Mobx-miniprogram。网络请求封装wx.request或使用fly.js与Spring Boot后端API通信。3. 部署与运维容器化Docker Docker Compose实现环境一致与快速部署。持续集成/部署Jenkins 或 GitHub Actions。监控Spring Boot Actuator Prometheus Grafana。三、核心模块与代码实现1. 项目结构与依赖Maven核心依赖pom.xml片段dependencies !-- Spring Boot Starter -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-security/artifactId /dependency lt;!-- MyBatis-Plus --gt; lt;dependencygt; lt;groupIdgt;com.baomidoult;/groupIdgt; lt;artifactIdgt;mybatis-plus-boot-starterlt;/artifactIdgt; lt;versiongt;3.5.3.1lt;/versiongt; lt;/dependencygt; lt;dependencygt; lt;groupIdgt;mysqllt;/groupIdgt; lt;artifactIdgt;mysql-connector-javalt;/artifactIdgt; lt;scopegt;runtimelt;/scopegt; lt;/dependencygt; lt;!-- Spring AI (可选用于RAG方案) --gt; lt;dependencygt; lt;groupIdgt;org.springframework.ailt;/groupIdgt; lt;artifactIdgt;spring-ai-openai-spring-boot-starterlt;/artifactIdgt; lt;versiongt;1.0.0-M3lt;/versiongt; lt;/dependencygt; lt;!-- 工具类 --gt; lt;dependencygt; lt;groupIdgt;org.projectlomboklt;/groupIdgt; lt;artifactIdgt;lomboklt;/artifactIdgt; lt;optionalgt;truelt;/optionalgt; lt;/dependencygt; lt;dependencygt; lt;groupIdgt;com.auth0lt;/groupIdgt; lt;artifactIdgt;java-jwtlt;/artifactIdgt; lt;versiongt;4.4.0lt;/versiongt; lt;/dependencygt; /dependencies2. 核心领域模型与数据库主要实体类示例User, NutritionQAimport com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.time.LocalDateTime; Data TableName(t_user) public class User { TableId(type IdType.AUTO) private Long id; private String openId; // 小程序用户唯一标识 private String nickname; private Integer age; private String gender; // M, F private String healthCondition; // 健康状况如“高血压”、“糖尿病” private LocalDateTime createTime; } Data TableName(t_nutrition_qa) public class NutritionQA { TableId(type IdType.AUTO) private Long id; private Long userId; private String userQuestion; private String aiAnswer; private String questionType; // 如“食物成分”、“膳食搭配”、“疾病饮食” TableField(fill FieldFill.INSERT) private LocalDateTime createTime; }3. 智能问答服务核心逻辑以“规则匹配知识库检索”的混合策略为例实现问答服务import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; Service public class NutritionQAService { Resource private KnowledgeBaseService knowledgeBaseService; Resource private RuleEngineService ruleEngineService; Resource private NutritionQAMapper qaMapper; /** 处理用户营养学问题 param userQuestion 用户问题 param user 当前用户 return 智能回答 */ public AnswerDTO answerQuestion(String userQuestion, User user) { // 1. 意图识别与分类 String questionType classifyQuestion(userQuestion); // 2. 规则优先检查是否有预定义的规则答案如固定问答对 String ruleAnswer ruleEngineService.matchRule(userQuestion); if (ruleAnswer ! null) { return saveAndReturnAnswer(userQuestion, ruleAnswer, questionType, user); } // 3. 知识库检索从结构化知识库中查找相关信息 Listlt;KnowledgeItemgt; relevantKnowledge knowledgeBaseService.retrieve(userQuestion, 3); // 4. 答案生成与组装 String finalAnswer generateAnswer(userQuestion, relevantKnowledge, user); // 5. 保存问答记录并返回 return saveAndReturnAnswer(userQuestion, finalAnswer, questionType, user); } private String classifyQuestion(String question) { // 简单的关键词匹配分类逻辑 if (question.contains(热量) || question.contains(卡路里)) { return ENERGY; } else if (question.contains(维生素) || question.contains(矿物质)) { return NUTRIENT; } else if (question.contains(怎么吃) || question.contains(搭配)) { return MATCHING; } return GENERAL; } private String generateAnswer(String question, Listlt;KnowledgeItemgt; knowledge, User user) { // 简单的模板填充实际可接入LLM进行润色 StringBuilder answer new StringBuilder(); answer.append(根据您的提问“).append(question).append(”为您提供以下信息\n\n); for (KnowledgeItem item : knowledge) { answer.append(• ).append(item.getContent()).append(\n); } if (user.getHealthCondition() ! null) { answer.append(\n【个性化提醒】您标注的健康状况是“) .append(user.getHealthCondition()) .append(”以上建议请结合自身情况谨慎参考必要时咨询专业医师。); } return answer.toString(); } private AnswerDTO saveAndReturnAnswer(String question, String answer, String type, User user) { NutritionQA record new NutritionQA(); record.setUserId(user.getId()); record.setUserQuestion(question); record.setAiAnswer(answer); record.setQuestionType(type); qaMapper.insert(record); return new AnswerDTO(answer, record.getId()); } }4. RESTful API 接口示例import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; RestController RequestMapping(/api/qa) public class NutritionQAController { Resource private NutritionQAService qaService; Resource private UserService userService; PostMapping(/ask) public Resultlt;AnswerDTOgt; askQuestion(RequestBody QuestionRequest request, RequestHeader(Authorization) String token) { // 1. 从JWT token中解析用户ID Long userId JwtUtil.parseUserId(token); User user userService.getById(userId); // 2. 调用问答服务 AnswerDTO answer qaService.answerQuestion(request.getQuestion(), user); // 3. 返回结果 return Result.success(answer); } } Data class QuestionRequest { private String question; } Data class AnswerDTO { private String answer; private Long recordId; public AnswerDTO(String answer, Long recordId) { this.answer answer; this.recordId recordId; } }四、总结与展望本文详细阐述了基于Spring Boot的膳食搭配营养学知识智能问答小程序的技术实现方案。项目采用Spring Boot构建高性能、可扩展的后端服务结合规则引擎与知识库检索实现智能问答核心并通过微信小程序提供轻量级前端交互。技术亮点清晰的微服务架构与模块化设计。灵活可扩展的智能问答策略规则/RAG。结合用户画像的个性化答案生成。未来优化方向引入更精准的NLP模型进行意图识别与实体抽取。构建更全面的营养学知识图谱提升问答的准确性与关联性。增加膳食记录与智能分析功能提供长期营养趋势报告。该项目不仅具有实际应用价值也是学习现代Java后端技术、AI工程化落地的优秀实践案例。