当前位置: 首页 > news >正文

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,以下是完整版本:

Stringprompt=String.format("你是一个热梗识别专家。请分析以下社交媒体评论内容,提取出其中可能是网络热梗、流行语或新兴表达的关键词。\n\n"+"要求:\n"+"1. 只提取真正的热梗、流行语、网络用语\n"+"2. 忽略普通词汇、人名、地名\n"+"3. 每个梗用逗号分隔\n"+"4. 最多提取20个最有可能的梗\n"+"5. 如果没有明显的梗,返回'无'\n\n"+"评论内容:\n%s\n\n"+"提取的热梗(用逗号分隔):",combinedText);

Prompt设计要点

  1. 角色设定:明确AI的角色是"热梗识别专家",引导其使用专业视角
  2. 任务明确:清晰说明要做什么(提取热梗、流行语、新兴表达)
  3. 约束条件
    • 过滤规则:排除普通词汇、人名、地名
    • 格式要求:逗号分隔,便于后续解析
    • 数量限制:最多20个,避免过多噪音
    • 边界情况:无热梗时返回特定标识
  4. 示例引导:通过输出格式提示,规范AI响应结构
JSON格式清理机制

由于AI可能返回包含JSON格式的响应(如{"memes": "老6"),我们添加了正则表达式清理:

List<String>memes=Arrays.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: 自动生成词条(可选) │ │ - 如果autoGenerate=true │ │ - 调用candidateService.generateEntry() │ │ - 生成完整百科词条 │ │ - 状态: pending(待审核) │ └─────────────────────────────────────────────┘
数据库交互

创建的候选词记录

INSERTINTOmeme_candidate(keyword,-- AI提取的热梗关键词source,-- 'CSV_AI_EXTRACTED'confidence_score,-- 0.85(AI提取的高置信度)context,-- 包含该关键词的原始评论status-- 'PENDING'(待审核))VALUES(...);

自动生成的词条记录(如果启用):

INSERTINTOmeme_entry(title,-- 热梗名称definition,-- AI生成的释义origin,-- 来源背景usage_scenario,-- 使用场景examples,-- 示例句子status-- 'pending'(待审核发布))VALUES(...);

提示:根据项目规范,只有status='published'的词条才会显示在前端。AI生成的词条默认为pending,需要管理员审核后发布。

使用方式

前端管理页面:

  • 访问:http://localhost:5173/admin/ai
  • 左侧面板: “📁 CSV文件夹处理”
  • 放置CSV文件到springboot-mememind/csv/文件夹
  • 点击" 开始处理CSV文件夹"按钮

API调用:

curl-XPOST"http://localhost:8081/api/v1/csv-import/scan-folder?autoGenerate=true"
优势对比
指标旧方案(逐行导入)新方案(AI智能提取)
处理100条评论100个候选词15个高质量候选词
重复率自动去重
质量低(包含普通词汇)高(只保留真正热梗)
人工筛选需要不需要
处理时间~5秒~30秒(含AI分析)

2. CSV文件夹手动触发模式

背景

之前实现了每5分钟自动扫描CSV文件夹的定时任务,但发现:

  • 后台定时任务占用资源导致前端卡顿
  • 用户无法控制处理时机
  • 不适合大批量文件处理
解决方案

禁用自动定时任务,改为手动触发

  • 注释掉@Scheduled注解
  • 新增REST API:POST /api/v1/csv-import/scan-folder
  • 支持参数配置:
    • autoGenerate: 是否自动生成词条(默认true)
    • aiModel: AI模型名称(可选,留空使用默认模型)
临时配置机制

为了实现灵活的参数传递,设计了临时配置模式:

// 设置临时配置csvAutoProcessTask.setTempConfig(autoGenerate,aiModel);// 执行扫描和处理csvAutoProcessTask.triggerManualScan();// 处理完成后自动清除临时配置tempAutoGenerate=null;tempAiModel=null;

优点:

  • ✅ 消除后台定时任务的资源占用
  • ✅ 前端性能显著提升
  • ✅ 用户可以控制处理时机
  • ✅ 支持自定义配置参数

3. AI监控模块完善

功能特性
  • 实时监控: 记录每次AI调用的响应时间、token使用量
  • 错误分类: 7种错误类型自动识别(超时、配额、网络等)
  • 双层告警: 实时告警 + 定时汇总报告
  • 成本分析: Token使用追踪与费用估算
数据库表结构
CREATETABLEai_monitoring_log(idBIGINTPRIMARYKEYAUTO_INCREMENT,keywordVARCHAR(255),ai_modelVARCHAR(50)DEFAULT'default',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.ts

exportconsthttpClient=axios.create({baseURL:apiBaseUrl(),timeout:60_000,// 从15秒增加到60秒})
ESM模块兼容性修复

问题: Vite配置文件中使用require('http')导致启动失败

解决:

importhttpfrom'node:http'// 替换 require('http').Agent 为 http.Agent

2. 后端配置优化

数据库连接池扩容

文件:application.properties

# SQLite数据库配置优化 spring.datasource.hikari.maximum-pool-size=5 # 从1增加到5 spring.datasource.hikari.minimum-idle=2 # 新增最小空闲连接 spring.datasource.hikari.connection-timeout=30000 # 从10秒增加到30秒 spring.datasource.hikari.idle-timeout=600000 spring.datasource.hikari.max-lifetime=1800000
Redis超时调整
spring.data.redis.timeout=10000ms # 从3秒增加到10秒

3. 代码质量改进

日志格式化规范

问题: 使用了Python风格的{:.2f}格式化占位符

解决: 改用Java标准格式化

// 错误写法log.info("耗时: {:.2f}秒",duration);// ✅ 正确写法log.info("耗时: {}秒",String.format("%.2f",duration));
异常处理完善

文件:AiServiceWithMonitoring.java

修复了recordFailure方法参数不匹配的问题:

// 添加错误类型分类StringerrorType=classifyError(e);StringerrorMessage=e.getMessage()!=null?e.getMessage():e.getClass().getSimpleName();monitoringService.recordFailure(keyword,model,responseTime,errorType,errorMessage);

📊 性能提升总结

优化项优化前优化后
CSV处理质量低(大量噪音)高(精准提取)
前端响应速度卡顿严重流畅
数据库并发能力1个连接5个连接

http://www.gsyq.cn/news/1563901.html

相关文章:

  • Linux Load Average本质解析:不是CPU负载,而是系统资源竞争队列
  • 抖音直播实时数据采集终极指南:如何快速搭建WebSocket监控系统
  • 2026最新选AI命理工具时,怎么判断AI功能是不是实用?
  • 09-运算符大全
  • MSSM+与SV-ViT:多尺度特征与高效注意力在阿尔茨海默病MRI早期诊断中的应用
  • 2026年新发布:烟台地区医院供暖改造专业服务商选择与华天成深度解析 - 品牌鉴赏官2026
  • 暗黑破坏神2存档编辑器:从二进制到可视化的技术实现解析
  • 医疗AI置信度控制:VLM与保形风险控制构建可信决策辅助系统
  • 2026唐山防水补漏避坑指南:卫生间/厨房/阳台/屋顶/地下室漏水检测维修全攻略,正规施工+透明报价+口碑榜靠谱服务商推荐 - 安佳防水
  • 云服务器实际利用率多少,你都支付了全部资源量的费用(用不够一个月也按一个月算)。基
  • 2026大连漏水检测维修本地口碑防水商家榜单:厨卫/阳台/屋面/地下室渗漏水维修,持证施工+明码实价,防水补漏公司TOP5推荐 - 即刻修防水
  • Noto字体终极指南:如何彻底消除全球900+语言的“豆腐块“显示问题
  • 一键解决Windows系统依赖难题:VisualCppRedist AIO完全指南
  • 2026大理漏水检测维修本地口碑防水商家榜单:厨卫/阳台/屋面/地下室渗漏水维修,持证施工+明码实价,防水补漏公司TOP5推荐 - 即刻修防水
  • Python数据归一化与标准化:4种scikit-learn方法原理与实战
  • 【资源合集】100个免费编程学习网站-平台推荐
  • Steam游戏DRM解除工具深度解析:架构设计与实现原理
  • 暗黑破坏神2存档编辑器:告别繁琐十六进制操作的专业解决方案
  • Excel 怎么统计报名状态?零基础用 COUNTIF 先学一个场景
  • 嵌入式GUI皮肤系统:从emWin FLEX皮肤到自定义绘制的实战指南
  • 家里管道堵了别乱找!2026南宁正规疏通维修团队甄选指南 - 宅安选房屋修缮
  • KMS智能激活工具完整指南:5分钟永久解决Windows和Office激活问题
  • Unity IL2CPP逆向深度解析:Cpp2IL实战指南与高级应用
  • 5大革新特性:PVZ Toolkit如何重新定义游戏增强工具的边界
  • 3PT架构:融合几何先验的Transformer轻量化设计与工程实践
  • 高并发理论与实践
  • 有关RIP的实践笔记[ENSP]
  • Day3 Java 学习笔记:运算符与简易计算器
  • SGA-MCTS:基于蒙特卡洛树搜索与原子经验检索的智能体架构解析
  • Node.js path模块实战指南:跨平台路径处理与安全校验