目录
[三、AI 能力工程化接入(LangChain4j)](#三、AI 能力工程化接入(LangChain4j))
[3.1 AI 服务统一注入设计](#3.1 AI 服务统一注入设计)
[3.2 新闻智能分类(结构化输出)](#3.2 新闻智能分类(结构化输出))
[3.3 新闻正文 AI 清洗与排版](#3.3 新闻正文 AI 清洗与排版)
[4.1 多站点爬虫统一处理流程](#4.1 多站点爬虫统一处理流程)
[4.2 AI + 爬虫完整处理流程](#4.2 AI + 爬虫完整处理流程)
[6.1 用户兴趣建模](#6.1 用户兴趣建模)
[6.2 推荐策略实现](#6.2 推荐策略实现)
[7.1 树形评论结构](#7.1 树形评论结构)
[7.2 点赞防重复设计](#7.2 点赞防重复设计)
一、研究背景与问题分析
传统新闻系统在内容获取、分类与推荐环节高度依赖人工规则或静态算法,存在以下明显不足:
-
新闻来源分散,采集与清洗成本高
-
基于关键词或规则的分类泛化能力弱
-
推荐系统依赖简单热度,个性化不足
-
对老年用户不友好,缺乏语音交互能力
随着大语言模型(LLM)在文本理解与生成领域的成熟,将其引入新闻系统的内容处理与决策环节 ,具备明显的工程可行性与实践价值。本文基于 Spring Boot + MyBatis 构建后端服务,结合 LangChain4j 接入大模型能力,设计并实现了一套 AI 驱动的智能新闻系统,实现了从新闻采集、智能处理到个性化推荐的完整业务闭环。
二、系统总体架构设计
系统采用 分层架构 + AI 服务解耦设计,核心模块如下:
-
控制层(Controller):对外提供 REST 接口
-
业务层(Service):新闻爬虫、推荐、评论、语音处理
-
数据层(Mapper):MyBatis 持久化
-
AI 能力层:通过 LangChain4j 封装大模型能力
该设计的核心原则是:将 AI 能力作为"基础服务",而非业务逻辑的一部分。
三、AI 能力工程化接入(LangChain4j)
3.1 AI 服务统一注入设计
系统通过 Spring Bean 将大模型能力统一注入,业务层只依赖接口,不感知模型实现细节:
@Configuration
public class AiConfig {
@Bean
public AiAssistant aiAssistant(ChatLanguageModel model,
ChatMemory chatMemory,
AiTools aiTools) {
return AiServices.builder(AiAssistant.class)
.chatLanguageModel(model)
.chatMemory(chatMemory)
.tools(aiTools)
.build();
}
}
设计意义:
-
AI 能力与业务逻辑解耦
-
模型可替换
-
统一管理 Prompt 与上下文
3.2 新闻智能分类(结构化输出)
新闻分类不采用传统关键词匹配,而是通过 Prompt 约束大模型返回结构化 JSON:
@SystemMessage("""
你是一个新闻内容分析专家。
请根据标题判断新闻类别,并严格返回 JSON:
{"category":"分类","location":"视觉关键词"}
""")
String classify(@UserMessage String title);
在业务中直接解析 JSON:
JSONObject json = JSON.parseObject(aiResult);
String category = json.getString("category");
String location = json.getString("location");
工程优势:
-
分类逻辑无需维护规则表
-
新类别可通过 Prompt 扩展
-
输出格式稳定,易于程序处理
3.3 新闻正文 AI 清洗与排版
针对不同网站正文结构不一致的问题,采用 AI 进行语义级清洗与统一排版:
@SystemMessage("""
你是专业新闻编辑。
请删除广告、版权说明等无关内容,
并确保每个自然段首行缩进2个全角空格。
""")
String cleanAndFormat(@UserMessage String rawContent);
相比正则处理,该方案具备更强的跨站点适应能力。
四、新闻爬虫模块设计与实现
4.1 多站点爬虫统一处理流程
系统支持多个主流新闻网站,所有爬虫最终统一进入 processLinks 方法处理:
if (newsMapper.countByUrl(detailUrl) > 0) {
continue; // URL 去重
}
4.2 AI + 爬虫完整处理流程
核心处理流程如下:
String title = document.title();
String rawContent = contentElement.text();
// AI 分类
String aiResult = classifier.classify(title);
// AI 正文清洗
String formattedContent = contentProcessor.cleanAndFormat(rawContent);
// 搜索并下载封面图
String imageUrl = imageService.searchAndDownload(location);
// 数据入库
newsMapper.insert(news);
并在每条新闻处理后进行冷却:
Thread.sleep(30000); // 防止反爬
该设计实现了端到端无人值守新闻生产流程。
五、新闻封面图获取策略
系统采用 "原图优先,搜索兜底" 的策略:
if (imageUrl == null) {
imageUrl = searchByKeyword(keyword);
}
下载图片时增加健壮性处理:
conn.setConnectTimeout(10000);
conn.setReadTimeout(10000);
conn.setRequestProperty("User-Agent", USER_AGENT);
并支持多次重试,最终保证每条新闻都有可用封面图。
六、个性化推荐系统设计
6.1 用户兴趣建模
通过用户点击行为更新兴趣权重:
INSERT INTO user_interests (user_id, category, click_count)
VALUES (?, ?, 1)
ON DUPLICATE KEY UPDATE click_count = click_count + 1;
6.2 推荐策略实现
推荐逻辑集中在 Service 层:
List<String> interests = newsMapper.getTopInterests(userId);
for (String category : interests) {
News news = newsMapper.getRandomByCategory(category);
recommendList.add(news);
}
若推荐不足,则使用 24 小时热榜补齐:
recommendList.addAll(newsMapper.getHotNews24h());
该策略在复杂度与效果之间取得了良好平衡。
七、评论系统与点赞一致性控制
7.1 树形评论结构
后端构建完整评论树:
for (NewsComment comment : rootComments) {
List<NewsComment> replies = mapper.getReplies(comment.getId());
comment.setReplies(replies);
}
前端无需递归查询数据库。
7.2 点赞防重复设计
点赞前校验用户行为:
int count = mapper.checkNewsLike(userId, newsId);
点赞与取消点赞逻辑:
if (count == 0) {
mapper.insertLike(userId, newsId);
mapper.incrementLike(newsId);
} else {
mapper.deleteLike(userId, newsId);
mapper.decrementLike(newsId);
}
确保数据一致性。
八、语音识别(ASR)工程实现
针对老年用户,集成百度语音识别极速版。
关键参数设置如下:
JSONObject result = client.asr(audioData, "wav", 16000, options);
重点优化点:
-
明确使用
wav格式,避免 3312 错误 -
固定采样率 16000Hz
-
完整异常日志输出,提升可维护性
九、系统工程价值分析
该系统具备以下工程价值:
-
AI 深度参与核心业务流程,而非简单接口调用
-
模块化设计,适合课程设计与真实项目
-
爬虫、推荐、评论、语音完整闭环
-
对智慧养老、资讯平台具有直接复用价值
十、总结与展望
本文从工程实践角度,系统性介绍了一套 基于 Spring Boot 与 LangChain4j 的 AI 智能新闻系统。通过将大语言模型引入新闻分类、正文清洗与摘要生成环节,有效降低了系统规则维护成本,并显著提升了内容质量与用户体验。
后续可进一步引入:
-
向量检索与语义推荐
-
AI 内容审核
界面展示:


