|
@@ -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
|