google_ai_studio.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import os
  2. import time
  3. import uuid
  4. from typing import Optional
  5. import google.generativeai as genai
  6. import orjson
  7. import requests
  8. from google.generativeai.types import (HarmBlockThreshold, HarmCategory)
  9. from loguru import logger
  10. from utils.feishu_data import Material
  11. CACHE_DIR = '/app/cache/'
  12. prompt = '''
  13. 请帮助我做以下分析:
  14. 我将提供给你视频,需要你模拟成中老年用户在视频消费平台观看这些视频。
  15. 需要你充分发挥想象力,推测出中老年用户在观看这些视频过程中,可能产生什么具体的需求。并推测出该点需求的原因。
  16. -每项需求请根据观看者的需求强烈程度打分排序,越强烈分值越高,分值越高排序越前。分值范围:0-10分。
  17. -每项需求请分类。需求类型:文字问答类、视频推荐类、
  18. -针对这些需求,平台有两部分功能:钩子及落地方案,钩子指在视频需求产生时,平台会有相关提示,提示用户进入落地方案;落地方案指针对用户需求,平台提供的相关信息、服务能力,解决用户的需求
  19. -针对这些需求,平台有几类解决方案,1. 文字问答;可提供问答信息获取服务;2. 内容推荐;推荐平台内相关视频内容;
  20. -需求是用户在观看过程中有欲望产生除观看外的动作,需求不要泛泛而谈,而是针对这个视频的强烈需求欲望。第一要与视频紧密相关,第二要包含用户真正的好奇心、交流欲等。第三需求范围不要大而空,要具体详细真实,如“了解适合老年人的旅游景点和路线”是不好的需求提取与描述,要根据视频说明具体的景点及具体出行行为
  21. -由于用户观看行为与注意力,需求最好与视频初始部分或整体内容相关;
  22. -合理为需求打分,如判断需求不强烈,请打低分;一个视频可都为低分需求;打分考虑以下维度:问题与视频关联程度;问题精准度;问题可获得信息的丰富度;
  23. -需求详细query是将用户需求及视频背景信息总结为一段给AI模型的需求问题或指令;query格式为:我看了一段内容为“(视频50字简介)”的视频,我想了解“(具体需求)”
  24. -需求详细query描述时,不要用“它””他们””视频中的***”指代视频内容,描述清楚其名称及场景;视频信息完全由query内容传递。
  25. -总结11字内钩子话术,引导用户产生兴趣点击落地方案;产品落地形态应与产品钩子合理承接。
  26. 输出内容单引号换成双引号,每一个字段都要有值
  27. 输出内容格式:
  28. output in JSON format with keys:
  29. 需求排序序号(str)
  30. 需求强烈程度分值(str)
  31. 用户具体的需求描述(str)
  32. 需求详细query(str)
  33. 需求分类(str)
  34. 推测出该点需求的原因(str)
  35. 需求钩子话术(str)
  36. 落地方案类型(str)
  37. 落地方案形态描述(str)
  38. '''
  39. prompt1 = '''
  40. 请帮助我做以下分析:
  41. 我将提供给你视频,需要你模拟成中老年用户在视频消费平台观看这些视频。
  42. 需要你充分发挥想象力,推测出中老年用户在观看这些视频过程中,可能产生的具体的需求。
  43. 根据视频内容,分析用户是否会因为内容产生强烈的衍生需求,需求可能包含:了解获取更多相关信息、进行相关社交交流、获取相关商业服务等衍生需求
  44. 请根据视频内容,为用户观看视频时产生需求的强烈程度打分,1-10分,10分为非常强烈,1分为基本没有衍生需求。换言之,评估此视频是否适合为老年人提供衍生信息与服务
  45. 评判标准可从以下方面考虑:视频信息量,是否有较多信息量可引出相关信息需求;是否有特定事件、人物、现象等可能引起知识需求的内容;视频是否与商业化服务较直接相关等
  46. 综合用户需求为视频整体打一个需求强烈程度分值,打分区分度要大
  47. 我们会根据打分对视频需求排序,请客观评价;直接输出JSON结果,不要有其他内容;
  48. 输出内容单引号换成双引号,每一个字段都要有值;只输出一个结果
  49. 输出内容格式:
  50. output in JSON format with keys:
  51. 需求强烈程度(str)
  52. 理由(str)
  53. 示例:
  54. {
  55. "需求强烈程度":4,
  56. "理由":"XXXX"
  57. }
  58. '''
  59. # CACHE_DIR = '/Users/z/Downloads/'
  60. # PROXY_ADDR = 'http://localhost:1081'
  61. # os.environ['http_proxy'] = PROXY_ADDR
  62. # os.environ['https_proxy'] = PROXY_ADDR
  63. class GoogleAI(object):
  64. @classmethod
  65. def download_video(cls, video_link: str) -> Optional[str]:
  66. file_path = os.path.join(CACHE_DIR, f'{str(uuid.uuid4())}.mp4')
  67. for _ in range(3):
  68. try:
  69. response = requests.get(url=video_link, timeout=60)
  70. if response.status_code == 200:
  71. with open(file_path, 'wb') as f:
  72. f.write(response.content)
  73. logger.info(f'[内容分析] 视频链接: {video_link}, 存储地址: {file_path}')
  74. return file_path
  75. except Exception:
  76. time.sleep(1)
  77. continue
  78. return
  79. @classmethod
  80. def run(cls, api_key, video_url):
  81. video_path = None
  82. try:
  83. genai.configure(api_key=api_key)
  84. video_path = cls.download_video(video_link=video_url)
  85. if not video_path:
  86. logger.error(f'[内容分析] 视频下载失败, 跳过任务')
  87. os.remove(video_path)
  88. logger.info(f"[内容分析] 文件已删除: {video_path}")
  89. return "[异常] 视频下载失败",""
  90. video = genai.upload_file(path=video_path, mime_type='video/mp4')
  91. while video.state.name == 'PROCESSING':
  92. time.sleep(1)
  93. video = genai.get_file(name=video.name)
  94. if video.state.name != 'ACTIVE':
  95. genai.delete_file(name=video.name)
  96. os.remove(video_path)
  97. return "[异常] 上传视频失败", ""
  98. model = genai.GenerativeModel(
  99. model_name='gemini-2.0-flash',
  100. generation_config=genai.GenerationConfig(response_mime_type='application/json'),
  101. safety_settings={
  102. HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: HarmBlockThreshold.BLOCK_NONE,
  103. },
  104. )
  105. # mark, prompt = Material.feishu_list()
  106. response = model.generate_content(
  107. contents=[
  108. video,
  109. f'{prompt}',
  110. ],
  111. stream=False,
  112. request_options={
  113. 'timeout': 600,
  114. },
  115. )
  116. text = orjson.loads(response.text.strip())
  117. response2 = model.generate_content(
  118. contents=[
  119. video,
  120. f'{prompt1}',
  121. ],
  122. stream=False,
  123. request_options={
  124. 'timeout': 600,
  125. },
  126. )
  127. text2 = orjson.loads(response2.text.strip())
  128. genai.delete_file(name=video.name)
  129. os.remove(video_path)
  130. return text,text2
  131. except Exception as e:
  132. logger.error(f"[内容分析] 处理异常,异常信息{e}")
  133. os.remove(video_path)
  134. return f"[异常] {e}",""
  135. if __name__ == '__main__':
  136. ai = GoogleAI()
  137. ai.run("AIzaSyA_dXKbcW8s0fFIoo89rtPRWU34pJry7mU",
  138. "http://rescdn.yishihui.com/jq_oss/video/2025012215472528213")