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 {
int picType = 1;
int textType = 0;
String ACCOUNT = "account";
String MODEL = "model";
String MODEL_KEY = "modelKey";
int SUCCESS_STATUS = 200;
String WEATHER_GROUP = "weatherType";
String ADMIN_ROLE = "admin";
......
......@@ -16,10 +16,12 @@ public class WebConfig extends WebMvcConfigurationSupport {
private LoginInterceptor loginInterceptor;
@Resource
LogResponseTimeInterceptor logResponseTimeInterceptor;
@Resource
HeaderInterceptor headerInterceptor;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
//
registry.addInterceptor(headerInterceptor);
registry.addInterceptor(loginInterceptor);
registry.addInterceptor(logResponseTimeInterceptor);
super.addInterceptors(registry);
......
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.vo.AIResponse;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -14,11 +14,15 @@ public class AIController {
@Autowired
AIService aiService;
@PostMapping("/translate")
public Response<AIResponse> translate(@RequestBody TranslateDTO translateDTO) {
return Response.SUCCESS(aiService.translate(translateDTO));
public Response<AIResponse> translate(@RequestBody AIRequestDTO AIRequestDTO) {
return Response.SUCCESS(aiService.translate(AIRequestDTO));
}
@PostMapping("/tag")
public Response<AIResponse> newsTag(@RequestBody TranslateDTO translateDTO) {
return Response.SUCCESS(aiService.newsTags(translateDTO));
@PostMapping("/news/tag")
public Response<AIResponse> newsTag(@RequestBody AIRequestDTO AIRequestDTO) {
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;
import lombok.Data;
@Data
public class TranslateInputDTO {
public class AIInputDTO {
String record_json;
String msg_info;
String warn_info;
String language;
}
......@@ -3,8 +3,8 @@ package com.nanyan.securitylink.dto;
import lombok.Data;
@Data
public class TranslateDTO {
TranslateInputDTO inputs;
public class AIRequestDTO {
AIInputDTO inputs;
String response_mode;
String user;
}
package com.nanyan.securitylink.entity;
public class UserHeader {
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;
}
import lombok.Data;
public String getAccountName() {
return accountName;
}
public void setAccountName(String accountName) {
this.accountName = accountName;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
@Data
public class UserHeader {
String model;
String modelKey;
}
......@@ -5,6 +5,7 @@ import com.nanyan.securitylink.common.MsgCode;
import com.nanyan.securitylink.entity.UserHeader;
import com.nanyan.securitylink.entity.UserThreadLocal;
import com.nanyan.securitylink.execption.HeaderException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
......@@ -14,19 +15,21 @@ import javax.servlet.http.HttpServletResponse;
import java.util.Base64;
@Slf4j
@Component
public class HeaderInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
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.setAccountName(accountName);
userHeader.setModel(model);
userHeader.setModelKey(modelKey);
UserThreadLocal.set(userHeader);
}catch (Exception e){
e.printStackTrace();
throw new HeaderException(MsgCode.LOGIN_FAILED);
log.info("", e);
}
return true;
......@@ -41,8 +44,6 @@ public class HeaderInterceptor implements HandlerInterceptor {
if(StringUtils.isEmpty(value)){
return "";
}
byte[] decodedBytes = Base64.getDecoder().decode(value);
value = new String(decodedBytes);
return value;
}
}
......@@ -31,10 +31,10 @@ public class LogResponseTimeInterceptor implements HandlerInterceptor {
// System.out.println("接口耗时:" + time + "ms");
String requestURI = request.getRequestURI();
UserHeader userHeader = UserThreadLocal.get();
String accountName = "";
String model = "";
if(userHeader != null){
accountName = UserThreadLocal.get().getAccountName();
logger.info("account:{} 接口{}耗时{} ms", accountName,requestURI, time);
model = UserThreadLocal.get().getModel();
logger.info("model:{} 接口{}耗时{} ms", model,requestURI, time);
}else {
logger.info("接口{}耗时{} ms",requestURI, time);
}
......
......@@ -11,10 +11,7 @@ import java.io.IOException;
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
String uri = request.getRequestURI();
String token = request.getHeader("token"); // 从请求头中获取 token
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
return true;
}
}
package com.nanyan.securitylink.service;
import com.nanyan.securitylink.dto.TranslateDTO;
import com.nanyan.securitylink.dto.AIRequestDTO;
import com.nanyan.securitylink.vo.AIResponse;
public interface AIService {
AIResponse translate(TranslateDTO translateDTO);
AIResponse newsTags(TranslateDTO translateDTO);
AIResponse translate(AIRequestDTO AIRequestDTO);
AIResponse newsTags(AIRequestDTO AIRequestDTO);
AIResponse naturalDisasterTag(AIRequestDTO aiRequestDTO);
}
......@@ -5,10 +5,8 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.nanyan.securitylink.common.MsgCode;
import com.nanyan.securitylink.config.AppConfig;
import com.nanyan.securitylink.dto.TranslateDTO;
import com.nanyan.securitylink.entity.ChatCompletionResponse;
import com.nanyan.securitylink.entity.ChatInputData;
import com.nanyan.securitylink.entity.Message;
import com.nanyan.securitylink.dto.AIRequestDTO;
import com.nanyan.securitylink.entity.*;
import com.nanyan.securitylink.execption.BaseException;
import com.nanyan.securitylink.service.AIService;
import com.nanyan.securitylink.vo.AIResponse;
......@@ -33,51 +31,84 @@ import java.util.Map;
@Slf4j
@Service
public class DeepSeekAIServiceImpl implements AIService {
public class AIServiceImpl implements AIService {
@Autowired
AppConfig appConfig;
@Autowired
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 {
LABEL_MAP.put("枪击", "TagShooting");
LABEL_MAP.put("抢劫", "TagRobbery");
LABEL_MAP.put("爆炸", "TagExplosion");
LABEL_MAP.put("恐怖袭击", "TagTerroristAttack");
LABEL_MAP.put("纵火", "TagArson");
LABEL_MAP.put("大规模伤亡事件", "TagMassCasualtyIncident");
LABEL_MAP.put("人质事件", "TagHostageSituation");
LABEL_MAP.put("毒气泄漏", "TagToxicGasLeak");
LABEL_MAP.put("生物危害", "TagBiologicalHazard");
LABEL_MAP.put("交通意外", "TagTrafficAccident");
LABEL_MAP.put("建筑物倒塌", "TagBuildingCollapse");
LABEL_MAP.put("食品安全", "TagFoodSafety");
LABEL_MAP.put("社会冲突", "TagSocialConflict");
LABEL_MAP.put("群体性事件", "TagMassGatheringIncident");
LABEL_MAP.put("环境污染", "TagEnvironmentalPollution");
LABEL_MAP.put("重大事故", "TagMajorAccident");
LABEL_MAP.put("抗议示威", "TagProtestDemonstration");
LABEL_MAP.put("集体维权", "TagCollectiveAdvocacy");
LABEL_MAP.put("活动失控骚乱", "TagUncontrolledEventRiot");
LABEL_MAP.put("地域冲突", "TagTerritorialConflict");
LABEL_MAP.put("性别冲突", "TagGenderConflict");
LABEL_MAP.put("宗教冲突", "TagReligiousConflict");
LABEL_MAP.put("民族冲突", "TagEthnicConflict");
LABEL_MAP.put("阶级冲突", "TagClassConflict");
LABEL_MAP.put("食物中毒", "TagFoodPoisoning");
LABEL_MAP.put("公共卫生事件", "PublicHealthEmergency");
LABEL_MAP.put("环境污染", "TagEnvironmentalPollution");
LABEL_MAP.put("活动失控骚乱", "TagUncontrolledEventRiot");
LABEL_MAP.put("抗议示威", "TagProtestDemonstration");
LABEL_MAP.put("工业事故", "IndustriaAccident");
LABEL_MAP.put("核事故", "NuclearAccident");
LABEL_MAP.put("性别冲突", "TagGenderConflict");
LABEL_MAP.put("矿难", "MiningAccident");
LABEL_MAP.put("游行抗议", "Protest");
LABEL_MAP.put("水坝溃坝", "DamBurst");
LABEL_MAP.put("油轮泄漏", "OilSpill");
LABEL_MAP.put("火灾", "Fire");
NEWS_LABEL_MAP.put("枪击", "TagShooting");
NEWS_LABEL_MAP.put("抢劫", "TagRobbery");
NEWS_LABEL_MAP.put("爆炸", "TagExplosion");
NEWS_LABEL_MAP.put("恐怖袭击", "TagTerroristAttack");
NEWS_LABEL_MAP.put("纵火", "TagArson");
NEWS_LABEL_MAP.put("大规模伤亡事件", "TagMassCasualtyIncident");
NEWS_LABEL_MAP.put("人质事件", "TagHostageSituation");
NEWS_LABEL_MAP.put("毒气泄漏", "TagToxicGasLeak");
NEWS_LABEL_MAP.put("生物危害", "TagBiologicalHazard");
NEWS_LABEL_MAP.put("交通意外", "TagTrafficAccident");
NEWS_LABEL_MAP.put("建筑物倒塌", "TagBuildingCollapse");
NEWS_LABEL_MAP.put("食品安全", "TagFoodSafety");
NEWS_LABEL_MAP.put("社会冲突", "TagSocialConflict");
NEWS_LABEL_MAP.put("群体性事件", "TagMassGatheringIncident");
NEWS_LABEL_MAP.put("环境污染", "TagEnvironmentalPollution");
NEWS_LABEL_MAP.put("重大事故", "TagMajorAccident");
NEWS_LABEL_MAP.put("抗议示威", "TagProtestDemonstration");
NEWS_LABEL_MAP.put("集体维权", "TagCollectiveAdvocacy");
NEWS_LABEL_MAP.put("活动失控骚乱", "TagUncontrolledEventRiot");
NEWS_LABEL_MAP.put("地域冲突", "TagTerritorialConflict");
NEWS_LABEL_MAP.put("性别冲突", "TagGenderConflict");
NEWS_LABEL_MAP.put("宗教冲突", "TagReligiousConflict");
NEWS_LABEL_MAP.put("民族冲突", "TagEthnicConflict");
NEWS_LABEL_MAP.put("阶级冲突", "TagClassConflict");
NEWS_LABEL_MAP.put("食物中毒", "TagFoodPoisoning");
NEWS_LABEL_MAP.put("公共卫生事件", "PublicHealthEmergency");
NEWS_LABEL_MAP.put("工业事故", "IndustriaAccident");
NEWS_LABEL_MAP.put("核事故", "NuclearAccident");
NEWS_LABEL_MAP.put("矿难", "MiningAccident");
NEWS_LABEL_MAP.put("游行抗议", "Protest");
NEWS_LABEL_MAP.put("水坝溃坝", "DamBurst");
NEWS_LABEL_MAP.put("油轮泄漏", "OilSpill");
NEWS_LABEL_MAP.put("火灾", "Fire");
NATURAL_DISASTER_LABEL_MAP.put("地震","earthquake");
NATURAL_DISASTER_LABEL_MAP.put("火山爆发","volcanicEruption");
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();
......@@ -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";
@Override
public AIResponse translate(TranslateDTO translateDTO) {
public AIResponse translate(AIRequestDTO AIRequestDTO) {
ChatInputData chatInputData = new ChatInputData();
buildTranslate(chatInputData, translateDTO);
ChatCompletionResponse chatCompletionResponse = aiRequest(chatInputData, appConfig.getApiTranslateKey());
buildTranslate(chatInputData, AIRequestDTO);
String apiKey = getModelApiKey();
ChatCompletionResponse chatCompletionResponse = aiRequest(chatInputData, apiKey);
if (CollectionUtils.isNotEmpty(chatCompletionResponse.getChoices())) {
AIResponse aiResponse = new AIResponse();
......@@ -99,11 +131,12 @@ public class DeepSeekAIServiceImpl implements AIService {
return null;
}
public AIResponse newsTags(TranslateDTO translateDTO) {
public AIResponse newsTags(AIRequestDTO aiRequestDTO) {
ChatInputData chatInputData = new ChatInputData();
buildNewsTag(chatInputData, translateDTO);
ChatCompletionResponse chatCompletionResponse = aiRequest(chatInputData, appConfig.getApiTranslateKey());
buildNewsTag(chatInputData, aiRequestDTO);
String apiKey = getModelApiKey();
ChatCompletionResponse chatCompletionResponse = aiRequest(chatInputData, apiKey);
if (CollectionUtils.isNotEmpty(chatCompletionResponse.getChoices())) {
AIResponse aiResponse = new AIResponse();
......@@ -115,9 +148,9 @@ public class DeepSeekAIServiceImpl implements AIService {
outputs.setResult(result);
aiResponse.setOutputs(outputs);
for (String s : split) {
if(LABEL_MAP.containsKey(s)){
if(NEWS_LABEL_MAP.containsKey(s)){
CodeVO codeVO = new CodeVO();
codeVO.setCode(LABEL_MAP.get(s));
codeVO.setCode(NEWS_LABEL_MAP.get(s));
codeVO.setName(s);
result.add(codeVO);
}
......@@ -128,14 +161,72 @@ public class DeepSeekAIServiceImpl implements AIService {
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");
}
}
private void buildNewsTag(ChatInputData chatInputData, AIRequestDTO AIRequestDTO) {
setModel(chatInputData);
chatInputData.setStream(false);
List<Message> messages = new ArrayList<>();
chatInputData.setMessages(messages);
Message systemRole = getSystemTagDeepSeekMessage();
Message systemRole = getSystemMessageForNewsTag();
messages.add(systemRole);
Message userRole = getUserTagDeepSeekMessage(translateDTO);
Message userRole = getUserMessageForNewsTag(AIRequestDTO);
messages.add(userRole);
}
......@@ -147,7 +238,7 @@ public class DeepSeekAIServiceImpl implements AIService {
} catch (JsonProcessingException e) {
throw new BaseException(MsgCode.JSON_ERROR);
}
log.info("translate json:{}", writeValueAsString);
log.info("json:{}", writeValueAsString);
HttpEntity header = getHeader(apiKey);
HttpEntity<String> entity = new HttpEntity<>(writeValueAsString, header.getHeaders());
ResponseEntity<ChatCompletionResponse> response = restTemplate.postForEntity(DEEP_SEEK_URL, entity, ChatCompletionResponse.class);
......@@ -158,22 +249,22 @@ public class DeepSeekAIServiceImpl implements AIService {
throw new BaseException(MsgCode.TRANSLATE_ERROR);
}
private void buildTranslate(ChatInputData chatInputData, TranslateDTO translateDTO) {
chatInputData.setModel("deepseek-v3-250324");
private void buildTranslate(ChatInputData chatInputData, AIRequestDTO AIRequestDTO) {
setModel(chatInputData);
chatInputData.setStream(false);
List<Message> messages = new ArrayList<>();
chatInputData.setMessages(messages);
Message systemRole = getDeepSeekMessage(translateDTO);
Message systemRole = getDeepSeekMessage(AIRequestDTO);
messages.add(systemRole);
}
@NotNull
private static Message getDeepSeekMessage(TranslateDTO translateDTO) {
private static Message getDeepSeekMessage(AIRequestDTO AIRequestDTO) {
Message systemRole = new Message();
systemRole.setRole("user");
systemRole.setContent("需要翻译的JSON:" + translateDTO.getInputs().getRecord_json() + "\n" +
systemRole.setContent("需要翻译的JSON:" + AIRequestDTO.getInputs().getRecord_json() + "\n" +
"\n" +
"你是一个 JSON 翻译员,能够将给定的 JSON 中的 value 值部分翻译成 `" + translateDTO.getInputs().getLanguage() + "`。\n" +
"你是一个 JSON 翻译员,能够将给定的 JSON 中的 value 值部分翻译成 `" + AIRequestDTO.getInputs().getLanguage() + "`。\n" +
"\n" +
"## 限制\n" +
"- 严格按照要求进行翻译,不改变 JSON 的结构和无意义的 key 的 value。\n" +
......@@ -184,15 +275,66 @@ public class DeepSeekAIServiceImpl implements AIService {
return systemRole;
}
private static Message getUserTagDeepSeekMessage(TranslateDTO translateDTO) {
private static Message getUserMessageForNaturalDisasterTag(AIRequestDTO AIRequestDTO) {
Message userRole = new Message();
userRole.setRole("user");
userRole.setContent(translateDTO.getInputs().getRecord_json());
userRole.setContent(AIRequestDTO.getInputs().getWarn_info());
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
private static Message getSystemTagDeepSeekMessage() {
private static Message getSystemMessageForNewsTag() {
Message systemRole = new Message();
systemRole.setRole("system");
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