Skip to content

bfcl: 無法評測 irrelevance 類別 — 空 ground_truth 一律判 False,且「正確地不呼叫」到不了 scorer #138

Description

@lianghsun

現況

BFCL 官方有 irrelevance / live_irrelevance 類別:提供工具但正確行為是不要呼叫
用來量測模型會不會過度熱心地亂呼叫工具——這也是各模型在 BFCL 上分差最大的類別之一。

目前 twinkle-eval(v2.8.0,main 亦同)有兩層限制,使這個類別無法評測:

1. Scorer 對空 ground truth 一律判 False

if not predicted_calls or not ground_truth:

if not predicted_calls or not ground_truth:
    return False

irrelevance 題的 ground truth 是空的(正確答案=不呼叫),走到這裡永遠 False。

2. Extractor 把「沒有呼叫」變成 None,而不是空列表

bfcl_prompt extractor 在解析不到任何 function call 時回傳 None
bfcl_fc 模式下模型不回 tool_calls 時亦同。對 irrelevance 題而言,
「沒有可解析的呼叫」正是正確行為,但它在進 scorer 之前就被當成無法解析。

重現

from twinkle_eval.metrics.scorers.bfcl import BFCLScorer  # 名稱依實際 class
import json

scorer = BFCLScorer()
gold = json.dumps({"category": "irrelevance", "ground_truth": []})

# 模型正確地拒絕呼叫(無 tool call)→ 應為 True,實際 False
print(scorer.score("[]", gold))          # False
# 模型錯誤地硬呼叫 → 應為 False,實際也是 False
print(scorer.score(json.dumps([{"name": "get_weather", "arguments": {}}]), gold))  # False

兩種行為分不開,此類別的分數恆為 0。

建議語義(對齊 BFCL 官方 checker)

  • category 含 irrelevance 時(或 ground_truth 為空):
    正確 ⟺ 預測中沒有任何有效的 function call
    模型輸出拒絕說明、閒聊、或無法解析為呼叫的內容,都算正確。
  • extractor 端:解析不到呼叫時回傳 "[]"(空列表的 JSON),讓「沒有呼叫」
    成為可評分的預測,而非 unparsed;或由 scorer 在 irrelevance 類別下把
    None/unparsed 視為正確。

背景

我們正在為 OpenTWBench 建台灣在地的 tool-calling 評測集(tw-bfcl-bench),
irrelevance 是規劃中的類別(80/400 題)。目前打算先在執行端以 wrapper
monkey-patch 處理,但這個語義放進 twinkle-eval 本體對所有使用者都有價值。

願意發 PR,若維護者對介面走向(extractor 回空列表 vs scorer 特判)有偏好,
請告訴我。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    • Status
      Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions