You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gemini 1.5 Flash API token消耗异常过高问题咨询

Gemini 1.5 Flash Token消耗远超预期的原因排查

问题背景

我仅使用Gemini 1.5 Flash API运行Python代码提取视频帧,识别帧中男女数量。自行估算:700次请求×400 Token/请求=280,000 Token,成本约0.084美元。但账单显示:

  • 输入Token超128k时总用量11,993,645,成本1.78美元
  • 输入Token≤128k时总用量10,987,345,成本0.82美元
    总Token消耗远超预期,询问是否是代码或计算存在错误。

运行代码

class VideoGenderAnalyzer:
        def __init__(self, api_key, video_path, interval=5, max_frames=100, debug_folder="debug_frames"):

            self.api_key = api_key
            self.video_path = video_path
            self.interval = interval
            self.max_frames = max_frames
            self.debug_folder = debug_folder

            # Configure the API
            genai.configure(api_key=self.api_key)

            # Ensure the debug folder exists
            os.makedirs(self.debug_folder, exist_ok=True)

            # Initialize counters
            self.male_time = 0
            self.female_time = 0

        def extract_frames(self):

            frames = []
            cap = cv2.VideoCapture(self.video_path)

            frame_count = 0
            while frame_count < self.max_frames:
                ret, frame = cap.read()
                if not ret:
                    break

                current_time = cap.get(cv2.CAP_PROP_POS_MSEC) / 1000
                frames.append({
                    'frame': frame,
                    'timestamp': current_time
                })

                # Skip ahead
                cap.set(cv2.CAP_PROP_POS_MSEC, (current_time + self.interval) * 1000)
                frame_count += 1

            cap.release()
            return frames

        def analyze_frame_gender(self, frame, index):

            try:
                # Removed the resizing step
                # frame_resized = cv2.resize(frame, (1024, 1024), interpolation=cv2.INTER_AREA)

                # Convert the image to base64
                _, buffer = cv2.imencode('.jpg', frame, [cv2.IMWRITE_JPEG_QUALITY, 95])
                image_base64 = base64.b64encode(buffer).decode('utf-8')

                # Save the first 5 frames for debugging
                if index < 5:
                    debug_path = os.path.join(self.debug_folder, f"frame_{index}.jpg")
                    cv2.imwrite(debug_path, frame, [cv2.IMWRITE_JPEG_QUALITY, 95])
                    print(f"Saved frame {index} to {debug_path}")

                # Gemini API requires 'mime_type' and 'data'
                input_data = {'mime_type': 'image/jpeg', 'data': image_base64}

                model = genai.GenerativeModel(model_name="gemini-1.5-flash")

                prompt = """In this image:
        - How many men are there? (just the number)
        - How many women are there? (just the number)
        - If no one is on the screen, write 0

        Provide the answer in this format:
        Men: X
        Women: Y"""

                # API call
                response = model.generate_content([input_data, prompt])

                # Print the raw response for debugging
                print(f"Response for frame {index}: {response.text}")
                # Token bilgilerini yazdır
                print(f"Frame {index} Token Bilgileri:")
                print(f"  Input Tokens: {response.usage_metadata.prompt_token_count}")
                print(f"  Output Tokens: {response.usage_metadata.candidates_token_count}")
                print(f"  Toplam Tokens: {response.usage_metadata.total_token_count}")
                return response.text
            except Exception as e:
                print(f"Frame analysis error (frame {index}): {e}")
                return "Men: 0\nWomen: 0"

问题原因分析

  1. 图像Token预估严重错误
    你假设单请求400 Token完全不符合Gemini的图像Token计算规则:Gemini将图像转换为Token时,会根据图像分辨率、色彩信息、压缩率等计算,而非固定值。你代码中移除了帧缩放步骤,原尺寸视频帧(比如1920×1080)对应的Token可能高达数千甚至上万,700次请求的总Token自然会突破千万级,和账单数据匹配。

  2. 代码存在冗余操作
    每次调用analyze_frame_gender时都重新实例化genai.GenerativeModel,虽然这不会直接增加Token消耗,但会产生不必要的初始化开销,建议在__init__中提前创建模型实例复用。

  3. 账单计费规则误解
    账单中区分输入Token是否超过128k是因为Gemini对大输入有不同费率,但核心问题还是单帧图像的Token消耗远高于你的预估,而非计费规则本身导致总消耗飙升。

解决建议

  • 恢复帧缩放:将帧缩至较小尺寸(如512×512),大幅降低图像对应的Token数量,这是减少消耗最有效的方式。
  • 复用模型实例:在__init__方法中初始化self.model = genai.GenerativeModel(model_name="gemini-1.5-flash"),后续调用直接使用self.model。
  • 查看真实单帧Token:你代码中已打印prompt_token_count,可以查看前几帧的实际输入Token,以此重新估算总消耗,验证是否和账单一致。

内容的提问来源于stack exchange,提问作者Pancarsuyu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 20:24:53