ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

SpringBoot+AI大模型影视评论舆情可视化分析平台毕业设计完整攻略

SpringBoot+AI大模型影视评论舆情可视化分析平台毕业设计完整攻略 如果你正在为计算机毕业设计选题发愁大概率已经看腻了“图书管理系统”“在线订餐系统”“宿舍管理系统”这类项目。它们不是不能做而是很难在答辩时讲出技术亮点——评委一眼就能看出代码里没有多少值得追问的东西。影视评论舆情数据可视化分析平台是最近在毕业设计圈子里热度很高的一类选题。它把 SpringBoot、AI 大模型、数据可视化三件事串在了一起先抓取影视评论数据再调用大模型做情感分析最后把分析结果用图表展示出来。听起来不难但做完整之后你的简历上可以写“基于大模型的舆情分析系统”论文里可以写“情感分析模型的应用研究”答辩时可以从技术链路、业务逻辑、实际问题三个角度展开。这篇文章写给准备做这个选题、或者正在自学 SpringBoot AI 大模型应用开发的同学。我会把整套思路拆开讲系统架构怎么设计、每个模块做什么、关键的代码怎么写、真正容易踩坑的地方在哪里以及毕业设计答辩时导师大概率会问哪些问题。文章里的代码是通用的最小实现思路版本以你本地的项目实际情况为准但核心流程不会有太大差异。1. 毕业设计选这个题到底值不值先说结论这个选题非常适合需要“技术含量”和“展示效果”兼顾的本科毕业设计也适合准备春招秋招、需要在短期内补一个完整项目经历的在校生。市面上大量管理系统类毕设的致命问题在于业务太单薄。比如图书管理系统核心逻辑就是增删改查哪怕套上 Spring Cloud本质上也只是一个数据库应用。评委问“你项目的难点是什么”你很难回答出一个真正有深度的问题。影视评论舆情分析平台不一样它天然具备一个完整的业务链路数据采集、数据清洗、大模型分析、结果存储、可视化展示。每一个环节都可以单独拿出来深挖而且链路之间是有关联的——数据质量影响分析结果分析结果又决定可视化图表的呈现效果。从技术栈的角度看这个项目几乎覆盖了企业后端开发的主要知识点SpringBoot 负责后端服务与接口设计MySQL 存储影视信息和评论数据AI 大模型负责情感分析、观点提取等自然语言处理任务ECharts 或 Vue ECharts 负责前端可视化展示爬虫或开放 API 负责数据获取系统还要考虑接口鉴权、异步任务、定时任务、日志记录等工程化问题。也就是说做完这个选题你等于把“如何用 Java 对接 AI 大模型”和“如何做数据可视化大屏”两个热门方向都提前走了一遍。当然这个题也有不适合的人群。如果你只想要一个最省事、最快通过检查的题目那这个选题的难度确实比普通 CRUD 系统高一些因为它涉及大模型 API 的调用、Prompt 设计、结果解析、异常兜底、数据一致性等问题。但只要愿意花两周时间从零跑通这套技术组合的回报是明显高于传统管理系统的。2. 系统整体架构与核心概念在写代码之前先把系统分成五个部分来理解。这个分层方式也建议直接用在你的毕业设计论文结构里。2.1 总体架构采集-分析-展示三层链路整个系统可以抽象成三层第一层是数据采集层。负责从公开渠道获取影视信息和评论数据。这里有两种做法一是调用公开 API二是使用爬虫抓取。考虑到毕业设计的时间限制和稳定性更推荐优先使用公开 API爬虫只作为补充。第二层是 AI 分析层。这是整个系统的核心亮点。评论数据是原始文本计算机无法直接理解“好评还是差评”需要借助大模型做情感分类、关键词提取、观点总结等任务。可以用在线大模型 API也可以本地部署开源模型。对毕设来说在线 API 实现成本最低、效果最好。第三层是数据展示层。AI 分析的结果存入 MySQL 后由 SpringBoot 提供聚合查询接口前端通过 ECharts 把情感分布、评分走势、热门话题等数据渲染成可视化图表。后端模块划分建议如下影视模块影视信息的管理与查询评论模块评论数据的采集、存储和查询分析模块调用大模型进行情感分析和观点提炼统计模块按时间、影视、情感等维度做聚合统计可视化接口模块给前端图表提供 JSON 数据。2.2 核心概念SpringBoot、AI 大模型、数据可视化SpringBoot是目前 Java 后端最主流的快速开发框架。它的核心价值是“约定大于配置”内置了 Web 容器、自动配置、起步依赖等机制让开发者不需要手动搭建 Tomcat、配置大量 XML 就能启动一个 Web 服务。对你来说它解决的是“把后端接口快速跑起来”的问题。AI 大模型在这里承担的是自然语言理解任务。评论数据属于非结构化文本传统做法是先用分词工具比如 HanLP、Jieba切词再用情感词典打分效果有限且需要大量人工规则。大模型解决的是“让机器读懂评论情感倾向”的问题给它一段文本它能判断出正面、中性、负面还能给出原因甚至能提取出“演员演技好”“剧情拖沓”这样的具体维度。数据可视化是把分析结果图形化展示。这里用的最多的是 ECharts它是一个纯 JavaScript 的图表库支持折线图、柱状图、饼图、词云、地图、雷达图等配置简单效果专业非常适合毕业设计里的可视化大屏。三者之间的关系是SpringBoot 负责串联所有模块AI 大模型是分析的“大脑”数据可视化把分析结果变成“人眼能看懂”的界面。3. 技术选型与关键依赖技术选型不需要追求最新而是要追求稳定、资料多、你能驾驭。毕业设计最忌讳选一个自己完全不熟悉的高版本框架出了问题连错误信息都看不懂。3.1 技术栈清单模块推荐技术说明后端框架SpringBoot 2.7.x 或 3.x根据 JDK 版本选择JDK 8 选 2.7.xJDK 17 可选 3.x数据库MySQL 5.7 / 8.0存储影视、评论、分析结果数据访问MyBatis-Plus 或 Spring Data JPAMyBatis-Plus 的资料和代码生成器更丰富AI 大模型国内大模型 API 或 OpenAI 兼容接口按官方文档获取 API Key按 Token 计费HTTP 客户端Hutool、OkHttp、RestTemplate用于调用大模型接口前端框架Vue 3 Element Plus ECharts适合前后端分离项目项目构建MavenJava 项目最常用定时任务Spring Task定时抓取评论或更新分析结果3.2 SpringBoot 版本选择一个真实的坑在项目起步阶段最容易出问题的不是业务代码而是 SpringBoot 版本与 JDK、依赖之间的搭配。很多同学从网上下载了一份代码但本机 JDK 版本不匹配启动直接报错。如果你本机安装的是 JDK 8建议直接选择 SpringBoot 2.7.x。如果你用的是 JDK 17 或 JDK 21可以选择 SpringBoot 3.x。这里容易出现的问题包括JDK 8 搭配 SpringBoot 3 启动失败JDK 17 搭配低版本 MyBatis-Plus 出现反射报错javax 包与 jakarta 包冲突导致注解无法导入。建议在创建项目时统一使用 Spring Initializrhttps://start.spring.io生成基础工程并注意观察控制台日志中的版本告警。3.3 pom.xml 核心依赖示例!-- 文件路径pom.xml -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.18/version relativePath/ /parent properties java.version1.8/java.version mybatis-plus.version3.5.3.2/mybatis-plus.version hutool.version5.8.25/hutool.version /properties dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version${mybatis-plus.version}/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency dependency groupIdcn.hutool/groupId artifactIdhutool-all/artifactId version${hutool.version}/version /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies这里的版本号是相对稳妥的组合。如果你的 SpringBoot 版本不同依赖版本要做相应调整不要直接照抄。3.4 application.yml 基础配置# 文件路径src/main/resources/application.yml server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/movie_comment?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true # AI 大模型配置放到自己的配置项中 ai: api-key: sk-your-api-key base-url: https://your-llm-api.example.com/v1 model: your-model-name max-tokens: 1024 temperature: 0.7说明ai.api-key等配置请替换为你实际使用的大模型平台信息。不要把 API Key 硬编码在 Java 代码里也不要提交到公开仓库这一点在答辩时也可以作为工程规范来讲。4. 数据采集模块评论数据从哪里来数据是整个系统的原料。如果没有真实评论数据AI 分析和可视化展示都无从谈起。这一步可以先小规模验证再逐步扩大数据量。4.1 两种数据来源的取舍方式一公开 API一些影视平台、评论平台会提供开放 API但认证门槛、调用频率限制各不相同。优点是数据规范、稳定缺点是字段有限不一定能拿到详细评论。方式二爬虫采集使用 HttpClient 或 Jsoup 模拟浏览器请求页面解析 HTML 或 JSON 接口获取评论数据。优点是数据量大、真实缺点是容易遇到反爬机制且必须注意合法合规问题。关于爬虫一个必须强调的原则只抓取公开、合法、可访问的信息遵守目标网站的 robots 协议和服务条款控制抓取频率不能给对方服务器造成压力抓取的数据仅用于个人学习研究不用于商业用途。涉及登录后可见、用户隐私、付费内容的数据一律不碰。4.2 采集流程设计采集模块的流程如下确定目标影视和评论页面发起 HTTP GET 请求携带合理的 User-Agent解析返回的 JSON 或 HTML提取评论内容、评分、评论时间清洗数据去掉空白字符、表情符号、重复内容写入 MySQL 的评论表。4.3 基于 Hutool Jsoup 的采集示例这里演示一个简化版本思路是分层清晰先抓取页面再解析评论最后存储。// 文件路径src/main/java/com/example/movie/comment/service/impl/CommentCrawlServiceImpl.java import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; Service public class CommentCrawlServiceImpl implements CommentCrawlService { Override public ListComment fetchCommentsFromApi(String movieId, int pages) { ListComment result new ArrayList(); for (int page 0; page pages; page) { // 这里替换为实际可用的评论接口地址 String url https://example.com/movie/ movieId /comments?start page * 20; String response HttpUtil.get(url, 5000); JSONObject json JSONUtil.parseObj(response); JSONArray comments json.getJSONArray(comments); if (comments null) { break; } for (int i 0; i comments.size(); i) { JSONObject item comments.getJSONObject(i); Comment comment new Comment(); comment.setMovieId(Long.valueOf(movieId)); comment.setContent(item.getStr(content)); comment.setUserName(item.getStr(userName)); comment.setCommentTime(item.getStr(time)); comment.setLikeCount(item.getInt(likeCount, 0)); result.add(comment); } } return result; } }这个示例的重点在于“分层”CommentCrawlService只负责采集采集完成后由另一个 Service 负责去重和写入数据库。不建议在 Controller 里直接调用爬虫逻辑否则答辩时讲不清楚职责划分。也可以在采集后面加一个去重逻辑比如按“电影 ID 评论内容”做唯一判断避免重复数据污染分析结果。5. AI 大模型接入与情感分析实现这是整个项目的核心亮点也是答辩时最能展示技术深度的地方。5.1 为什么用大模型做情感分析而不是分词词典如果只是简单统计“好评”“差评”用情感词典也勉强能做但效果很机械。比如“这个电影让我哭得稀里哗啦但我就是喜欢”这句话词典法很容易误判为负面情绪因为出现了“哭”。大模型能够理解上下文从而判断出“哭”在这里是正面的情感表达。除了情感分类你还可以让大模型输出评论中提到的具体维度演员演技剧情逻辑画面特效配乐音效整体推荐程度。这样可视化图表就不止一个情感饼图了还能展示“口碑维度雷达图”项目的展示效果立刻提升一个档次。5.2 大模型接入的通用思路无论使用哪家平台接入流程都是相似的注册平台账号创建 API Key阅读接口文档确认基础地址、鉴权方式、模型名称构造请求参数messages、model、temperature、max_tokens 等解析返回结果提取模型生成的文本对文本做后处理转成结构化数据。为了让模型输出可以被程序直接使用建议在 Prompt 中明确要求返回 JSON 格式。这是最容易踩坑的地方模型返回的结果往往是普通文本如果你用正则硬解析很容易失败正确做法是在 Prompt 里约束 JSON 结构并在代码里做容错解析。5.3 情感分析 Prompt 设计Prompt 不要写得含糊。一个高质量的 Prompt 应该包含角色、任务、输入格式、输出格式、示例。你是一个影视评论情感分析专家。请分析下面的影视评论返回 JSON 格式结果。 JSON 字段说明 - sentiment: 情感倾向只能是 positive、neutral、negative 之一 - score: 情感分数范围 0 到 100分数越高代表情感越正面 - reasons: 用户给出该评分的主要原因数组类型 - keyPoints: 评论中提到的影视关注点数组类型 示例输出 {sentiment: positive, score: 85, reasons: [演员演技在线, 剧情节奏紧凑], keyPoints: [演技, 剧情]} 评论内容 这部电影的剧情虽然有一些俗套但男女主角的演技非常出色尤其是结尾部分很感人。整体观感不错推荐观看。 固定输出 JSON 结构的关键在于“示例”和“字段说明”。用的时候可以把示例直接放在 Prompt 里模型在少样本条件下会更容易稳定输出结构化结果。5.4 Java 调用大模型接口的代码实现以下代码采用“调用 HTTP 接口 解析 JSON”的方式不绑定具体 SDK便于你根据自己所用的大模型平台调整。// 文件路径src/main/java/com/example/movie/comment/ai/LLMClient.java import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; Component public class LLMClient { Value(${ai.api-key}) private String apiKey; Value(${ai.base-url}) private String baseUrl; Value(${ai.model}) private String model; Value(${ai.max-tokens}) private Integer maxTokens; Value(${ai.temperature}) private Double temperature; /** * 调用大模型返回模型生成的原始文本。 */ public String chat(String systemPrompt, String userPrompt) { JSONObject body new JSONObject(); body.set(model, model); body.set(max_tokens, maxTokens); body.set(temperature, temperature); JSONArray messages new JSONArray(); JSONObject systemMsg new JSONObject(); systemMsg.set(role, system); systemMsg.set(content, systemPrompt); messages.add(systemMsg); JSONObject userMsg new JSONObject(); userMsg.set(role, user); userMsg.set(content, userPrompt); messages.add(userMsg); body.set(messages, messages); HttpResponse response HttpRequest.post(baseUrl /chat/completions) .header(Authorization, Bearer apiKey) .header(Content-Type, application/json) .body(body.toString()) .timeout(30000) .execute(); String responseBody response.body(); JSONObject result JSONUtil.parseObj(responseBody); // 兼容不同平台的返回结构核心是取第一个 choices 里的 message.content JSONArray choices result.getJSONArray(choices); if (choices null || choices.isEmpty()) { throw new RuntimeException(大模型返回结果为空); } JSONObject first choices.getJSONObject(0); return first.getJSONObject(message).getStr(content); } }这段代码的关键点有三个使用Value注入配置而不是把密钥写死在代码中请求体中的messages数组是主流大模型接口的通用约定返回结果解析时先获取choices再取message.content。5.5 把模型输出转换为结构化对象模型返回的是 JSON 字符串我们需要转成 Java 对象。// 文件路径src/main/java/com/example/movie/comment/ai/SentimentAnalyzer.java import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import org.springframework.stereotype.Service; import javax.annotation.Resource; Service public class SentimentAnalyzer { Resource private LLMClient llmClient; private static final String SYSTEM_PROMPT 你是一个影视评论情感分析专家。请分析下面的影视评论返回指定的 JSON 格式结果。; public SentimentResult analyze(String commentContent) { StringBuilder userPrompt new StringBuilder(); userPrompt.append(请分析以下影视评论的情感倾向。\n); userPrompt.append(评论内容\n\\\\n); userPrompt.append(commentContent); userPrompt.append(\n\\\\n); userPrompt.append(严格返回 JSON{\sentiment\: \positive/neutral/negative\, \score\: 0-100, \reasons\: [\原因1\, \原因2\], \keyPoints\: [\演技\, \剧情\]}); String modelResponse llmClient.chat(SYSTEM_PROMPT, userPrompt.toString()); // 模型可能输出额外文本这里做一次 JSON 提取容错 String jsonStr extractJson(modelResponse); JSONObject json JSONUtil.parseObj(jsonStr); SentimentResult result new SentimentResult(); result.setSentiment(json.getStr(sentiment)); result.setScore(json.getInt(score)); result.setReasons(json.getBeanList(reasons, String.class)); result.setKeyPoints(json.getBeanList(keyPoints, String.class)); return result; } private String extractJson(String text) { int start text.indexOf({); int end text.lastIndexOf(}); if (start 0 end start) { return text.substring(start, end 1); } return text; } }这里的extractJson是一个轻量容错方案。实际生产环境可以考虑引入 JSON 修复或重试机制但对于毕业设计能够处理模型偶尔输出多余文本的情况已经足够。5.6 关键问题如何控制成本和速度大模型接口是按 Token 计费的。如果你把几千条评论全部做一次情感分析整体成本可能会超出预期。优化思路有三个先过滤短评论去除明显无意义的内容对相似评论做去重同步分析改为异步批量处理降低接口并发压力。对于毕业设计建议准备 500 到 1000 条评论作为标注样本既便于展示也便于论文写作时分析情感分析的准确率。6. 数据可视化展示层实现数据可视化是这个项目的“门面”。很多同学把时间花在了后端结果前端图表效果平平答辩时大打折扣。可视化部分至少要给人“专业”的第一印象。6.1 可视化看板的图表规划不建议只做一个饼图或者柱状图。一个相对完整的舆情分析看板应该包含总体统计卡片评论总数、正面评论数、负面评论数、分析影视数量情感分布饼图正面、中性、负面占比评论趋势折线图按时间维度展示评论量变化影视热度柱状图评论量 Top 10 影视口碑维度雷达图演技、剧情、特效、配乐等维度的评分热门关键词词云从评论中提取的关键词展示。6.2 后端聚合查询接口前端图表不是直接查询数据库而是由后端提供聚合好的 JSON 数据。下面是一个统计情感分布的接口示例。// 文件路径src/main/java/com/example/movie/comment/controller/StatisticsController.java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; RestController RequestMapping(/api/statistics) public class StatisticsController { Resource private CommentStatisticsService commentStatisticsService; GetMapping(/sentiment) public MapString, Object sentimentDistribution() { ListMapString, Object list commentStatisticsService.countBySentiment(); MapString, Object result new HashMap(); result.put(data, list); return result; } GetMapping(/trend) public MapString, Object commentTrend() { ListMapString, Object list commentStatisticsService.countByDay(); MapString, Object result new HashMap(); result.put(data, list); return result; } }统计 SQL 可以使用 MyBatis-Plus 的 QueryWrapper也可以直接写 XML 里的自定义 SQL。高频统计场景下自定义 SQL 性能更可控也更容易在论文中解释清楚。6.3 前端 ECharts 可视化示例如果采用 Vue 3 项目需要先安装 EChartsnpm install echarts --save下面是一个基于 Vue 3 的组件初始化示例。!-- 文件路径src/views/SentimentChart.vue -- template div refchartRef stylewidth: 100%; height: 400px;/div /template script setup import { ref, onMounted, onBeforeUnmount } from vue import * as echarts from echarts import axios from axios const chartRef ref(null) let chartInstance null onMounted(async () { const response await axios.get(/api/statistics/sentiment) const data response.data.data chartInstance echarts.init(chartRef.value) const option { title: { text: 影视评论情感分布 }, tooltip: { trigger: item }, legend: { bottom: 0 }, series: [ { name: 情感分布, type: pie, radius: 60%, data: data.map(item ({ name: item.sentiment positive ? 正面 : item.sentiment neutral ? 中性 : 负面, value: item.count })) } ] } chartInstance.setOption(option) window.addEventListener(resize, handleResize) }) function handleResize() { chartInstance chartInstance.resize() } onBeforeUnmount(() { window.removeEventListener(resize, handleResize) chartInstance chartInstance.dispose() }) /script这段代码的逻辑很直白组件加载时请求后端统计接口把返回数据映射为 ECharts 饼图的 data 结构最后渲染。一个实践建议不要把所有图表代码写在一个大组件里建议按图表类型拆分成独立组件每个组件负责一种数据展示这样项目结构更清晰论文里也能写“模块化设计”。7. 运行验证与效果检查代码写完后如何判断整个系统是“跑通了”而不是“只是启动了”7.1 启动后端服务mvn clean package -Dmaven.test.skiptrue java -jar target/movie-comment-platform-0.0.1-SNAPSHOT.jar启动后查看控制台日志出现Started Application in x.x seconds或者Tomcat started on port(s): 8080就代表启动成功。7.2 检查接口是否能返回数据curl http://localhost:8080/api/statistics/sentiment预期返回结果类似{ data: [ { sentiment: positive, count: 320 }, { sentiment: neutral, count: 120 }, { sentiment: negative, count: 80 } ] }如果返回为空先检查数据库里是否已经写入评论数据再检查统计分析接口的 SQL 是否正确。7.3 前端页面验证启动 Vue 项目npm install npm run dev浏览器访问http://localhost:8081能看到可视化看板正常渲染说明前后端数据链路已经打通。7.4 效果判断的核心指标不要只看“页面出来了”还需要检验数据链路的健壮性数据库中有多少条评论数据AI 情感分析的成功率是多少图表数据是否随着数据库数据变化而变化如果 AI 接口超时系统是否报错影响其他模块。8. 常见问题与排查思路以下都是做这类项目最常遇到的问题建议收藏备用。问题现象可能原因排查方式解决方案SpringBoot 启动失败JDK 版本与 SpringBoot 版本不兼容查看启动日志中的 java.lang.UnsupportedClassVersionError统一 JDK 和 SpringBoot 版本JDK 8 使用 2.7.xJDK 17 使用 3.x数据库中文乱码建库时未指定 utf8mb4 字符集查看数据库连接参数和表结构建库语句指定CHARACTER SET utf8mb4连接参数增加characterEncodingutf8大模型接口返回超时网络问题或模型响应时间较长先用 curl 或 Postman 单独测试接口增加 HTTP 客户端超时时间添加重试机制降低单次分析文本长度模型返回的 JSON 解析失败Prompt 没有约束输出格式打印模型原始返回内容在 Prompt 中加入严格的 JSON 格式示例并写容错解析方法爬虫拿不到数据目标网站有反爬措施检查返回状态码和页面内容降低请求频率更换 User-Agent优先使用公开 API图表不显示前端接口路径 404 或返回数据结构不匹配打开浏览器开发者工具查看 Network 面板确认后端接口路径和前端请求路径一致接口返回数据量太大导致页面卡顿一次查询了全量数据查看 SQL 是否缺少条件增加时间范围、影视 ID 等过滤条件后端做分页评论情感全部是 neutralPrompt 设计缺少倾向性引导查看一条原始评论的模型输出调整 Prompt要求模型区分“推荐、一般、不推荐”增加少量示例9. 最佳实践与工程建议9.1 从最小闭环开始不要一上来就追求完整功能建议先把这样一条链路跑通手动存入 10 条评论 → 调用大模型分析 → 展示一个情感饼图。链路通了再逐步增加爬虫、统计、词云、历史趋势等功能。这样你在调试时永远知道问题出在哪个环节。9.2 数据库设计要预留扩展字段评论表建议包含主键、电影 ID、用户昵称、评论内容、评论时间、点赞数、采集来源、创建时间。分析结果表建议包含主键、评论 ID、情感分类、情感分数、分析维度、分析时间。分开存储的原因是人力和 AI 分析结果可能会因为模型升级而变化保留原始数据可以重新分析。9.3 API Key 的安全管理绝对不要把 API Key 提交到 GitHub。建议通过环境变量注入export AI_API_KEYsk-your-key然后在application.yml中使用占位符ai: api-key: ${AI_API_KEY}答辩时提到这一点可以展示你具备基础的安全意识。9.4 异步分析与定时任务AI 分析是耗时操作如果用户在页面上立即触发分析接口会等很久。推荐把分析过程改成异步任务使用Async注解或者 Spring 的定时任务在后台批量处理。Scheduled(fixedDelay 60000) public void analyzePendingComments() { ListComment pendingList commentMapper.selectList( new LambdaQueryWrapperComment().eq(Comment::getAnalyzeStatus, 0).last(limit 50)); for (Comment comment : pendingList) { try { SentimentResult result sentimentAnalyzer.analyze(comment.getContent()); sentimentResultService.save(result, comment.getId()); comment.setAnalyzeStatus(1); commentMapper.updateById(comment); } catch (Exception e) { log.error(评论分析失败commentId: {}, comment.getId(), e); comment.setAnalyzeStatus(2); // 标记失败 commentMapper.updateById(comment); } } }这里使用了状态字段analyze_status来标记评论是否已经分析过0 表示待分析1 表示成功2 表示失败。这个设计在论文中非常值得写因为它体现了你对任务状态管理、失败重试、日志监控的理解。9.5 日志规范在 AI 调用、爬虫采集、统计查询这三个环节一定要打印日志。否则系统出问题时你根本不知道是数据没采集到还是 AI 接口调用失败还是 SQL 写错。log.info(开始爬取电影 {} 的评论第 {} 页, movieId, page); log.info(大模型分析完成commentId{}sentiment{}score{}, comment.getId(), result.getSentiment(), result.getScore());9.6 单元测试搜索引擎热词里能看到不少开发者关注“SpringBoot 单元测试最佳实战”。建议给最核心的分析模块写一个最小单元测试使用 Mock 技术模拟大模型返回结果而不真实调用接口。SpringBootTest class SentimentAnalyzerTest { MockBean private LLMClient llmClient; Autowired private SentimentAnalyzer sentimentAnalyzer; Test void analyze_shouldReturnPositive() { Mockito.when(llmClient.chat(Mockito.anyString(), Mockito.anyString())) .thenReturn({\sentiment\: \positive\, \score\: 90, \reasons\: [\演技好\], \keyPoints\: [\演技\]}); SentimentResult result sentimentAnalyzer.analyze(演员演技非常出色); Assertions.assertEquals(positive, result.getSentiment()); Assertions.assertEquals(90, result.getScore()); } }这段测试的价值在于不需要真实调用大模型就能验证分析模块的解析逻辑是否正确。答辩时如果能现场跑一个测试用例比口头说“测试过”更有说服力。10. 毕业设计论文与答辩准备要点论文写作和答辩是这个项目最后的临门一脚。很多同学代码做完了但论文写得像流水账白白浪费了一个好题目。10.1 论文结构建议第四章“系统设计”建议分成四个小节架构设计画一张系统架构分层图数据库设计列出核心表结构和 E-R 图功能模块设计分别说明数据采集、AI 分析、可视化展示的流程接口设计列出关键接口的请求参数和返回结构。第五章“系统实现”不建议按功能模块平铺直叙建议结合“关键技术难点”来写如何设计 Prompt 让大模型稳定输出结构化 JSON如何设计异步任务处理批量评论分析如何对模型输出做容错解析如何优化统计接口的查询性能。10.2 答辩时的高频问题准备提问方向建议回答思路为什么选择大模型而不是传统情感词典大模型能理解上下文处理反讽、隐喻等复杂表达传统词典法规则维护成本高大模型分析结果准确吗可以选取 100 条评论人工标注与模型结果对比给出准确率数据如果大模型接口挂了怎么办系统要有超时、重试、失败状态标记机制允许重新分析爬虫的合规性如何保证只获取公开数据遵守 robots 协议控制频率仅用于学习研究系统有哪些可扩展的方向接入更多数据源、支持多平台采集、引入流式计算、增加用户画像你的系统相比已有的舆情系统有什么优势使用大模型替代传统词典分析维度更丰富可视化呈现更直观10.3 项目材料与演示注意毕业设计通常要求提供源码、论文LW、PPT、讲解视频。建议提前准备一份 README.md写清楚项目简介、技术栈、启动步骤、账号配置、接口说明。这样无论是导师查看代码还是你录制讲解视频都能省大量时间。演示的时候注意提前准备好数据。不建议现场爬取因为网络和反爬不可控。正确的做法是数据库里已经预置好几百条真实评论和分析结果现场演示时打开页面直接展示图表效果再补充说明数据采集和 AI 分析的过程。11. 总结与下一步学习方向这篇内容把 SpringBoot AI 大模型影视评论舆情数据可视化分析平台的完整链路拆了一遍从选题价值、系统架构、技术选型到评论采集、大模型情感分析、可视化展示、常见问题、论文答辩准备。真正值得你重点掌握的不是某一个框架的用法而是“端到端”的工程思维数据从哪里来经过什么处理最终如何呈现每一层之间如何衔接出错时如何排查。如果你打算继续深入这里有三个方向可以参考研究大模型应用中更稳定的结构化输出方案比如 Function Calling 或 JSON Mode优化统计查询性能引入缓存、索引、分库分表等概念熟悉数据采集的工程化问题包括频率控制、失败重试、分布式抓取。建议下一步动起手来先把最小链路跑通准备几十条评论、注册一个大模型 API、写一个后端接口、画一个饼图。只要这条路通了后面的模块都只是在这个骨架上一块一块填充。这个项目本身不难难的是你愿不愿意在“已经能跑”的基础上把每一步都搞清楚为什么这么做。如果你把文章里提到的几个关键坑都实际踩一遍毕业设计答辩完全不用慌。
返回列表