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も通る。
これは件数の違いを検出する指定なので、同数の入れ替わりは拾えない。by_idを挟むと、返却順が逆でも元の文書へ要約を戻せる。入力順を含む全2通りで、ID結合の誤対応は0件だった。タイトルの数字はこのサンプルの結果で、Claudeの生成精度を測った値ではない。
集計に戻す前に
小さいバッチで順番がそろったとしても、次もそろう保証にはならない。実データではバッチ内のIDを一意にし、失敗した結果はresult.typeで分けて保存する。上のコードは全件成功・ID重複なしの前提なので、成功分だけを集計する処理には欠落IDの確認も足す。自分なら、まずこの逆順サンプルを集計処理のテストに残す。
