首先明确一个核心原则:要快速掌握 Gemini 各版本的真实性能表现——特别是原生推理能力和响应延迟——最有效的方法,是使用一套标准化的零样本测试题直接评估模型,而不是依赖官方宣传参数。关键在于完全避开微调、提示工程等人工干预,直击模型的最原始状态。
具体实施步骤如下。

准备标准化零样本测试集
首先,选择合适的测试集。从官方渠道下载 GPQA-Diamond 子集(v2.1 版本)和 MMLU-Pro,分别随机抽取 50 道题目。将两组题目保存为 gpqa_test.jsonl 和 mmlu_test.jsonl,每行一个完整的 JSON 对象,包含 question、choices 和 answer 字段。注意,不要合并成单个文件——Gemini 各版本对 batch size 非常敏感,混合文件会导致 token 计数失真,后续分析结果不可靠。
接下来,使用 Python 脚本进行预处理。将所有选项统一格式:选项字母转换为大写,后面紧跟英文句点(例如 "A.")。同时确保问题末尾没有多余换行或空格。这一步看似繁琐,但至关重要。Gemini 3.0 及以上版本对输入格式歧义特别敏感,格式不标准会触发额外重试逻辑,导致 P95 延迟虚高 300 毫秒以上。
最后,将这两个文件放入 ./testsets/ 目录,并设置权限为只读。为什么?任何写入操作都会污染缓存命中率,影响延迟基线的稳定性。
构造严格零样本提示模板
提示模板的设计是关键,但原则只有一个:极简。绝对不要出现类似“请从以下选项中选择正确答案”的引导语——一旦出现,Gemini 3.5 Flash 会自作主张启用隐式 tool-calling,自动补全 JSON Schema,导致输出结构完全失控,token 数也会溢出。
正确做法使用最干净的模板:
“问题:【{question}】
选项:【{A. choice_a}】【{B. choice_b}】【{C. choice_c}】【{D. choice_d}】
仅输出单个大写字母,不要解释。”
这里有一个必须严格遵守的细节:所有占位符用中文全角括号包裹,且字母后面必须紧跟英文句点。实测数据表明,若使用半角括号或省略句点,Gemini 3.1 Pro 的首 token 延迟波动会扩大 2.3 倍。
执行原子化 API 调用并采集原始指标
此步骤的关键是“原子化”——每次只问一个问题,逐个进行,不并发。
第一步:初始化客户端,关闭所有缓存。
genai.configure(api_key=os.getenv("GEMINI_KEY"))
model = genai.GenerativeModel("gemini-3.5-flash", generation_config={"temperature": 0, "max_output_tokens": 1})
第二步:逐题发起独立请求,禁用流式响应。
对 gpqa_test.jsonl 中每一行数据,构建 contents=[{"text": prompt}],然后调用 model.generate_content(contents)。这里切勿使用 generate_content_async——异步并发会触发 Google Cloud 内部的动态批处理,掩盖单次请求的真实延迟。
第三步:强制提取原始耗时和 token 数。
从 response.usage_metadata 中读取 total_token_count 和 prompt_token_count。更关键的延迟数据,从 response._response.request_metadata.get("latency_ms") 提取毫秒级耗时。不要自行用 time.time() 手动计时,因为 SDK 内部有网络握手和重试开销,手动测量会混入非模型环节的时间。
【必须关闭 Google Cloud Trace 的自动采样功能,否则会增加 17 到 23 毫秒的埋点开销,影响延迟数据的纯净度。】
解析响应并校验有效性
拿到响应后,如何判断模型是否答对?这里有两种常用方法。
方法一:正则硬匹配。
使用 re.search(r'^[A-D].?$', response.text.strip()) 提取答案。规则简单:只接受以单个大写字母开头、后跟可选句点结尾的字符串。Gemini 3.0 Pro 在零样本下偶尔会输出“Answer: B”这样的格式,这属于无效响应,必须计入 error_rate。
方法二:长度截断容错。
如果响应长度超过 3 个字符,直接截取首字符并转大写,然后比对。该方法能覆盖 Gemini 3.5 Flash 输出“B.”或“(B)”的情况。但需注意,这种方法对 GPQA 这类需要多步推理的题目不太适用——可能会把逻辑链已断裂、只是碰巧输出正确字母的错误答案误判为有效。
在统计时,只有 response.text.strip() 非空且正则匹配成功的响应,才能参与 accuracy 计算。空响应或 HTTP 429 错误的全部计入 failure_count,且不参与延迟均值的统计。
生成可验证的基线报告
完成全部 100 道题后,整理结果。使用 Pandas 汇总生成 CSV 文件,推荐列名如下:
model_name, dataset, question_id, prompt_tokens, candidates_tokens, latency_ms, is_correct, is_valid, error_type
其中 error_type 字段很重要,需填入具体错误原因,例如“empty_response”、“format_mismatch”或“http_429”。切勿合并成一个大类——不同错误类型反映截然不同的底层问题:模型崩溃、解码器失准、配额超限,需分开分析。
最后,使用 scipy.stats.bootstrap 对 latency_ms 列进行 1000 次重采样,输出 P50 和 P95 的置信区间。这一步是必须的,因为 Gemini 各版本在连续请求中会出现显著 tail latency 波动,仅给出单次均值没有比较价值。
