google_ai_studio.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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. -每项需求请分类。需求类型:比如获取服务类、获取信息类、交流互动类、内容分享类等,类型字数请控制在10个字以内。
  18. -针对这些需求,平台有两部分功能:钩子及落地方案,钩子指在视频需求产生时,平台会有相关提示,提示用户进入落地方案;落地方案指针对用户需求,平台提供的相关信息、服务能力,解决用户的需求
  19. -针对这些需求,平台有几类解决方案,1. AI对话机器人;可提供信息与基础生活服务,回答用户问题;2. 内容推荐;推荐平台内相关短视频;3.外部跳转;跳转至H5或小程序页面,如商品页、应用页等各类页面;4. 二维码;可加入社群、关注公众号、小助手等;5.引导分享;视频如引起用户强烈分享欲,引导用户分享;不限于此5种,可提出更多解决方案及落地页方式
  20. -需求是用户在观看过程中有欲望产生除观看外的动作,需求不要泛泛而谈,而是针对这个视频的强烈需求欲望。第一要与视频紧密相关,第二要包含用户真正的好奇心、交流欲等。第三需求范围不要大而空,要具体详细真实,如“了解适合老年人的旅游景点和路线”是不好的需求提取与描述,要根据视频说明具体的景点及具体出行行为
  21. -需求描述清晰简洁,30字以内
  22. -由于用户观看行为与注意力,需求最好与视频初始部分或整体内容相关;
  23. -客观合理为需求打分,如判断需求不强烈,请打低分;一个视频可都为低分需求
  24. -需求
  25. -需求详细query是将用户需求及视频背景信息总结为一段给AI模型的需求问题或指令;AI模型没有视频上下文信息,仅根据你的描述进行回答,请总结,不要有指代;落地方案非AI对话机器人,可为空
  26. -总结10字内钩子话术,引导用户产生兴趣点击落地方案;产品落地形态应与产品钩子合理承接。如,点击“搜索更多养老院视频”按键后,自动搜索“养老院”相关内容且页面跳转落地至搜索结果页,展示养老院视频列表供用户挑选;
  27. 输出内容单引号换成双引号,每一个字段都要有值
  28. 输出内容格式:
  29. output in JSON format with keys:
  30. 需求排序序号(str)
  31. 需求强烈程度分值(str)
  32. 用户具体的需求描述(str)
  33. 需求详细query(str)
  34. 需求分类(str)
  35. 推测出该点需求的原因(str)
  36. 需求钩子话术(str)
  37. 落地方案类型(str)
  38. 落地方案形态描述(str)
  39. '''
  40. # CACHE_DIR = '/Users/z/Downloads/'
  41. # PROXY_ADDR = 'http://localhost:1081'
  42. # os.environ['http_proxy'] = PROXY_ADDR
  43. # os.environ['https_proxy'] = PROXY_ADDR
  44. class GoogleAI(object):
  45. @classmethod
  46. def download_video(cls, video_link: str) -> Optional[str]:
  47. file_path = os.path.join(CACHE_DIR, f'{str(uuid.uuid4())}.mp4')
  48. for _ in range(3):
  49. try:
  50. response = requests.get(url=video_link, timeout=60)
  51. if response.status_code == 200:
  52. with open(file_path, 'wb') as f:
  53. f.write(response.content)
  54. logger.info(f'[内容分析] 视频链接: {video_link}, 存储地址: {file_path}')
  55. return file_path
  56. except Exception:
  57. time.sleep(1)
  58. continue
  59. return
  60. @classmethod
  61. def run(cls, api_key, video_url):
  62. video_path = None
  63. try:
  64. genai.configure(api_key=api_key)
  65. video_path = cls.download_video(video_link=video_url)
  66. if not video_path:
  67. logger.error(f'[内容分析] 视频下载失败, 跳过任务')
  68. os.remove(video_path)
  69. logger.info(f"[内容分析] 文件已删除: {video_path}")
  70. return "[异常] 视频下载失败"
  71. video = genai.upload_file(path=video_path, mime_type='video/mp4')
  72. while video.state.name == 'PROCESSING':
  73. time.sleep(1)
  74. video = genai.get_file(name=video.name)
  75. if video.state.name != 'ACTIVE':
  76. genai.delete_file(name=video.name)
  77. os.remove(video_path)
  78. return "[异常] 上传视频失败"
  79. model = genai.GenerativeModel(
  80. model_name='gemini-1.5-flash',
  81. generation_config=genai.GenerationConfig(response_mime_type='application/json'),
  82. safety_settings={
  83. HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: HarmBlockThreshold.BLOCK_NONE,
  84. },
  85. )
  86. # mark, prompt = Material.feishu_list()
  87. response = model.generate_content(
  88. contents=[
  89. video,
  90. f'{prompt}',
  91. ],
  92. stream=False,
  93. request_options={
  94. 'timeout': 600,
  95. },
  96. )
  97. text = orjson.loads(response.text.strip())
  98. genai.delete_file(name=video.name)
  99. os.remove(video_path)
  100. return text
  101. except Exception as e:
  102. logger.error(f"[内容分析] 处理异常,异常信息{e}")
  103. os.remove(video_path)
  104. return f"[异常] {e}"
  105. if __name__ == '__main__':
  106. ai = GoogleAI()
  107. ai.run("AIzaSyA_dXKbcW8s0fFIoo89rtPRWU34pJry7mU",
  108. "http://rescdn.yishihui.com/jq_oss/video/2025012215472528213")