0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claudeのバッチ結果、IDで結んで誤対応2→0

0
Posted at

2件送って2件返れば、上から並べて結べそうに見える。ClaudeのMessage Batchesでは、この集計が静かに壊れる。自分は結果を保存する段階で、送信時に付けたcustom_idと元データを結ぶ形にしたい。

今日は手元で、結果をわざと逆順にした。件数チェックは通るのに、別の文書の要約が付く。例外も出ないんだよね。

Claudeのバッチ結果を逆順にする

公式Python SDKのanthropic 0.102.0をローカルで確認した。results()の説明には、結果の順序は保証されず、custom_idで対応づけると明記されている。SDKも受け取った行をデコードして渡す作りで、送信順へ並べ直してはくれない。

以下はPython 3.12.13で実行済み。APIには接続せず、成功した結果からIDと本文を取り出した後の集計だけを再現する。textは検証用の列名だ。

sent = ["req-a", "req-b"]
# 成功した結果から必要な列を取り出した想定
rows = [
    {"custom_id": "req-b", "text": "Bの要約"},
    {"custom_id": "req-a", "text": "Aの要約"},
]

def mismatches(pairs):
    return sum(key != row["custom_id"] for key, row in pairs)

bad = list(zip(sent, rows, strict=True))
by_id = {row["custom_id"]: row for row in rows}
fixed = [(key, by_id[key]) for key in sent]
print("行順:", mismatches(bad))
print("ID結合:", mismatches(fixed))
行順: 2
ID結合: 0

strict=Trueも通る。

同じ2件の結果でも、行順では文書と要約が入れ替わり、custom_idで結ぶと正しく対応づけられる流れ。

これは件数の違いを検出する指定なので、同数の入れ替わりは拾えない。by_idを挟むと、返却順が逆でも元の文書へ要約を戻せる。入力順を含む全2通りで、ID結合の誤対応は0件だった。タイトルの数字はこのサンプルの結果で、Claudeの生成精度を測った値ではない。

集計に戻す前に

小さいバッチで順番がそろったとしても、次もそろう保証にはならない。実データではバッチ内のIDを一意にし、失敗した結果はresult.typeで分けて保存する。上のコードは全件成功・ID重複なしの前提なので、成功分だけを集計する処理には欠落IDの確認も足す。自分なら、まずこの逆順サンプルを集計処理のテストに残す。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?