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

使用Google Bard API遇429错误的技术问题咨询

问题解答

1. 出错时保存已获取的Bard响应列表

最可靠的方式是实时写入数据+异常触发时备份,避免因报错导致已获取的响应丢失。以下是Python实现示例:

import json
import time
import random
from bardapi import Bard

# 初始化Bard客户端和响应存储列表
bard = Bard(token="your_bard_token")
responses = []
input_sentences = ["语句1", "语句2", ...]  # 你的120条语句

for idx, sentence in enumerate(input_sentences):
    try:
        # 调用Bard API获取响应
        res = bard.get_answer(sentence)
        # 存储响应
        record = {"input": sentence, "response": res}
        responses.append(record)
        
        # 实时逐行写入JSONL文件(每行一条记录,便于后续解析)
        with open("bard_responses.jsonl", "a", encoding="utf-8") as f:
            json.dump(record, f, ensure_ascii=False)
            f.write("\n")
            
        # 正常请求后添加基础延迟
        time.sleep(random.uniform(3, 5))
        
    except Exception as e:
        print(f"处理第{idx+1}条语句失败: {str(e)}")
        # 出错时立即将已获取的完整列表备份到JSON文件
        with open("bard_responses_backup.json", "w", encoding="utf-8") as f:
            json.dump(responses, f, ensure_ascii=False, indent=2)
        # 根据需求选择:break终止循环,或continue继续处理后续语句
        break

这种方式的优势:

  • 实时写入避免中途崩溃导致全部数据丢失
  • 异常触发时的备份进一步保障已获取数据的安全性
  • JSONL格式支持逐行读取,后续可快速恢复未完成的任务

2. Google Bard的调用限制及高效拉取方案

调用限制说明

Google官方未公开Bard API的具体每秒/每小时调用限制,且非官方封装的Bard客户端(如bardapi)的限制会动态调整,取决于账号状态、请求频率、请求内容等因素。根据实际测试经验:

  • 单账号短时间内连续请求(无延迟)极易触发429限流
  • 保持3-5秒的请求间隔可稳定获取大部分数据

高效拉取方案

方案1:分块处理+指数退避

将120条语句分成若干小批量(如每组10条),组间设置更长间隔(如30秒),组内每条保持3-5秒间隔;遇到429时采用指数退避策略(延迟时间翻倍)重试,比固定延迟更灵活:

for idx, sentence in enumerate(input_sentences):
    retry_count = 0
    max_retries = 3
    success = False
    
    while retry_count < max_retries and not success:
        try:
            res = bard.get_answer(sentence)
            record = {"input": sentence, "response": res}
            responses.append(record)
            
            with open("bard_responses.jsonl", "a", encoding="utf-8") as f:
                json.dump(record, f, ensure_ascii=False)
                f.write("\n")
                
            time.sleep(random.uniform(3, 5))
            success = True
            
        except Exception as e:
            if "429" in str(e):
                retry_count += 1
                delay = 2 ** retry_count * random.uniform(1, 2)
                print(f"触发429限流,{round(delay, 2)}秒后重试第{retry_count}次")
                time.sleep(delay)
            else:
                print(f"处理失败: {str(e)}")
                with open("bard_responses_backup.json", "w", encoding="utf-8") as f:
                    json.dump(responses, f, ensure_ascii=False, indent=2)
                break

方案2:Celery异步调度(适合大规模任务)

如果需要处理更多数据,可使用Celery将请求拆分为异步任务,通过配置任务并发数和任务间隔避免限流:

  • 设置Celery worker的并发数为1(避免同时发起多个请求)
  • 给每个任务添加固定延迟(如3-5秒)
  • 同样结合实时写入和异常备份机制

不过对于仅120条语句的场景,分块+指数退避的方案已足够高效,无需引入Celery这类复杂工具。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:37:41