ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Claude 4.5 与 GPT-5 能力对比:用 Python 统一 API 通道跑通双模型评测

Claude 4.5 与 GPT-5 能力对比:用 Python 统一 API 通道跑通双模型评测 1. 为什么要在 Python 里同时跑 Claude 4.5 和 GPT-5如果你正在做 LLM 应用选型大概率会遇到一个很现实的问题单看官方 benchmark 表格Claude 4.5 和 GPT-5 的分数咬得很紧但真正落到自己的业务 prompt 上谁更稳、谁更啰嗦、谁在长上下文里更容易丢信息只有跑一遍才知道。我最近在做一个合同条款抽取的小工具同一批 200 条样本分别喂给两个模型结论和榜单差距不小这也让我更坚定了一件事——评测必须自己动手。麻烦点在于两家模型的 SDK、鉴权方式、返回结构都不一样。Claude 走的是messages.create返回content数组GPT-5 走chat.completions.create返回choices[0].message.content。如果每换一个模型就改一遍调用代码评测脚本会越写越乱后面想加第三个模型更是灾难。所以这篇的做法是用 TaoToken 作为统一 API 通道把 Claude 4.5 和 GPT-5 收敛到同一套 OpenAI 兼容接口上Python 侧只维护一份调用函数靠model参数切换。这样对比评测的变量就只剩模型本身而不是 SDK 差异。适合正在做模型选型、想快速搭一套可复现评测流程的开发者也适合已经有一堆 prompt 想批量对照跑一遍的人。下面会给出可复制的config.toml骨架、Python 调用示例、验证动作以及我踩过的几个坑。2. TaoToken 前置准备拿 Key 与确认通道统一通道的核心价值是「一个 base_url 一个 key调多个模型」。TaoToken 的 API 入口是https://taotoken.net/api兼容 OpenAI 的请求格式所以 Python 里可以直接用openai这个库不需要为 Claude 单独装 Anthropic SDK。第一步是拿 Key。打开控制台页面登录后在 API Keys 区域创建一个新 key复制出来先存到环境变量里别硬编码进脚本。控制台地址在这里https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentclaude45_gpt5_python_eval创建 key 的直达页https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentclaude45_gpt5_python_eval拿到 key 之后先确认你要用的两个模型名。不同通道对模型标识的写法可能略有差异建议在模型对话页面先手动发一条消息确认claude-4.5和gpt-5这类标识能正常返回再去写脚本。模型对话入口https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentclaude45_gpt5_python_eval如果你后面打算把评测脚本接进 CI 或者长期跑批量任务可以顺带看下 Coding Plan它在高频调用场景下更省心https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentclaude45_gpt5_python_eval环境变量这样设Linux/macOS 用 exportWindows 用 setexport TAOTOKEN_API_KEYsk-你的key export TAOTOKEN_BASE_URLhttps://taotoken.net/api3. 可复制配置config.toml 骨架与 Python 调用3.1 config.toml 配置骨架把模型名、温度、max_tokens 这些评测变量抽到配置文件里改参数不用动代码。下面这份可以直接复制# config.toml [api] base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY timeout 120 max_retries 3 [models.claude] name claude-4.5 temperature 0.0 max_tokens 2048 [models.gpt5] name gpt-5 temperature 0.0 max_tokens 2048 [eval] tasks_file tasks.jsonl output_file results.jsonl repeat 1这里temperature 0.0是为了让对比尽量可复现评测场景下不建议开高温度否则同一 prompt 两次结果差异会干扰判断。max_retries是给网络抖动留的余量批量跑的时候很有用。3.2 Python 统一调用封装核心思路只用一个openai客户端通过model参数切换。这样 Claude 4.5 和 GPT-5 走的是同一条代码路径。# eval_runner.py import os import json import time import tomllib from openai import OpenAI def load_config(pathconfig.toml): with open(path, rb) as f: return tomllib.load(f) def build_client(cfg): api_key os.environ.get(cfg[api][api_key_env]) if not api_key: raise RuntimeError(未找到 API Key请检查环境变量) return OpenAI( api_keyapi_key, base_urlcfg[api][base_url], timeoutcfg[api][timeout], max_retriescfg[api][max_retries], ) def call_model(client, model_cfg, prompt): start time.time() resp client.chat.completions.create( modelmodel_cfg[name], temperaturemodel_cfg[temperature], max_tokensmodel_cfg[max_tokens], messages[{role: user, content: prompt}], ) latency time.time() - start return { text: resp.choices[0].message.content, latency: round(latency, 3), usage: resp.usage.model_dump() if resp.usage else {}, } def run_eval(): cfg load_config() client build_client(cfg) tasks [json.loads(line) for line in open(cfg[eval][tasks_file], encodingutf-8)] with open(cfg[eval][output_file], w, encodingutf-8) as out: for task in tasks: for key in (claude, gpt5): model_cfg cfg[models][key] try: result call_model(client, model_cfg, task[prompt]) record { task_id: task[id], model: model_cfg[name], output: result[text], latency: result[latency], usage: result[usage], } except Exception as e: record { task_id: task[id], model: model_cfg[name], error: str(e), } out.write(json.dumps(record, ensure_asciiFalse) \n) print(f[{task[id]}] {model_cfg[name]} done) if __name__ __main__: run_eval()tasks.jsonl每行一个任务格式如下方便你把自己的 prompt 批量塞进去{id: math_001, prompt: 证明对所有正整数 n≥3n^n n! * 2^n给出每步依据。} {id: summary_001, prompt: 对以下合同做结构化摘要列出甲方权利、乙方义务、违约责任正文}3.3 对比评测的 prompt 设计要点同一批任务要保证两个模型收到完全一致的输入否则对比没意义。我在tasks.jsonl里把 prompt 写死脚本里不做任何模型相关的分支处理。另外建议给每个任务加一个category字段比如math、summary、code跑完统计时能按类别看差异比只看总分有用得多。4. 验证请求跑通一次双模型调用先别急着批量跑用一条最小请求确认通道是通的。下面这段可以直接在 Python 交互环境里执行import os from openai import OpenAI client OpenAI( api_keyos.environ[TAOTOKEN_API_KEY], base_urlhttps://taotoken.net/api, ) prompt 用一句话解释什么是注意力机制。 for model in [claude-4.5, gpt-5]: resp client.chat.completions.create( modelmodel, messages[{role: user, content: prompt}], temperature0, max_tokens256, ) print(f {model} ) print(resp.choices[0].message.content) print(tokens:, resp.usage.total_tokens if resp.usage else N/A)成功的话你会看到两段风格不同的回答并且各自带 token 用量。如果这里就报错先看第 5 节的排查表别往下走。确认单条通了之后再跑批量脚本python eval_runner.py跑完results.jsonl里每行是一条记录包含模型名、输出、延迟和 token 用量。我实测下来同一批 20 条任务Claude 4.5 在结构化输出上更规整GPT-5 在开放推理题上给的思路更发散延迟两者接近但长文本任务里 GPT-5 的 token 消耗会明显高一些。这些差异只有自己跑一遍才有体感。5. 本篇常见错排查报错/现象可能原因处理方式AuthenticationError401key 没设进环境变量或复制时带了空格重新echo $TAOTOKEN_API_KEY确认key 前后不要有空白NotFoundError404 model模型标识写错比如把claude-4.5写成claude-4-5去模型对话页面确认实际可用标识RateLimitError429批量跑太快触发限流在循环里加time.sleep(1)或降低并发返回内容为空max_tokens设太小被截断调到 1024 以上再试超时APITimeoutError长文本任务耗时超过默认超时把timeout提到 180 或 300中文乱码写文件没指定encodingutf-8所有open都加encodingutf-8两个模型结果串了循环里变量复用没重置每次调用独立构造messages别复用可变对象还有一个容易忽略的点temperature0并不保证完全确定性尤其在长输出里仍可能有细微差异。如果你要做严格的 A/B 对比建议每个任务重复跑 3 次取多数config.toml里的repeat字段就是留给这个的。6. 把评测流程固定下来跑通之后建议把config.toml、tasks.jsonl、eval_runner.py三个文件放进同一个 git 仓库每次换模型或改 prompt 都留一次 commit。这样过两周回头看能清楚知道结论是在什么配置下得出的而不是凭记忆。接入相关的细节和参数说明可以对照接入文档再核一遍https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentclaude45_gpt5_python_eval如果你更习惯在图形界面里先手动对比几轮再写脚本模型对话页面可以直接切换模型发同一段 prompt适合快速找感觉https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentclaude45_gpt5_python_eval长期要跑批量评测或者把模型接进编码 AgentCoding Plan 会比按次调用更合适https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentclaude45_gpt5_python_eval最后补一句实操经验评测脚本里最值得加的不是花哨的评分逻辑而是把每次请求的原始输出、延迟、token 用量都落盘。我一开始只存了模型回答后来想回头分析「是不是长 prompt 导致延迟飙升」时发现数据不够只能重跑一遍。落盘这件事越早做越省事。
返回列表