クレーム・紛争案件の経緯と期限を、メールと資料から時系列にまとめる
取引先とのトラブルが起きた案件について、担当者のメール、議事録、日報、契約書、検査記録から、いつ誰が何を言ったのかを日付順に並べた表を作ります。各行には出どころを付けます。責任の所在や見通しはAIに書かせません。
- 利用ツール
- ChatGPT/Claude/Gemini/Google Apps Script/Make/n8n/Power Automate/Python
- 対象業界
- 不動産/保険/士業/建設/自治体
- 対象部門
- 法務/経営企画
- 対象業務
- 情報検索/要約
- 主な課題
- 判断に時間がかかる/属人化している/情報が見つからない
- AIで行う処理
- 要約
- 主な効果
- 判断支援/工数削減/検索時間短縮
- 導入難易度
- ★★★☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 現場か営業から「相手方と揉めている」と法務へ連絡が入る
- 法務が、関係しそうな人(現場代理人、営業担当、品質管理、購買)に資料の提出を依頼する
- 担当者が自分のメールボックスから関係するスレッドを探して転送する
- 議事録、日報、検査記録、写真を、工事管理システムや個人のフォルダから集める
- 契約書、注文書、仕様書、変更指示書を契約書フォルダから探す
- 法務が全部を読み、Excelに日付順で打ち込む
- 日付の分からないやり取りと口頭のやり取りを、担当者に聞き取る
- 契約書から、検収、契約不適合、解除の予告に関する条文を探して抜き書きする
- 弁護士に渡せる形に整える
- 案件が動くたびに、6から9をもう一度やる
- 人法務が案件フォルダを作り、関係者に「ここへ出してください」と依頼する
- 自動案件フォルダに資料が入ると、その日の夕方にワークフローが動く
- 自動メール、Office文書、PDFをテキストにする(スキャンPDFはOCRする)
- 自動資料1点ごとに資料IDを振り、ページと段落の位置を記録して索引を作る
- 【AI】 資料1点ずつから、出来事、日付、発言者、引用、出どころを取り出す
- 【AI】 契約書から、期限に関わる条文を条番号と条文のまま取り出す
- 自動案件ごとにまとめて日付順に並べ、日付不明の行を別の表に分ける
- 【AI】 並べ終わった表を通しで見て、記録どうしが食い違っている箇所を拾う
- 自動時系列表、出どころ索引、論点候補、期限の一覧をExcelにして案件フォルダへ保存する
- 人法務が引用と原本を突き合わせ、誤りを直し、聞き取りで日付不明を埋める
- 人法務責任者が全行を読んでから、弁護士へ渡す
- 自動資料が増えたら、増えた分だけを処理して表に追記する
各工程の詳しい説明を読む
- 現場か営業から「相手方と揉めている」と法務へ連絡が入る
- 法務が、関係しそうな人(現場代理人、営業担当、品質管理、購買)に資料の提出を依頼する
- 担当者が自分のメールボックスから関係するスレッドを探して転送する
- 議事録、日報、検査記録、写真を、工事管理システムや個人のフォルダから集める
- 契約書、注文書、仕様書、変更指示書を契約書フォルダから探す
- 法務が全部を読み、Excelに日付順で打ち込む
- 日付の分からないやり取りと口頭のやり取りを、担当者に聞き取る
- 契約書から、検収、契約不適合、解除の予告に関する条文を探して抜き書きする
- 弁護士に渡せる形に整える
- 案件が動くたびに、6から9をもう一度やる
問題は6つあります。
(a)資料が人のメールボックスにある。 出てくるのは、担当者が「関係がある」と思ったものだけです。自分に不利なやり取りは、悪意が無くても記憶から落ちます。 後から相手方が出してきたメールを法務が初めて見る、ということが起こります。
(b)読む順番と並べる順番が逆になる。 メールのスレッドは新しい返信が上にあり、時系列は古い順です。1通ずつ上下に行き来しながら打ち込むため、抜けと重複が出ます。
(c)出どころを書く手間で、出どころを書かなくなる。 「4月8日、相手方が仕様変更を口頭で依頼」とだけ書いた行は、あとで「それはどの資料に書いてあるのか」と聞かれたときに、もう一度全部を読み直さないと答えられません。
(d)読みながら食い違いを一本化してしまう。 自社の日報には「立会いのうえ確認」、相手方のメールには「立会いは無かった」と書かれている。自社の記録だけで1行にしてしまうと、弁護士に渡したあとで前提が崩れます。
(e)期限が契約書の別々の条に散っている。 検収の期間、契約不適合を通知できる期間、解除の予告期間、支払の期日が、それぞれ別の条にあります。探すこと自体に時間がかかります。
(f)案件が動くたびに作り直している。 前回どこまで入れたかが分からないため、最初から並べ直します。担当者が異動すると、その案件の経緯は事実上消えます。
- 【人】 法務が案件フォルダを作り、関係者に「ここへ出してください」と依頼する
- 【自動】 案件フォルダに資料が入ると、その日の夕方にワークフローが動く
- 【自動】 メール、Office文書、PDFをテキストにする(スキャンPDFはOCRする)
- 【自動】 資料1点ごとに資料IDを振り、ページと段落の位置を記録して索引を作る
- 【AI】 資料1点ずつから、出来事、日付、発言者、引用、出どころを取り出す
- 【AI】 契約書から、期限に関わる条文を条番号と条文のまま取り出す
- 【自動】 案件ごとにまとめて日付順に並べ、日付不明の行を別の表に分ける
- 【AI】 並べ終わった表を通しで見て、記録どうしが食い違っている箇所を拾う
- 【自動】 時系列表、出どころ索引、論点候補、期限の一覧をExcelにして案件フォルダへ保存する
- 【人】 法務が引用と原本を突き合わせ、誤りを直し、聞き取りで日付不明を埋める
- 【人】 法務責任者が全行を読んでから、弁護士へ渡す
- 【自動】 資料が増えたら、増えた分だけを処理して表に追記する
自動化されるのは「テキストにする」「位置を記録する」「出来事を取り出す」「日付順に並べる」「条文を拾う」「体裁を作る」の6つです。残るのは、引用が原本と合っているかを確かめることと、聞き取りと、渡す判断です。
食い違いは並べたまま残します。 8番目の処理が拾うのは「同じ事柄について、別々の記録が別のことを言っている」という状態そのものです。どちらが正しいかは書かせません。 表には両方の行を残し、論点候補の一覧に「立会いの有無について記録が食い違う」とだけ書きます。責任の所在、見通し、法的な評価は、どの工程でも出しません。 これは運用の約束ではなく、出力の項目を作らないという設計で担保します。
02今回想定するシステム構成
案件フォルダ(SharePoint の案件別フォルダ) メール(.msg / .eml)/ 議事録 / 日報 / 検査記録 / 契約書 / 注文書 / 変更指示書 / 写真 │ ▼【トリガー】毎日18:00 + 法務が押すオンデマンド実行 Make のシナリオ │ ├──▶ フォルダから未処理のファイルを取得 │ └──▶ テキスト化(メールはヘッダーと本文に分ける/スキャンPDFはOCR) │ ├──▶ Python ── 資料IDの付与、ページ・段落の位置の記録、索引の作成 │ ├──▶ Iterator で資料1点ずつのバンドルに分ける │ │ │ ├──▶ Claude API ①事実の抽出 ── 出来事・日付・発言者・引用・出どころ(JSON) │ └──▶ Claude API ②期限の条文 ── 条番号・条文・期間の定め(契約書のみ / JSON) │ ├──▶ Array aggregator で案件IDごとに1つのバンドルへまとめる │ ├──▶ Python ── 日付順の並べ替え、日付不明の振り分け、引用と原本の機械照合 │ ├──▶ Claude API ③食い違いの洗い出し ── 並べ終わった表を通しで見る(JSON) │ └──▶ Python ── Excel を作り、案件フォルダへ保存 → Teams で法務に通知 │ ▼ 法務が引用と原本を突き合わせ、聞き取りで日付不明を埋める ──【人】 │ ▼ 法務責任者が全行を読み、弁護士へ渡す ──【人】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| ワークフロー | Make | Power Automate、n8n |
| 処理 | Claude API | OpenAI API、Gemini API |
| 集計 | Python | Google Apps Script |
Makeを置いているのは、資料1点ずつに分けて処理し、最後に案件ごとへまとめ直す流れを画面上で組めるためです。 公式のフロー制御の説明では、Iterator は配列を一連のバンドルに変換するモジュールで、各要素が個別のバンドルになります。Array aggregator は複数のバンドルを1つにまとめるモジュールで、group by の欄でまとめ方を指定できます。 ここに案件IDを指定すると、資料単位の結果が案件単位に戻ります。
資料1点ずつに分けるのは、出どころを正確に出すためです。 40通のメールをまとめて渡すと、どの記述がどの通のものかが曖昧になります。1点ずつ渡せば、そのバンドルが持つ資料IDがそのまま出どころになります。呼び出し回数は増えますが、この構成でいちばん削ってはいけないのが出どころの正確さです。
Pythonは3か所で使います。資料IDと位置の付与、日付順の並べ替え、引用が原本に含まれるかの機械照合です。いずれも判断の余地がない処理で、AIに任せる理由がありません。Excelの生成もここで行います。保管先のSharePointと通知先のTeamsは役割の表に入れていません。その組織で既に使っているものに合わせてください。
03どうやって実装するのか
処理の起点を決める
起点は2つ置きます。毎日18時の定時実行と、法務が押すオンデマンド実行です。
Makeのシナリオは既定で15分ごとに実行され、スケジュールの設定画面で変更します。設定できるのは、一定間隔、1回だけ、毎日、平日(月曜から金曜)、毎週、毎月、特定の日付、オンデマンドです。最短の間隔は契約しているプランによって変わります。 詳細設定では、シナリオが動く期間の開始日と終了日も決められます。
15分ごとのままにしないでください。 案件フォルダには1日のうちに何度も資料が入ります。そのたびに動くと、同じ案件を1日に何度も処理し、通知も同じ回数だけ飛びます。1日1回にまとめ、急ぐときだけ法務が手で起こすのが、この業務に合っています。
即時実行のトリガーを使う場合は、実行回数の上限に注意が必要です。既定では毎分100回が上限で、超えた分はキューに入って順に処理されます。Webhookの応答モジュールを置いている場合は、上限を超えた呼び出しに429が返ります。
案件ごとにシナリオを作らないでください。 案件は増え続けます。フォルダ名に案件IDを入れ、1つのシナリオが案件IDごとに処理を分ける作りにします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| メール | 差出人、宛先、CC、送信日時、件名、本文、添付の有無 | 関係者のメールボックスからの書き出し(.msg/.eml) |
| 議事録 | 開催日、出席者、決めたこと、持ち帰り事項 | TeamsとSharePoint、担当者のフォルダ |
| 日報・作業記録 | 作業日、現場、作業内容、立会者、天候 | 工事管理システムのCSV出力 |
| 検査記録・是正指示 | 検査日、指摘内容、是正の期限、確認日 | 品質管理のフォルダ |
| 写真 | 撮影日時、ファイル名、保存場所 | 現場の写真フォルダ |
| 契約書・注文書 | 契約日、条文、金額、納期 | 契約書フォルダ(PDF) |
| 変更指示書・見積 | 発行日、変更内容、追加金額、承認欄 | 契約書フォルダ、購買のフォルダ |
| チャット | 送信日時、発言者、本文 | Teamsの書き出し |
| 聞き取りメモ | 誰に、いつ聞いて、何と答えたか | 法務が作る |
資料はコピーを案件フォルダに置き、原本は動かしません。 索引には元の場所、置いた人、置いた日を残します。あとで「その資料はもともとどこにあったのか」を答える必要が出るためです。
写真は中身を読ませません。 撮影日時とファイル名だけを時系列に入れ、何が写っているかは人が1行書きます。写真から状態を読み取らせると、それは事実の記録ではなく評価になります。
聞き取りメモを最初から入力に入れてください。 口頭のやり取りは、メモにしない限りどこにも残りません。「4月8日ごろ、現場で口頭の依頼があったと担当者は述べている」という形で、誰の記憶かを書いたうえで資料として扱います。
データの取得方法を決める
メール: Outlookで該当スレッドを選び、.msgで書き出します。スレッド全体を出してください。 返信に引用された過去のやり取りが、元のメールが消えている場合の唯一の記録になることがあります。書き出しは本人が行い、「関係すると思うもの」ではなく「相手方の社名か案件名が入っているもの全部」という条件で出してもらいます。判断を挟ませないためです。
フォルダの監視: MakeのMicrosoft 365のモジュールで、案件フォルダの新規ファイルを取得します。処理済みのファイルは索引に記録し、次回は飛ばします。
PDF: テキストが埋まっているものはそのまま抽出します。スキャンしたものはOCRにかけ、索引に「OCR」と印を付けます。 OCRを通した資料は、数字と固有名詞に誤りが混ざる前提で人が確かめます。工事管理システムはCSV出力を使います。紛争案件は過去の期間を一度取れば足りるため、手動の出力で十分なことがほとんどです。
取れなかった資料も記録します。 退職した担当者のメールボックス、上書きされた現場の写真、保存期間を過ぎたチャット。「取れなかった」という事実を索引に残さないと、表が完全なものに見えてしまいます。
AIへ渡す前に整形する
- 資料IDの付与 …
S-001から順に振ります。索引に、ファイル名、資料の種類、日付、元の場所、置いた人、ページ数、OCRの有無を記録します - メールの分解 … 1通を1資料として扱い、ヘッダー(差出人、宛先、送信日時)と本文を分けて持ちます。 日付はヘッダーから取り、本文の「昨日お伝えした」は日付として扱いません
- 引用部分の除去 … 返信に含まれる過去のやり取り(
>以降や区切り行の下)を落とします。同じ発言が10通分だけ並ぶのを防ぐためです。ただし、元のメールが資料として存在しない場合は落とさず、「引用からの復元」と印を付けます - 位置の記録 … PDFはページ番号、文書は段落番号を付けます。
S-012 p.2 第3段落の形で、出どころの索引から原本の場所を引けるようにします - 分割 … 長い資料は段落の切れ目で分けます。分けた位置も索引に残し、あとで位置がずれないようにします
- 基準日の付与 … その資料自体の日付(メールの送信日時、議事録の開催日)を一緒に渡します。本文に「来週まで」とあったとき、基準日が無ければ何も確定できません
- 渡さない資料の除外 … 弁護士とのやり取り、社内の稟議、原価の資料を、この段階で外します。第13章で扱います
3番目の引用除去は、やりすぎないでください。 「元のメールが無いときは落とさない」という例外を置かないと、相手方しか持っていなかった発言が、引用ごと消えます。
AIに処理させる
計算処理にさせること:
| 処理 | 内容 |
|---|---|
| 資料IDと位置の付与 | ファイル単位、ページ・段落単位 |
| 日付順の並べ替え | 抽出された日付で昇順に並べる |
| 引用の機械照合 | quote の文字列が原本のテキストに含まれるかを確かめる |
| 重複行の統合 | 同じ資料ID、同じ位置、同じ日付の行 |
| 表の振り分け | 日付が付いた行と、日付不明の行を別の表に分ける |
| Excelの生成 | 4つのシートに分けて書き出す |
生成AI(Claude API)にさせること:
| 処理 | 内容 |
|---|---|
| 出来事の切り出し | 資料1点から、日付が特定できる出来事を取り出す |
| 発言者と立場 | 誰が言ったか、自社か相手方か第三者か不明か |
| 出どころと引用 | 資料のどの位置か、原本の文字列をそのまま写す |
| 日付の特定の度合い | 日まで分かるか、月までか、分からないか |
| 期限に関わる条文 | 契約書から、条番号と条文と期間の定めを写す |
| 記録の食い違い | 同じ事柄について別々の記録が別のことを言っている箇所 |
| 記録の欠け | 「この依頼に対する返信の記録が無い」という箇所 |
させないこと:
責任の所在、過失の有無、契約違反にあたるかどうか、勝ち負けの見込み、相手方の主張が正しいかどうか、期限を過ぎているかどうかの判断、書かれていない出来事の補完。
期限の判断をさせない理由は、起算日の読み方が事実ではないためです。 「引渡しから1年」という条文があったとき、引渡しがいつ成立したのかが、この案件で争っていること自体であることがあります。条文と、時系列表にある日付を、同じ紙に並べて出すところまでが機械の仕事です。 日数の計算もPythonにさせません。「起算日から何日経過」という列を作ると、その列は起算日を1つに決めたことになります。
指示内容を固定する
資料1点ごとに呼び出す、事実抽出のプロンプトです。
あなたは、紛争になっている案件の資料を読み、事実の時系列を作る担当者です。
下の資料1点から、日付が特定できる出来事を取り出してください。
【この作業でしないこと】
- どちらに責任があるか、過失があるか、契約違反にあたるかを書かないでください。
- 勝てるか負けるか、有利か不利かを書かないでください。
- 相手方の主張が正しいかどうかを評価しないでください。
- 期限を過ぎているかどうかを書かないでください。
- 資料に書かれていない出来事を補わないでください。
「おそらく連絡したと思われる」のような推測を書かないでください。
【厳守事項】
- すべての行に quote を付けてください。quote は資料の本文から一字一句そのまま
写してください。要約、言い換え、句読点の変更をしないでください。
- すべての行に locator を付けてください。locator は、下に与えた位置の書き方
(「p.2 第3段落」など)に合わせてください。
- 日付は、資料に書かれている日付か、資料自体の日付から確実に決まる場合だけ
events に入れてください。
「基準日」を渡してあります。「昨日」「来週」などは、基準日から確実に決まる
場合だけ日付にし、決まらない場合は undated_events に入れてください。
- 月までしか分からない場合は、その月の1日を date に入れ、
date_precision を「月まで特定」にしてください。
- 日付がまったく分からない出来事、口頭のやり取りで時期が不明なものは、
undated_events に入れてください。when_text には、資料に書かれている
時期の表現(「昨年の夏ごろ」など)をそのまま写してください。
- actor は資料に書かれている名前か役職を写してください。
書かれていなければ「記載なし」とし、推測で補わないでください。
- actor_side は「自社」「相手方」「第三者」「不明」から選んでください。
下に与えた当事者の一覧に無い名前は「不明」にしてください。
- event は、起きたことを1文で書いてください。評価語(不当、不誠実、遅延の責任)を
使わず、「◯◯を依頼した」「◯◯と回答した」「◯◯を受領した」のように書いてください。
- 資料の中で、別の記録と突き合わせないと決められないことがあれば、
data_gaps に書いてください。
【契約書の場合の追加指示】
- 期間、期限、予告、通知、検査、引渡し、解除、支払期日に関わる条文を
deadline_clauses に入れてください。
- clause_text には条文をそのまま写してください。要約しないでください。
- period_text には、期間の定めの部分だけを写してください(「引渡しの日から1年間」など)。
- starting_point_text には、条文に起算点として書かれている文言を写してください。
- その期限が過ぎているかどうか、有効かどうかは書かないでください。
【当事者の一覧】
{parties}
【資料ID】{source_id}
【資料の種類】{source_type}
【資料の基準日】{base_date}
【位置の書き方】{locator_format}
【資料の本文】
{source_text}
「評価語を使わない」は具体例で示してください。 「不当に」「一方的に」「遅延した」は、書き手の評価が入った言葉です。「4月20日納入の予定に対し、5月2日に納入した」と書けば、遅れていることは読む人に分かります。
「決まらない場合は undated_events に入れる」という逃げ道が要ります。 これが無いと、「昨年の夏ごろ」を勝手に8月1日と決めてきます。日付不明のまま残せる場所を作ることが、この設計でいちばん効きます。
表を並べ終わったあとの3回目の呼び出しでは、行IDを振った時系列表を丸ごと渡し、「同じ事柄について別々の記録が別のことを言っている組み合わせ」を行IDの組で返させます。 ここでも「どちらが正しいか」は返させません。返すのは、食い違っている事柄と、その種類(日付が違う/数量や金額が違う/言った内容が違う/合意の有無が違う)と、関係する行IDだけです。
出力形式を固定する
資料1点ごとの呼び出しでは、次の形のJSONを返させます。Claude APIでは output_config.format に {"type": "json_schema", "schema": {...}} を渡すと、応答をスキーマに沿った形に制約できます。
{
"type": "object",
"additionalProperties": false,
"required": ["source_id", "events", "undated_events", "deadline_clauses", "data_gaps"],
"properties": {
"source_id": { "type": "string" },
"events": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"required": ["date", "date_precision", "actor", "actor_side", "event", "locator", "quote"],
"properties": {
"date": { "type": "string", "format": "date" },
"date_precision": { "type": "string", "enum": ["日まで特定", "月まで特定"] },
"actor": { "type": "string" },
"actor_side": { "type": "string", "enum": ["自社", "相手方", "第三者", "不明"] },
"event": { "type": "string" },
"locator": { "type": "string" },
"quote": { "type": "string" }
}
}
},
"undated_events": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"required": ["when_text", "actor", "actor_side", "event", "locator", "quote"],
"properties": {
"when_text": { "type": "string" },
"actor": { "type": "string" },
"actor_side": { "type": "string", "enum": ["自社", "相手方", "第三者", "不明"] },
"event": { "type": "string" },
"locator": { "type": "string" },
"quote": { "type": "string" }
}
}
},
"deadline_clauses": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"required": ["clause_no", "clause_text", "period_text", "starting_point_text", "locator"],
"properties": {
"clause_no": { "type": "string" },
"clause_text": { "type": "string" },
"period_text": { "type": "string" },
"starting_point_text": { "type": "string" },
"locator": { "type": "string" }
}
}
},
"data_gaps": {
"type": "array",
"items": { "type": "string" }
}
}
}
このスキーマには、責任、過失、有利不利、見通し、期限の当否を入れる項目がありません。 項目が無ければ、そこには書けません。「書かないでください」という指示と、書く場所を作らないことの両方をやってください。 指示だけだと、event の文の中に評価が混ざります。
公式の説明で確認できた仕様のうち、この設計に関わるものが3つあります。
オブジェクトの additionalProperties は false にする必要があります。 勝手な項目が増えないため、この用途には都合のよい制約です。
文字列の形式では date が使えます。 日付の列が 2026-04-08 の形に揃い、並べ替えがそのまま効きます。ただし空文字を入れられません。 日付不明の行を events に置けないので undated_events を別に作りますが、これは日付不明を別に置くという業務側の要件とたまたま一致しています。
文字列の長さの制約(minLength、maxLength)と数値の範囲の制約は使えず、配列の minItems は0と1だけです。 引用の長さや行数の下限はスキーマで書けないため、プロンプトで指示し、Python側で確かめます。
さらに、この題材では必ずぶつかる仕様があります。引用(citations)と構造化出力は併用できません。 資料を document ブロックで渡して citations.enabled を true にし、同時に output_config.format を指定すると、APIは400エラーを返します。 引用は本文の途中に引用のブロックを差し込む仕組みで、スキーマで形を固定する仕組みと両立しないためです。
そこで、出どころは前処理で振った資料IDと位置で持ちます。 資料1点ずつに分けて渡しているので、その呼び出しの資料IDがそのまま出どころになります。引用が本物かどうかは、Pythonで原本のテキストに含まれるかを確かめます。
引用の位置をAPIに保証させたい場合は、呼び出しを分けます。 引用を有効にすると、平文は文単位、PDFはページ単位、独自コンテンツはブロック単位で位置が返ります。独自コンテンツは追加の分割がされないため、1資料を1ブロックにすればブロック番号が資料IDに対応します。 その呼び出しではJSONを返させられないので、弁護士に渡す前に重要な行だけを確かめる用途に限るのが現実的です。なお引用を有効にする場合、同じリクエスト内の文書は全部有効か全部無効かのどちらかにします。
システムへ連携する
Excelを1つ作り、案件フォルダに保存します。シートは次の4つです。
| シート | 列 |
|---|---|
| 時系列 | 行ID/日付/特定の度合い/発言者/立場/出来事/資料ID/位置/引用/確認済み |
| 日付不明 | 行ID/時期の表現/発言者/立場/出来事/資料ID/位置/引用/聞き取り結果 |
| 出どころ索引 | 資料ID/種類/日付/ファイル名/元の場所/置いた人/ページ数/OCRの有無 |
| 論点候補 | 論点/種類/関係する行ID/備考(人が書く) |
期限の一覧は、時系列シートの下に続けて置きます。 条番号、条文、期間の定め、起算点の文言、出どころ(資料IDと位置)の5列です。別のファイルにしないでください。 弁護士に渡したあと、期限の紙だけがどこかへ行きます。
Teamsへの通知は、案件名、資料の点数、時系列の行数、日付不明の行数、引用の照合に失敗した行数、論点候補の件数だけを送ります。通知に本文を載せないでください。 Teamsのチャネルは、案件に関係しない人も見られることがあります。弁護士への受け渡しは、この流れの外に置きます。 第13章で扱います。
人が確認する
人の確認は必須です。 確認するのは4つです。
- 引用と原本の突き合わせ … 機械照合を通った行も、論点に関わる行は原本を開いて前後を読みます。引用が一致していても、前後を読むと意味が違うことがあります
- 日付不明の行の聞き取り … 担当者に聞き、分かったものは日付を入れて時系列へ移します。分からないまま残すことを、法務が許す運用にしてください
- 食い違いの扱い … 両方の行をそのまま残します。「こちらが正しい」と1行に直したくなりますが、そこは止めてください
- 論点候補の追加 … 機械が拾えるのは、記録どうしの食い違いと記録の欠けだけです。論点の大半は、法務と弁護士が足します
確認が終わった行には、時系列シートの「確認済み」列に印を付けます。印の無い行が残ったまま弁護士に渡さないことを、運用の決まりにします。
表の先頭に、必ず次の2行を書いてください。 「この表は、資料から機械的に抜き出したものを人が確認したものです」「この表に入っていない資料は、出どころ索引の末尾に一覧があります」。整った表ほど、これで全部だと見えてしまいます。
例外に対処する
| 起きること | どうするか |
|---|---|
| スキャンPDFのテキストが取れない | OCRにかけ、失敗したものは data_gaps に入れて人が読む |
| 引用が原本に含まれない | その行を表に出さず「要確認」のシートに回す |
| 日付が特定できない | 日付不明のシートへ。勝手に確定させない |
| 同じ出来事が複数の資料にある | 統合せず、両方の出どころを残す |
| 資料が入力の上限を超える | 段落の切れ目で分け、位置を索引に残す |
| APIがエラーを返す | 資料単位で再実行する。案件全体をやり直さない |
| 関係者が退職してメールが無い | 「取得できなかった資料」として索引の末尾に記録する |
| 相手方から新しい書面が来た | 差分だけ処理して表に追記する |
| 当事者の一覧に無い名前が出る | 立場を「不明」にし、人が一覧に足してから再実行する |
1点ずつ処理しているため、失敗した資料だけを再実行できます。 40通のメールのうち3通で失敗しても、37通の結果は残ります。案件全体をやり直す作りにしないでください。
記録を残す
案件ごとに、次を残します。
- 入力した資料のコピーと、出どころ索引
- AIが返した生のJSON(資料ID別、呼び出し日時つき)
- 人が直したあとの表と、直した差分
- 実行日時、実行者、使ったプロンプトの版
- 表の版番号と更新日(案件が動くたびに更新するため)
- 案件フォルダを誰がいつ開いたかの記録
行ごとに、AIが出したものか人が足したものかを持たせてください。 時系列シートに「出どころ区分」の列を1つ作り、抽出 と 人が追加 を入れます。あとで「この行はどこから来たのか」を答えられるようにするためです。
AIの生のJSONを捨てないでください。 人が直した結果だけを残すと、何を直したのかが分からなくなります。差分が残っていれば、プロンプトのどこを直せば次から間違えないかが見えます。 保存期間は社内の文書規程に従います。紛争案件の記録は、終わってから数年後に別の案件で参照されることがあります。
04実装レベルの3段階
推すのは半自動からです。 月12件で、1件あたり数十点の資料を扱います。毎回チャット画面に貼り直す手間が、2か月で組む手間を上回ります。 ただし、本格構成の「差分更新」だけは半自動の段階から入れてください。 案件は必ず動きます。差分更新が無いと、2回目の更新で最初から貼り直すことになり、そこで運用が止まります。 処理済みの資料IDを索引に記録し、新しい資料だけを処理して追記する。これだけで済みます。 引用の機械照合も、本格構成を待たずに入れる価値があります。 Pythonで数行です。照合に失敗した行を表から外すだけで、人が原本を開き直す回数がはっきり減ります。
05工数削減シミュレーション
導入後 12件 × 45分 ÷ 60 = 9 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 取引先や顧客とのトラブルが月に数件あり、そのたびに法務や管理部門が経緯を整理している企業。資料が担当者のメールボックスと現場のフォルダに散らばっていて、案件ごとに集め直している場合。社外の弁護士に相談する前に、事実関係を自社で整理してから渡す運用をしている企業。
- 紛争が年に数件で、そのつど資料一式を弁護士に渡して整理まで任せている場合。案件管理システムに経緯が日付順で記録されており、時系列を作り直す必要がない場合。案件の資料を外部のAPIに渡すことが社内規程で認められておらず、規程を見直す見込みも無い場合。
07最小構成で試す方法
生成AIのチャット画面だけで試せます。
終わった案件を1件選び、社名と人名を置き換えてください。 実在の案件をそのまま貼らない、というのがこの題材での最初の約束です。相手方の社名を「A社」、担当者名を「A社担当者」、自社の担当者を「当社担当者」に置き換えます。
置き換えたメール17通と議事録3本をテキストにして、資料IDと基準日を頭に付けて貼ります。第7章のプロンプトを、JSONの指定を外して「表で返してください」に変えれば、そのまま使えます。
見るのは3つです。
- すべての行に出どころが付いているか … 1行でも空なら、プロンプトの厳守事項が効いていません
- 日付不明が正しく分けられているか … 「昨年の夏ごろ」が具体的な日付になっていたら、そこが直す場所です
- 書いていないことを書いていないか … 責任、評価語、推測。1つでもあれば、出力の項目を作らない設計が必要だと分かります
法務が自分で作った時系列表と突き合わせてください。 見るのは、AIが拾って人が落としていた行がどれだけあるかです。ここで1行でも出てくれば、この仕組みを組む理由になります。
入力の上限があるため、最小構成では資料を20点程度までに絞ります。足りなければ、期間を区切って2回に分けてください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 出どころの無い行が混ざる | source_id と locator を必須項目にし、欠けた行を機械的に落とす |
| 引用が原本に無い | Pythonで原本テキストとの一致を確かめ、一致しない行を「要確認」へ回す |
| 食い違いが勝手に一本化される | 資料1点ずつ処理し、まとめるのはPythonの突き合わせだけにする |
| 「昨年の夏ごろ」が具体的な日付になる | 資料の基準日を渡し、確定できないものは日付不明の配列へ |
| 返信の引用で同じ発言が何度も並ぶ | 前処理で引用部分を落とす。ただし元のメールが無い場合は残す |
| 責任や見通しを書いてくる | スキーマにその項目を作らない。プロンプトで禁じるだけにしない |
| 期限を「過ぎている」と書いてくる | 条文と期間の定めを写す項目だけにし、判断の項目を作らない |
| 引用と構造化出力を同時に指定して400エラー | 併用できない。引用を使う呼び出しとJSONを返す呼び出しを分ける |
date に空文字を入れられない | 日付不明は時系列に入れず、別の配列に置く |
| 長い資料が入力の上限を超える | 段落の切れ目で分け、位置を索引に残す |
| 案件が動くたびに作り直している | 処理済みの資料IDを索引に持ち、差分だけ追記する |
| 同じ案件が15分おきに何度も処理される | スケジュールを毎日1回にし、急ぐときはオンデマンドで起こす |
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 相手方とのメール、社内の検討メール、議事録、契約書、検査記録、現場の記録、関係者の氏名と所属と連絡先。この情報は社外に出せない前提で設計します。
- 外部のAPIに渡す範囲を先に決める … 全部渡すのがいちばん楽ですが、それをしません。渡すのは事実を記録した資料だけです。渡さないのは、弁護士とのやり取り、社内の見通しを書いたメール、稟議と決裁の文書、見積の原価です。案件フォルダを「渡す」「渡さない」の2つに分け、渡さない側は人が読みます。 フォルダで分けておけば、機械が誤って拾いません
- 弁護士とのやり取りを分ける(秘匿特権の考え方) … 社外の弁護士との相談内容を、他の資料と同じ流れに入れません。どの資料がどういう扱いになるかは、社外の弁護士に確認してください。この記事では判断しません。 運用としては、弁護士とのやり取りを別フォルダに置き、AIにも社内の一般の利用者にも渡さない、という線を先に引きます
- 学習利用 … 入力を学習に使わないことが契約で保証されるサービスを選びます。無料版のチャット画面を業務で使わないことを、明文で決めてください
- 委託先の監督 … 個人情報保護委員会のガイドライン(通則編)は、個人データの取扱いを委託する場合に委託先への必要かつ適切な監督を求めています。示されているのは、適切な委託先を選ぶこと、契約で安全管理措置を定めること、取扱状況を把握することです。AIのサービスもワークフローのサービスも、この対象になります。 再委託がある場合も委託元が責任を負う点が示されています
- 安全管理措置は規模とリスクに応じて … 同じガイドラインは、事業の規模と性質、個人データの量と性質、媒体に伴うリスクに応じた措置を求めています。紛争案件の資料は、件数は少なくても漏れたときの影響が大きい種類です
- アクセスできる人の範囲 … 案件フォルダを、その案件に関わる人だけに絞ります。法務2名、案件の担当者、責任者。現場の全員が見られる共有フォルダに置かないでください。 ワークフローの実行アカウントにも、案件フォルダ以外の権限を与えません
- 誰が開いたかを残す … 紛争案件では、社内から相手方へ情報が流れることがあります。記録を残すことを関係者に先に伝えてください
- 社外の弁護士への渡し方を先に決める … クラウドの共有リンクを社外に開ける作りにしません。受け渡しの方法と、渡した資料の記録の取り方を、案件が起きる前に決めます
- 人が決めること … 責任の所在、相手方への回答、和解するかどうか、訴訟にするかどうか。この仕組みが出すのは、事実がどの資料のどこに書いてあるかまでです
誤りが起きた場合のリスクは、秘匿しておくべき社内の検討が外部へ出ること、誤った時系列を前提に弁護士が方針を立てること、案件に関係しない社員が経緯を読めてしまうことです。2番目は、引用の機械照合と人の読み直しの2段構えで受けます。
10まず何から始めるか
1週目:渡す資料と渡さない資料の線を引く
法務責任者と情報システムで、外部のAPIに渡してよい資料の範囲を決めます。ここが決まらないと、あとの工程は全部止まります。 終わった案件1件を使って、フォルダの分け方が実際に運用できるかを確かめます。
2週目:終わった案件1件で最小構成を試す
社名と人名を置き換えた資料20点で、チャット画面から試します。法務が自分で作った時系列表と突き合わせ、拾えていない行と、出どころの正確さを見ます。 評価語が混ざっていたら、その語をプロンプトの例に足します。
3週目:資料IDの付け方とテキスト化を決める
メールの書き出し方、PDFのOCR、ページと段落の位置の書き方を決めます。位置の書き方を先に固定してください。 あとから変えると、過去の表の位置が全部ずれます。
4週目以降: Makeで半自動を組み、新しい案件2件で回します。差分更新を最初から入れてください。 処理済みの資料IDを索引に持つだけです。
3か月目: 出来上がった表を弁護士に渡し、この形で使えるかを聞きます。弁護士が読みやすい形は、社内で読みやすい形と違うことがあります。 列の順番、引用の長さ、期限の一覧の置き場所は、ここで直します。
6か月目: 日付不明の行が多い案件の傾向を見ます。口頭のやり取りが多い現場、日報に時刻を書かない現場が見えてきます。 ここまで来ると、この仕組みは経緯を整理する道具から、あとで説明できる記録の付け方を現場に決めてもらう道具になります。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
output_config.format に {"type": "json_schema", "schema": {...}} を渡すと応答をスキーマに制約できること。オブジェクトの additionalProperties は false が必要なこと。文字列の形式に date が使えること。文字列の長さの制約と数値の範囲の制約は使えず、配列の minItems は0と1のみであること。文法のコンパイルで初回に遅延が出て、結果は24時間キャッシュされ、スキーマの構造を変えると無効になること(名前や説明文の変更では無効にならない) | Claude Docs: Structured outputs | 2026-09-24 |
各文書の citations.enabled を true にして引用を有効にできること。1つのリクエスト内の文書は全部有効か全部無効かのどちらかにすること。平文は文単位、PDFはページ単位、独自コンテンツはブロック単位で位置が返り、独自コンテンツでは追加の分割が行われないこと。引用と構造化出力は併用できず、引用を有効にした文書と output_config.format(または旧 output_format)を同時に指定すると400エラーが返ること | Claude Docs: Citations | 2026-09-24 |
| Make のシナリオが既定で15分ごとに実行され、一定間隔・1回のみ・毎日・平日・毎週・毎月・特定の日付・オンデマンドを選べること。最短の間隔は契約プランによること。詳細設定で実行期間の開始日と終了日を指定できること。即時実行のトリガーでは既定の上限が毎分100回で、超えた分はキューに入り、Webhook応答モジュールがある場合は429が返ること | Make Help: Schedule a scenario | 2026-09-24 |
| Iterator が配列を一連のバンドルに変換し、各要素が個別のバンドルになること。Array aggregator が複数のバンドルを1つにまとめるモジュールで、group by の欄でまとめ方を指定できること | Make Help: Flow control | 2026-09-24 |
| 安全管理措置について、事業の規模と性質、個人データの量と性質、媒体に伴うリスクに応じた措置を求めていること。委託先の監督について、委託先が同等の安全管理措置を講じるよう必要かつ適切な監督を行うことを求め、適切な委託先の選定、契約での安全管理措置の明示、取扱状況の把握を挙げていること。再委託がある場合も委託元が責任を負うこと | 個人情報保護委員会:ガイドライン(通則編) | 2026-09-24 |
案件の資料をどこまで外部のサービスへ渡してよいかは、社内規程、取引先との秘密保持契約、案件の内容によって異なります。この部分は個別の確認が必要です。 弁護士とのやり取りの扱いは社外の弁護士に確認してください。工事管理システムからのデータ取得の方法と、スキャンPDFのOCRの精度は、利用している製品と資料の状態によって変わります。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。この記事は事実の整理の方法を扱うもので、法的な評価や責任の所在についての判断を示すものではありません。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0215)についてのご相談はこちらから。
