|
|
@@ -1,63 +1,22 @@
|
|
|
-package com.tzld.piaoquan.longarticle.utils.other;
|
|
|
+package com.tzld.piaoquan.longarticle.service.remote;
|
|
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.tzld.piaoquan.longarticle.model.dto.kimi.AIResult;
|
|
|
+import com.tzld.piaoquan.longarticle.utils.JSONUtils;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.apache.commons.lang3.math.NumberUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.Map;
|
|
|
-
|
|
|
+@Service
|
|
|
+@Slf4j
|
|
|
public class OpenAIUtils {
|
|
|
|
|
|
- public static void main(String[] args) {
|
|
|
- System.out.println(getKimiTitleSafeScore("历史上真实的王莽,还真不是传说中的那样"));
|
|
|
-// System.out.println(makeKimiTitleSafer("历史上真实的王莽,还真不是传说中的那样"));
|
|
|
-// System.out.println(kimiMining("在这个充满喜悦和庆祝的日子里,我决定为弟弟的婚礼准备一份特别的礼物——30000元作为结婚礼金。\n" +
|
|
|
-// "这笔钱对我和我的家庭来说不算小数目,但在我看来,能为弟弟的新生活贡献一份力量,这份心意远远超过了金钱的价值。\n" +
|
|
|
-// "我和丈夫商量过后,都认为这是一个表达我们祝福和支持的好办法。\n" +
|
|
|
-// "婚礼当天,一切都安排得井井有条。喜悦和幸福的气氛弥漫在空气中,我看着弟弟和他的新娘幸福地站在一起,心中充满了欣慰。\n" +
|
|
|
-// "然而,在这一天中,我意外听到了一段对话,这段对话让我重新审视了家庭成员之间的关系和支持的真正含义。\n" +
|
|
|
-// "当我上厕所时,无意中经过一个小房间,听到了里面传出的声音。那是弟弟和母亲的对话。\n" +
|
|
|
-// "原来,弟弟在担心,担心这份厚重的礼金会给我和我的丈夫带来经济上的负担。\n" +
|
|
|
-// "他在对母亲说,他宁愿没有这笔钱,也不愿看到我们因此受到影响。这番话让我站在门外的脚步凝固了,心中充满了复杂的情感。\n" +
|
|
|
-// "\n" +
|
|
|
-// "我感动于弟弟的体贴和关心,但同时也感到了一丝悲哀。我们之间的爱和支持,难道仅仅局限于物质的给予吗?我对支持的理解,是否太过狭隘,忽略了弟弟真正的感受和需求?\n" +
|
|
|
-// "泪水在眼眶中打转,我没有进去打扰他们,而是默默地拉起我的丈夫,决定离开宴会,我需要时间来消化这突如其来的情感波动。\n" +
|
|
|
-// "回到家后,我花了很长时间去思考和反思。我意识到,作为家庭成员,我们之间的支持不应该成为彼此的负担。\n" +
|
|
|
-// "真正的支持,应该是基于对彼此需求的理解和尊重,而不仅仅是物质上的帮助。\n" +
|
|
|
-// "\n" +
|
|
|
-// "于是,我和弟弟进行了一次深入的交谈。我向他解释了我给予礼金的初衷,同时也表达了我对他顾虑的理解和尊重。\n" +
|
|
|
-// "我们都意识到,家庭成员之间的沟通是多么的重要。只有通过开放和坦诚的沟通,我们才能更好地理解彼此的需求和感受,避免不必要的误解和心理负担。\n" +
|
|
|
-// "这次事件让我深刻体会到,家庭关系的维护不仅仅需要物质上的支持,更需要心灵上的交流和理解。在未来的日子里,我希望我们每个人都能成为一个倾听者,一个理解者,让我们的家充满爱和支持,而不是压力和负担。\n" +
|
|
|
-// "家庭的爱,应该是无条件的,它不仅仅存在于物质的传递中,更重要的是心与心之间的连接。\n" +
|
|
|
-// "通过有效的沟通,我们可以解决误会和矛盾,使得家庭关系变得更加紧密和和谐。\n" +
|
|
|
-// "我相信,只要我们愿意打开心扉,相互理解和支持,就能构建一个充满爱的家园。\n" +
|
|
|
-// "\n" +
|
|
|
-// "这次经历虽然让我一时感到困惑和伤心,但最终却让我获得了更多的成长和领悟。\n" +
|
|
|
-// "我感谢弟弟无意间给我的这堂课,它让我认识到,在家庭这个小社会中,每个人的感受和需求都是重要的,我们应该学会更加细腻和周到地去关爱彼此。"));
|
|
|
- }
|
|
|
-
|
|
|
- public static String getKimiTitle(String title) {
|
|
|
- String single_title_prompt = "请将以上标题改写成适合小程序点击和传播的小程序标题,小程序标题的写作规范如下,请学习后进行小程序标题的编写。直接输出最终的小程序标题\n" +
|
|
|
- " 小程序标题写作规范:\n" +
|
|
|
- " 1.要点前置:将最重要的信息放在标题的最前面,以快速吸引读者的注意力。例如,“5月一辈子同学,三辈子亲,送给我的老同学,听哭无数人!”中的“5月”和“一辈子同学,三辈子亲”都是重要的信息点。\n" +
|
|
|
- " 2.激发情绪:使用能够触动人心的语言,激发读者的情感共鸣。如“只剩两人同学聚会,看后感动落泪。”使用“感动落泪”激发读者的同情和怀旧情绪。\n" +
|
|
|
- " 3.使用数字和特殊符号:数字可以提供具体性,而特殊符号如“\uD83D\uDD34”、“\uD83D\uDE04”、“\uD83D\uDD25”等可以吸引视觉注意力,增加点击率。\n" +
|
|
|
- " 4.悬念和好奇心:创建悬念或提出问题,激发读者的好奇心。例如,“太神奇了!长江水位下降,重庆出现惊奇一幕!”中的“惊奇一幕”就是一个悬念。\n" +
|
|
|
- " 5.名人效应:如果内容与知名人士相关,提及他们的名字可以增加标题的吸引力。\n" +
|
|
|
- " 6.社会价值观:触及读者的文化和社会价值观,如家庭、友情、国家荣誉等。\n" +
|
|
|
- " 7.标点符号的运用:使用感叹号、问号等标点来增强语气和情感表达。\n" +
|
|
|
- " 8.直接的语言:使用直白、口语化的语言,易于理解,如“狗屁股,笑死我了!”。\n" +
|
|
|
- " 9.热点人物或事件:提及当前的热点人物或事件,利用热点效应吸引读者。\n" +
|
|
|
- " 10.字数适中:保持标题在10-20个字之间,既不过长也不过短,确保信息的完整性和吸引力。\n" +
|
|
|
- " 11.适当的紧迫感:使用“最新”、“首次”、“紧急”等词汇,创造一种紧迫感,促使读者立即行动。\n" +
|
|
|
- " 12.情感或价值诉求:使用如“感动”、“泪目”、“经典”等词汇,直接与读者的情感或价值观产生共鸣。\n" +
|
|
|
- " 避免误导:确保标题准确反映内容,避免夸大或误导读者。" +
|
|
|
- " 输出:只输出标题,不输出其他内容";
|
|
|
- return KimiAPI.chat(title + "\n" + single_title_prompt);
|
|
|
- }
|
|
|
+ @Autowired
|
|
|
+ private DeepSeekApiService deepSeekApiService;
|
|
|
|
|
|
- public static Integer getKimiTitleSafeScore(String kimiTitle) {
|
|
|
+ public Integer getKimiTitleSafeScore(String kimiTitle) {
|
|
|
String prompt = "请你学习一下内容规范,以下标题可能会违反了某条内容规范。请你对标题做一个内容风险评级,1-10分,等级越高内容违规风险越大。 \n" +
|
|
|
" 请直接输出内容风险评级的分数,不要输出你的理由、分析等内容。 \n" +
|
|
|
" 输出:\n" +
|
|
|
@@ -91,14 +50,16 @@ public class OpenAIUtils {
|
|
|
" (11)不符合《即时通信工具公众信息服务发展管理暂行规定》及遵守法律法规、社会主义制度、国家利益、公民合法利益、公共秩序、社会道德风尚和信息真实性等“七条底线”要求的; \n" +
|
|
|
" (12)含有法律、行政法规禁止的其他内容的。\n" +
|
|
|
" 输入的标题是: " + kimiTitle;
|
|
|
- String res = DeepSeekAPI.chat(prompt);
|
|
|
+
|
|
|
+ AIResult result = deepSeekApiService.request(prompt);
|
|
|
+ String res = result.getResponse().getChoices().get(0).getMessage().getContent();
|
|
|
if (StringUtils.isNotEmpty(res) && NumberUtils.isParsable(res)) {
|
|
|
return Integer.parseInt(res);
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- public static String makeKimiTitleSafer(String title) {
|
|
|
+ public String makeKimiTitleSafer(String title) {
|
|
|
String prompt = "以下每行为一个文章的标题,请用尽量平实的语言对以上标题进行改写,保持在10~15字左右,请注意:\n" +
|
|
|
" 1. 不要虚构或改变标题的含义。\n" +
|
|
|
" 2. 不要用笃定的语气描述存疑的可能性,不要将表述可能性的问句改为肯定句。\n" +
|
|
|
@@ -111,15 +72,13 @@ public class OpenAIUtils {
|
|
|
" \"title_v2\": 请填写第二次输出的标题\n" +
|
|
|
" }\n" +
|
|
|
" 输入的标题是: " + title;
|
|
|
- Map<String, String> responseFormat = new HashMap<>();
|
|
|
- responseFormat.put("type", "json_object");
|
|
|
- String res = DeepSeekAPI.chat(prompt, responseFormat);
|
|
|
-// String res = KimiAPI.jsonChat(prompt);
|
|
|
- JSONObject jsonObject = JSONObject.parseObject(res);
|
|
|
+ AIResult result = deepSeekApiService.request(prompt, null, null, true);
|
|
|
+ String res = result.getResponse().getChoices().get(0).getMessage().getContent();
|
|
|
+ JSONObject jsonObject = JSONUtils.parseAIJsonContent(res);
|
|
|
return jsonObject.getString("title_v2");
|
|
|
}
|
|
|
|
|
|
- public static JSONObject kimiMining(String text) {
|
|
|
+ public JSONObject kimiMining(String text) {
|
|
|
String textPrompt = "请从我给你的文章中挖掘出以下信息并且返回如下结果。\n" +
|
|
|
" 你返回的结果是一个 json, 格式如下:\n" +
|
|
|
" {\n" +
|
|
|
@@ -127,15 +86,32 @@ public class OpenAIUtils {
|
|
|
" \"content_title\": 一个总结性的标题,该标题应简洁并能够反映文章的主要内容\n" +
|
|
|
" }\n" +
|
|
|
" 你需要处理的文本是:";
|
|
|
- Map<String, String> responseFormat = new HashMap<>();
|
|
|
- responseFormat.put("type", "json_object");
|
|
|
- String content = DeepSeekAPI.chat(textPrompt + text, responseFormat);
|
|
|
-// String content = KimiAPI.jsonChat(textPrompt + text);
|
|
|
+ AIResult result = deepSeekApiService.request(textPrompt + text, null, null, true);
|
|
|
+ String content = result.getResponse().getChoices().get(0).getMessage().getContent();
|
|
|
if (StringUtils.isEmpty(content)) {
|
|
|
return null;
|
|
|
}
|
|
|
- return JSONObject.parseObject(content);
|
|
|
+ return JSONUtils.parseAIJsonContent(content);
|
|
|
}
|
|
|
|
|
|
+ public String processDeepSeekTitle(String title) {
|
|
|
+ String single_title_prompt = "请将以上标题改写成适合小程序点击和传播的小程序标题,小程序标题的写作规范如下,请学习后进行小程序标题的编写。直接输出最终的小程序标题\n" +
|
|
|
+ " 小程序标题写作规范:\n" +
|
|
|
+ " 1.要点前置:将最重要的信息放在标题的最前面,以快速吸引读者的注意力。例如,“5月一辈子同学,三辈子亲,送给我的老同学,听哭无数人!”中的“5月”和“一辈子同学,三辈子亲”都是重要的信息点。\n" +
|
|
|
+ " 2.激发情绪:使用能够触动人心的语言,激发读者的情感共鸣。如“只剩两人同学聚会,看后感动落泪。”使用“感动落泪”激发读者的同情和怀旧情绪。\n" +
|
|
|
+ " 3.使用数字和特殊符号:数字可以提供具体性,而特殊符号如“\uD83D\uDD34”、“\uD83D\uDE04”、“\uD83D\uDD25”等可以吸引视觉注意力,增加点击率。\n" +
|
|
|
+ " 4.悬念和好奇心:创建悬念或提出问题,激发读者的好奇心。\n" +
|
|
|
+ " 5.名人效应:如果内容与知名人士相关,提及他们的名字可以增加标题的吸引力。\n" +
|
|
|
+ " 6.社会价值观:触及读者的文化和社会价值观,如家庭、友情、国家荣誉等。\n" +
|
|
|
+ " 7.标点符号的运用:使用感叹号、问号等标点来增强语气和情感表达。\n" +
|
|
|
+ " 8.直接的语言:使用直白、口语化的语言,易于理解,如“狗屁股,笑死我了!”。\n" +
|
|
|
+ " 9.热点人物或事件:提及当前的热点人物或事件,利用热点效应吸引读者。\n" +
|
|
|
+ " 10.字数适中:保持标题在10-20个字之间,既不过长也不过短,确保信息的完整性和吸引力。\n" +
|
|
|
+ " 11.情感或价值诉求:使用如“感动”、“泪目”、“经典”等词汇,直接与读者的情感或价值观产生共鸣。\n" +
|
|
|
+ " 避免误导:确保标题准确反映内容,避免夸大或误导读者。";
|
|
|
+ String prompt = title + "\n" + single_title_prompt;
|
|
|
+ AIResult res = deepSeekApiService.request(prompt);
|
|
|
+ return res.getResponse().getChoices().get(0).getMessage().getContent();
|
|
|
+ }
|
|
|
|
|
|
}
|