ソースを参照

Merge branch '2024-09-23newDbTasks' of Server/title_with_video into new-master

luojunhui 3 ヶ月 前
コミット
627ddd8e6f

+ 1 - 0
.gitignore

@@ -21,6 +21,7 @@ lib64/
 parts/
 sdist/
 var/
+test_code/
 *.egg-info/
 .installed.cfg
 *.egg

+ 14 - 0
applications/config/__init__.py

@@ -23,4 +23,18 @@ long_articles_config = {
     'password': 'changwen@123456',
     'db': 'long_articles',
     'charset': 'utf8mb4'
+}
+
+# deep seek model config
+deep_seek = {
+    "api_key": "sk-30d00642c8b643cab3f54e5672f651c9",
+    "model": "deepseek-chat",
+    "base_url": "https://api.deepseek.com"
+}
+
+# moonshot model config(kimi)
+moon_shot = {
+    "api_key": "sk-5DqYCa88kche6nwIWjLE1p4oMm8nXrR9kQMKbBolNAWERu7q",
+    "model": "moonshot-v1-32k",
+    "base_url": "https://api.moonshot.cn/v1"
 }

+ 3 - 0
applications/const/task_const.py

@@ -76,6 +76,9 @@ class NewContentIdTaskConst(HistoryContentIdTaskConst):
     KIMI_SUCCESS_STATUS = 1
     KIMI_FAIL_STATUS = 2
 
+    # KIMI 安全分
+    KIMI_SAFE_SCORE = 7
+
 
 class RematchTaskConst(NewContentIdTaskConst):
     """

+ 131 - 23
applications/functions/kimi.py

@@ -6,6 +6,8 @@ import json
 from openai import OpenAI
 
 from applications.functions.chatgpt import OpenAIServer
+from applications.config import moon_shot
+from applications.config import deep_seek
 from applications.log import logging
 
 
@@ -15,17 +17,37 @@ class KimiServer(object):
     """
 
     @classmethod
-    async def search_kimi_schedule(cls, params):
+    async def search_kimi_schedule(cls, params, safe_score):
         """
         搜索阶段 kimi 操作
         :param params:
+        :param safe_score:
         :return:
         """
         title = params['article_title'].split("@@")[-1]
         contents = params['article_text']
         trace_id = params['content_id']
         try:
-            kimi_title = await cls.kimi_title(title)
+            kimi_title = await cls.kimi_title(title, ai_model=deep_seek)
+            # 判断kimi 标题是否安全
+            title_score = await cls.get_kimi_title_safe_score(kimi_title, ai_model=moon_shot)
+            kimi_green_title = None
+            if int(title_score) > safe_score:
+                kimi_green_title = await cls.make_kimi_title_safer(title, ai_model=moon_shot)
+                
+            logging(
+                code="1005",
+                info="generate_title",
+                data={
+                    "ori_title": title,
+                    "kimi_title": kimi_title,
+                    "title_score": title_score,
+                    "new_kimi_title": kimi_green_title
+                },
+                trace_id=trace_id
+            )
+            kimi_title = kimi_green_title if kimi_green_title else kimi_title
+
         except Exception as e:
             logging(
                 code="4002",
@@ -42,7 +64,7 @@ class KimiServer(object):
 
         kimi_title = kimi_title.replace("'", "").replace('"', "").replace("\\", "")
         try:
-            kimi_info = await cls.kimi_mining(contents)
+            kimi_info = await cls.kimi_mining(contents, ai_model=deep_seek)
         except Exception as e:
             logging(
                 code="4002",
@@ -137,10 +159,11 @@ class KimiServer(object):
                 f.write(json.dumps(result, ensure_ascii=False))
 
     @classmethod
-    async def kimi_title(cls, ori_title):
+    async def kimi_title(cls, ori_title, ai_model):
         """
         prompt + kimi + ori_title generate new title
         :param ori_title:
+        :param ai_model:
         :return:
         """
         single_title_prompt = """
@@ -161,8 +184,8 @@ class KimiServer(object):
         避免误导:确保标题准确反映内容,避免夸大或误导读者。
         """
         client = OpenAI(
-            api_key='sk-5DqYCa88kche6nwIWjLE1p4oMm8nXrR9kQMKbBolNAWERu7q',
-            base_url="https://api.moonshot.cn/v1"
+            api_key=ai_model['api_key'],
+            base_url=ai_model['base_url']
         )
         chat_completion = client.chat.completions.create(
             messages=[
@@ -171,16 +194,17 @@ class KimiServer(object):
                     "content": ori_title + "\n" + single_title_prompt,
                 }
             ],
-            model="moonshot-v1-32k",
+            model=ai_model['model'],
         )
         response = chat_completion.choices[0].message.content
         return response.split("\n")[0]
 
     @classmethod
-    async def kimi_mining(cls, text):
+    async def kimi_mining(cls, text, ai_model):
         """
         通过文章来挖掘出有效的信息
         :param text:
+        :param ai_model:
         :return:
         """
         text_prompt = """
@@ -193,8 +217,8 @@ class KimiServer(object):
         你需要处理的文本是:
         """
         client = OpenAI(
-            api_key='sk-5DqYCa88kche6nwIWjLE1p4oMm8nXrR9kQMKbBolNAWERu7q',
-            base_url="https://api.moonshot.cn/v1"
+            api_key=ai_model['api_key'],
+            base_url=ai_model['base_url']
         )
         chat_completion = client.chat.completions.create(
             messages=[
@@ -203,18 +227,102 @@ class KimiServer(object):
                     "content": text_prompt + text,
                 }
             ],
-            model="moonshot-v1-32k",
+            model=ai_model['model'],
+            response_format={"type": "json_object"}
         )
-        response = chat_completion.choices[0].message.content.replace('```json', '').replace('```', '')
+        content = json.loads(chat_completion.choices[0].message.content)
+        return content
 
-        try:
-            response = json.loads(response)
-            return response
-        except:
-            # 处理中文双引号出现在 “key”: “value”情况
-            try:
-                response_json_string = response.replace('“', '"').replace('”', '"')
-                response = json.loads(response_json_string)
-                return response
-            except Exception as e:
-                return {}
+    @classmethod
+    async def get_kimi_title_safe_score(cls, kimi_title, ai_model):
+        """
+        获取kimi_title的安全分数
+        """
+        prompt = f"""
+        请你学习一下内容规范,以下标题可能会违反了某条内容规范。请你对标题做一个内容风险评级,1-10分,等级越高内容违规风险越大。 
+        请直接输出内容风险评级的分数,不要输出你的理由、分析等内容。 
+        输出:
+            只需要输出危险分级分数,不要输出任何其他内容。
+        内容规范为: 
+        4.2 色俗内容 
+            4.2.1 散布淫秽、色情内容,包括但不限于招嫖、寻找一夜情、性伴侣等。 
+            4.2.2 发布有色情意味的情色文字、情色视频、情色漫画等内容。 
+            4.2.3 以投稿/爆料等形式描述约炮经历、性交体验、偷情、涉隐私部位偷拍等伤风败俗的话题内容。 
+            4.2.4 以低俗的配图引诱用户阅读文章、关注微信公众号。包含性撩拨、性挑逗画面;疑似女性性高潮/性虐场面;偷拍的沐浴/更衣/如厕/亲热等私密画面;女性故意露出敏感部位 (纯裸露的胸、生殖器官)以及敏感部位未打码的真人写真/艺术摄影等。 
+            4.2.5 文内以低俗类的动图或引导图,诱导用户点击进而跳转至另一篇图文页或关注某个公众号。 
+            4.2.6 文章主要描述PUA撩妹、撩汉等相关话题,且引导用户关注公众号/加个人微信号/加群。 
+        4.11 煽动、夸大、误导类内容 平台鼓励创作者提供准确、清晰、能体现文章内容主旨的标题,不允许通过标题噱头诱导用户点击或误导用户。
+            包括但不限于以下情况: 
+            4.11.1 标题含有危害人身安全、恐吓侮辱、惊悚、极端内容,或者以命令式语气强迫用户阅读。 
+            4.11.2 标题无依据夸大事件严重程度、紧急程度、受影响面以及事件引发的情绪。 
+            4.11.3 标题以浮夸的描述,反常识强调某种食物/行为对人体健康的影响,煽动人群要/不要去做某行为。 
+            4.11.4 非官方通知或者公告,但标题假借官方名义煽动获取流量,或以信息来源机密、看完即删来诱导用户。 
+            4.11.5 标题故意隐藏关键信息,或无中生有部分信息,给用户造成误导。 
+            4.12 违反国家法律法规禁止的内容 
+                (1)违反宪法确定的基本原则的; 
+                (2)危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的; 
+                (3)损害国家荣誉和利益的; 
+                (4)煽动民族仇恨、民族歧视,破坏民族团结的; 
+                (5)破坏国家宗教政策,宣扬邪教和封建迷信的; 
+                (6)散布不实信息,扰乱社会秩序,破坏社会稳定的; 
+                (7)散布淫秽、色情、赌博、暴力、恐怖或者教唆犯罪的; 
+                (8)侮辱或者诽谤他人,侵害他人合法权益的; 
+                (9)煽动非法集会、结社、游行、示威、聚众扰乱社会秩序; 
+                (10)以非法民间组织名义活动的; 
+                (11)不符合《即时通信工具公众信息服务发展管理暂行规定》及遵守法律法规、社会主义制度、国家利益、公民合法利益、公共秩序、社会道德风尚和信息真实性等“七条底线”要求的; 
+                (12)含有法律、行政法规禁止的其他内容的。
+        输入的标题是: {kimi_title}
+        """
+        client = OpenAI(
+            api_key=ai_model['api_key'],
+            base_url=ai_model['base_url']
+        )
+        chat_completion = client.chat.completions.create(
+            messages=[
+                {
+                    "role": "user",
+                    "content": prompt
+                }
+            ],
+            model=ai_model['model']
+        )
+        response = chat_completion.choices[0].message.content
+        return response
+
+    @classmethod
+    async def make_kimi_title_safer(cls, ori_title, ai_model):
+        """
+        安全化 kimi title
+        """
+        prompt = """
+            以下每行为一个文章的标题,请用尽量平实的语言对以上标题进行改写,保持在10~15字左右,请注意:
+            1. 不要虚构或改变标题的含义。
+            2. 不要用笃定的语气描述存疑的可能性,不要将表述可能性的问句改为肯定句。
+            直接输出改写后的标题列表。
+            在改写完成后,再输出一次,在改写的标题前增加和标题情感、语气匹配的特殊符号,如:“🔴”、“😄”、“🔥”、“😨”等等
+            输出:
+                输出结果是Dict, 格式为: 
+                {
+                "title_v1": 请填写第一次输出的标题,
+                "title_v2": 请填写第二次输出的标题
+                }
+            输入的标题是: 
+        """
+        client = OpenAI(
+            api_key=ai_model['api_key'],
+            base_url=ai_model['base_url']
+        )
+        chat_completion = client.chat.completions.create(
+            messages=[
+                {
+                    "role": "user",
+                    "content": prompt + ori_title,
+                }
+            ],
+            model=ai_model['model'],
+            response_format={"type": "json_object"}
+        )
+        response = chat_completion.choices[0].message.content
+        response_json = json.loads(response)
+        safer_title = response_json["title_v2"]
+        return safer_title

+ 6 - 1
tasks/new_contentId_task.py

@@ -343,7 +343,12 @@ class NewContentIdTask(object):
                 )
                 return
             try:
-                kimi_result = await generate_kimi_result(content_id=content_id, article_text_table=self.article_text_table, db_client=self.long_articles_client)
+                kimi_result = await generate_kimi_result(
+                    content_id=content_id,
+                    article_text_table=self.article_text_table,
+                    db_client=self.long_articles_client,
+                    safe_score=NewContentIdTaskConst.KIMI_SAFE_SCORE
+                )
                 await self.update_content_status(
                     new_content_status=NewContentIdTaskConst.TASK_KIMI_FINISHED_STATUS,
                     trace_id=trace_id,

+ 1 - 1
tasks/rm_match_task.py

@@ -117,7 +117,7 @@ class ReMatchTask(object):
         response = await self.db_client.async_select(select_sql)
         status_list = list(i[0] for i in response)
         for status in status_list:
-            if status in [rematch_task_const.REMATCH_PROCESSING_STATUS, rematch_task_const.REMATCH_SUCCESS_STATUS]:
+            if status == rematch_task_const.REMATCH_PROCESSING_STATUS:
                 return True
         return False
 

+ 2 - 2
tasks/utils/kimi_task.py

@@ -53,7 +53,7 @@ async def get_kimi_result(content_id, article_text_table, db_client) -> Dict:
         return {}
 
 
-async def generate_kimi_result(content_id, article_text_table, db_client) -> Dict:
+async def generate_kimi_result(content_id, article_text_table, db_client, safe_score) -> Dict:
     """
     为content_id执行kimi操作
     """
@@ -69,7 +69,7 @@ async def generate_kimi_result(content_id, article_text_table, db_client) -> Dic
         "article_text": res[0][1],
         "content_id": content_id
     }
-    kimi_info = await K.search_kimi_schedule(params=article_obj)
+    kimi_info = await K.search_kimi_schedule(params=article_obj, safe_score=safe_score)
     kimi_title = kimi_info['k_title']
     content_title = kimi_info['content_title'].replace("'", "").replace('"', "")
     content_keys = json.dumps(kimi_info['content_keys'], ensure_ascii=False)