取引先から戻ってきた契約書の修正版を自社の送付版と比べ、変更点と自社の運用への影響を法務担当向けに説明し、受け入れの判断の論点を並べる
取引先から戻ってきた契約書の修正版を、自社が送った版と条項ごとに機械で突き合わせ、変更を漏れなく取り出します。変更ごとに、意味、波及する条項、自社の運用で守れるかを法務担当向けに説明し、判断の論点を並べます。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Python
- 対象業界
- IT・SaaS/商社/広告/製造
- 対象部門
- 法務
- 対象業務
- 内容確認・チェック/比較検討
- 主な課題
- 判断に時間がかかる/属人化している/確認ミスが多い
- AIで行う処理
- 要約
- 主な効果
- 判断支援/属人化解消/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 法務の担当が修正版を受け取り、変更履歴があれば履歴を順に見る
- 履歴が無い、または怪しい場合は、Word の比較の機能か目で、自社の送付版と全文を読み比べる
- 変更ごとに、定義語や「第○条に定める」の参照をたどり、ほかの条項への影響を考える
- 運用に関わる変更は、開発・サポート・セキュリティの担当に Slack で「この条件は守れるか」と聞く
- 返事を待って、変更ごとの論点を表計算にまとめる
- 上長と事業部の担当に説明し、受け入れるかを決めてもらう
- 人法務の担当が、修正版を案件のフォルダの「受領」に保存する
- 自動保存をきっかけにプログラムが動き、同じ案件の送付版を探す
- 自動修正版の変更履歴をすべて反映した本文と、送付版の本文を作り、条項ごとに分ける
- 自動条項ごとに差分を取り、変更の一覧を作る。変更履歴に無かった差分には印を付ける
- 自動変更された条項から、定義語と参照条項をたどって波及先の条項を集める
- 自動変更に関わる運用の事実を、事実の表から引く
- 自動変更ごとに、差分・波及先・運用の事実を Claude API に渡し、説明と論点を受け取る
- 自動変更の一覧、説明、論点を1つのメモにまとめ、案件のフォルダに置いて法務の担当に知らせる
- 人法務の担当がメモと差分を確かめ、受け入れるか、何を聞くかを決める
- 人運用の事実の表に無い点だけ、担当部署に聞く
各工程の詳しい説明を読む
- 法務の担当が修正版を受け取り、変更履歴があれば履歴を順に見る
- 履歴が無い、または怪しい場合は、Word の比較の機能か目で、自社の送付版と全文を読み比べる
- 変更ごとに、定義語や「第○条に定める」の参照をたどり、ほかの条項への影響を考える
- 運用に関わる変更は、開発・サポート・セキュリティの担当に Slack で「この条件は守れるか」と聞く
- 返事を待って、変更ごとの論点を表計算にまとめる
- 上長と事業部の担当に説明し、受け入れるかを決めてもらう
(a)履歴を信じると見落とす。 相手が自分の修正の一部を承諾してから送ってくると、その部分には色が付きません。 1番目だけで済ませた修正版から、後で責任の上限の変更が見つかったことがあります。
(b)定義語の変更の波及を追いきれない。 「本サービス」「顧客データ」「障害」の定義の変更は1行でも、その語を使う条項がすべて変わります。 担当者がたどれる範囲は、経験と残り時間で決まります。
(c)運用の事実を毎回聞いている。 稼働率、障害の連絡の時間、データの削除の日数は、ほぼ毎月同じ質問を同じ担当に投げています。 返事を待つ間、修正版は止まります。
(d)説明の仕方が担当者で違う。 同じ変更でも、担当者によって論点の挙げ方が違い、事業部は何を決めればよいのかが分かりません。
- 【人】 法務の担当が、修正版を案件のフォルダの「受領」に保存する
- 【自動】 保存をきっかけにプログラムが動き、同じ案件の送付版を探す
- 【自動】 修正版の変更履歴をすべて反映した本文と、送付版の本文を作り、条項ごとに分ける
- 【自動】 条項ごとに差分を取り、変更の一覧を作る。変更履歴に無かった差分には印を付ける
- 【自動】 変更された条項から、定義語と参照条項をたどって波及先の条項を集める
- 【自動】 変更に関わる運用の事実を、事実の表から引く
- 【自動】 変更ごとに、差分・波及先・運用の事実を Claude API に渡し、説明と論点を受け取る
- 【自動】 変更の一覧、説明、論点を1つのメモにまとめ、案件のフォルダに置いて法務の担当に知らせる
- 【人】 法務の担当がメモと差分を確かめ、受け入れるか、何を聞くかを決める
- 【人】 運用の事実の表に無い点だけ、担当部署に聞く
4番目と5番目を機械で行うのが、この設計の分かれ目です。 差分と波及先をAIに探させると、探した結果が正しいかを人が全文で確かめ直すことになります。 機械で取り出したものは漏れが無いと言えるので、人はAIの説明の中身だけを見られます。
10番目で、担当部署への問い合わせが減ります。 同じ質問に毎月答えていた事実は、表に1回書けば済みます。表に無い新しい論点だけが人に回ります。
02今回想定するシステム構成
案件のフォルダ(送付版 .docx / 受領した修正版 .docx) ▼【トリガー】「受領」への保存(フォルダの監視) Python(差分の取り出し) ├──▶ 修正版:変更履歴をすべて反映した本文を作る(挿入は残す・削除と移動元は外す) ├──▶ 送付版と修正版を条項(第○条)ごとに分ける ├──▶ difflib で条項ごとに差分(置換・削除・挿入)を取る ├──▶ 変更履歴の有無を照らし、履歴に無い差分に印を付ける ├──▶ 定義語・参照条項をたどって波及先を集める └──▶ 運用の事実の表から、関わる事実を引く ▼ Claude API(構造化出力) │ 変更ごとに:何が変わったか/自社への影響/波及先/運用の事実との食い違い/確認先/判断の論点 ▼ Python ── メモ(Word)にまとめて案件のフォルダへ、法務の担当に通知 ▼ 【法務の担当】差分とメモを確かめ、受け入れの判断と問い合わせ先を決める
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 処理 | Claude API(変更ごとの説明と判断の論点の作成、構造化出力) | OpenAI API、Gemini API |
| 差異計算 | Python(difflib による条項ごとの差分、変更履歴の照合、定義語と参照条項の追跡) | Word の文書の比較の機能(手作業) |
| 保管 | 案件ごとの共有フォルダ(送付版、修正版、メモ) | 契約管理の仕組みの添付の領域 |
| 通知 | Slack | Microsoft Teams |
新しく足すのは、差分を取るプログラムと、運用の事実の表です。 運用の事実の表には、稼働率の目標、計画停止の事前の通知、障害の第一報までの時間、データを消すまでの日数、再委託先の一覧と変更の通知、監査に応じる範囲、バックアップの保存期間を、それぞれの担当部署が決めた値と根拠の文書の場所とともに書きます。この表を作ることが、最初の準備作業です。
AI を呼ぶのは Claude API の構造化出力です。 公式の説明では、スキーマを output_config.format に type: "json_schema" で渡し、ベータのヘッダーは不要とされています。古い output_format の書き方は非推奨です。オブジェクトには additionalProperties: false が必要で、数値の minimum・maximum や文字列の minLength・maxLength は使えません(使うと400のエラー)。
差分は Python の標準ライブラリの difflib で取ります。 SequenceMatcher の get_opcodes() は、2つの並びの違いを replace(置き換え)・delete(削除)・insert(挿入)・equal(同じ)の区間で返します。どこからどこまでが、どう変わったかが位置つきで出るので、AIに渡す差分にそのまま使えます。
03どうやって実装するのか
処理の起点を決める
修正版が案件のフォルダの「受領」に保存されたことを起点にします。 法務の担当がメールやチャットで受け取った修正版を、決まった名前(例:2026-10-14_受領_修正版.docx)で保存する運用にします。定時の一括処理にしないのは、取引先が回答を急いでいることが多いからです。 受け取ってから数分でメモが届けば、その日のうちに論点を事業部に返せます。
同じ案件の送付版は、ファイル名の「送付」と日付で探し、いちばん新しいものを比べる元にします。 交渉が何往復かしていると、送付版が複数あります。前々回の版と比べると、すでに合意した変更まで出てきて、メモが読めなくなります。 比べる元にした版のファイル名は、メモの先頭に必ず書きます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 送付版 | 自社が最後に送った契約書(.docx) | 案件のフォルダ |
| 修正版 | 取引先から戻ってきた契約書(.docx。変更履歴の有無は問わない) | 案件のフォルダの「受領」 |
| 運用の事実の表 | 項目、自社の値、決めた部署、根拠の文書、最終確認日 | 法務が管理する表 |
| 案件の情報 | 取引先、契約の種類、プラン、事業部の担当 | 契約の管理の表 |
質を決めるのは、運用の事実の表です。 「障害の第一報は2時間以内」「解約後のデータの削除は30日以内」のように、数字と、その数字を決めた部署と文書を1行ずつ持ちます。 AIはこの表に無い事実を作り出さないよう指示し、表に無ければ「確認先」として部署の名前だけを返させます。
最終確認日を持たせるのは、事実が変わるからです。 稼働率の目標や再委託先は、サービスの改善とともに変わります。半年以上確認していない行は、メモに「事実の確認が古い」と出します。
データの取得方法を決める
- 修正版の本文を作る … .docx は ZIP の中の XML で、本文は
document.xmlにあります。Microsoft の Open XML の説明では、段落はp、その中の連続した文字のかたまりはr、文字はtで表され、挿入はins、削除はdel、移動はmoveFrom/moveToとして記録されます。 挿入の中の文字は残し、削除と移動元は外して、変更をすべて受け入れた状態の本文を作ります - 変更履歴の一覧を別に持つ … 同じ XML から、挿入・削除の記録のある段落を控えます。後で「履歴に無い差分」を見分けるのに使います
- 送付版の本文を作る … 送付版は自社が履歴を承諾してから送っている前提で、同じ方法で本文にします
- 条項に分ける … 「第○条」で始まる段落で区切り、条番号と見出しを付けます。別紙と定義の条は別に扱います
1番目で、相手が受け入れたつもりの本文を作るのが要点です。 比べる相手を「変更をすべて反映した本文」にすると、履歴として残っている変更も、履歴を切って直した変更も、同じ差分として出てきます。 Word の画面で「変更履歴なし」の表示にしても履歴は一時的に隠れるだけで、承諾か却下をしない限り消えないとされています。見た目ではなく XML から作るのはそのためです。
AIへ渡す前に整形する
- 表記のゆれをそろえる … 全角と半角の数字、空白、改行の位置をそろえます。そろえないと、空白1つの違いが差分として大量に出ます
- 条番号の付け直しを見分ける … 条が1つ足されて以降の番号がずれた場合は、見出しと本文の一致の度合いで対応を取り、番号のずれだけの差分は「番号の変更」としてまとめます
- 条項ごとの差分を取る … 対応する条項どうしを
SequenceMatcherで比べ、get_opcodes()のequal以外を変更として取り出します。比べる単位は文字です - 履歴の照合 … 取り出した変更が、2番目の取得の手順で控えた履歴の段落に入っているかを見て、入っていなければ
untracked(履歴に無い変更)とします - 定義語の波及 … 定義の条で変わった語を拾い、その語を使っている条項をすべて集めます
- 参照条項の波及 … 変更された条項を「第○条」で参照している条項と、変更された条項が参照している条項を集めます
- 運用の事実の引き当て … 変更された文に、表の項目の語(稼働率、通知、削除、再委託、監査 など)があれば、その行を添えます
3番目で autojunk を切ります。 difflib の説明では、2つ目の並びが200要素以上あると、1%を超えて出てくる要素を「ジャンク」とみなすとされています。契約書を文字の並びで比べると「の」「を」「る」が1%を超え、差分の取り方が粗くなります。 SequenceMatcher(None, a, b, autojunk=False) で比べます。
4番目の untracked を、メモの一番上に出します。 相手が気づかせたくない変更とは限りませんが、担当者が履歴だけを見て読み飛ばしやすい変更です。
AIに処理させる
させるのは、機械が取り出した変更1つずつについて、説明と論点を書くことです。
| 書くもの | 材料 | 守ること |
|---|---|---|
| 何が変わったか | 変更前と変更後の文 | 2〜3文。文言を言い換えず、変わった語を「」で示す |
| 自社への影響 | 上記+波及先の条項 | 誰の、どの義務・権利が、どう変わるか |
| 運用の事実との食い違い | 変更後の文+運用の事実の表の行 | 表の値と比べ、守れない・確認が要るを書く |
| 確認先 | 運用の事実の表の「決めた部署」 | 表に無ければ「表に無い」と書き、部署を推測しない |
| 判断の論点 | 上記すべて | 法務の担当と事業部が決めるべき問いを、問いの形で1〜3個 |
論点は問いの形にさせます。 「障害の第一報の時間を1時間に縮めることを受け入れるか。受け入れる場合、夜間の当番の体制を変えるか」のように、決める人が答えればよい形にします。
| させないこと | 理由 |
|---|---|
| 差分や波及先を探すこと | 機械で取り出したものだけを説明する |
| 受け入れるべきかの結論 | 交渉の方針と事業の判断で決める |
| 代わりの文言の提案 | 本記事の範囲外。返し方は交渉の担当が決める |
| 運用の事実の表に無い値の記述 | 自社の稼働率や通知時間を推測で書かない |
| 法令の要件の断定 | 「法律上必要」と書かず、確認が要る論点として挙げる |
4行目がいちばん起きやすい失敗です。 「一般的なクラウドサービスの稼働率は〜」のように業界の相場を自社の事実のように書きます。 表に無ければ「表に無い」と書かせ、確認先の部署の欄も空にします。
指示内容を固定する
あなたはクラウドサービス企業の法務部で、取引先から戻ってきた契約書の修正を、
法務の担当者に説明するメモを書く立場です。
【変更】は、自社の送付版と修正版をプログラムで比べて取り出したものです。
あなたが差分を探し直す必要はありません。渡された変更だけを説明してください。
【書くこと】(変更1つにつき)
1. what_changed:何が変わったか。変わった語を「」で示し、2〜3文で。
2. impact:自社のどの義務・権利が、どう変わるか。
【波及先の条項】がある場合は、その条項の意味がどう変わるかも書く。
3. ops_conflicts:【運用の事実】の行と比べた結果。
status は conflict(守れない)、needs_check(確認が要る)、ok(表の値で守れる)。
4. ask_to:確認先の部署。【運用の事実】の「決めた部署」だけを使う。
5. questions:受け入れを判断するための問いを1〜3個。問いの形で書く。
【厳守事項】
- 変更前・変更後の文言を言い換えて要約しないでください。引用は「」で原文のまま。
- 受け入れるべきか、断るべきかの結論を書かないでください。
- 代わりの文言を提案しないでください。
- 自社の稼働率、通知時間、削除の日数などは【運用の事実】の値だけを使ってください。
表に無いときは ops_conflicts に「表に無い」と書き、値を推測しないでください。
- 業界の一般的な水準を、自社の事実のように書かないでください。
- 法令上の要件を断定しないでください。確認が要るなら questions に入れてください。
- untracked が true の変更は、what_changed の最初に「変更履歴に無い変更」と書いてください。
【案件】{deal}
【変更】{change}
【波及先の条項】{ripple}
【運用の事実】{ops_facts}
冒頭で「差分を探し直す必要はない」と書いているのは、AIが全文を読み直して別の変更を足すのを防ぐためです。 渡すのは1つの変更とその周辺だけですが、何も言わないと「ほかにも気になる点として」と書き足すことがあります。機械が拾っていない変更が混ざると、どれが本当の差分か分からなくなります。
推論の過程を出力させないのも、意図してのことです。 Claude の構造化出力の説明では、モデルの考えを段階的に書かせる項目を置くと拒否の扱い(reasoning_extraction)になることがあり、短い説明を求めるよう勧められています。impact と questions は短い説明と問いに限っています。
出力形式を固定する
変更1つにつき、次の形の JSON を構造化出力で受け取ります。
{
"change_id": "",
"clause": "",
"untracked": false,
"what_changed": "",
"impact": "",
"ripple_clauses": [
{ "clause": "", "effect": "" }
],
"ops_conflicts": [
{ "fact": "", "our_value": "", "status": "conflict" }
],
"ask_to": [""],
"questions": [""]
}
障害の通知の条項が直された変更なら、受け取る中身はたとえば次のようになります。
{
"change_id": "C-07",
"clause": "第12条(障害の通知)",
"untracked": true,
"what_changed": "変更履歴に無い変更。第一報の期限が「障害を認識してから2時間以内」から「障害の発生から1時間以内」に変わった。",
"impact": "起算点が「認識」から「発生」に移り、期限も短くなるため、通知の遅れが契約違反になりやすくなる。",
"ripple_clauses": [
{ "clause": "第15条(損害賠償)", "effect": "第12条の違反が賠償の対象に入る" }
],
"ops_conflicts": [
{ "fact": "障害の第一報", "our_value": "検知から2時間以内", "status": "conflict" }
],
"ask_to": ["カスタマーサポート部"],
"questions": ["起算点を「発生」とすることを受け入れるか", "1時間以内の第一報に夜間の体制で応じられるか"]
}
起算点の変更は、期限の数字よりも見落とされやすい変更です。 人が読み比べると「2時間が1時間に」だけに目が行き、「認識」が「発生」に変わったことに気づかないことがあります。差分を文字単位で取っているので、両方が変更として出てきます。
スキーマでは status を conflict・needs_check・ok の列挙にし、すべてのオブジェクトに additionalProperties: false を付けます。数の上限・下限を付けられないため、questions が3個を超えたらプログラムの側で切り、メモに「論点が多い」と印を付けます。
1つ目の理由は、運用の事実との食い違いを機械で数えられることです。 status が conflict の変更を集めれば、どの修正版がどの部署の運用に触れているかが一覧になります。担当部署へのまとめての問い合わせにも使えます。
2つ目は、untracked と ripple_clauses をメモの先頭に並べられることです。 法務の担当がまず見るべきは、履歴に無い変更と、波及の広い変更です。自由文で受け取ると、この並べ替えができません。
3つ目は、受け取った後に照合できることです。 プログラムは、what_changed の「」の中の文言が変更前か変更後の文に実際にあるか、ops_conflicts の our_value が運用の事実の表の値と一致するかを確かめます。一致しない項目は、メモで「要確認」にします。
応答が途中で切れたときの扱いも決めておきます。 公式の説明では、max_tokens に達すると stop_reason が max_tokens になり、出力が不完全でスキーマに合わないことがあるので、上限を上げて再試行するよう案内されています。拒否のときは stop_reason が refusal で、200で返り、スキーマに合わないことがあるとされています。どちらも stop_reason を見てから JSON を読みます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 案件のフォルダ | フォルダの監視(同期したフォルダ、またはストレージの通知) | 受領の保存を検知し、送付版を探す |
| Claude API | Messages API(構造化出力) | 変更ごとの説明と論点 |
| 運用の事実の表 | 読み取りのみ | 変更に関わる事実を引く |
| メモ | Word の文書として案件のフォルダに保存 | 変更の一覧、説明、論点、照合の結果 |
| Slack | 投稿 | 法務の担当に、件数と untracked・conflict の数を知らせる |
契約書の本文には手を入れません。 この構成が作るのはメモだけで、修正版にも送付版にも書き込みません。 返すときの文言は、法務の担当が Word で直します。
メモの並び順を決めておきます。 先頭に「比べた版」「変更の数」「履歴に無い変更の数」「運用の事実と食い違う変更の数」、次に untracked の変更、conflict を含む変更、波及の広い変更、それ以外の順です。番号のずれだけの差分は、最後にまとめて1行ずつ並べます。
人が確認する
- 差分そのものを確かめる … メモの各変更には、変更前と変更後の文を並べて載せます。AIの説明より先に、差分を目で見ます
untrackedの変更を必ず読む … 取引先に「この変更は履歴に出ていなかった」と伝えるかも、担当者が決めます- 運用の事実との食い違いを担当部署に確かめる …
conflictとneeds_checkだけを、確認先の部署にまとめて聞きます - 受け入れるかを決める … 論点を事業部に示し、上長の承認の範囲で決めます
- 運用の事実の表を直す … 確かめた結果、表の値が古ければ、担当部署に表を直してもらいます
1番目を省かないでください。 AIの説明は差分の要約で、差分の取り違えがあれば説明も間違います。 変更前と変更後が並んでいれば、数秒で確かめられます。
目標は、40件をならして1件30分です。 差分の確認と、論点を事業部に示すまでの時間です。運用の事実の表に無い論点が多い月は30分を超えます。 それは表を育てる材料になります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 送付版が見つからない | 処理を止め、法務の担当に送付版の場所を聞く。比べる元の無い差分は作らない |
| 修正版が PDF やスキャン | 本構成の対象外。相手に Word で送ってもらうよう頼む |
| 条の番号が大きくずれ、対応が取れない | 見出しが一致しない条を「対応不明」として並べ、人が対応を付ける |
| 相手の雛形に組み直されていて条項が対応しない | 差分が過半になるため、AIの説明を作らず「全面的な組み直し」と知らせる |
| 表や別紙の中の変更 | 表は行ごとに比べる。画像として貼られた別紙は比べられないので、人に回す |
| 書式だけの変更(太字、段落の配置) | 本文が同じなら差分に出さず、件数だけをメモに書く |
max_tokens で途中で切れた | 上限を上げて再試行する。それでも切れたら、その変更を「説明なし」で載せる |
refusal が返った | その変更を「説明なし」で載せ、差分だけを人が読む |
| 照合で引用が原文に無い | その変更を「要確認」にする |
いちばん重いのは、上から4行目です。 相手が自社の雛形の書式に全文を組み直して返してくると、条項の対応が取れず、差分が意味をなさなくなります。 その場合は、AIで無理に説明せず、交渉の担当に「全文の読み直しが要る」と知らせるのが正しい扱いです。
記録を残す
- 比べた2つのファイル(送付版と修正版)と、それぞれのハッシュ値
- 作った本文(変更を反映した修正版の本文、送付版の本文)と、条項の対応表
- 差分の一覧(
get_opcodes()の結果)と、untrackedの判定 - 波及先として集めた条項と、引き当てた運用の事実の行
- Claude API に渡した入力と受け取った出力の全文、
stop_reason - 照合の結果と、法務の担当が付けた判断(受け入れ/交渉/保留)
ハッシュ値を残すのは、どの版とどの版を比べたかを後から確かめるためです。 交渉が何往復かすると、「その変更はいつの版で入ったのか」を聞かれます。ファイル名だけでは、上書きされた版を区別できません。
04実装レベルの3段階
半自動化で、①の読み比べの時間が大きく減ります。 ただ、影響の整理と運用の事実の確認は手のままです。本格構成で1件30分になり、この段階が本記事の想定です。 差が大きいのは、波及先と運用の事実を人が探す時間が、確かめる時間に変わるからです。
05工数削減シミュレーション
導入後 40件 × 30分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 法人向けのクラウドサービスを提供し、自社の利用契約書・サービスレベルの合意書・業務委託契約を取引先に送ると、取引先の法務が手を入れた修正版が月に数十件戻ってくるIT・SaaS企業。修正が稼働率、障害の連絡、データの削除、再委託、責任の上限など、自社の運用で守れるかどうかに関わり、法務の担当が開発・カスタマーサポート・セキュリティの担当に1件ずつ確かめている場合。修正版が変更履歴の無い全文の書き直しで戻ってくることがある場合。自社が送った版を契約ごとに保存している場合。
- 戻ってくる修正版が月に数件で、担当者が全文を読み比べられている場合。契約がすべて自社の約款への同意で成立し、個別の修正を受け付けていない場合。自社が送った版が残っておらず、比べる元が無い場合。修正版が紙やスキャンした画像でしか届かない場合。なお、修正を受け入れるかどうか、代わりの文言をどうするか、交渉の方針の判断は、この構成では代替できません。
07最小構成で試す方法
- 先月戻ってきた修正版から5件を選ぶ(変更履歴の無い全文の書き直し、定義の条の変更、稼働率や障害の通知の変更を含むものを入れる)
- 各件で、Word の文書の比較の機能を使い、送付版と修正版を比べた結果を作る
- 比較の結果から変更を3つずつ選び、運用の事実(稼働率、障害の連絡の時間、データの削除の日数)をメモに書く
- Claude のチャットに、1つの変更の前後の文と運用の事実を貼り付け、「この変更が何を変え、自社の運用で守れるか、受け入れを判断するための問いを書いてください。結論と代わりの文言は書かないでください」と指示する
- 出てきた説明を、当時担当者が書いた論点のメモと並べる
| 出てきた内容 | 判断 |
|---|---|
| 運用の事実との食い違いを正しく指摘した | 差分を取るプログラムの作成に進む |
| 業界の相場を自社の事実のように書いた | 指示の書き方で直る。構成は有効 |
| 波及先の条項に気づかない | 想定どおり。波及先はプログラムで集めて渡す |
3行目は、失敗ではありません。 1つの変更だけを渡せば、AIはほかの条項を知りません。波及先を機械で集めて渡す理由が、ここで確かめられます。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 変更履歴だけを見て、履歴に無い変更を落とす | 変更を反映した本文と送付版を比べる |
| 空白や全角半角の違いが大量の差分になる | 比べる前に表記をそろえる |
| 差分が粗くなる | autojunk=False で比べる |
| 条が1つ増えて全部の番号がずれる | 見出しと本文で対応を取り、番号のずれだけの差分をまとめる |
| 前々回の版と比べてしまう | 最新の送付版を比べる元にし、ファイル名をメモに書く |
| 自社の数字を業界の相場で書く | 運用の事実の表に無ければ「表に無い」と書かせる |
スキーマの maxItems で400になる | 配列の数の制約は minItems の0か1だけ。数はプログラムで切る |
古い output_format で書いて400になる | output_config.format で渡す |
| 途中で切れた JSON を読もうとする | stop_reason を先に見る |
| 画像で貼られた別紙の変更を落とす | 比べられないことをメモに書き、人に回す |
上の2行が、この構成の失敗のほとんどです。 履歴だけを見る、表記をそろえない、のどちらでも、法務の担当は結局全文を読み直すことになります。 差分に漏れが無いと言えることが、この構成のすべての前提です。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 取引先との契約書の全文、取引の条件(料金、責任の上限、稼働率)、自社の運用の事実(障害の対応の体制、再委託先、データの扱い)です。
- AIに渡す範囲を変更の周辺に限る … 契約書の全文は渡さず、変更された条項、波及先の条項、関わる運用の事実だけを渡します。料金表や取引先の担当者の名前は、変更に関わらない限り渡しません
- API の契約とデータの扱いを確かめる … 取引先の契約書は秘密保持の対象であることが多く、外部のAPIに渡してよいかは、自社の情報管理の決まりと、取引先との秘密保持の条件の両方で確かめます
- 運用の事実の表の公開範囲を絞る … 障害の対応の体制や再委託先の一覧は、それ自体が外に出してはいけない情報です。法務と担当部署に限ります
- 結論をAIに書かせない … 受け入れるか、断るかは法務の担当と事業部が決めます。メモに結論が書かれていると、それが既定の答えとして読まれます
- 照合で一致しない引用を残さない … 原文に無い「」の引用は、説明の信用を損ないます。要確認の印を外すのは人だけにします
誤りが起きた場合のリスクは、変更を見落としたまま署名することと、守れない条件を守れると思って受け入れることの2つです。 前者は差分を機械で取ることで、後者は運用の事実の表と照らすことで防ぎます。
10まず何から始めるか
1週目:運用の事実の表を作る
過去3か月の修正版で、担当部署に問い合わせた質問を集めます。同じ質問が何度も出ている項目から、値・決めた部署・根拠の文書を表に書きます。 稼働率、障害の通知、データの削除、再委託、監査の5つから始めれば十分です。
2週目:5件で試す
Word の比較の結果と運用の事実を、手元のAIサービスに貼り付けて説明させます。業界の相場を自社の事実として書いていないか、結論を書いていないかを最優先で見ます。
3週目:差分を取るプログラムを作る
.docx から変更を反映した本文を作り、条項ごとに difflib で比べるところまでを作ります。この時点ではAIを呼ばず、出てきた差分の一覧を、担当者が手で読み比べた結果と照らします。 差分に漏れが無いことを、ここで確かめます。
4週目:波及先と運用の事実をつなぐ
定義語と参照条項の追跡、運用の事実の引き当てを足し、Claude API で説明と論点を作ります。照合の仕組みも同時に入れます。
2か月目: メモの形を法務の担当と事業部に見てもらい、並び順と論点の書き方を直します。3か月目以降: 1件90分が何分になったかを測り、運用の事実の表に無い論点の数が月ごとに減っていくことを確かめられた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
構造化出力のスキーマを output_config.format に type: "json_schema" で渡し、ベータのヘッダーが不要なこと。output_format が非推奨であること。オブジェクトに additionalProperties: false が必要で、数値の minimum・maximum、文字列の minLength・maxLength、配列の minItems の0と1以外の制約が使えず、使うと400になること。max_tokens に達すると stop_reason が max_tokens で出力がスキーマに合わないことがあること。拒否のときは stop_reason が refusal で200が返ること。考えの過程を求める項目が reasoning_extraction の拒否を招きうること | Claude API Docs: Structured outputs | 2026-10-14 |
SequenceMatcher と get_opcodes() の replace・delete・insert・equal の意味。2つ目の並びが200要素以上のとき、1%を超えて出る要素がジャンクとみなされること(autojunk) | Python ドキュメント: difflib | 2026-10-14 |
WordprocessingML の段落 p・ラン r・テキスト t の構造。挿入 ins、削除 del、段落の書式の変更 pPrChange、移動 moveFrom/moveTo の記録。変更をすべて受け入れる処理の例 | Microsoft Learn: Accept all revisions in a word processing document | 2026-10-14 |
| 「すべての変更を承諾」の操作。「変更履歴なし」の表示は変更を一時的に隠すだけで、次に開くと再び見え、承諾か却下をしない限り消えないこと | Microsoft サポート: Word で変更履歴を承諾または却下する | 2026-10-14 |
どの修正を受け入れるか、代わりの文言をどうするかは、自社の法務と事業部で決めてください。 本記事は公開されている仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1565)についてのご相談はこちらから。
