Files
snails-ai-backend/snails-chat/src/main/java/com/hanserwei/chat/controller/AiChatController.java
Hanserwei 501980046b feat(chat): 实现AI客服助手与手机号码识别功能
- 新增AI助手提示词模板,定义角色、目标与交互规则
- 实现手机号自动识别并触发消息发送工具- 添加RabbitMQ配置与消息收发组件
- 集成SendMessage工具支持用户留资通知
- 引入会话上下文管理工具类ConversationContext
- 升级聊天客户端配置,加载系统提示词与默认工具
- 增加数据库操作工具日志记录
- 添加Spring AMQP与Jackson依赖支持消息队列通信
2025-10-27 20:23:42 +08:00

69 lines
2.9 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.hanserwei.chat.controller;
import com.hanserwei.chat.model.dto.ChatMessageDTO;
import com.hanserwei.chat.model.vo.AIResponse;
import com.hanserwei.chat.tools.SendMQMessageTools;
import com.hanserwei.chat.utils.ConversationContext;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Slf4j
@RestController
@RequestMapping("/ai")
public class AiChatController {
@Resource
private ChatClient dashScopeChatClient;
@Resource
private SendMQMessageTools sendMQMessageTools;
private static final Pattern PHONE_PATTERN = Pattern.compile("(?<!\\d)(1[3-9]\\d{9})(?!\\d)");
@PostMapping(path = "/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<AIResponse> chatWithAi(@RequestBody ChatMessageDTO chatMessageDTO) {
log.info("会话ID{}", chatMessageDTO.getConversionId());
ConversationContext.setConversationId(chatMessageDTO.getConversionId());
triggerSendMessageIfPhonePresent(chatMessageDTO);
return dashScopeChatClient.prompt()
.user(chatMessageDTO.getMessage())
.advisors(p -> p.param(ChatMemory.CONVERSATION_ID, chatMessageDTO.getConversionId()))
.stream()
.chatResponse()
.mapNotNull(chatResponse -> AIResponse.builder()
.v(chatResponse.getResult().getOutput().getText())
.build())
.contextWrite(ctx -> ConversationContext.withConversationId(chatMessageDTO.getConversionId()))
.doFinally(signalType -> ConversationContext.clear());
}
private void triggerSendMessageIfPhonePresent(ChatMessageDTO chatMessageDTO) {
String message = chatMessageDTO.getMessage();
if (message == null || message.isEmpty()) {
return;
}
Matcher matcher = PHONE_PATTERN.matcher(message);
if (!matcher.find()) {
return;
}
String phoneNumber = matcher.group(1);
log.info("检测到手机号:{}会话ID{}", phoneNumber, chatMessageDTO.getConversionId());
sendMQMessageTools.sendMQMessage(phoneNumber)
.doOnError(error -> log.error("触发发送消息工具失败,手机号:{},错误:{}", phoneNumber, error.getMessage(), error))
.subscribe(result -> log.info("已触发发送消息工具,手机号:{},结果:{}", phoneNumber, result));
}
}