Claudeで不使用証明書の回収漏れを確認する — RoHS・REACH書類の再依頼まで
取引先から届いたRoHS・REACHの不使用証明書PDFをClaudeに読ませ、品番・有効期限・対象物質の抜けを一覧にして再依頼メールの下書きまで進める手順です。
不使用証明書の回収確認は、届いたPDFを開き、品番・有効期限・対象物質が揃っているかを一枚ずつ目で追う作業です。Claudeは各ページを画像とテキストの両方で読めるため、この「記載の有無を拾う」部分を任せられます。任せられるのは抜けの検出までです。法令に適合しているかどうかの判断と、取引先への最終的な依頼は担当者が持ちます。
この記事では、証明書PDFを一括で読ませ、抜けを表にし、再依頼メールの下書きを作るまでを順に組みます。
不使用証明書の確認でClaudeに任せる範囲
ここでいう不使用証明書は、取引先が自社に出す「納入品にRoHS・REACHの対象物質を含まない(または基準値以下)」という趣旨の書面です。書式は取引先ごとにばらばらで、調達側の担当者は受け取った書面が自社の依頼項目を満たしているかを確かめることになります。
任せやすい作業と、人に残す作業は次のように分かれます。
| 作業 | Claudeに任せるか | 理由 |
|---|---|---|
| 品番・発行日・有効期限・署名の有無を拾う | Claudeに任せるか任せる | 理由書面に書いてあるかどうかの照合 |
| 依頼した物質の欄が埋まっているか見る | Claudeに任せるか任せる | 理由欄の有無と記載値の読み取り |
| 回収状況の一覧とステータス付け | Claudeに任せるか任せる | 理由抽出結果の集計 |
| 再依頼メールの下書き | Claudeに任せるか任せる | 理由抜けの内容を文面にするだけ |
| 記載値が基準を満たすかの最終判断 | Claudeに任せるか人が持つ | 理由法的な適合判断は担当者の責任 |
| 免除用途や代替品の扱い | Claudeに任せるか人が持つ | 理由個別の事情と最新の規制を読む必要がある |
つまりClaudeに頼むのは「書いてあるか」であり、「適合しているか」ではありません。この線引きを最初に決めておくと、後の指示文もぶれません。
抜けの項目を先に決める
読ませる前に、何を抜けとみなすかを表にします。ここが曖昧だと、Claudeはもっともらしい要約を返すだけで、抜けの一覧になりません。
| 項目 | 見る場所 | 抜けの例 |
|---|---|---|
| 品番・品名 | 見る場所表題、明細表 | 抜けの例品番が型式の一部だけで、発注書の品番と一致しない |
| 発行日・有効期限 | 見る場所発行欄、末尾 | 抜けの例有効期限の記載がない、発行日が空欄 |
| 対象物質の網羅 | 見る場所物質リスト、チェック欄 | 抜けの例依頼した物質のうち一部の行が空白 |
| 基準値・測定方法 | 見る場所注記、添付表 | 抜けの例「含有しない」とだけあり基準値の根拠がない |
| 発行者の署名・社印 | 見る場所末尾、押印欄 | 抜けの例署名欄が空、担当者名がない |
| 適用範囲(対象ロット) | 見る場所本文 | 抜けの例特定ロットにしか触れていない |
RoHS指令(Directive 2011/65/EU)の制限物質は、Annex IIに最大許容濃度とあわせて載っています。指令の本文では、鉛・水銀・六価クロム・PBB・PBDEが0.1%、カドミウムが0.01%という値で示され、均質材料あたりの重量濃度で見ます。ただしこの附属書は委任法令で改正されるため、依頼する物質リストと上限値は、自社が準拠している最新の版から取ってください。REACHの高懸念物質の扱いも、候補リストの更新に合わせて依頼項目が増減します。
依頼項目の一覧は、自社の様式から写して手元の定義にします。この表の列をそのまま、後の抽出スキーマの項目にします。
証明書PDFを一括で読ませる準備
APIで読ませる場合の上限を、先に表にまとめます。
| 条件 | 上限・挙動 |
|---|---|
| リクエスト全体のサイズ | 上限・挙動32MB |
| 1リクエストあたりのページ数 | 上限・挙動600ページ(コンテキストウィンドウが1M未満のリクエストは100ページ) |
| 形式 | 上限・挙動標準的なPDF(パスワード・暗号化なし) |
| 送り方 | 上限・挙動URL、base64、Files APIのfile_id |
この制限は、PDF以外に同じリクエストで送る内容も含めた全体に掛かります。証明書は1社1ファイルで数ページのことが多いため、1ファイルずつ別リクエストで送るのが扱いやすい構成です。まとめて1リクエストに詰めると、1枚の読み違いや形式エラーで全体が止まります。パスワード付きPDFを受け取ったときは、事前に解除してもらうか、解除したものを別に保存してから送ります。エラーの切り分けはCould not process PDFの記事が参考になります。
claude.aiのチャットに直接アップロードする場合の数値は別です。チャットへのアップロードは1チャット20ファイルまで、PDFは1000ページまでで、100ページ以下のPDFだけ画像・グラフも解析され、101〜1000ページはテキストのみの処理になります。件数が少ないうちは、claude.aiに数社分をまとめて渡し、表の形で抜けを出させる使い方でも足ります。上限の比較はClaudeとChatGPTのPDF処理上限にあります。
抽出をJSONで受け取るスクリプト
数十社分を回すなら、1社ずつ同じ形式で結果を受け取ったほうが後工程が楽です。次は、Messages APIにPDFをbase64で渡し、structured outputsで抜けの項目を固定の形に揃える例です。モデル名は公式の例に合わせた書き方なので、手元で使うモデルに置き換えてください。
python3 check_cert.py certs/*.pdf > result.jsonlimport base64, json, os, sys, requests
SCHEMA = {
"type": "object",
"properties": {
"part_numbers": {"type": "array", "items": {"type": "string"}},
"issued_on": {"type": ["string", "null"]},
"expires_on": {"type": ["string", "null"]},
"substances": {"type": "array", "items": {
"type": "object",
"properties": {
"name": {"type": "string"},
"statement": {"type": ["string", "null"]},
"threshold": {"type": ["string", "null"]}},
"required": ["name", "statement", "threshold"],
"additionalProperties": False}},
"signed": {"type": "boolean"},
"missing_notes": {"type": "array", "items": {"type": "string"}}},
"required": ["part_numbers", "issued_on", "expires_on",
"substances", "signed", "missing_notes"],
"additionalProperties": False}
PROMPT = """添付は取引先から届いた不使用証明書です。
書面に書かれている内容だけを抽出してください。
- 書かれていない項目は null、配列は空にする
- 推測で補わない。読み取れない箇所は missing_notes に書く
- 日付は書面の表記のまま返す
- 適合かどうかの判断はしない"""
def check(path):
data = base64.standard_b64encode(open(path, "rb").read()).decode()
body = {
"model": "claude-opus-5-5",
"max_tokens": 2048,
"messages": [{"role": "user", "content": [
{"type": "document", "source": {
"type": "base64", "media_type": "application/pdf",
"data": data}},
{"type": "text", "text": PROMPT}]}],
"output_config": {"format": {
"type": "json_schema", "schema": SCHEMA}}}
r = requests.post(
"https://api.anthropic.com/v1/messages",
headers={"x-api-key": os.environ["ANTHROPIC_API_KEY"],
"anthropic-version": "2023-06-01",
"content-type": "application/json"},
json=body, timeout=300)
r.raise_for_status()
text = r.json()["content"][0]["text"]
return {"file": os.path.basename(path), **json.loads(text)}
for p in sys.argv[1:]:
print(json.dumps(check(p), ensure_ascii=False))指示文の要は「書かれていない項目はnullにする」「推測で補わない」の2行です。これを入れないと、空欄の有効期限にそれらしい日付が入る危険があります。structured outputsはスキーマに沿った形を保証する仕組みで、中身の正しさを保証するものではありません。
もう一つ注意があります。structured outputsはCitations(引用)と同時に有効にすると400エラーになります。「この値はどのページのどの記載か」を残したい場合は、JSONの項目にページ番号を持たせるか、Citationsを使う別の呼び出しに分けてください。スキャン画像のPDFを引用する場合の制約はCitationsでスキャンPDFを引用できない理由で扱っています。
回収状況の一覧にする
JSON Linesで出た結果を、発注側の品番マスタと突き合わせて一覧にします。ここはClaudeに頼まず、単純な照合で十分です。判定は3段階程度に絞ると運用しやすくなります。
| 状態 | 条件の例 |
|---|---|
| 回収済み | 条件の例品番・有効期限・全物質の記載・署名が揃っている |
| 要再依頼 | 条件の例空欄、期限切れ、物質の抜け、署名なしのどれかがある |
| 未回収 | 条件の例品番マスタにあるが、対応する証明書PDFがない |
有効期限が切れているかどうかは、Claudeに今日の日付を考えさせず、抽出した日付をスクリプトで比較します。日付の表記は書面のまま返す指示にしてあるので、和暦・西暦の混在や「無期限」のような文言は、正規化の段階で人が拾えるように別の列へ回します。
claude.aiで少数を処理するだけなら、スクリプトは要りません。PDFを添付して次のように頼み、表で返してもらいます。
添付の証明書PDFごとに、次の列の表を作ってください。
列: ファイル名 / 品番 / 発行日 / 有効期限 / 物質ごとの記載 / 署名の有無 / 抜けているもの
書かれていない項目は「記載なし」と書き、推測で埋めないでください。
読み取りに自信のない箇所には「要目視」と付けてください。「要目視」の列を持たせると、Claudeが迷った箇所を人に戻す出口になります。複数資料をまとめて要約するときの組み立てはPDF要約のコツにもまとめてあります。
再依頼メールの下書きを作る
抜けが固まったら、取引先ごとに再依頼文を作ります。ここでの入力は、先ほどの一覧のうち「要再依頼」の行です。
次の一覧は、取引先Aから届いた不使用証明書の確認結果です。
抜けている項目だけを挙げて、再提出を依頼するメールの下書きを作ってください。
- 依頼する項目は一覧に書かれたものだけにする
- 期限は「(日付を入れる)」の空欄にしておく
- 宛名と署名は空欄にする
- 法令への適合について断定する表現は入れない下書きのうち確認するのは、依頼項目が一覧と一致しているかと、期限や宛名の空欄が残ったまま送られないかの2点です。取引先に同じ依頼を繰り返し出す場合は、依頼文のひな形を自社の様式で固定し、抜けの内容だけを差し込む形にすると、文面のぶれがなくなります。
一覧がずれやすい書面の型
実際に回すと、抽出よりも照合の段階でずれが出ます。よくある型は次の3つです。
- 1通の証明書に複数の品番が列挙されている。
part_numbersを配列にしてあるのはこのためで、一覧への展開は品番ごとの行に分けて行う - 改訂版が後から届き、旧版と新版が同じフォルダに並ぶ。ファイル名ではなく発行日で新しいほうを残す
- 英文の書面で、物質名が略称(Pb、Cd、Cr6+など)で書かれている。依頼する物質名の別名を指示文に添えておくと、行の取り違えが減る
いずれもClaudeの読み取りよりも、受け取った書類の整理の問題です。ファイルの命名規則を取引先と決めておくと、一覧の照合が楽になります。
読み違いを防ぐ確認
PDFの読み取りは、ページを画像に変換した内容と、そこから抽出したテキストを合わせて行われます。そのため押印の位置、表の罫線、チェック欄の✓といった視覚情報も読めますが、画像としての理解には限界があります。画像解析の制限として、低品質・回転・200ピクセル未満の小さい画像で誤読や幻覚が起きうること、位置や座標の出力は近似であること、数え上げが不正確になりうることが挙げられています。
証明書に当てはめると、次の箇所が危ない場所です。
- 傾いてスキャンされた書面や、FAXを経由した粗い画像
- 小さな文字の脚注に書かれた免除や但し書き
- チェック欄が印刷の濃淡で曖昧な様式
- 表の物質名と判定欄が離れていて、行を取り違えやすい様式
対策は、PDFを正しい向きに直してから渡すこと、ページ番号はPDFビューアの番号で指示することの2つです。書面に印刷されたページ番号ではなく、PDFビューアの表示番号を使うと、ページの取り違えを避けられます。日本語PDFの読み取り精度を自社の帳票で測る方法は日本語PDFのOCR精度の見極め方に書いてあります。
運用としては、最初の1〜2回は抽出結果を原本と1枚ずつ突き合わせ、取りこぼしの癖を把握します。たとえば「署名」を押印と区別できない、といった癖が見つかれば、指示文に定義を足します。その後は、「要目視」と付いたものと、期限や物質の抜けで「要再依頼」になったものだけを人が見る運用に絞れます。
取引先の書類を渡す前に決めておくこと
証明書には取引先の社名、品番、場合によっては取引条件を示す情報が載ります。外部サービスに渡す前に、自社の秘密保持の取り決めと、取引先との契約条項で第三者への開示が制限されていないかを確認してください。守秘義務を負う職種が顧客データを渡す前の確認点は、税理士のClaude利用と守秘義務の整理が転用できます。
APIの場合、structured outputsではプロンプトと応答がZDR(ゼロデータリテンション)で処理されます。一方でJSONスキーマ自体は、最後の使用から最大24時間キャッシュされます。このため、スキーマには取引先名や品番といった機微情報を書かず、項目名だけにしておきます。上の例のスキーマも、項目名だけで構成しています。
まとめ
この手順で自動化できるのは、書面に「書いてあるか」の拾い出しまでです。基準値に収まるか、免除に該当するかの判断は、規制の最新版を読んだ担当者に残ります。
先に作る価値があるのは、抜けの定義表です。依頼項目を自社の様式から写して列にすれば、抽出スキーマ、一覧の判定、再依頼文の3つがその表から生まれます。件数が少ないうちはclaude.aiで表を出させ、取引先が増えたらスクリプトに移す順で足ります。