提交 f398883f 作者: 925993793@qq.com

定制专题-逻辑优化、bug修改

上级 e3a41619
...@@ -33,6 +33,8 @@ public class LlmProperties { ...@@ -33,6 +33,8 @@ public class LlmProperties {
private String defaultModel; private String defaultModel;
//是否开启网络搜索 //是否开启网络搜索
private Boolean webSearch; private Boolean webSearch;
//温度
private Float temperature;
} }
/** /**
......
...@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; ...@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zzsn.event.config.properties.LlmProperties;
import com.zzsn.event.constant.Result; import com.zzsn.event.constant.Result;
import com.zzsn.event.entity.Subject; import com.zzsn.event.entity.Subject;
import com.zzsn.event.external.entity.ExternalSubjectInfoSourceMap; import com.zzsn.event.external.entity.ExternalSubjectInfoSourceMap;
...@@ -35,6 +36,7 @@ import com.zzsn.event.xxljob.service.IXxlJobInfoService; ...@@ -35,6 +36,7 @@ import com.zzsn.event.xxljob.service.IXxlJobInfoService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
...@@ -82,6 +84,8 @@ public class ExternalController { ...@@ -82,6 +84,8 @@ public class ExternalController {
private CaiJiCenterHttpService caiJiCenterHttpService; private CaiJiCenterHttpService caiJiCenterHttpService;
@Autowired @Autowired
private ConfigurationMessageService configurationMessageService; private ConfigurationMessageService configurationMessageService;
@Resource
private LlmProperties llmProperties;
@Value("${caiji.keywordCrawler.url:}") @Value("${caiji.keywordCrawler.url:}")
private String keywordCrawlerUrl; private String keywordCrawlerUrl;
...@@ -114,9 +118,9 @@ public class ExternalController { ...@@ -114,9 +118,9 @@ public class ExternalController {
Date timeDisable = record.getTimeDisable(); Date timeDisable = record.getTimeDisable();
if (timeDisable != null) { if (timeDisable != null) {
if (timeDisable.before(now)) { if (timeDisable.before(now)) {
record.setCollectStatus("采集中");
} else {
record.setCollectStatus("已完成"); record.setCollectStatus("已完成");
} else {
record.setCollectStatus("采集中");
} }
} else { } else {
record.setCollectStatus("采集中"); record.setCollectStatus("采集中");
...@@ -209,7 +213,15 @@ public class ExternalController { ...@@ -209,7 +213,15 @@ public class ExternalController {
* @date 2025/8/25 * @date 2025/8/25
*/ */
@GetMapping("/optimizeDescription") @GetMapping("/optimizeDescription")
public Result<?> optimizeDescription(@RequestParam String remark) { public Result<?> optimizeDescription(@RequestParam String remark, @RequestParam String language) {
String languageCN = "中文简体";
if ("zh-CN".equals(language)) {
languageCN = "中文,且为中文简体";
} else if ("en".equals(language)) {
languageCN = "英文";
} else if ("ja".equals(language)) {
languageCN = "日文";
}
String prompt = "【角色】 你是一名资深【行业分析师】和【技术文档撰写者】。你的任务是将一个简短的主题转化为一段定义清晰、内容充实、客观中立的专题概述。\n" + String prompt = "【角色】 你是一名资深【行业分析师】和【技术文档撰写者】。你的任务是将一个简短的主题转化为一段定义清晰、内容充实、客观中立的专题概述。\n" +
"【核心任务】 根据用户提供的一个简短主题名称或初步想法,将其扩展成一段约150字的、详尽且准确的专题描述。这段描述需要全面覆盖该主题的核心定义、背景、关键组成部分、重要影响或相关应用场景,语言需保持专业、精炼和高信息密度,避免主观评价和浮夸修辞。\n" + "【核心任务】 根据用户提供的一个简短主题名称或初步想法,将其扩展成一段约150字的、详尽且准确的专题描述。这段描述需要全面覆盖该主题的核心定义、背景、关键组成部分、重要影响或相关应用场景,语言需保持专业、精炼和高信息密度,避免主观评价和浮夸修辞。\n" +
"【要求】\n" + "【要求】\n" +
...@@ -218,14 +230,17 @@ public class ExternalController { ...@@ -218,14 +230,17 @@ public class ExternalController {
"信息密集:优先使用名词和专业术语,尽量保留用户输入的关键词,确保段落内含大量关键实体和概念,为后续关键词提取提供丰富素材。\n" + "信息密集:优先使用名词和专业术语,尽量保留用户输入的关键词,确保段落内含大量关键实体和概念,为后续关键词提取提供丰富素材。\n" +
"逻辑连贯:语句之间逻辑顺畅,形成一段完整的概述,而非关键词罗列。\n" + "逻辑连贯:语句之间逻辑顺畅,形成一段完整的概述,而非关键词罗列。\n" +
"精准简洁:严格控制字数在150字左右,直达核心,避免冗长。\n" + "精准简洁:严格控制字数在150字左右,直达核心,避免冗长。\n" +
"语种识别:识别用户输入的语种,例如中文、日文、英文,输出也要用对应的语种输出\n" + "输出语种:输出的文字必须是" + languageCN + "\n" +
"最终输出:请直接生成一段约150字的专题描述,无需任何前置说明、标题或分点。\n" + "最终输出:请直接生成一段约150字的专题描述,无需任何前置说明、标题或分点。\n" +
"【输入输出示例】\n" + "【输入输出示例】\n" +
"示例:\n" + "示例:\n" +
"输入: 特斯拉刹车失灵\n" + "输入: 特斯拉刹车失灵\n" +
"输出: 该专题聚焦于特斯拉电动汽车系列车型涉及的刹车系统性能与安全问题。近年来,全球多地车主报告在驾驶过程中遭遇疑似刹车失灵或制动距离异常延长的案例,引发了消费者对车辆安全性的广泛担忧。事件导致了多起交通事故,并促使美国国家公路交通安全管理局等权威机构启动缺陷调查。专题将涵盖相关事故报告、技术分析、监管机构的调查进展、特斯拉官方的回应及后续软件更新措施,旨在全面审视此类事件的真实性与潜在技术根源。"; "输出: 该专题聚焦于特斯拉电动汽车系列车型涉及的刹车系统性能与安全问题。近年来,全球多地车主报告在驾驶过程中遭遇疑似刹车失灵或制动距离异常延长的案例,引发了消费者对车辆安全性的广泛担忧。事件导致了多起交通事故,并促使美国国家公路交通安全管理局等权威机构启动缺陷调查。专题将涵盖相关事故报告、技术分析、监管机构的调查进展、特斯拉官方的回应及后续软件更新措施,旨在全面审视此类事件的真实性与潜在技术根源。";
String crawlerWord = llmService.model("qwen", "qwen-max-latest", prompt, remark); String description = llmService.model("qwen", "qwen-max-latest", prompt, remark);
return Result.OK(crawlerWord); Map<String, String> resultMap = new HashMap<>();
resultMap.put("language", language);
resultMap.put("model", description);
return Result.OK(resultMap);
} }
...@@ -241,16 +256,20 @@ public class ExternalController { ...@@ -241,16 +256,20 @@ public class ExternalController {
String prompt = "你是一个专业信息采集助手,根据用户专题描述生成关键词表达式:\n" + String prompt = "你是一个专业信息采集助手,根据用户专题描述生成关键词表达式:\n" +
"1. 用 + 表示与关系(必须同现),| 表示或关系(任一出现),用()分组\n" + "1. 用 + 表示与关系(必须同现),| 表示或关系(任一出现),用()分组\n" +
"2. 执行三步操作:\n" + "2. 执行三步操作:\n" +
" (1) 提取核心实体(如企业/产品名)\n" + " (1) 理解语意,识别用户需求,提取核心实体(如企业/产品名),实体词语必须完整不能有歧义\n" +
" (2) 将抽象词拆解为3-5个具体场景词(如\"动向\"→\"上升|下降|波动|结构调整\")\n" + " (2) 将抽象词拆解为3-5个具体场景词(如\"动向\"→\"上升|下降|波动|结构调整\")\n" +
" (3) 扩展同义词/行业关联词\n" + " (3) 扩展同义词/行业关联词\n" +
"3. 排除时间词,+号不超过2个,单组|内词不超过5个\n" + "3. 排除时间词,|两边只能是单个词语,不能是括号词组,\n" +
"4. 输出仅含表达式\n" + "4.+号不超过2个,尽量使用两组词表达,最多使用三组词\n" +
"5. 输出仅含表达式\n" +
"\n" + "\n" +
"示例: \n" + "示例: \n" +
"描述:苹果新款iPhone发布引发市场反响\n" + "描述:苹果新款iPhone发布引发市场反响\n" +
"输出:(苹果|iPhone)+(発売|価格|予約状況|市場シェア|消費者反応)"; "输出:(苹果|iPhone)+(発売|価格|予約状況|市場シェア|消費者反応)";
String crawlerWord = llmService.model("qwen", "qwen-max-latest", prompt, remark); LlmProperties.ModelConfig modelConfig = llmProperties.getModelConfig("qwen");
modelConfig.setDefaultModel("qwen-max-latest");
modelConfig.setTemperature(0.1f);
String crawlerWord = llmService.qwenModel(modelConfig, prompt, remark);
return Result.OK(crawlerWord); return Result.OK(crawlerWord);
} }
...@@ -416,7 +435,6 @@ public class ExternalController { ...@@ -416,7 +435,6 @@ public class ExternalController {
String key = "GATHER_SUMMARY::" + subjectId; String key = "GATHER_SUMMARY::" + subjectId;
if (redisUtil.hasKey(key)) { if (redisUtil.hasKey(key)) {
Object data = redisUtil.get(key); Object data = redisUtil.get(key);
if (data instanceof Map) {
Map<String, Object> map = (Map<String, Object>) data; Map<String, Object> map = (Map<String, Object>) data;
List<String> idList = JSON.parseArray(map.get("idList").toString(), String.class); List<String> idList = JSON.parseArray(map.get("idList").toString(), String.class);
InfoDataSearchCondition searchCondition = new InfoDataSearchCondition(); InfoDataSearchCondition searchCondition = new InfoDataSearchCondition();
...@@ -434,8 +452,7 @@ public class ExternalController { ...@@ -434,8 +452,7 @@ public class ExternalController {
return Result.OK(resultMap); return Result.OK(resultMap);
} }
} }
} return Result.OK(map);
return Result.OK((Map<String, Object>) data);
} else { } else {
List<DisplayInfo> dataList = getDataList(subjectId); List<DisplayInfo> dataList = getDataList(subjectId);
return Result.OK(generateSummary(subjectId, dataList, language)); return Result.OK(generateSummary(subjectId, dataList, language));
...@@ -471,14 +488,15 @@ public class ExternalController { ...@@ -471,14 +488,15 @@ public class ExternalController {
List<String> content = new ArrayList<>(); List<String> content = new ArrayList<>();
content.add(summary); content.add(summary);
translateVO.setContent(content); translateVO.setContent(content);
List<String> data = new ArrayList<>(); String result = null;
try { try {
String s = HttpUtil.doPost(TRANSLATE_URL, ObjectUtil.objectToJSONObject(translateVO), 10000); String s = HttpUtil.doPost(TRANSLATE_URL, ObjectUtil.objectToJSONObject(translateVO), 10000);
data = JSONArray.parseArray(s, String.class); List<String> data = JSONArray.parseArray(s, String.class);
result = Jsoup.parse(data.get(0)).text();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
return Result.OK(data); return Result.OK(result);
} }
...@@ -533,12 +551,14 @@ public class ExternalController { ...@@ -533,12 +551,14 @@ public class ExternalController {
"输出(示例段落):\n" + "输出(示例段落):\n" +
"多篇关于机器学习可解释性(XAI)的研究聚焦于提升复杂模型透明度。核心共识在于有效解释技术(如梯度解释法、LIME、SHAP)能增强用户信任并提升决策准确率。然而,在方法实用性上存在分歧,部分研究指出主流技术存在显著计算效率缺陷,尤其在资源受限场景;同时,医疗领域应用突显透明度不足是阻碍临床采纳的关键瓶颈。研究趋势显示从开发基础解释方法(如早期梯度法)转向评估实际场景效能及效率优化。当前主要知识缺口在于缺乏统一标准评估解释的可靠性与临床相关性,亟需开发兼顾高效性和领域适配性的XAI解决方案。"; "多篇关于机器学习可解释性(XAI)的研究聚焦于提升复杂模型透明度。核心共识在于有效解释技术(如梯度解释法、LIME、SHAP)能增强用户信任并提升决策准确率。然而,在方法实用性上存在分歧,部分研究指出主流技术存在显著计算效率缺陷,尤其在资源受限场景;同时,医疗领域应用突显透明度不足是阻碍临床采纳的关键瓶颈。研究趋势显示从开发基础解释方法(如早期梯度法)转向评估实际场景效能及效率优化。当前主要知识缺口在于缺乏统一标准评估解释的可靠性与临床相关性,亟需开发兼顾高效性和领域适配性的XAI解决方案。";
String model = llmService.model("qwen", "qwen-max-latest", prompt, JSONObject.toJSONString(params)); String model = llmService.model("qwen", "qwen-max-latest", prompt, JSONObject.toJSONString(params));
if (StringUtils.isNotBlank(model)) {
resultMap = new HashMap<>(); resultMap = new HashMap<>();
resultMap.put("idList", idList); resultMap.put("idList", idList);
resultMap.put("language", language); resultMap.put("language", language);
resultMap.put("model", model); resultMap.put("model", model);
redisUtil.set("GATHER_SUMMARY::" + subjectId, resultMap); redisUtil.set("GATHER_SUMMARY::" + subjectId, resultMap);
} }
}
return resultMap; return resultMap;
} }
} }
package com.zzsn.event.llm; package com.zzsn.event.llm;
import com.zzsn.event.config.properties.LlmProperties;
/** /**
* 模型调用 * 模型调用
*/ */
...@@ -15,4 +17,14 @@ public interface LlmService { ...@@ -15,4 +17,14 @@ public interface LlmService {
* @return 大模型响应结果 * @return 大模型响应结果
*/ */
String model(String modelType, String modelName, String system, String content); String model(String modelType, String modelName, String system, String content);
/**
* 千问模型调用
*
* @param modelConfig 模型配置信息
* @param system 提示词
* @param content 引用内容
* @return 大模型响应结果
*/
String qwenModel(LlmProperties.ModelConfig modelConfig, String system, String content);
} }
...@@ -136,6 +136,9 @@ public class LlmServiceImpl implements LlmService { ...@@ -136,6 +136,9 @@ public class LlmServiceImpl implements LlmService {
.messages(Arrays.asList(systemMsg, userMsg)) .messages(Arrays.asList(systemMsg, userMsg))
.resultFormat(GenerationParam.ResultFormat.MESSAGE) .resultFormat(GenerationParam.ResultFormat.MESSAGE)
.build(); .build();
if (modelConfig.getTemperature() != null) {
param.setTemperature(modelConfig.getTemperature());
}
GenerationResult call = gen.call(param); GenerationResult call = gen.call(param);
return call.getOutput().getChoices().get(0).getMessage().getContent(); return call.getOutput().getChoices().get(0).getMessage().getContent();
} catch (Exception e) { } catch (Exception e) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论