Claudeでデータシートを比較し代替品の同等性を判定する手順
2つの部品データシートPDFをClaude APIに渡し、絶対最大定格・電気的特性・パッケージ寸法を条件とページ番号つきで同じ列に起こして、同等の項目と差が出る項目に分ける手順です。
調達が止まった部品の代替候補を見つけても、「置き換えてよいか」は別の問いです。現行品と候補のデータシートを横に並べ、定格と特性を一項目ずつ突き合わせる作業が残ります。数十ページのPDFを2本開いて表に写す時間を、Claude APIのPDF対応で短くするのがこの記事の話です。
要点は1つ。値だけを抜かせず、測定条件とPDFのページ番号を同じ行に持たせることです。条件が違う数値を並べても同等かどうかは決まらず、ページ番号がなければ原本で確かめ直す手間が戻ってきます。
同等かどうかは「値・条件・ページ」の3点で決まる
データシートの数字は、条件とセットで意味を持ちます。電気的特性の表には、電源電圧や周囲温度、負荷といった測定条件の列が付くのが普通です。現行品が「ある条件での最大値」を、候補が「別の条件での標準値」を載せていれば、数字が近くても同じ土俵では比べられません。
そこで抽出の単位を次の4つ組にします。
- 項目名(例: 出力電流、入力オフセット電圧)
- 値と単位(最小・標準・最大のどれか)
- 測定条件
- 載っているPDFのページ
この4つ組を2本のPDFから起こし、同じ項目を同じ行に置けば、人が判定する材料が揃います。
比較する列を先に決める
PDFを渡す前に、比べる項目の大分類を決めておきます。分類を指示に含めると、返ってくる表の形が毎回そろいます。
| 区分 | 同等と見てよい見方 | 差が出やすい点 |
|---|---|---|
| 絶対最大定格 | 同等と見てよい見方候補の限界が現行品以上 | 差が出やすい点損傷しうる限界値で、動作保証の範囲ではない |
| 推奨動作条件 | 同等と見てよい見方現行品の使用範囲を候補が含む | 差が出やすい点電圧・温度の範囲が狭い側に合わせる必要 |
| 電気的特性 | 同等と見てよい見方同じ測定条件の値同士で比較 | 差が出やすい点条件違いは「比較不能」として残す |
| パッケージ・ピン配置 | 同等と見てよい見方外形寸法とピン機能が一致 | 差が出やすい点図面は画像で、文字として引用できない |
絶対最大定格は、動作を保証する範囲ではなく超えると劣化や破損のおそれがある限界です。ここが現行品を上回っていても、同等とは言えません。通常の使い方に当たるのは推奨動作条件と電気的特性の側で、判定の中心はそちらに置きます。
2本のPDFを渡して条件つきの表を起こす
PDFはdocumentブロックとして渡します。渡し方はURL、base64、Files APIのfile_idの3通りで、手元のファイルを2本比べるだけならbase64が手軽です。citationsを有効にすると、返答の各主張にPDFのどこから取ったかが付きます。
import base64
import pathlib
import anthropic
client = anthropic.Anthropic()
def doc(path, title):
raw = pathlib.Path(path).read_bytes()
return {
"type": "document",
"source": {
"type": "base64",
"media_type": "application/pdf",
"data": base64.standard_b64encode(raw).decode(),
},
"title": title,
"citations": {"enabled": True},
}
PROMPT = """2つのデータシートを比べます。
次の4区分について、項目ごとに1行で、
部品Aの値と条件、部品Bの値と条件を並べた表を作ってください。
区分: 絶対最大定格 / 推奨動作条件 / 電気的特性 / パッケージ・ピン配置
- 値は最小・標準・最大のどれかを明記する
- 測定条件が書かれていない項目は「条件記載なし」とする
- 片方にしかない項目は、もう片方を「記載なし」とする
- ページはPDFビューアーのページ番号で数える
"""
resp = client.messages.create(
model="claude-opus-5-5",
max_tokens=4096,
messages=[{
"role": "user",
"content": [
doc("part_a.pdf", "部品A(現行品)"),
doc("part_b.pdf", "部品B(代替候補)"),
{"type": "text", "text": PROMPT},
],
}],
)
for block in resp.content:
if block.type != "text":
continue
print(block.text)
for c in getattr(block, "citations", None) or []:
last = c.end_page_number - 1
print(f" <- {c.document_title} p.{c.start_page_number}-{last}")押さえておく点が3つあります。PDFは質問文より前に置くと性能が安定すること。ページ番号の指定は、紙面に印刷された番号ではなくPDFビューアーのページ番号にすること。データシートは表紙や目次で印刷番号とずれやすく、指示に書いておかないと原本で該当ページを探せなくなります。最後に、citationsは1リクエスト内のすべての文書で有効にするか、すべて無効にするかのどちらかです。
データシートには改訂版があり、同じ型番でも版によって数値が変わることがあります。どの版を渡したかは、documentブロックのcontextフィールドに、改訂番号や取得日を文字列で入れておく方法があります。titleには長さの制限があるため、メタデータはcontext向きです。contextはモデルに渡されますが、引用の対象にはなりません。表の出力と一緒に版を記録しておけば、数か月後に表を見直すときも、どの版の数字か迷いません。
引用のページ番号で原本に戻って確かめる
PDFの引用はpage_locationとして返り、start_page_numberは1始まり、end_page_numberは含まない終端です。1ページだけの引用なら開始が1、終端が2で返ります。上のコードでend_page_number - 1を出しているのはこのためです。
返ってきた表のうち、確かめる優先順位は次のとおりです。
- 同等と判定する行の値と条件(誤読が判定を直接変えるため)
- 候補が現行品を下回る行
- 条件が「条件記載なし」の行
引用に使われるcited_textは、元のPDFにある文を指します。表の数値が引用の文と食い違っていれば、読み違えの目印になります。
落とし穴
パッケージ図面とグラフは引用の対象にならない
citationsで引用できるのはテキストだけで、PDF内の画像は引用できません。外形寸法の図面、ピン配置図、特性グラフは画像として描かれていることが多く、Claudeが読み取れても引用は付きません。さらに、テキストを抽出できないスキャン画像のPDFは引用の対象外です。図面から起こした寸法は、原本のページを開いて目で突き合わせます。
画像の読み取りには、視覚機能全般の制約が及びます。低品質・回転・小さすぎる画像では誤読が起こりうるため、小さな文字で描かれた寸法線の数値は人の目で見直す対象です。
同等・差あり・比較不能の3つに振り分ける
表ができたら、各行を3つのどれかに入れます。判定の基準は、Claudeに「同等ですか」と聞くのではなく、先に決めた規則で行ごとに当てはめます。
行の振り分け先
同等
同じ測定条件で、候補の値が現行品の要求を満たす行です。推奨動作条件なら、現行品の使用範囲を候補の範囲が含んでいること。
差あり
条件が同じで、値が現行品の要求を満たさない行です。置き換えの可否は回路側の余裕を見て、設計者が決めます。
比較不能
測定条件が違う、または片方に記載がない行です。ここを「同等」に丸めない点が、この手順の肝です。
行を振り分けるときの規則は、プロンプトの2回目に渡せます。たとえば次のような指示です。
先ほどの表の各行を、次の規則で3分類してください。
- 測定条件が両方に書かれ、完全に同じなら比較する
- 条件が違う、または片方が記載なしの行は「比較不能」にする
- 比較した結果、候補が現行品を満たさない行は「差あり」にする
- 「同等」の行には、根拠の値とページ番号を残すこの2回目の依頼は、1回目の表の内容を前提にします。PDFを毎回付け直すと入力が重くなるので、同じ2本に何度も質問するなら、documentブロックにcache_controlを付けてプロンプトキャッシュを使います。引用の出力自体はキャッシュされませんが、参照元の文書はキャッシュできます。
最終的な採否は、この表を読んだ人が決めます。「比較不能」が多い行ほど、メーカーへの問い合わせや実機での測定が必要になる項目です。表はその洗い出しのために使います。
振り分けの具体例
次の表は、手順の見せ方のための架空の行です。数値は実在の部品とは関係がありません。
| 項目 | 部品A | 部品B | 振り分け |
|---|---|---|---|
| 電源電圧の絶対最大 | 部品A6.0V(p.5) | 部品B7.0V(p.4) | 振り分け同等(Bが上回る) |
| 出力電流の最大 | 部品A500mA、25℃(p.6) | 部品B450mA、25℃(p.5) | 振り分け差あり |
| 入力オフセットの最大 | 部品A2mV、電源5V(p.6) | 部品B3mV、電源3.3V(p.5) | 振り分け比較不能 |
| 外形 | 部品A図面のみ(p.18) | 部品B図面のみ(p.16) | 振り分け目視で照合 |
3行目は数字だけ見ると候補が悪いように見えますが、電源電圧が違うため同じ土俵ではありません。データシートによっては、同じ表に複数の電源電圧の列があり、候補側にも5Vの値がある場合があります。そのときは条件が合う列を指定して、もう一度抽出し直します。「比較不能」は結論ではなく、追加で探す対象を示す印です。
4行目の外形は、図面が画像で描かれているため表に寸法が入りません。寸法の表が別にあれば、その数値は引用つきで取れます。表がなく図面だけなら、ランド寸法やピッチを原本で測る作業は人に残ります。
大きなデータシートで詰まるとき
データシートは表と小さな文字が多く、PDF対応の上限に近づきやすい文書です。
PDFの上限
リクエストサイズ
32MB
プラットフォームにより異なる
ページ数
600
コンテキストが1M未満なら100
ページごとにテキストが取り出され、同時にページが画像としても渡されます。テキスト分のトークンは1ページあたり1,500〜3,000が目安で、画像分の計算が加わります。2本合計で60ページなら、テキスト分だけで9万〜18万トークンになる計算です。正確な見積もりはトークンカウントで確かめます。
表が細かく文字が小さいページが多いPDFは、ページ数の上限より先にコンテキストウィンドウを使い切ることがあります。その場合は、絶対最大定格と電気的特性のあるページだけを切り出して渡し、区分ごとに複数回に分けて依頼します。パスワードや暗号化のかかったPDFは受け付けられないため、先に解除しておきます。
PDFの上限とChatGPTとの違いはClaudeとChatGPTのPDF読み込み上限を比較にあります。
表をJSONにしたいときの分け方
条件つきの表を、後段のプログラムで扱いたくなることがあります。ただし、citationsを有効にしたままoutput_config.formatを指定すると、APIは400エラーを返します。両立できないため、使う順番を分けます。
- 根拠のページを残したいとき: この記事のようにcitationsを有効にして、文章や表で返させる
- JSONで受けたいとき: citationsを無効にして構造化出力を使い、スキーマに
pageのフィールドを持たせる
後者は引用が付かない分、ページ番号の裏取りが人手になります。両立できない理由はCitationsとstructured outputsが併用できない理由で扱っています。PDFからJSONで品目を抜き、再計算で抜けを拾う手順は、見積書で組んだ見積書PDFをClaude APIで品目表に構造化がそのまま使えます。複数社の料金を表にそろえる考え方はClaude Researchで競合の料金を比較するにもあります。
代替品の判断はどこまで任せるか
Claudeに任せてよいのは、2本のPDFから「値・条件・ページ」を並べる作業までです。読み違いが起きうるのは、図に埋まった数値、小さな文字、複数の条件を持つ表のセルで、これらは引用が付かないか、付いても表の解釈を取り違える場所です。
同等かどうかの最終判定は、置き換え先の回路で何が必要かを知っている人の仕事です。Claudeの表は、その人が原本のどのページを開けばよいかを先に教える地図として使うと、確認の漏れが減ります。