Commit 36a6440c authored by zhouwei's avatar zhouwei

Merge branch 'dev' into 'master'

Dev

See merge request !5
parents 7ee87f51 c0d6a3b6
...@@ -5,6 +5,8 @@ public interface Constant { ...@@ -5,6 +5,8 @@ public interface Constant {
int picType = 1; int picType = 1;
int textType = 0; int textType = 0;
String ACCOUNT = "account"; String ACCOUNT = "account";
String MODEL = "model";
String MODEL_KEY = "modelKey";
int SUCCESS_STATUS = 200; int SUCCESS_STATUS = 200;
String WEATHER_GROUP = "weatherType"; String WEATHER_GROUP = "weatherType";
String ADMIN_ROLE = "admin"; String ADMIN_ROLE = "admin";
......
...@@ -16,10 +16,12 @@ public class WebConfig extends WebMvcConfigurationSupport { ...@@ -16,10 +16,12 @@ public class WebConfig extends WebMvcConfigurationSupport {
private LoginInterceptor loginInterceptor; private LoginInterceptor loginInterceptor;
@Resource @Resource
LogResponseTimeInterceptor logResponseTimeInterceptor; LogResponseTimeInterceptor logResponseTimeInterceptor;
@Resource
HeaderInterceptor headerInterceptor;
@Override @Override
protected void addInterceptors(InterceptorRegistry registry) { protected void addInterceptors(InterceptorRegistry registry) {
// registry.addInterceptor(headerInterceptor);
registry.addInterceptor(loginInterceptor); registry.addInterceptor(loginInterceptor);
registry.addInterceptor(logResponseTimeInterceptor); registry.addInterceptor(logResponseTimeInterceptor);
super.addInterceptors(registry); super.addInterceptors(registry);
......
package com.nanyan.securitylink.controller; package com.nanyan.securitylink.controller;
import com.nanyan.securitylink.dto.TranslateDTO; import com.nanyan.securitylink.dto.AIRequestDTO;
import com.nanyan.securitylink.service.AIService; import com.nanyan.securitylink.service.AIService;
import com.nanyan.securitylink.vo.AIResponse; import com.nanyan.securitylink.vo.AIResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -14,11 +14,15 @@ public class AIController { ...@@ -14,11 +14,15 @@ public class AIController {
@Autowired @Autowired
AIService aiService; AIService aiService;
@PostMapping("/translate") @PostMapping("/translate")
public Response<AIResponse> translate(@RequestBody TranslateDTO translateDTO) { public Response<AIResponse> translate(@RequestBody AIRequestDTO AIRequestDTO) {
return Response.SUCCESS(aiService.translate(translateDTO)); return Response.SUCCESS(aiService.translate(AIRequestDTO));
} }
@PostMapping("/tag") @PostMapping("/news/tag")
public Response<AIResponse> newsTag(@RequestBody TranslateDTO translateDTO) { public Response<AIResponse> newsTag(@RequestBody AIRequestDTO AIRequestDTO) {
return Response.SUCCESS(aiService.newsTags(translateDTO)); return Response.SUCCESS(aiService.newsTags(AIRequestDTO));
}
@PostMapping("/natural/disaster/tag")
public Response<AIResponse> naturalDisasterTag(@RequestBody AIRequestDTO AIRequestDTO) {
return Response.SUCCESS(aiService.naturalDisasterTag(AIRequestDTO));
} }
} }
...@@ -3,7 +3,9 @@ package com.nanyan.securitylink.dto; ...@@ -3,7 +3,9 @@ package com.nanyan.securitylink.dto;
import lombok.Data; import lombok.Data;
@Data @Data
public class TranslateInputDTO { public class AIInputDTO {
String record_json; String record_json;
String msg_info;
String warn_info;
String language; String language;
} }
...@@ -3,8 +3,8 @@ package com.nanyan.securitylink.dto; ...@@ -3,8 +3,8 @@ package com.nanyan.securitylink.dto;
import lombok.Data; import lombok.Data;
@Data @Data
public class TranslateDTO { public class AIRequestDTO {
TranslateInputDTO inputs; AIInputDTO inputs;
String response_mode; String response_mode;
String user; String user;
} }
package com.nanyan.securitylink.entity; package com.nanyan.securitylink.entity;
public class UserHeader { import lombok.Data;
String userId;
String accountName;
String role;
String token;
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getAccountName() { @Data
return accountName; public class UserHeader {
} String model;
String modelKey;
public void setAccountName(String accountName) {
this.accountName = accountName;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
} }
...@@ -5,6 +5,7 @@ import com.nanyan.securitylink.common.MsgCode; ...@@ -5,6 +5,7 @@ import com.nanyan.securitylink.common.MsgCode;
import com.nanyan.securitylink.entity.UserHeader; import com.nanyan.securitylink.entity.UserHeader;
import com.nanyan.securitylink.entity.UserThreadLocal; import com.nanyan.securitylink.entity.UserThreadLocal;
import com.nanyan.securitylink.execption.HeaderException; import com.nanyan.securitylink.execption.HeaderException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.HandlerInterceptor;
...@@ -14,19 +15,21 @@ import javax.servlet.http.HttpServletResponse; ...@@ -14,19 +15,21 @@ import javax.servlet.http.HttpServletResponse;
import java.util.Base64; import java.util.Base64;
@Slf4j
@Component @Component
public class HeaderInterceptor implements HandlerInterceptor { public class HeaderInterceptor implements HandlerInterceptor {
@Override @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
try{ try{
String accountName = getHeader(request, Constant.ACCOUNT); String model = getHeader(request, Constant.MODEL);
String modelKey = getHeader(request, Constant.MODEL_KEY);
UserHeader userHeader = new UserHeader(); UserHeader userHeader = new UserHeader();
userHeader.setAccountName(accountName); userHeader.setModel(model);
userHeader.setModelKey(modelKey);
UserThreadLocal.set(userHeader); UserThreadLocal.set(userHeader);
}catch (Exception e){ }catch (Exception e){
e.printStackTrace(); log.info("", e);
throw new HeaderException(MsgCode.LOGIN_FAILED);
} }
return true; return true;
...@@ -41,8 +44,6 @@ public class HeaderInterceptor implements HandlerInterceptor { ...@@ -41,8 +44,6 @@ public class HeaderInterceptor implements HandlerInterceptor {
if(StringUtils.isEmpty(value)){ if(StringUtils.isEmpty(value)){
return ""; return "";
} }
byte[] decodedBytes = Base64.getDecoder().decode(value);
value = new String(decodedBytes);
return value; return value;
} }
} }
...@@ -31,10 +31,10 @@ public class LogResponseTimeInterceptor implements HandlerInterceptor { ...@@ -31,10 +31,10 @@ public class LogResponseTimeInterceptor implements HandlerInterceptor {
// System.out.println("接口耗时:" + time + "ms"); // System.out.println("接口耗时:" + time + "ms");
String requestURI = request.getRequestURI(); String requestURI = request.getRequestURI();
UserHeader userHeader = UserThreadLocal.get(); UserHeader userHeader = UserThreadLocal.get();
String accountName = ""; String model = "";
if(userHeader != null){ if(userHeader != null){
accountName = UserThreadLocal.get().getAccountName(); model = UserThreadLocal.get().getModel();
logger.info("account:{} 接口{}耗时{} ms", accountName,requestURI, time); logger.info("model:{} 接口{}耗时{} ms", model,requestURI, time);
}else { }else {
logger.info("接口{}耗时{} ms",requestURI, time); logger.info("接口{}耗时{} ms",requestURI, time);
} }
......
...@@ -11,10 +11,7 @@ import java.io.IOException; ...@@ -11,10 +11,7 @@ import java.io.IOException;
@Component @Component
public class LoginInterceptor implements HandlerInterceptor { public class LoginInterceptor implements HandlerInterceptor {
@Override @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
String uri = request.getRequestURI();
String token = request.getHeader("token"); // 从请求头中获取 token
return true; return true;
} }
} }
package com.nanyan.securitylink.service; package com.nanyan.securitylink.service;
import com.nanyan.securitylink.dto.TranslateDTO; import com.nanyan.securitylink.dto.AIRequestDTO;
import com.nanyan.securitylink.vo.AIResponse; import com.nanyan.securitylink.vo.AIResponse;
public interface AIService { public interface AIService {
AIResponse translate(TranslateDTO translateDTO); AIResponse translate(AIRequestDTO AIRequestDTO);
AIResponse newsTags(TranslateDTO translateDTO); AIResponse newsTags(AIRequestDTO AIRequestDTO);
AIResponse naturalDisasterTag(AIRequestDTO aiRequestDTO);
} }
...@@ -5,10 +5,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; ...@@ -5,10 +5,8 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.nanyan.securitylink.common.MsgCode; import com.nanyan.securitylink.common.MsgCode;
import com.nanyan.securitylink.config.AppConfig; import com.nanyan.securitylink.config.AppConfig;
import com.nanyan.securitylink.dto.TranslateDTO; import com.nanyan.securitylink.dto.AIRequestDTO;
import com.nanyan.securitylink.entity.ChatCompletionResponse; import com.nanyan.securitylink.entity.*;
import com.nanyan.securitylink.entity.ChatInputData;
import com.nanyan.securitylink.entity.Message;
import com.nanyan.securitylink.execption.BaseException; import com.nanyan.securitylink.execption.BaseException;
import com.nanyan.securitylink.service.AIService; import com.nanyan.securitylink.service.AIService;
import com.nanyan.securitylink.vo.AIResponse; import com.nanyan.securitylink.vo.AIResponse;
...@@ -33,51 +31,84 @@ import java.util.Map; ...@@ -33,51 +31,84 @@ import java.util.Map;
@Slf4j @Slf4j
@Service @Service
public class DeepSeekAIServiceImpl implements AIService { public class AIServiceImpl implements AIService {
@Autowired @Autowired
AppConfig appConfig; AppConfig appConfig;
@Autowired @Autowired
RestTemplate restTemplate; RestTemplate restTemplate;
private static final Map<String, String> LABEL_MAP = new HashMap<>(); private static final Map<String, String> NEWS_LABEL_MAP = new HashMap<>();
private static final Map<String, String> NATURAL_DISASTER_LABEL_MAP = new HashMap<>();
static { static {
LABEL_MAP.put("枪击", "TagShooting"); NEWS_LABEL_MAP.put("枪击", "TagShooting");
LABEL_MAP.put("抢劫", "TagRobbery"); NEWS_LABEL_MAP.put("抢劫", "TagRobbery");
LABEL_MAP.put("爆炸", "TagExplosion"); NEWS_LABEL_MAP.put("爆炸", "TagExplosion");
LABEL_MAP.put("恐怖袭击", "TagTerroristAttack"); NEWS_LABEL_MAP.put("恐怖袭击", "TagTerroristAttack");
LABEL_MAP.put("纵火", "TagArson"); NEWS_LABEL_MAP.put("纵火", "TagArson");
LABEL_MAP.put("大规模伤亡事件", "TagMassCasualtyIncident"); NEWS_LABEL_MAP.put("大规模伤亡事件", "TagMassCasualtyIncident");
LABEL_MAP.put("人质事件", "TagHostageSituation"); NEWS_LABEL_MAP.put("人质事件", "TagHostageSituation");
LABEL_MAP.put("毒气泄漏", "TagToxicGasLeak"); NEWS_LABEL_MAP.put("毒气泄漏", "TagToxicGasLeak");
LABEL_MAP.put("生物危害", "TagBiologicalHazard"); NEWS_LABEL_MAP.put("生物危害", "TagBiologicalHazard");
LABEL_MAP.put("交通意外", "TagTrafficAccident"); NEWS_LABEL_MAP.put("交通意外", "TagTrafficAccident");
LABEL_MAP.put("建筑物倒塌", "TagBuildingCollapse"); NEWS_LABEL_MAP.put("建筑物倒塌", "TagBuildingCollapse");
LABEL_MAP.put("食品安全", "TagFoodSafety"); NEWS_LABEL_MAP.put("食品安全", "TagFoodSafety");
LABEL_MAP.put("社会冲突", "TagSocialConflict"); NEWS_LABEL_MAP.put("社会冲突", "TagSocialConflict");
LABEL_MAP.put("群体性事件", "TagMassGatheringIncident"); NEWS_LABEL_MAP.put("群体性事件", "TagMassGatheringIncident");
LABEL_MAP.put("环境污染", "TagEnvironmentalPollution"); NEWS_LABEL_MAP.put("环境污染", "TagEnvironmentalPollution");
LABEL_MAP.put("重大事故", "TagMajorAccident"); NEWS_LABEL_MAP.put("重大事故", "TagMajorAccident");
LABEL_MAP.put("抗议示威", "TagProtestDemonstration"); NEWS_LABEL_MAP.put("抗议示威", "TagProtestDemonstration");
LABEL_MAP.put("集体维权", "TagCollectiveAdvocacy"); NEWS_LABEL_MAP.put("集体维权", "TagCollectiveAdvocacy");
LABEL_MAP.put("活动失控骚乱", "TagUncontrolledEventRiot"); NEWS_LABEL_MAP.put("活动失控骚乱", "TagUncontrolledEventRiot");
LABEL_MAP.put("地域冲突", "TagTerritorialConflict"); NEWS_LABEL_MAP.put("地域冲突", "TagTerritorialConflict");
LABEL_MAP.put("性别冲突", "TagGenderConflict"); NEWS_LABEL_MAP.put("性别冲突", "TagGenderConflict");
LABEL_MAP.put("宗教冲突", "TagReligiousConflict"); NEWS_LABEL_MAP.put("宗教冲突", "TagReligiousConflict");
LABEL_MAP.put("民族冲突", "TagEthnicConflict"); NEWS_LABEL_MAP.put("民族冲突", "TagEthnicConflict");
LABEL_MAP.put("阶级冲突", "TagClassConflict"); NEWS_LABEL_MAP.put("阶级冲突", "TagClassConflict");
LABEL_MAP.put("食物中毒", "TagFoodPoisoning"); NEWS_LABEL_MAP.put("食物中毒", "TagFoodPoisoning");
LABEL_MAP.put("公共卫生事件", "PublicHealthEmergency"); NEWS_LABEL_MAP.put("公共卫生事件", "PublicHealthEmergency");
LABEL_MAP.put("环境污染", "TagEnvironmentalPollution"); NEWS_LABEL_MAP.put("工业事故", "IndustriaAccident");
LABEL_MAP.put("活动失控骚乱", "TagUncontrolledEventRiot"); NEWS_LABEL_MAP.put("核事故", "NuclearAccident");
LABEL_MAP.put("抗议示威", "TagProtestDemonstration"); NEWS_LABEL_MAP.put("矿难", "MiningAccident");
LABEL_MAP.put("工业事故", "IndustriaAccident"); NEWS_LABEL_MAP.put("游行抗议", "Protest");
LABEL_MAP.put("核事故", "NuclearAccident"); NEWS_LABEL_MAP.put("水坝溃坝", "DamBurst");
LABEL_MAP.put("性别冲突", "TagGenderConflict"); NEWS_LABEL_MAP.put("油轮泄漏", "OilSpill");
LABEL_MAP.put("矿难", "MiningAccident"); NEWS_LABEL_MAP.put("火灾", "Fire");
LABEL_MAP.put("游行抗议", "Protest");
LABEL_MAP.put("水坝溃坝", "DamBurst"); NATURAL_DISASTER_LABEL_MAP.put("地震","earthquake");
LABEL_MAP.put("油轮泄漏", "OilSpill"); NATURAL_DISASTER_LABEL_MAP.put("火山爆发","volcanicEruption");
LABEL_MAP.put("火灾", "Fire"); NATURAL_DISASTER_LABEL_MAP.put("海啸","tsunami");
NATURAL_DISASTER_LABEL_MAP.put("台风/飓风","typhoonHurricane");
NATURAL_DISASTER_LABEL_MAP.put("龙卷风","tornadowarning");
NATURAL_DISASTER_LABEL_MAP.put("洪水","flood");
NATURAL_DISASTER_LABEL_MAP.put("干旱","drought");
NATURAL_DISASTER_LABEL_MAP.put("山体滑坡","landslide");
NATURAL_DISASTER_LABEL_MAP.put("泥石流","mudslide");
NATURAL_DISASTER_LABEL_MAP.put("雪崩","avalanche");
NATURAL_DISASTER_LABEL_MAP.put("森林火灾","forestFire");
NATURAL_DISASTER_LABEL_MAP.put("冰川融化","glacialMelting");
NATURAL_DISASTER_LABEL_MAP.put("沙尘暴","dustStorm");
NATURAL_DISASTER_LABEL_MAP.put("高温热浪","heatWave");
NATURAL_DISASTER_LABEL_MAP.put("寒潮","coldWave");
NATURAL_DISASTER_LABEL_MAP.put("暴雨","rainstorm");
NATURAL_DISASTER_LABEL_MAP.put("工业事故","IndustriaAccident");
NATURAL_DISASTER_LABEL_MAP.put("交通事故","TrafficAccident");
NATURAL_DISASTER_LABEL_MAP.put("火灾","Fire");
NATURAL_DISASTER_LABEL_MAP.put("爆炸","Explosion");
NATURAL_DISASTER_LABEL_MAP.put("核事故","NuclearAccident");
NATURAL_DISASTER_LABEL_MAP.put("化学品泄漏","ChemicalSpill");
NATURAL_DISASTER_LABEL_MAP.put("油轮泄漏","OilSpill");
NATURAL_DISASTER_LABEL_MAP.put("矿难","MiningAccident");
NATURAL_DISASTER_LABEL_MAP.put("食物中毒","FoodPoisoning");
NATURAL_DISASTER_LABEL_MAP.put("公共卫生事件","PublicHealthEmergency");
NATURAL_DISASTER_LABEL_MAP.put("建筑物倒塌","BuildingCollapse");
NATURAL_DISASTER_LABEL_MAP.put("恐怖袭击","Terrorism");
NATURAL_DISASTER_LABEL_MAP.put("水坝溃坝","DamBurst");
NATURAL_DISASTER_LABEL_MAP.put("游行抗议","Protest");
NATURAL_DISASTER_LABEL_MAP.put("冰雹","hail");
NATURAL_DISASTER_LABEL_MAP.put("冻雨","freezingRain");
NATURAL_DISASTER_LABEL_MAP.put("霾","hazeWarning");
NATURAL_DISASTER_LABEL_MAP.put("雷暴","thunderstormWarning");
NATURAL_DISASTER_LABEL_MAP.put("大风","HhighWind");
} }
private final static ObjectMapper objectMapper = new ObjectMapper(); private final static ObjectMapper objectMapper = new ObjectMapper();
...@@ -85,11 +116,12 @@ public class DeepSeekAIServiceImpl implements AIService { ...@@ -85,11 +116,12 @@ public class DeepSeekAIServiceImpl implements AIService {
private final static String DEEP_SEEK_URL = "https://ark.cn-beijing.volces.com/api/v3/chat/completions"; private final static String DEEP_SEEK_URL = "https://ark.cn-beijing.volces.com/api/v3/chat/completions";
@Override @Override
public AIResponse translate(TranslateDTO translateDTO) { public AIResponse translate(AIRequestDTO AIRequestDTO) {
ChatInputData chatInputData = new ChatInputData(); ChatInputData chatInputData = new ChatInputData();
buildTranslate(chatInputData, translateDTO); buildTranslate(chatInputData, AIRequestDTO);
ChatCompletionResponse chatCompletionResponse = aiRequest(chatInputData, appConfig.getApiTranslateKey()); String apiKey = getModelApiKey();
ChatCompletionResponse chatCompletionResponse = aiRequest(chatInputData, apiKey);
if (CollectionUtils.isNotEmpty(chatCompletionResponse.getChoices())) { if (CollectionUtils.isNotEmpty(chatCompletionResponse.getChoices())) {
AIResponse aiResponse = new AIResponse(); AIResponse aiResponse = new AIResponse();
...@@ -99,11 +131,12 @@ public class DeepSeekAIServiceImpl implements AIService { ...@@ -99,11 +131,12 @@ public class DeepSeekAIServiceImpl implements AIService {
return null; return null;
} }
public AIResponse newsTags(TranslateDTO translateDTO) { public AIResponse newsTags(AIRequestDTO aiRequestDTO) {
ChatInputData chatInputData = new ChatInputData(); ChatInputData chatInputData = new ChatInputData();
buildNewsTag(chatInputData, translateDTO); buildNewsTag(chatInputData, aiRequestDTO);
ChatCompletionResponse chatCompletionResponse = aiRequest(chatInputData, appConfig.getApiTranslateKey()); String apiKey = getModelApiKey();
ChatCompletionResponse chatCompletionResponse = aiRequest(chatInputData, apiKey);
if (CollectionUtils.isNotEmpty(chatCompletionResponse.getChoices())) { if (CollectionUtils.isNotEmpty(chatCompletionResponse.getChoices())) {
AIResponse aiResponse = new AIResponse(); AIResponse aiResponse = new AIResponse();
...@@ -115,9 +148,9 @@ public class DeepSeekAIServiceImpl implements AIService { ...@@ -115,9 +148,9 @@ public class DeepSeekAIServiceImpl implements AIService {
outputs.setResult(result); outputs.setResult(result);
aiResponse.setOutputs(outputs); aiResponse.setOutputs(outputs);
for (String s : split) { for (String s : split) {
if(LABEL_MAP.containsKey(s)){ if(NEWS_LABEL_MAP.containsKey(s)){
CodeVO codeVO = new CodeVO(); CodeVO codeVO = new CodeVO();
codeVO.setCode(LABEL_MAP.get(s)); codeVO.setCode(NEWS_LABEL_MAP.get(s));
codeVO.setName(s); codeVO.setName(s);
result.add(codeVO); result.add(codeVO);
} }
...@@ -128,14 +161,72 @@ public class DeepSeekAIServiceImpl implements AIService { ...@@ -128,14 +161,72 @@ public class DeepSeekAIServiceImpl implements AIService {
return null; return null;
} }
private void buildNewsTag(ChatInputData chatInputData, TranslateDTO translateDTO) { @Override
public AIResponse naturalDisasterTag(AIRequestDTO aiRequestDTO) {
ChatInputData chatInputData = new ChatInputData();
buildNaturalDisasterTag(chatInputData, aiRequestDTO);
String apiKey = getModelApiKey();
ChatCompletionResponse chatCompletionResponse = aiRequest(chatInputData, apiKey);
if (CollectionUtils.isNotEmpty(chatCompletionResponse.getChoices())) {
AIResponse aiResponse = new AIResponse();
String content = chatCompletionResponse.getChoices().get(0).getMessage().getContent();
if(StringUtils.isNotEmpty(content)){
String[] split = content.split(",", -1);
List<CodeVO> result = new ArrayList<>();
ResultVO outputs = new ResultVO();
outputs.setResult(result);
aiResponse.setOutputs(outputs);
for (String s : split) {
if(NATURAL_DISASTER_LABEL_MAP.containsKey(s)){
CodeVO codeVO = new CodeVO();
codeVO.setCode(NATURAL_DISASTER_LABEL_MAP.get(s));
codeVO.setName(s);
result.add(codeVO);
}
}
}
return aiResponse;
}
return null;
}
private String getModelApiKey() {
UserHeader userHeader = UserThreadLocal.get();
String apiKey = appConfig.getApiTranslateKey();
if(StringUtils.isNotEmpty(userHeader.getModelKey())){
apiKey = userHeader.getModelKey();
}
return apiKey;
}
private void buildNaturalDisasterTag(ChatInputData chatInputData, AIRequestDTO aiRequestDTO) {
setModel(chatInputData);
chatInputData.setStream(false);
List<Message> messages = new ArrayList<>();
chatInputData.setMessages(messages);
Message systemRole = getSystemMessageForNatureDisaster();
messages.add(systemRole);
Message userRole = getUserMessageForNaturalDisasterTag(aiRequestDTO);
messages.add(userRole);
}
private static void setModel(ChatInputData chatInputData) {
UserHeader userHeader = UserThreadLocal.get();
if(StringUtils.isNotEmpty(userHeader.getModel())){
chatInputData.setModel(userHeader.getModel());
}else {
chatInputData.setModel("deepseek-v3-250324"); chatInputData.setModel("deepseek-v3-250324");
}
}
private void buildNewsTag(ChatInputData chatInputData, AIRequestDTO AIRequestDTO) {
setModel(chatInputData);
chatInputData.setStream(false); chatInputData.setStream(false);
List<Message> messages = new ArrayList<>(); List<Message> messages = new ArrayList<>();
chatInputData.setMessages(messages); chatInputData.setMessages(messages);
Message systemRole = getSystemTagDeepSeekMessage(); Message systemRole = getSystemMessageForNewsTag();
messages.add(systemRole); messages.add(systemRole);
Message userRole = getUserTagDeepSeekMessage(translateDTO); Message userRole = getUserMessageForNewsTag(AIRequestDTO);
messages.add(userRole); messages.add(userRole);
} }
...@@ -147,7 +238,7 @@ public class DeepSeekAIServiceImpl implements AIService { ...@@ -147,7 +238,7 @@ public class DeepSeekAIServiceImpl implements AIService {
} catch (JsonProcessingException e) { } catch (JsonProcessingException e) {
throw new BaseException(MsgCode.JSON_ERROR); throw new BaseException(MsgCode.JSON_ERROR);
} }
log.info("translate json:{}", writeValueAsString); log.info("json:{}", writeValueAsString);
HttpEntity header = getHeader(apiKey); HttpEntity header = getHeader(apiKey);
HttpEntity<String> entity = new HttpEntity<>(writeValueAsString, header.getHeaders()); HttpEntity<String> entity = new HttpEntity<>(writeValueAsString, header.getHeaders());
ResponseEntity<ChatCompletionResponse> response = restTemplate.postForEntity(DEEP_SEEK_URL, entity, ChatCompletionResponse.class); ResponseEntity<ChatCompletionResponse> response = restTemplate.postForEntity(DEEP_SEEK_URL, entity, ChatCompletionResponse.class);
...@@ -158,22 +249,22 @@ public class DeepSeekAIServiceImpl implements AIService { ...@@ -158,22 +249,22 @@ public class DeepSeekAIServiceImpl implements AIService {
throw new BaseException(MsgCode.TRANSLATE_ERROR); throw new BaseException(MsgCode.TRANSLATE_ERROR);
} }
private void buildTranslate(ChatInputData chatInputData, TranslateDTO translateDTO) { private void buildTranslate(ChatInputData chatInputData, AIRequestDTO AIRequestDTO) {
chatInputData.setModel("deepseek-v3-250324"); setModel(chatInputData);
chatInputData.setStream(false); chatInputData.setStream(false);
List<Message> messages = new ArrayList<>(); List<Message> messages = new ArrayList<>();
chatInputData.setMessages(messages); chatInputData.setMessages(messages);
Message systemRole = getDeepSeekMessage(translateDTO); Message systemRole = getDeepSeekMessage(AIRequestDTO);
messages.add(systemRole); messages.add(systemRole);
} }
@NotNull @NotNull
private static Message getDeepSeekMessage(TranslateDTO translateDTO) { private static Message getDeepSeekMessage(AIRequestDTO AIRequestDTO) {
Message systemRole = new Message(); Message systemRole = new Message();
systemRole.setRole("user"); systemRole.setRole("user");
systemRole.setContent("需要翻译的JSON:" + translateDTO.getInputs().getRecord_json() + "\n" + systemRole.setContent("需要翻译的JSON:" + AIRequestDTO.getInputs().getRecord_json() + "\n" +
"\n" + "\n" +
"你是一个 JSON 翻译员,能够将给定的 JSON 中的 value 值部分翻译成 `" + translateDTO.getInputs().getLanguage() + "`。\n" + "你是一个 JSON 翻译员,能够将给定的 JSON 中的 value 值部分翻译成 `" + AIRequestDTO.getInputs().getLanguage() + "`。\n" +
"\n" + "\n" +
"## 限制\n" + "## 限制\n" +
"- 严格按照要求进行翻译,不改变 JSON 的结构和无意义的 key 的 value。\n" + "- 严格按照要求进行翻译,不改变 JSON 的结构和无意义的 key 的 value。\n" +
...@@ -184,15 +275,66 @@ public class DeepSeekAIServiceImpl implements AIService { ...@@ -184,15 +275,66 @@ public class DeepSeekAIServiceImpl implements AIService {
return systemRole; return systemRole;
} }
private static Message getUserTagDeepSeekMessage(TranslateDTO translateDTO) { private static Message getUserMessageForNaturalDisasterTag(AIRequestDTO AIRequestDTO) {
Message userRole = new Message(); Message userRole = new Message();
userRole.setRole("user"); userRole.setRole("user");
userRole.setContent(translateDTO.getInputs().getRecord_json()); userRole.setContent(AIRequestDTO.getInputs().getWarn_info());
return userRole; return userRole;
} }
private static Message getUserMessageForNewsTag(AIRequestDTO AIRequestDTO) {
Message userRole = new Message();
userRole.setRole("user");
userRole.setContent(AIRequestDTO.getInputs().getMsg_info());
return userRole;
}
@NotNull
private static Message getSystemMessageForNatureDisaster() {
Message systemRole = new Message();
systemRole.setRole("system");
systemRole.setContent("```xml\n" +
"<instruction>\n" +
"根据给定的天气预警信息,打上相应的标签。标签列表包括:大风,雷暴,霾,冻雨,地震,火山爆发,海啸,台风/飓风,龙卷风,洪水,干旱,山体滑坡,泥石流,雪崩,森林火灾,冰川融化,沙尘暴,高温热浪,寒潮,暴雨,工业事故,交通事故,火灾,爆炸,核事故,化学品泄漏,油轮泄漏,矿难,食物中毒,公共卫生事件,建筑物倒塌,恐怖袭击,水坝溃坝,游行抗议,冰雹。\n" +
"\n" +
"<instructions>\n" +
"1. 仔细阅读输入的天气预警信息,理解其描述的具体事件或现象。\n" +
"2. 根据预警信息的内容,从提供的标签列表中选择最匹配的一个或多个标签。\n" +
"3. 确保所选标签与预警信息描述的事件或现象完全一致,避免无关标签。\n" +
"4. 如果预警信息描述的事件或现象不在标签列表中,则忽略该信息或选择最接近的标签。\n" +
"5. 输出时仅列出匹配的标签,不要包含任何额外的解释或XML标签。\n" +
"6. 如果预警信息包含多个事件或现象,请为每个事件或现象分别打上对应的标签。\n" +
"\n" +
"<examples>\n" +
"<example>\n" +
"输入:今日预计有强风,风速可达10级以上,请市民注意防范。\n" +
"输出:大风\n" +
"</example>\n" +
"\n" +
"<example>\n" +
"输入:受台风影响,沿海地区将出现暴雨和大风天气,局部地区可能有洪水。\n" +
"输出:台风/飓风,暴雨,洪水\n" +
"</example>\n" +
"\n" +
"<example>\n" +
"输入:某化工厂发生泄漏事故,导致周边空气质量下降,建议居民关闭门窗。\n" +
"输出:化学品泄漏,工业事故\n" +
"</example>\n" +
"\n" +
"<notes>\n" +
"1. 标签之间用逗号分隔,不要使用空格或其他符号。\n" +
"2. 如果预警信息描述的事件或现象与多个标签相关,请列出所有相关标签。\n" +
"3. 确保标签的准确性,避免主观判断或猜测。\n" +
"4. 输出格式应简洁明了,仅包含标签名称。\n" +
"</notes>\n" +
"</instruction>\n" +
"```"
);
return systemRole;
}
@NotNull @NotNull
private static Message getSystemTagDeepSeekMessage() { private static Message getSystemMessageForNewsTag() {
Message systemRole = new Message(); Message systemRole = new Message();
systemRole.setRole("system"); systemRole.setRole("system");
systemRole.setContent("```xml\n" + systemRole.setContent("```xml\n" +
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment