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"
问题原因分析
图像Token预估严重错误
你假设单请求400 Token完全不符合Gemini的图像Token计算规则:Gemini将图像转换为Token时,会根据图像分辨率、色彩信息、压缩率等计算,而非固定值。你代码中移除了帧缩放步骤,原尺寸视频帧(比如1920×1080)对应的Token可能高达数千甚至上万,700次请求的总Token自然会突破千万级,和账单数据匹配。代码存在冗余操作
每次调用analyze_frame_gender时都重新实例化genai.GenerativeModel,虽然这不会直接增加Token消耗,但会产生不必要的初始化开销,建议在__init__中提前创建模型实例复用。账单计费规则误解
账单中区分输入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
相关产品推荐
相关产品推荐

