ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

GPT-5、Gemini 3 Pro谁更懂风控?首个信贷多模态评测基准FCMBench出炉

GPT-5、Gemini 3 Pro谁更懂风控?首个信贷多模态评测基准FCMBench出炉 1. 信贷风控多模态评测为什么难落地FCMBench 是奇富科技 AI 技术中心联合复旦大学、华南理工大学开源的一个信贷多模态评测基准全称 Financial Credit Multimodal Benchmark。它想解决的问题很具体通用多模态榜单刷得再高一到信贷审核场景就露怯。原因不复杂真实信贷数据涉及隐私不能公开脱敏合成数据又丢了物理噪声评测结果和实战表现对不上。FCMBench 的做法是造一个保留真实物理分布的实验环境。团队预设了 21 个虚拟人物画像覆盖性别、年龄、婚姻、资产、学历等维度再生成对应的全套证件材料包括身份证、房产证、银行流水、征信报告、营业执照等 18 类。关键一步是物理化所有电子证件被实体打印出来由 11 人团队用 5 种主流移动终端在真实环境光下重拍最终得到 4043 张带反光、折痕、透视畸变的真实场景样本。评测任务分三层。感知层有 DTR 文档类型识别和 KIE 关键信息提取KIE 用 Strict JSON 约束输出指标是 Set-based F1身份证号错一位直接零分。推理层有 CC 跨文档一致性校验和 RR 合理性审查比如结合纳税证明判断声称的年收入是否合理。鲁棒性层引入 10 种采集伪影包括反光、折痕、摩尔纹、多图同框、裁剪、大角度倾斜等。这套基准的价值在于它是一把有区分度的尺子。参测模型 F1 分数呈正态分布均值约 45.9%最高约 65%没有天花板效应也没有地板效应。雷达图暴露了两个短板内因上DTR 几乎顶到天花板但 RR 和 KIE 明显塌陷说明分类易、推理难外因上模型对几何信息缺失极度敏感多文档同框、图像裁剪、大角度倾斜是性能崩盘的三大杀手。你要复现这套评测核心工作是把 FCMBench 的样例数据跑通用统一通道接入 GPT-5 和 Gemini 3 Pro对比它们在信贷风控场景下的多模态理解差异。下面我从环境搭建开始一步步给你可复制的配置和脚本。2. TaoToken 统一通道接入 GPT-5 与 Gemini 3 ProFCMBench 的评测脚本本身不绑定特定模型供应商它只要求你提供一个兼容 OpenAI Chat Completions 格式的接口。这意味着你可以用同一个 Key 和 Base URL 接入多个模型省去为每个模型单独配 SDK 的麻烦。TaoToken 就是干这个的一个 API 通道同时支持 GPT-5、Gemini 3 Pro 等模型接口格式统一。先拿 Key。访问 https://taotoken.net/api-keys 注册后在控制台创建 API Key。这个 Key 同时用于 GPT-5 和 Gemini 3 Pro 的调用不需要分别申请。拿到 Key 后Base URL 统一用 https://taotoken.net/api 注意不要加 UTM 参数API 地址就是纯路径。模型 ID 需要确认一下。GPT-5 的模型 ID 通常是gpt-5Gemini 3 Pro 的模型 ID 通常是gemini-3-pro具体以控制台模型列表为准。你可以在 https://taotoken.net/models 查看当前可用的模型标识符。如果模型 ID 写错调用会返回 404 或 model not found这是最常见的低级错误。环境变量配置建议写进.env文件避免硬编码# .env TAOTOKEN_API_KEYsk-你的实际Key TAOTOKEN_BASE_URLhttps://taotoken.net/api GPT5_MODELgpt-5 GEMINI3_MODELgemini-3-proPython 侧用openai库即可因为 TaoToken 兼容 OpenAI 接口协议。安装依赖pip install openai python-dotenv pillow如果你要跑 FCMBench 的完整评测还需要克隆仓库并安装它自己的依赖git clone https://github.com/QFIN-tech/FCMBench.git cd FCMBench pip install -r requirements.txt数据集从 ModelScope 或 HuggingFace 下载。ModelScope 地址是 https://modelscope.cn/datasets/QFIN/FCMBench-V1.0 HuggingFace 地址是 https://huggingface.co/datasets/QFIN/FCMBench-V1.0 。下载后解压到data/目录目录结构保持仓库默认约定。这里有个坑要注意FCMBench 的评测脚本可能默认走本地模型或特定供应商的 SDK你需要找到它调用模型的那一层把 base_url 和 api_key 替换成 TaoToken 的配置。通常是在configs/或models/目录下有个api_client.py之类的文件里面会有OpenAI(base_url..., api_key...)的初始化代码。把这两个参数改成从环境变量读取即可。如果你只是想快速验证两个模型在信贷场景下的差异不必跑完整 4043 张样本。FCMBench 仓库里通常有sample/或demo/目录包含少量标注好的样例足够你做对比实验。完整评测跑下来 token 消耗不小建议先用样例调通流程。3. 可复制的评测配置与调用脚本这一节给你完整的配置文件和调用脚本直接复制就能跑。先写一个统一的客户端封装把 GPT-5 和 Gemini 3 Pro 的调用抽象成同一个函数# fcm_client.py import os import base64 import json from openai import OpenAI from dotenv import load_dotenv load_dotenv() client OpenAI( base_urlos.getenv(TAOTOKEN_BASE_URL, https://taotoken.net/api), api_keyos.getenv(TAOTOKEN_API_KEY) ) def encode_image(image_path): with open(image_path, rb) as f: return base64.b64encode(f.read()).decode(utf-8) def call_model(model_id, image_path, prompt, max_tokens2048): b64 encode_image(image_path) resp client.chat.completions.create( modelmodel_id, messages[ { role: user, content: [ {type: text, text: prompt}, { type: image_url, image_url: { url: fdata:image/jpeg;base64,{b64} } } ] } ], max_tokensmax_tokens, temperature0 ) return resp.choices[0].message.contentKIE 任务要求 Strict JSON 输出prompt 里必须明确字段名和格式。以身份证信息提取为例KIE_PROMPT 你是一个信贷审核信息提取系统。请从图片中提取以下字段以严格 JSON 格式输出不要添加任何解释文字 { name: 姓名, id_number: 身份证号, address: 住址, issue_date: 签发日期 } 如果某个字段无法识别值设为 null。跑对比实验的脚本# run_compare.py import json from fcm_client import call_model MODELS { GPT-5: gpt-5, Gemini-3-Pro: gemini-3-pro } SAMPLE_IMAGE data/sample/id_card_01.jpg results {} for name, model_id in MODELS.items(): raw call_model(model_id, SAMPLE_IMAGE, KIE_PROMPT) try: parsed json.loads(raw) results[name] {raw: raw, parsed: parsed, valid_json: True} except json.JSONDecodeError: results[name] {raw: raw, parsed: None, valid_json: False} with open(compare_result.json, w, encodingutf-8) as f: json.dump(results, f, ensure_asciiFalse, indent2) print(json.dumps(results, ensure_asciiFalse, indent2))如果你用 Cline 或 Claude Code 这类工具做批量评测配置方式类似。Cline 的 MCP 配置里需要写全三件套Base URL、API Key、Model ID。以 Cline 的settings.json为例{ llmProviders: { openai-compatible: { baseUrl: https://taotoken.net/api, apiKey: sk-你的实际Key, modelId: gpt-5 } } }Codex 的auth.json配置{ base_url: https://taotoken.net/api, api_key: sk-你的实际Key, model: gpt-5 }注意auth.json里字段名可能是base_url或baseUrl取决于 Codex 版本以实际报错为准调整。如果报local proxy failed通常是 Base URL 写成了带路径的完整地址但少了/v1或者多了尾部斜杠。TaoToken 的 API 地址是https://taotoken.net/api不要写成https://taotoken.net/api/v1除非文档明确要求。跑批量评测时建议加一个重试机制。多模态请求偶尔会因为图片过大或网络抖动失败import time def call_with_retry(model_id, image_path, prompt, retries3): for i in range(retries): try: return call_model(model_id, image_path, prompt) except Exception as e: if i retries - 1: raise time.sleep(2 ** i)4. 验证请求与结果校验配置写好后先跑一个最小验证确认通道通、模型能返回。用一张简单的证件样例图调 GPT-5python -c from fcm_client import call_model result call_model(gpt-5, data/sample/id_card_01.jpg, 描述这张图片的内容) print(result) 如果返回一段正常的图片描述说明 Base URL、Key、模型 ID 三件套都对了。如果报 401检查 Key 是否复制完整有没有多余空格。如果报 model not found检查模型 ID 是否和控制台一致。接下来跑 KIE 任务对比两个模型的 JSON 输出质量。FCMBench 的 KIE 指标是 Set-based F1核心逻辑是把嵌套 JSON 递归扁平化成键值对集合然后算精确匹配。你可以自己写一个简化版的校验脚本def flatten_json(obj, prefix): items {} if isinstance(obj, dict): for k, v in obj.items(): new_key f{prefix}.{k} if prefix else k items.update(flatten_json(v, new_key)) elif isinstance(obj, list): for i, v in enumerate(obj): items.update(flatten_json(v, f{prefix}[{i}])) else: items[prefix] obj return items def compute_f1(pred, gold): pred_flat flatten_json(pred) gold_flat flatten_json(gold) pred_set set(pred_flat.items()) gold_set set(gold_flat.items()) tp len(pred_set gold_set) precision tp / len(pred_set) if pred_set else 0 recall tp / len(gold_set) if gold_set else 0 f1 2 * precision * recall / (precision recall) if (precision recall) else 0 return {precision: precision, recall: recall, f1: f1}拿标注好的 gold JSON 和模型输出对比gold { name: 张三, id_number: 110101199001011234, address: 北京市东城区某街道, issue_date: 2020-01-01 } pred_gpt5 json.loads(results[GPT-5][raw]) pred_gemini json.loads(results[Gemini-3-Pro][raw]) print(GPT-5 F1:, compute_f1(pred_gpt5, gold)) print(Gemini-3-Pro F1:, compute_f1(pred_gemini, gold))实测下来两个模型在清晰证件上的 KIE 表现接近但一旦加入反光或折痕差异就出来了。你可以从 FCMBench 的鲁棒性样本里挑几张带伪影的图分别跑两个模型观察 JSON 字段的缺失和错位情况。常见现象是GPT-5 在折痕遮挡身份证号时倾向于输出 nullGemini 3 Pro 有时会“猜”一个数字导致精确匹配失败。这正是 FCMBench 强调的“错一位即零分”机制要暴露的问题。RR 合理性审查任务更能拉开差距。构造一个 prompt让模型判断收入与纳税是否匹配RR_PROMPT 你是一个信贷审核员。请根据提供的银行流水和纳税证明图片判断借款人声称的年收入是否合理。 输出 JSON { reasonable: true/false, reason: 判断理由 }这个任务需要模型同时理解两张图并进行数值推理。你可以用 FCMBench 里标注好的 RR 样例跑一轮统计两个模型的准确率。从论文数据看RR 是当前 SOTA 模型的深水区F1 普遍偏低所以两个模型都可能出错重点看谁的理由更接近人类审核员的逻辑。5. 常见报错排查跑评测过程中最容易撞上的几类报错我按现象、原因、解法列一下。401 Unauthorized。现象是请求直接被拒返回{error: {message: Invalid API key}}。原因通常是 Key 没读到环境变量或者.env文件没被load_dotenv()正确加载。检查方法在脚本里 print 一下os.getenv(TAOTOKEN_API_KEY)的前几位确认不是 None。另一个可能是 Key 被复制时带了换行或空格strip 一下。local proxy failed。这个报错通常出现在你用 Cline 或 Codex 这类工具时工具尝试走本地代理但配置不对。检查settings.json或auth.json里的 Base URL 是否写成了https://taotoken.net/api不要加/v1也不要在末尾加斜杠。如果工具默认走http://localhost:xxxx代理需要在设置里关掉代理选项或者把代理地址指向 TaoToken 的 API 地址。reading choices 报错。现象是KeyError: choices或IndexError: list index out of range。原因是返回体结构不符合预期可能是模型 ID 写错导致返回了错误信息而不是正常 completion。打印完整resp看看实际返回了什么。另一个可能是max_tokens设得太小模型还没输出完就被截断导致choices[0].message.content为空。OAuth 相关报错。如果你用 Claude Code 接入可能会遇到 OAuth token 过期或 scope 不足的问题。Claude Code 的配置里需要同时填 Base URL、API Key、Model ID 三件套。如果只填了 Key 没填 Base URL它会默认走 Anthropic 官方端点导致认证失败。检查~/.claude/settings.json或项目级配置确认baseUrl指向https://taotoken.net/api。JSON 解析失败。KIE 任务里模型返回的 JSON 带了 markdown 代码块标记比如json ...直接json.loads会报错。解法是在解析前先 strip 掉代码块标记def clean_json(raw): raw raw.strip() if raw.startswith(): raw raw.split(\n, 1)[1] raw raw.rsplit(, 1)[0] return raw.strip()图片 base64 过大导致请求超时。FCMBench 的样本是物理重拍的分辨率可能很高。如果单张图超过 4MBbase64 编码后请求体可能超过服务端限制。解法是在编码前压缩图片from PIL import Image import io def encode_image_compressed(image_path, max_size1600): img Image.open(image_path) img.thumbnail((max_size, max_size)) buf io.BytesIO() img.convert(RGB).save(buf, formatJPEG, quality85) return base64.b64encode(buf.getvalue()).decode(utf-8)模型返回空内容。有时候resp.choices[0].message.content是空字符串但finish_reason是stop。这可能是模型对某些图片内容触发了安全过滤。换一张样例图试试或者在 prompt 里明确要求“请描述图片中的文字信息”。6. 用统一通道持续跑信贷多模态评测FCMBench 的复现不是一次性的跑分而是一个可以持续迭代的评测流程。你搭好这套环境后后续每有新模型发布只需要改一下模型 ID就能用同一套脚本跑对比。TaoToken 的价值在这里体现得很直接一个 Key 管多个模型Base URL 不变切换模型只改一个字符串。如果你要长期做信贷风控方向的模型评测建议把评测脚本做成 CLI 工具支持传入模型 ID 和数据集路径python evaluate.py --model gpt-5 --dataset data/fcmbench_v1 --task kie python evaluate.py --model gemini-3-pro --dataset data/fcmbench_v1 --task rr结果输出成 CSV方便横向对比。FCMBench 的 Set-based F1 计算逻辑已经在第 4 节给了你可以直接集成进去。对于 RR 任务准确率统计更简单就是correct / total。批量跑的时候注意 token 消耗。4043 张样本全跑一遍每张图加 prompt 大约 1000-2000 token两个模型加起来消耗不小。建议先用sample/目录的 50-100 张做快速对比确认脚本没问题再上全量。TaoToken 的控制台可以看用量跑之前先估算一下预算。如果你在评测过程中发现某个模型在特定伪影下表现异常比如多文档同框时 GPT-5 的 KIE F1 骤降可以把这些 case 单独拎出来做 error analysis。FCMBench 论文里的雷达图已经指出几何信息缺失是共同短板但具体到每个模型的失败模式可能不同。这种细粒度的对比才是这套基准真正能帮你产出的东西。最后提醒一点FCMBench 的数据集有使用协议跑评测没问题但不要把样本图片二次分发或用于商业训练。评测结果可以公开对比数据本身要遵守 ModelScope 和 HuggingFace 上的许可条款。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进