kimi.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. """
  2. @author: luojunhui
  3. """
  4. import os
  5. import json
  6. from openai import OpenAI
  7. from applications.functions.chatgpt import OpenAIServer
  8. from applications.log import logging
  9. class KimiServer(object):
  10. """
  11. Kimi Server
  12. """
  13. @classmethod
  14. async def search_kimi_schedule(cls, params):
  15. """
  16. 搜索阶段 kimi 操作
  17. :param params:
  18. :return:
  19. """
  20. title = params['article_title'].split("@@")[-1]
  21. contents = params['article_text']
  22. trace_id = params['content_id']
  23. try:
  24. kimi_title = await cls.kimi_title(title)
  25. except Exception as e:
  26. logging(
  27. code="4002",
  28. info="kimi 挖掘失败--{}, 采用 gpt".format(e),
  29. trace_id=trace_id
  30. )
  31. gpt = OpenAIServer()
  32. kimi_title = gpt.gpt_mining(
  33. text=title,
  34. prompt=gpt.prompt_generate(
  35. prompt_type="title"
  36. )
  37. )
  38. kimi_title = kimi_title.replace("'", "").replace('"', "").replace("\\", "")
  39. try:
  40. kimi_info = await cls.kimi_mining(contents)
  41. except Exception as e:
  42. logging(
  43. code="4002",
  44. info="kimi 挖掘失败--{}, 采用 gpt".format(e),
  45. trace_id=trace_id
  46. )
  47. gpt = OpenAIServer()
  48. kimi_info = gpt.gpt_mining(
  49. text=contents,
  50. prompt=gpt.prompt_generate(
  51. prompt_type="text"
  52. )
  53. )
  54. kimi_info = kimi_info.replace('```json', '').replace('```', '')
  55. kimi_info = json.loads(kimi_info)
  56. kimi_info['k_title'] = kimi_title
  57. kimi_info['ori_title'] = title
  58. logging(
  59. code="1005",
  60. info="kimi_mining",
  61. data=kimi_info,
  62. trace_id=trace_id
  63. )
  64. return kimi_info
  65. @classmethod
  66. async def ask_kimi(cls, question):
  67. """
  68. Ask Kimi for information
  69. :param question: tiny text
  70. :return: "{}"
  71. """
  72. single_title_prompt = """
  73. 我会给你一个视频标题,需要你帮我用你所学的知识来帮我分析出以下信息,信息我都写到 json 里面了
  74. {
  75. "key_words": [], # 返回三个关键词
  76. "search_keys": [], # 标题可能的搜索关键词,返回 3 个
  77. "extra_keys": [], # 关心这个视频的用户还会关心哪些关键词, 返回 3 个
  78. "theme": 标题的主题, 用一个词概括
  79. }
  80. 只需要返回一个 json,key 和上面的一样,
  81. 我给你的标题是:
  82. """
  83. client = OpenAI(
  84. api_key='sk-5DqYCa88kche6nwIWjLE1p4oMm8nXrR9kQMKbBolNAWERu7q',
  85. base_url="https://api.moonshot.cn/v1"
  86. )
  87. chat_completion = client.chat.completions.create(
  88. messages=[
  89. {
  90. "role": "user",
  91. "content": single_title_prompt + question,
  92. }
  93. ],
  94. model="moonshot-v1-8k",
  95. )
  96. response = chat_completion.choices[0].message.content.replace('```json', '').replace('```', '')
  97. try:
  98. response = json.loads(response)
  99. return response
  100. except:
  101. return {}
  102. @classmethod
  103. async def ask_kimi_and_save_to_local(cls, info_tuple):
  104. """
  105. save file to local
  106. :return:
  107. """
  108. title, trace_id, save_path = info_tuple[0], info_tuple[1], info_tuple[2]
  109. if os.path.exists(save_path):
  110. logging(
  111. code="2001",
  112. info="该 video 信息已经挖掘完成---{}".format(title),
  113. function="ask_kimi_and_save_to_local",
  114. trace_id=trace_id,
  115. )
  116. else:
  117. os.makedirs(os.path.dirname(save_path), exist_ok=True)
  118. if not title:
  119. result = {}
  120. else:
  121. result = await cls.ask_kimi(title)
  122. logging(
  123. code="2001",
  124. info="kimi-result",
  125. data=result,
  126. trace_id=trace_id,
  127. function="ask_kimi_and_save_to_local"
  128. )
  129. with open(save_path, "w", encoding="utf-8") as f:
  130. f.write(json.dumps(result, ensure_ascii=False))
  131. @classmethod
  132. async def kimi_title(cls, ori_title):
  133. """
  134. prompt + kimi + ori_title generate new title
  135. :param ori_title:
  136. :return:
  137. """
  138. single_title_prompt = """
  139. 请将以上标题改写成适合小程序点击和传播的小程序标题,小程序标题的写作规范如下,请学习后进行小程序标题的编写。直接输出最终的小程序标题
  140. 小程序标题写作规范:
  141. 1.要点前置:将最重要的信息放在标题的最前面,以快速吸引读者的注意力。例如,“5月一辈子同学,三辈子亲,送给我的老同学,听哭无数人!”中的“5月”和“一辈子同学,三辈子亲”都是重要的信息点。
  142. 2.激发情绪:使用能够触动人心的语言,激发读者的情感共鸣。如“只剩两人同学聚会,看后感动落泪。”使用“感动落泪”激发读者的同情和怀旧情绪。
  143. 3.使用数字和特殊符号:数字可以提供具体性,而特殊符号如“🔴”、“😄”、“🔥”等可以吸引视觉注意力,增加点击率。
  144. 4.悬念和好奇心:创建悬念或提出问题,激发读者的好奇心。例如,“太神奇了!长江水位下降,重庆出现惊奇一幕!”中的“惊奇一幕”就是一个悬念。
  145. 5.名人效应:如果内容与知名人士相关,提及他们的名字可以增加标题的吸引力。
  146. 6.社会价值观:触及读者的文化和社会价值观,如家庭、友情、国家荣誉等。
  147. 7.标点符号的运用:使用感叹号、问号等标点来增强语气和情感表达。
  148. 8.直接的语言:使用直白、口语化的语言,易于理解,如“狗屁股,笑死我了!”。
  149. 9.热点人物或事件:提及当前的热点人物或事件,利用热点效应吸引读者。
  150. 10.字数适中:保持标题在10-20个字之间,既不过长也不过短,确保信息的完整性和吸引力。
  151. 11.适当的紧迫感:使用“最新”、“首次”、“紧急”等词汇,创造一种紧迫感,促使读者立即行动。
  152. 12.情感或价值诉求:使用如“感动”、“泪目”、“经典”等词汇,直接与读者的情感或价值观产生共鸣。
  153. 避免误导:确保标题准确反映内容,避免夸大或误导读者。
  154. """
  155. client = OpenAI(
  156. api_key='sk-5DqYCa88kche6nwIWjLE1p4oMm8nXrR9kQMKbBolNAWERu7q',
  157. base_url="https://api.moonshot.cn/v1"
  158. )
  159. chat_completion = client.chat.completions.create(
  160. messages=[
  161. {
  162. "role": "user",
  163. "content": ori_title + "\n" + single_title_prompt,
  164. }
  165. ],
  166. model="moonshot-v1-32k",
  167. )
  168. response = chat_completion.choices[0].message.content
  169. return response.split("\n")[0]
  170. @classmethod
  171. async def kimi_mining(cls, text):
  172. """
  173. 通过文章来挖掘出有效的信息
  174. :param text:
  175. :return:
  176. """
  177. text_prompt = """
  178. 请从我给你的文章中挖掘出以下信息并且返回如下结果。
  179. 你返回的结果是一个 json, 格式如下:
  180. {
  181. "content_keys": [] # 同时提供三个与文章内容高度相关的关键词,这些关键词将用于网络上搜索相关视频内容,
  182. "content_title": 一个总结性的标题,该标题应简洁并能够反映文章的主要内容
  183. }
  184. 你需要处理的文本是:
  185. """
  186. client = OpenAI(
  187. api_key='sk-5DqYCa88kche6nwIWjLE1p4oMm8nXrR9kQMKbBolNAWERu7q',
  188. base_url="https://api.moonshot.cn/v1"
  189. )
  190. chat_completion = client.chat.completions.create(
  191. messages=[
  192. {
  193. "role": "user",
  194. "content": text_prompt + text,
  195. }
  196. ],
  197. model="moonshot-v1-32k",
  198. )
  199. response = chat_completion.choices[0].message.content.replace('```json', '').replace('```', '')
  200. try:
  201. response = json.loads(response)
  202. return response
  203. except:
  204. return {}