大厂Java面试实录:从Spring Boot到AI技术的UGC内容社区场景深度解析
大厂Java面试实录:从Spring Boot到AI技术的UGC内容社区场景深度解析
面试场景:UGC内容社区平台技术面试
面试官:谢飞机,欢迎来到我们公司。今天我们将围绕UGC内容社区平台进行技术交流,请你放松心态,如实回答。
谢飞机:谢谢面试官,我会尽力表现的!
第一轮提问:Spring Boot基础与内容管理系统架构
面试官:首先,UGC平台需要处理大量的用户生成内容。请问我使用Spring Boot构建内容管理系统时,如何利用自动配置来简化开发?
谢飞机:嗯...Spring Boot的自动配置就是会根据类路径下的jar包自动配置Bean。比如如果看到spring-boot-starter-web,就会自动配置Tomcat、DispatcherServlet这些。在UGC平台里,我们可以用@SpringBootApplication注解,然后通过@ConditionalOnClass这样的条件注解来控制Bean的创建。
面试官:回答得不错。那在内容管理系统中,我们经常需要实时处理用户上传的内容和互动数据,请问如何使用Spring WebFlux来实现响应式的内容处理API?
谢飞机:Spring WebFlux是基于响应式编程的,可以用Mono和Flux来处理异步数据流。对于内容处理,我们可以创建一个Flux,然后通过WebSocket或者Server-Sent Events实时推送处理进度。这样可以避免阻塞,提高系统的并发处理能力。
面试官:很好。在UGC平台中,内容数据需要频繁查询,请问我应该如何设计Redis缓存来优化内容信息的读取性能?
谢飞机:Redis缓存的话,可以用String结构存储内容JSON数据,Key可以用"content:#{contentId}"这样的格式。对于热门内容,可以用Sorted Set来维护访问热度。还可以用Redis的过期时间自动清理不活跃的内容数据。对了,还可以用Pipeline批量减少网络开销。
面试官:思路清晰。最后一个问题,内容管理系统需要处理大量的UGC内容,请问如何使用Spring Data JPA来优化内容的批量查询和更新?
谢飞机:Spring Data JPA的话,可以用@Query注解写原生SQL,或者用Specification动态查询。批量更新的话,可以用saveAll()方法,或者用@Modifying注解写批量更新语句。对于分页查询,用Pageable对象配合Page返回结果。
面试官:很好,第一轮回答得不错。接下来我们进入第二轮。
第二轮提问:微服务架构与内容社区高并发
面试官:UGC平台通常采用微服务架构,请问在微服务拆分时,如何合理设计内容服务的边界?
谢飞机:内容服务的边界...应该按照业务能力来拆分。比如可以分成内容发布服务、内容审核服务、用户推荐服务、评论服务等。每个服务都有自己的数据库,通过API互相调用。内容发布服务可以负责用户内容发布,内容审核服务负责内容质量把控。
面试官:那在微服务通信中,我们如何使用OpenFeign来实现服务间的优雅调用?
谢飞机:OpenFeign是声明式的HTTP客户端,可以用@FeignClient注解定义接口。比如定义一个ContentClient接口,用@GetMapping("/api/contents/{id}")这样的注解来调用内容服务。OpenFeign会自动实现HTTP调用,还支持负载均衡、熔断这些功能。
面试官:在内容社区中,内容状态变更频繁,请问如何使用Kafka来实现内容状态的异步通知?
谢飞机:Kafka的话,可以创建一个"content-events"主题,内容服务在状态变更时发送消息。其他服务比如推荐服务、评论服务可以订阅这个主题。消息可以用JSON格式,包含内容ID、旧状态、新状态这些字段。这样可以实现服务解耦,提高系统的响应速度。
面试官:很好。最后一个问题,UGC平台需要保证高可用性,请问如何使用Resilience4j来实现服务的熔断和限流?
谢飞机:Resilience4j是一个轻量级的容错库。可以用CircuitBreaker来设置熔断规则,当错误率达到阈值就熔断。用RateLimiter来限制请求频率,用Bulkhead来限制并发线程数。比如在调用推荐服务时,可以加上@CircuitBreaker注解,当服务不可用时快速失败。
面试官:不错,第二轮回答得还可以。接下来我们进入最后一轮。
第三轮提问:AI技术与内容社区智能化
面试官:现代UGC平台都在引入AI技术来优化内容推荐。请问在Spring Boot中如何集成Spring AI来实现智能内容推荐?
谢飞机:Spring AI...这个我了解不多,应该是Spring框架对AI的支持。可以用Spring AI的客户端调用大模型API,把用户行为、内容特征、历史偏好作为输入,让AI计算出最优的内容推荐。然后把这个推荐结果保存到数据库,供用户使用。
面试官:那在内容社区中,我们如何使用向量数据库来实现相似内容的快速检索?
谢飞机:向量数据库...这个我接触不多。应该是把内容的特征转换成向量,然后存储在Milvus或者Chroma这样的向量数据库里。当需要查找相似内容时,可以用余弦相似度来计算内容之间的相似性,这样可以快速找到相似的内容推荐。
面试官:在内容推荐系统中,我们如何使用RAG技术来提高推荐内容的准确性?
谢飞机:RAG是检索增强生成...应该是先从知识库中检索相关的用户偏好和内容特征,然后结合这些信息来生成推荐。比如当用户浏览内容时,系统先从知识库中查找相关的用户历史偏好和内容特征,然后基于这些信息给出准确的内容推荐。
面试官:最后一个问题,UGC平台需要处理大量的自然语言交互,请问如何使用Embedding模型来实现智能语义理解?
谢飞机:Embedding模型...这个我了解不多。应该是把用户的自然语言交互转换成向量,然后在向量空间中进行相似度匹配。比如用户说"我想看有趣的内容",系统把这个交互转换成向量,然后在内容数据库中查找相似的内容,给出准确的内容推荐。
面试官:好的,今天的面试就到这里。你的回答有对有错,我们会综合评估。请你回家等通知吧。
谢飞机:谢谢面试官,我会继续学习的!
详细答案解析
第一轮答案详解
1. Spring Boot自动配置在UGC系统中的应用
业务场景:UGC内容社区平台需要快速构建基础架构,处理用户管理、内容发布、内容审核等核心功能。
技术实现:
java
@SpringBootApplication
public class UgcPlatformApplication {
public static void main(String[] args) {
SpringApplication.run(UgcPlatformApplication.class, args);
}
}
@Configuration
@ConditionalOnClass(DataSource.class)
public class DataSourceAutoConfiguration {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
}
@Service
public class ContentService {
@Autowired
private ContentRepository contentRepository;
public Content getContentById(Long contentId) {
return contentRepository.findById(contentId).orElse(null);
}
}
技术要点:
@SpringBootApplication包含@EnableAutoConfiguration,自动配置Spring上下文@ConditionalOnClass根据类路径条件自动配置Bean@ConfigurationProperties绑定配置文件属性到Bean- UGC系统中可自动配置数据源、Redis、消息队列等基础设施
2. Spring WebFlux实现响应式内容处理
业务场景:实时处理用户上传的内容,支持大量并发请求,避免阻塞式I/O影响系统性能。
技术实现:
java
@RestController
@RequestMapping("/api/contents")
public class ContentController {
@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<Content> getContentStream() {
return contentService.getProcessingContents();
}
@MessageMapping("/content.process")
@SendTo("/topic/contents")
public Content processContent(Content content) {
return contentService.processContent(content);
}
}
@Service
public class ContentService {
public Flux<Content> getProcessingContents() {
return Flux.interval(Duration.ofSeconds(1))
.flatMap(i -> contentRepository.findAllByStatus(ContentStatus.PROCESSING));
}
public Content processContent(Content content) {
return contentRepository.save(content);
}
}
技术要点:
- 使用
Flux<Content>处理异步数据流 MediaType.TEXT_EVENT_STREAM_VALUE支持Server-Sent Events- WebSocket集成实现双向实时通信
- 响应式编程避免阻塞,提高并发处理能力
3. Redis缓存优化内容信息读取
业务场景:内容信息频繁查询,需要减少数据库压力,提高响应速度。
技术实现:
java
@Service
public class ContentCacheService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
public Content getContentFromCache(Long contentId) {
String key = "content:" + contentId;
return (Content) redisTemplate.opsForValue().get(key);
}
public void cacheContent(Content content) {
String key = "content:" + contentId;
redisTemplate.opsForValue().set(key, content, 30, TimeUnit.MINUTES);
}
public void batchCacheContents(List<Content> contents) {
Map<String, Object> map = new HashMap<>();
contents.forEach(c -> map.put("content:" + c.getId(), c));
redisTemplate.opsForValue().multiSet(map);
}
}
技术要点:
- 使用String结构存储JSON序列化的内容数据
- 合理设置过期时间,避免内存泄漏
- Pipeline批量操作减少网络开销
- 设置合理的缓存穿透和缓存雪崩防护
4. Spring Data JPA优化内容批量操作
业务场景:批量查询和更新内容,提高数据处理效率。
技术实现:
java
@Repository
public interface ContentRepository extends JpaRepository<Content, Long> {
@Query("SELECT c FROM Content c WHERE c.status = :status")
List<Content> findByStatus(@Param("status") ContentStatus status);
@Query(value = "SELECT * FROM contents WHERE status = ?1 LIMIT ?2", nativeQuery = true)
Page<Content> findByStatusNative(ContentStatus status, Pageable pageable);
@Modifying
@Query("UPDATE Content c SET c.status = :newStatus WHERE c.id IN :ids")
int updateStatusByIds(@Param("newStatus") ContentStatus newStatus,
@Param("ids") List<Long> ids);
}
@Service
public class ContentService {
@Autowired
private ContentRepository contentRepository;
public List<Content> getPendingContents() {
return contentRepository.findByStatus(ContentStatus.PENDING);
}
public Page<Content> getContentsByPage(ContentStatus status, int page, int size) {
Pageable pageable = PageRequest.of(page, size, Sort.by("createTime").descending());
return contentRepository.findByStatusNative(status, pageable);
}
@Transactional
public void batchUpdateStatus(List<Long> ids, ContentStatus newStatus) {
contentRepository.updateStatusByIds(newStatus, ids);
}
}
技术要点:
- 使用
@Query注解优化复杂查询 - 原生SQL查询提高性能
@Modifying注解支持批量更新- 分页查询避免内存溢出
- 事务管理保证数据一致性
第二轮答案详解
1. 微服务边界设计
业务场景:UGC平台复杂度高,需要合理拆分微服务,提高系统可维护性和扩展性。
技术实现:
java
// 内容发布服务边界设计
@RestController
@RequestMapping("/api/contents")
public class ContentController {
@Autowired
private ContentService contentService;
@PostMapping
public ResponseEntity<Content> createContent(@RequestBody ContentRequest request) {
Content content = contentService.createContent(request);
return ResponseEntity.ok(content);
}
@GetMapping("/{id}/publish")
public ResponseEntity<Content> publishContent(@PathVariable Long id) {
Content content = contentService.publishContent(id);
return ResponseEntity.ok(content);
}
}
// 内容审核服务边界设计
@RestController
@RequestMapping("/api/moderation")
public class ModerationController {
@Autowired
private ModerationService moderationService;
@PostMapping("/check")
public ResponseEntity<ModerationResult> checkContent(@RequestBody Content content) {
ModerationResult result = moderationService.checkContent(content);
return ResponseEntity.ok(result);
}
}
技术要点:
- 按业务能力拆分:内容发布服务、内容审核服务、推荐服务、评论服务
- 单一职责原则:每个服务专注于特定业务领域
- 数据独立性:每个服务都有自己的数据库
- API设计:RESTful接口,清晰明确的资源路径
2. OpenFeign服务间调用
业务场景:微服务间需要优雅的HTTP调用,避免手动处理HTTP请求细节。
技术实现:
java
// 内容服务客户端
@FeignClient(name = "content-service", url = "${content.service.url}")
public interface ContentClient {
@GetMapping("/api/contents/{id}")
ResponseEntity<Content> getContentById(@PathVariable Long id);
@GetMapping("/api/contents/pending")
ResponseEntity<List<Content>> getPendingContents();
@PostMapping("/api/contents/{id}/approve")
ResponseEntity<Content> approveContent(@PathVariable Long id);
}
// 推荐服务中使用
@Service
public class RecommendationService {
@Autowired
private ContentClient contentClient;
@Autowired
private UserClient userClient;
public List<Content> getRecommendationsForUser(Long userId) {
// 调用用户服务获取用户偏好
User user = userClient.getUserById(userId);
// 调用内容服务获取待审核内容
ResponseEntity<List<Content>> contentResponse = contentClient.getPendingContents();
// 根据用户偏好筛选内容
return contentResponse.getBody().stream()
.filter(content -> matchesUserPreference(content, user))
.collect(Collectors.toList());
}
}
技术要点:
@FeignClient声明式HTTP客户端- 接口定义与远程服务API保持一致
- 自动集成负载均衡、熔断、重试
- 简化服务间调用代码,提高可维护性
3. Kafka内容状态异步通知
业务场景:内容状态变更频繁,需要实时通知相关服务,避免同步调用的性能瓶颈。
技术实现:
java
// 内容服务 - 消息生产者
@Service
public class ContentService {
@Autowired
private KafkaTemplate<String, ContentEvent> kafkaTemplate;
@Autowired
private ContentRepository contentRepository;
@Transactional
public Content updateContentStatus(Long contentId, ContentStatus newStatus) {
Content content = contentRepository.findById(contentId)
.orElseThrow(() -> new ContentNotFoundException(contentId));
ContentStatus oldStatus = content.getStatus();
content.setStatus(newStatus);
content = contentRepository.save(content);
// 发送状态变更事件
ContentEvent event = new ContentEvent();
event.setContentId(contentId);
event.setOldStatus(oldStatus);
event.setNewStatus(newStatus);
event.setTimestamp(LocalDateTime.now());
kafkaTemplate.send("content-events", event);
return content;
}
}
// 推荐服务 - 消息消费者
@Service
public class RecommendationService {
@Autowired
private ContentRepository contentRepository;
@KafkaListener(topics = "content-events", groupId = "recommendation-group")
public void handleContentEvent(ContentEvent event) {
if (event.getNewStatus() == ContentStatus.APPROVED) {
// 内容审核通过后加入推荐池
addToRecommendationPool(event.getContentId());
} else if (event.getNewStatus() == ContentStatus.REJECTED) {
// 内容审核拒绝后从推荐池移除
removeFromRecommendationPool(event.getContentId());
}
}
private void addToRecommendationPool(Long contentId) {
// 实现推荐添加逻辑
}
private void removeFromRecommendationPool(Long contentId) {
// 实现推荐移除逻辑
}
}
技术要点:
- 主题设计:按业务事件类型定义主题
- 消息结构:包含足够的上下文信息
- 消费者分组:实现消息的负载均衡
- 事件驱动架构:服务解耦,提高系统弹性
4. Resilience4j服务容错
业务场景:UGC平台依赖多个外部服务,需要保证系统在服务不可用时的稳定性。
技术实现:
java
@Configuration
public class Resilience4jConfig {
@Bean
public CircuitBreakerConfig circuitBreakerConfig() {
return CircuitBreakerConfig.custom()
.failureRateThreshold(50)
.waitDurationInOpenState(Duration.ofMillis(1000))
.slidingWindowSize(10)
.slidingWindowType(SlidingWindowType.COUNT_BASED)
.build();
}
@Bean
public RateLimiterConfig rateLimiterConfig() {
return RateLimiterConfig.custom()
.limitForPeriod(100)
.limitRefreshPeriod(Duration.ofSeconds(1))
.timeoutDuration(Duration.ofMillis(0))
.build();
}
}
@Service
public class ExternalAIService {
@Autowired
private CircuitBreaker circuitBreaker;
@Autowired
private RateLimiter rateLimiter;
@Autowired
private RestTemplate restTemplate;
@CircuitBreaker(name = "aiService", fallbackMethod = "generateContentFallback")
@RateLimiter(name = "aiService")
public Content generateContent(ContentRequest request) {
return restTemplate.postForObject("${ai.service.url}/generate", request, Content.class);
}
public Content generateContentFallback(ContentRequest request, Exception ex) {
Content fallbackContent = new Content();
fallbackContent.setTitle("默认内容标题");
fallbackContent.setContent("由于AI服务暂时不可用,这是默认生成的内容");
fallbackContent.setGeneratedAt(LocalDateTime.now());
return fallbackContent;
}
@Bulkhead(name = "aiService", type = Bulkhead.Type.THREADPOOL)
@Recover
public Content handleBulkheadFailure(Exception ex) {
Content fallbackContent = new Content();
fallbackContent.setTitle("系统繁忙");
fallbackContent.setContent("系统繁忙,请稍后重试");
fallbackContent.setGeneratedAt(LocalDateTime.now());
return fallbackContent;
}
}
技术要点:
- 熔断器:快速失败,避免资源浪费
- 限流器:控制请求频率,保护系统
- 舱壁隔离:限制并发线程数
- 降级策略:提供备用数据或默认值
- 配置灵活:可根据业务需求调整参数
第三轮答案详解
1. Spring AI智能内容推荐
业务场景:利用AI技术优化内容推荐,提高推荐准确性,提升用户参与度。
技术实现:
java
@Configuration
public class SpringAiConfig {
@Bean
public OpenAiClient openAiClient() {
return OpenAiClient.builder()
.apiKey("${openai.api.key}")
.build();
}
}
@Service
public class IntelligentRecommendationService {
@Autowired
private OpenAiClient openAiClient;
@Autowired
private ContentRepository contentRepository;
public RecommendationResult intelligentRecommend(User user) {
// 构建AI提示
String prompt = buildPrompt(user);
// 调用AI模型
AiResponse response = openAiClient.complete(prompt);
// 解析AI响应
RecommendationResult aiRecommendation = parseAiResponse(response.getContent());
// 验证和优化推荐结果
RecommendationResult optimizedRecommendation = validateAndOptimizeRecommendation(aiRecommendation);
// 保存推荐结果到数据库
return recommendationRepository.save(optimizedRecommendation);
}
private String buildPrompt(User user) {
return String.format(
"作为专业的内容推荐专家,请为以下用户推荐合适的内容:" +
"用户信息:%s,历史行为:%s,兴趣标签:%s,当前时间:%s。" +
"请返回JSON格式的推荐结果,包含推荐内容列表、推荐分数、推荐原因等信息。",
user.getUserInfo(),
user.getHistoricalBehavior(),
user.getInterestTags(),
LocalDateTime.now()
);
}
private RecommendationResult parseAiResponse(String aiResponse) {
// 使用JSON解析库解析AI返回的结果
return JsonUtils.fromJson(aiResponse, RecommendationResult.class);
}
private RecommendationResult validateAndOptimizeRecommendation(RecommendationResult recommendation) {
// 验证推荐的合理性
// 结合用户实时行为优化推荐
// 考虑内容新鲜度和质量等因素
return recommendation;
}
}
技术要点:
- Spring AI集成:简化AI模型调用
- 提示工程:构建高质量的AI推荐提示词
- 结果解析:JSON格式的结构化数据
- 推荐验证:结合用户行为和业务逻辑
- 持久化存储:保存推荐结果供后续使用
2. 向量数据库相似内容检索
业务场景:快速查找相似内容,优化推荐算法,提高内容发现效率。
技术实现:
java
@Service
public class SimilarContentService {
@Autowired
private MilvusClient milvusClient;
@Autowired
private ContentVectorService contentVectorService;
public List<Content> findSimilarContents(Content targetContent, int topK) {
// 将目标内容转换为向量
float[] targetVector = contentVectorService.contentToVector(targetContent);
// 在向量数据库中搜索相似内容
SearchParam searchParam = SearchParam.newBuilder()
.withCollectionName("contents")
.withVectors(targetVector)
.withTopK(topK)
.withMetricType(MetricType.L2)
.build();
SearchResult searchResult = milvusClient.search(searchParam);
// 解析搜索结果
return parseSearchResult(searchResult);
}
public void buildContentVectors(List<Content> contents) {
List<InsertParam> insertParams = contents.stream()
.map(content -> {
float[] vector = contentVectorService.contentToVector(content);
return InsertParam.newBuilder()
.withCollectionName("contents")
.withPrimaryField(content.getId())
.withVectorField(vector)
.withAdditionalFields(content.getFeatures())
.build();
})
.collect(Collectors.toList());
// 批量插入向量数据
insertParams.forEach(milvusClient::insert);
}
private List<Content> parseSearchResult(SearchResult searchResult) {
return searchResult.getResults().stream()
.map(result -> {
Content content = new Content();
content.setId(result.getId());
content.setSimilarityScore(result.getScore());
return content;
})
.collect(Collectors.toList());
}
}
@Component
public class ContentVectorService {
@Autowired
private EmbeddingModel embeddingModel;
public float[] contentToVector(Content content) {
// 构建内容特征文本
String featureText = String.format(
"标题:%s,类型:%s,标签:%s,内容摘要:%s,历史表现:%s",
content.getTitle(),
content.getType(),
content.getTags(),
content.getSummary(),
content.getHistoricalPerformance()
);
// 使用Embedding模型转换为向量
return embeddingModel.embed(featureText);
}
}
技术要点:
- 向量化:将内容特征转换为数值向量
- 相似度计算:使用余弦相似度或欧氏距离
- Milvus/Chroma:专门的向量数据库
- 批量处理:提高数据导入效率
- 特征工程:选择合适的内容特征
3. RAG技术在内容推荐中的应用
业务场景:提高内容推荐准确性,基于知识库和用户偏好提供个性化推荐。
技术实现:
java
@Service
public class ContentRecommendationService {
@Autowired
private DocumentRetriever documentRetriever;
@Autowired
private ChatModel chatModel;
@Autowired
private KnowledgeBaseService knowledgeBaseService;
public List<Content> getPersonalizedRecommendations(User user) {
// 1. 检索相关知识文档
List<Document> relevantDocuments = documentRetriever.retrieve(
user.getInterests(),
10
);
// 2. 构建增强提示
String enhancedPrompt = buildEnhancedPrompt(user, relevantDocuments);
// 3. 调用大模型生成推荐
AiResponse aiResponse = chatModel.complete(enhancedPrompt);
// 4. 处理和验证推荐
List<Content> recommendations = processRecommendations(aiResponse, relevantDocuments);
// 5. 记录推荐历史
saveRecommendationHistory(user, recommendations);
return recommendations;
}
private String buildEnhancedPrompt(User user, List<Document> documents) {
String context = documents.stream()
.map(Document::getContent)
.collect(Collectors.joining("\n\n"));
return String.format(
"基于以下知识库信息和用户偏好,请推荐合适的内容:" +
"\n\n知识库信息:\n%s" +
"\n\n用户偏好:%s,历史兴趣:%s,浏览历史:%s" +
"\n\n请提供个性化的内容推荐列表,每项包含标题、类型、相似度分数等信息。",
context,
user.getInterests(),
user.getHistoricalInterests(),
user.getBrowsingHistory()
);
}
private List<Content> processRecommendations(AiResponse aiResponse, List<Document> documents) {
// 解析AI响应,提取推荐内容
List<Content> recommendations = parseRecommendationResponse(aiResponse);
// 根据知识库信息优化推荐
return recommendations.stream()
.peek(content -> {
content.setConfidence(calculateConfidence(content, documents));
content.setRelevanceScore(calculateRelevance(content, user));
})
.sorted(Comparator.comparingDouble(Content::getConfidence).reversed())
.collect(Collectors.toList());
}
private double calculateConfidence(Content content, List<Document> documents) {
// 基于检索到的文档数量和质量计算置信度
return Math.min(1.0, documents.size() * 0.1);
}
@EventListener
public void handleNewDocument(DocumentAddedEvent event) {
// 当知识库新增文档时,更新向量索引
documentRetriever.updateIndex(event.getDocument());
}
}
技术要点:
- 文档检索:基于语义相似度查找相关知识
- 提示增强:结合检索结果构建上下文
- 推荐优化:评估推荐的准确性和置信度
- 知识库维护:定期更新和优化文档索引
- 个性化推荐:结合用户历史和行为数据
4. Embedding模型实现语义理解
业务场景:理解用户自然语言意图,提供精准的内容服务和推荐。
技术实现:
java
@Service
public class SemanticUnderstandingService {
@Autowired
private EmbeddingModel embeddingModel;
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@Autowired
private QueryIntentAnalyzer intentAnalyzer;
public ContentQueryIntent understandUserIntent(String userInput) {
// 1. 分析用户输入意图
QueryIntent intent = intentAnalyzer.analyzeIntent(userInput);
// 2. 将输入转换为向量
float[] inputVector = embeddingModel.embed(userInput);
// 3. 构建语义理解查询
NativeSearchQuery searchQuery = buildSemanticSearchQuery(inputVector, intent);
// 4. 执行搜索
SearchHits<ContentDocument> searchHits =
elasticsearchTemplate.search(searchQuery, ContentDocument.class);
// 5. 处理和理解结果
return processUnderstandingResult(searchHits, userInput, intent);
}
private NativeSearchQuery buildSemanticSearchQuery(float[] inputVector, QueryIntent intent) {
// 构建向量相似度查询
VectorScriptQueryBuilder vectorQuery = QueryBuilders
.scriptQuery(new Script(
"cosineSimilarity(params.query_vector, 'doc_vector') + 1.0",
Collections.singletonMap("query_vector", inputVector)
));
// 构建意图过滤器
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
.must(vectorQuery)
.filter(buildIntentFilter(intent));
return new NativeSearchQueryBuilder()
.withQuery(boolQuery)
.withPageable(PageRequest.of(0, 10))
.build();
}
private BoolQueryBuilder buildIntentFilter(QueryIntent intent) {
BoolQueryBuilder filter = QueryBuilders.boolQuery();
switch (intent.getType()) {
case CONTENT_SEARCH:
filter.must(QueryBuilders.termQuery("category", "content_search"));
break;
case CONTENT_RECOMMENDATION:
filter.must(QueryBuilders.termQuery("category", "recommendation"));
break;
case TECHNICAL_SUPPORT:
filter.must(QueryBuilders.termQuery("category", "technical_support"));
break;
default:
filter.must(QueryBuilders.existsQuery("content"));
}
return filter;
}
private ContentQueryIntent processUnderstandingResult(SearchHits<ContentDocument> searchHits,
String userInput,
QueryIntent intent) {
ContentQueryIntent intentResult = new ContentQueryIntent();
intentResult.setOriginalInput(userInput);
intentResult.setIntentType(intent);
intentResult.setConfidence(calculateIntentConfidence(searchHits));
List<ContentDocument> documents = searchHits.stream()
.map(hit -> hit.getContent())
.sorted(Comparator.comparingDouble(ContentDocument::getRelevanceScore).reversed())
.collect(Collectors.toList());
intentResult.setRelevantDocuments(documents);
return intentResult;
}
// 定期重新索引文档
@Scheduled(fixedRate = 3600000) // 每小时执行一次
public void reindexContentDocuments() {
List<ContentDocument> documents = contentDocumentRepository.findAll();
documents.forEach(doc -> {
float[] vector = embeddingModel.embed(doc.getContent());
doc.setVector(vector);
contentDocumentRepository.save(doc);
});
}
}
技术要点:
- 意图识别:分析用户输入的真实意图
- 向量化搜索:将输入转换为向量进行相似度匹配
- 多维度过滤:结合意图和类别进行精确过滤
- 相关性排序:基于相似度分数排序结果
- 定期更新:保持向量索引的时效性
文章标签:Java面试,Spring Boot,微服务,Redis,Kafka,AI技术,向量数据库,RAG,UGC内容社区
文章简述:本文通过面试官与程序员谢飞机的对话形式,详细解析了UGC内容社区平台中的关键技术栈,涵盖Spring Boot基础、微服务架构、AI应用等核心知识点,为Java求职者提供实用的面试指导和学习参考。