2026山东大学项目实训个人工作记录(八)
MemeMind 项目进度更新 - 2026年6月概述MemeMind AI热梗百科平台近期完成了多项重要功能升级和优化包括CSV智能导入、AI监控模块、前端性能优化等。本文档记录最近的项目进展和技术改进。✨ 新增功能1. CSV智能热梗提取功能核心改进从逐行导入升级为AI智能分析❌ 旧方案将CSV每一行评论直接当作候选词产生大量低质量数据✅ 新方案AI分析全文内容智能提取真正的热梗关键词工作流程1. 读取CSV文件 → 收集所有评论内容 2. AI智能分析 → 识别可能的热梗、流行语 3. 提取关键词 → 返回高质量热梗列表如yyds, 绝绝子, 蚌埠住了... 4. 创建候选词 → 为每个热梗创建MemeCandidate记录 5. 自动生成词条可选→ 调用AI生成完整百科词条技术实现文件位置:CsvImportService.java关键方法:extractMemesWithAI()AI Prompt设计详解我们精心设计了专门针对热梗识别的Prompt以下是完整版本StringpromptString.format(你是一个热梗识别专家。请分析以下社交媒体评论内容提取出其中可能是网络热梗、流行语或新兴表达的关键词。\n\n要求\n1. 只提取真正的热梗、流行语、网络用语\n2. 忽略普通词汇、人名、地名\n3. 每个梗用逗号分隔\n4. 最多提取20个最有可能的梗\n5. 如果没有明显的梗返回无\n\n评论内容\n%s\n\n提取的热梗用逗号分隔,combinedText);Prompt设计要点角色设定明确AI的角色是热梗识别专家引导其使用专业视角任务明确清晰说明要做什么提取热梗、流行语、新兴表达约束条件过滤规则排除普通词汇、人名、地名格式要求逗号分隔便于后续解析数量限制最多20个避免过多噪音边界情况无热梗时返回特定标识示例引导通过输出格式提示规范AI响应结构JSON格式清理机制由于AI可能返回包含JSON格式的响应如{memes: 老6我们添加了正则表达式清理ListStringmemesArrays.stream(aiResponse.split([,])).map(String::trim)// 清理JSON格式符号花括号、引号等.map(s-s.replaceAll(^[{\\\[]|[}\\\]]$,)).filter(s-!s.isEmpty()s.length()50).distinct().limit(20).collect(Collectors.toList());正则表达式解释^[{\\[]- 匹配开头的{,,,[符号|[}\\]]$- 匹配结尾的},,,]符号完整处理流程┌─────────────────────────────────────────────┐ │ 步骤1: 读取CSV文件 │ │ - 路径: springboot-mememind/csv/ │ │ - 编码: UTF-8 │ │ - 解析: OpenCSV库 │ └──────────────────┬──────────────────────────┘ ↓ ┌─────────────────────────────────────────────┐ │ 步骤2: 收集所有评论 │ │ - 跳过表头行 │ │ - 过滤空行 │ │ - 提取第一列作为评论内容 │ │ - 合并为文本集合 │ ──────────────────┬──────────────────────────┘ ↓ ┌─────────────────────────────────────────────┐ │ 步骤3: Token限制保护 │ │ - 检查总长度 │ │ - 超过10000字符则截断 │ │ - 记录警告日志 │ └──────────────────┬──────────────────────────┘ ↓ ┌─────────────────────────────────────────────┐ │ 步骤4: AI智能分析 │ │ - 构建Prompt │ │ - 调用AiService.generateSimpleResponse() │ │ - 记录监控数据时间、token │ └──────────────────┬──────────────────────────┘ ↓ ┌─────────────────────────────────────────────┐ │ 步骤5: 解析AI响应 │ │ - 按逗号分割 │ │ - 清理JSON格式符号 │ │ - 过滤空值和过长词50字符 │ │ - 去重 │ │ - 限制最多20个 │ └──────────────────┬──────────────────────────┘ ↓ ┌─────────────────────────────────────────────┐ │ 步骤6: 创建候选词 │ │ - 为每个热梗创建MemeCandidate │ │ - 设置来源: CSV_AI_EXTRACTED │ │ - 设置置信度: 0.85 │ │ - 关联上下文相关评论 │ │ - 状态: PENDING │ └──────────────────┬──────────────────────────┘ ↓ ┌─────────────────────────────────────────────┐ │ 步骤7: 自动生成词条可选 │ │ - 如果autoGeneratetrue │ │ - 调用candidateService.generateEntry() │ │ - 生成完整百科词条 │ │ - 状态: pending待审核 │ └─────────────────────────────────────────────┘数据库交互创建的候选词记录INSERTINTOmeme_candidate(keyword,-- AI提取的热梗关键词source,-- CSV_AI_EXTRACTEDconfidence_score,-- 0.85AI提取的高置信度context,-- 包含该关键词的原始评论status-- PENDING待审核)VALUES(...);自动生成的词条记录如果启用INSERTINTOmeme_entry(title,-- 热梗名称definition,-- AI生成的释义origin,-- 来源背景usage_scenario,-- 使用场景examples,-- 示例句子status-- pending待审核发布)VALUES(...);提示根据项目规范只有statuspublished的词条才会显示在前端。AI生成的词条默认为pending需要管理员审核后发布。使用方式前端管理页面:访问:http://localhost:5173/admin/ai左侧面板: “ CSV文件夹处理”放置CSV文件到springboot-mememind/csv/文件夹点击 开始处理CSV文件夹按钮API调用:curl-XPOSThttp://localhost:8081/api/v1/csv-import/scan-folder?autoGeneratetrue优势对比指标旧方案逐行导入新方案AI智能提取处理100条评论100个候选词15个高质量候选词重复率高自动去重质量低包含普通词汇高只保留真正热梗人工筛选需要不需要处理时间~5秒~30秒含AI分析2. CSV文件夹手动触发模式背景之前实现了每5分钟自动扫描CSV文件夹的定时任务但发现后台定时任务占用资源导致前端卡顿用户无法控制处理时机不适合大批量文件处理解决方案禁用自动定时任务改为手动触发注释掉Scheduled注解新增REST API:POST /api/v1/csv-import/scan-folder支持参数配置autoGenerate: 是否自动生成词条默认trueaiModel: AI模型名称可选留空使用默认模型临时配置机制为了实现灵活的参数传递设计了临时配置模式// 设置临时配置csvAutoProcessTask.setTempConfig(autoGenerate,aiModel);// 执行扫描和处理csvAutoProcessTask.triggerManualScan();// 处理完成后自动清除临时配置tempAutoGeneratenull;tempAiModelnull;优点:✅ 消除后台定时任务的资源占用✅ 前端性能显著提升✅ 用户可以控制处理时机✅ 支持自定义配置参数3. AI监控模块完善功能特性实时监控: 记录每次AI调用的响应时间、token使用量错误分类: 7种错误类型自动识别超时、配额、网络等双层告警: 实时告警 定时汇总报告成本分析: Token使用追踪与费用估算数据库表结构CREATETABLEai_monitoring_log(idBIGINTPRIMARYKEYAUTO_INCREMENT,keywordVARCHAR(255),ai_modelVARCHAR(50)DEFAULTdefault,response_time_msINT,input_tokensINT,output_tokensINT,statusVARCHAR(20),-- SUCCESS/FAILUREerror_typeVARCHAR(50),error_messageTEXT,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP);REST API接口GET /api/v1/ai-monitoring/stats- 获取统计信息GET /api/v1/ai-monitoring/logs- 查询监控日志GET /api/v1/ai-monitoring/errors- 获取错误统计GET /api/v1/ai-monitoring/costs- 成本分析报告 技术优化1. 前端性能优化Vite配置优化问题: 前后端连接超时代理配置不合理解决方案(vite.config.ts):server:{proxy:{/api:{target:http://localhost:8081,changeOrigin:true,timeout:60000,// 增加到60秒proxyTimeout:60000,agent:newhttp.Agent({keepAlive:true,keepAliveMsecs:60000,maxSockets:50,maxFreeSockets:10,}),},},}Axios超时调整文件:client.tsexportconsthttpClientaxios.create({baseURL:apiBaseUrl(),timeout:60_000,// 从15秒增加到60秒})ESM模块兼容性修复问题: Vite配置文件中使用require(http)导致启动失败解决:importhttpfromnode:http// 替换 require(http).Agent 为 http.Agent2. 后端配置优化数据库连接池扩容文件:application.properties# SQLite数据库配置优化 spring.datasource.hikari.maximum-pool-size5 # 从1增加到5 spring.datasource.hikari.minimum-idle2 # 新增最小空闲连接 spring.datasource.hikari.connection-timeout30000 # 从10秒增加到30秒 spring.datasource.hikari.idle-timeout600000 spring.datasource.hikari.max-lifetime1800000Redis超时调整spring.data.redis.timeout10000ms # 从3秒增加到10秒3. 代码质量改进日志格式化规范问题: 使用了Python风格的{:.2f}格式化占位符解决: 改用Java标准格式化// 错误写法log.info(耗时: {:.2f}秒,duration);// ✅ 正确写法log.info(耗时: {}秒,String.format(%.2f,duration));异常处理完善文件:AiServiceWithMonitoring.java修复了recordFailure方法参数不匹配的问题// 添加错误类型分类StringerrorTypeclassifyError(e);StringerrorMessagee.getMessage()!null?e.getMessage():e.getClass().getSimpleName();monitoringService.recordFailure(keyword,model,responseTime,errorType,errorMessage); 性能提升总结优化项优化前优化后CSV处理质量低大量噪音高精准提取前端响应速度卡顿严重流畅数据库并发能力1个连接5个连接