他社から管理を引き継いだ物件の賃貸借契約書を読み取り、賃料・敷金・契約期間・特約を管理台帳にそろえて、引継ぎ一覧との食い違いを拾う
他社から管理を引き継いだ物件の賃貸借契約書を読み取り、賃料・共益費・敷金・契約期間・更新料・特約を管理台帳の項目にそろえます。読めない箇所と、前の管理会社の引継ぎ一覧との食い違いを拾います。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Python
- 対象業界
- その他/不動産/建設
- 対象部門
- 総務
- 対象業務
- データ入力・転記/台帳・マスタ管理
- 主な課題
- 入力作業が多い/引き継ぎができていない/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/工数削減/機会損失防止
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 前の管理会社から契約書の束と、入居者ごとの賃料の一覧を受け取る
- 束を部屋ごとに分け、契約書・更新合意書・覚書・重要事項説明書の順に並べる
- 契約書の頭書や条文から、賃料・共益費・敷金・契約期間・更新料・解約予告の期間を探す
- 更新合意書と覚書を新しい順に見て、変わった条件を上書きする
- 特約の欄を読み、原状回復・ペット・短期解約の違約金などをメモする
- 管理台帳へ打ち込み、前の管理会社の一覧と金額を見比べる
- 食い違いがあれば、前の管理会社かオーナーに問い合わせる
- 人受け取った束を部屋ごとに分け、部屋番号の付いた仕切り紙を挟んでスキャンする
- 人前の管理会社の一覧を、決まった列の並びに直して共有ドライブへ置く
- 自動スキャンの保存をきっかけに処理が動き、仕切り紙で部屋ごとのファイルに分ける
- 自動Google Document AI が全ページの文字と信頼度を返す
- 自動OpenAI API が書類の種類と日付を判定し、管理台帳の項目に値と根拠の文字列を入れる
- 自動根拠の文字列が読み取り結果に本当にあるかを確かめ、無いものを `unverified` にする
- 自動書類の日付の新しい順に条件を重ね、今の条件を組み立てる
- 自動前の管理会社の一覧と突き合わせ、食い違いを理由付きで出す
- 人引継ぎ担当が、食い違いと `unverified` と判読不能の項目だけを原本で確かめる
- 人確認の済んだ部屋を管理台帳へ取り込み、食い違いを前の管理会社へ問い合わせる
各工程の詳しい説明を読む
- 前の管理会社から契約書の束と、入居者ごとの賃料の一覧を受け取る
- 束を部屋ごとに分け、契約書・更新合意書・覚書・重要事項説明書の順に並べる
- 契約書の頭書や条文から、賃料・共益費・敷金・契約期間・更新料・解約予告の期間を探す
- 更新合意書と覚書を新しい順に見て、変わった条件を上書きする
- 特約の欄を読み、原状回復・ペット・短期解約の違約金などをメモする
- 管理台帳へ打ち込み、前の管理会社の一覧と金額を見比べる
- 食い違いがあれば、前の管理会社かオーナーに問い合わせる
(a)最新の条件が書類の束の中に散らばっている。 4番目の作業は、書類の日付を見て新しい順に並べ直すところから始まります。更新合意書で賃料が下がり、その後の覚書で駐車場が足された部屋では、3枚を読まないと今の月額が出ません。
(b)一覧と契約書の食い違いが、見比べの最後に回る。 6番目の見比べは、打ち込みが終わってからの作業です。期限が迫ると、一覧の値をそのまま台帳に入れて、見比べを後回しにすることになります。そのまま最初の請求が出ると、借主から指摘されて初めて分かります。
(c)特約が台帳に残らない。 5番目のメモは担当者の手元に残り、台帳の項目にはなりません。退去のときに「この部屋の原状回復の特約は」と聞かれて、また契約書を開きます。
(d)連帯保証の条件が読み落とされる。 国土交通省の資料では、令和2年4月1日施行の改正民法で連帯保証人について極度額を設定する必要があるとされています。入居の時期によって、極度額の欄がある契約と無い契約が混ざります。 台帳に契約の時期と極度額の有無を持たせないと、後から確かめる手がかりがありません。
- 【人】 受け取った束を部屋ごとに分け、部屋番号の付いた仕切り紙を挟んでスキャンする
- 【人】 前の管理会社の一覧を、決まった列の並びに直して共有ドライブへ置く
- 【自動】 スキャンの保存をきっかけに処理が動き、仕切り紙で部屋ごとのファイルに分ける
- 【自動】 Google Document AI が全ページの文字と信頼度を返す
- 【自動】 OpenAI API が書類の種類と日付を判定し、管理台帳の項目に値と根拠の文字列を入れる
- 【自動】 根拠の文字列が読み取り結果に本当にあるかを確かめ、無いものを
unverifiedにする - 【自動】 書類の日付の新しい順に条件を重ね、今の条件を組み立てる
- 【自動】 前の管理会社の一覧と突き合わせ、食い違いを理由付きで出す
- 【人】 引継ぎ担当が、食い違いと
unverifiedと判読不能の項目だけを原本で確かめる - 【人】 確認の済んだ部屋を管理台帳へ取り込み、食い違いを前の管理会社へ問い合わせる
6番目がこの構成の要です。 生成AIが返した値は、読み取り結果の中に同じ文字列があるものだけを採用します。 契約書に無い数字を台帳に入れないための、機械の側の歯止めです。
7番目は、規則で決めます。 どの書類が新しいかは書類の日付で決まり、生成AIの判断に任せる必要がありません。変わった項目だけを上書きし、変わっていない項目は古い書類の値を残します。
9番目で人が見るのは、全部の項目ではありません。 一覧と一致し、根拠も確かめられた項目は流し見で済ませ、食い違いと根拠の無い項目に時間を使います。
02今回想定するシステム構成
引き継いだ契約書の束(紙・スキャンPDF)+前の管理会社の一覧 │ 部屋番号の仕切り紙を挟んでスキャン ▼【トリガー】共有ドライブの受付フォルダへの保存 Python ── 仕切り紙で部屋ごとに分ける ▼ Google Document AI(Enterprise Document OCR) │ 全ページの文字、文字ごとの信頼度、画像の品質スコア ▼ OpenAI API ── 書類の種類と日付、台帳の項目の値と根拠の文字列(構造化出力) ▼ Python ── 根拠の照合、新しい順の重ね合わせ、一覧との突き合わせ ▼ 判定(ok / mismatch / unverified / unreadable) ▼ 【人が食い違いと根拠の無い項目だけ確認】 ▼ 管理台帳へ取り込み/前の管理会社へ問い合わせ
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Enterprise Document OCR、Form Parser) | Azure AI Document Intelligence |
| 生成AI | OpenAI API(書類の種類と日付の判定、台帳の項目への値のそろえ、特約の分類) | Claude API、Gemini API |
| 差異計算 | Python(根拠の文字列の照合、新しい順の重ね合わせ、一覧との突き合わせ) | 管理システムの取り込み時の確認 |
| 連携 | Python(受付フォルダの監視、仕切り紙での分割、取り込み用のファイルの書き出し) | 既存の連携の仕組み |
| 保管 | 共有ドライブ(契約書の束のスキャン) | 管理システムの文書の添付 |
管理台帳の賃貸管理システムは、いまのものを使います。 多くの管理システムには、入居者と契約の情報を決まった列のファイルで取り込む機能があります。この構成は、その取り込み用のファイルを作るところまでで、管理システムへ直接書き込みません。 取り込みの形式は製品ごとに違うため、この部分は使っている管理システムに合わせた個別の対応になります。
OCRに Google Document AI を選ぶのは、日本語の印字と手書きを同じプロセッサで読めるからです。 Enterprise Document OCR は一般提供(GA)で、対応言語の表で日本語に手書きの対応が付いています。賃料の欄だけ手書きで書き込まれた契約書が多いので、手書きに対応していることが前提になります。
Form Parser を主役にしないのは、契約書の頭書の表が複雑だからです。 Form Parser の表の読み取りは、行や列をまたぐセルの無い単純な表が対象とされています。標準契約書の頭書は、項目名のセルが縦に結合された表です。そこで全文の読み取りを主にし、Form Parser は単純な表の書類(覚書の金額の表など)にだけ使います。
生成AIに OpenAI API を選ぶのは、構造化出力でスキーマへの準拠を指定できるからです。 Responses API では text.format に type: "json_schema" と strict: true を指定します。
03どうやって実装するのか
処理の起点を決める
共有ドライブの受付フォルダにスキャンのPDFが保存されたことを起点にします。 管理替えでは、1棟分の束がまとめて届くことが多いので、1棟を1回のスキャンで読み込み、仕切り紙で部屋ごとに分けます。
仕切り紙は、部屋番号と2次元コードを印刷したA4の紙です。引継ぎ担当が束を部屋ごとに分けるとき、部屋の先頭に1枚挟むだけにします。部屋ごとにスキャンを分けるより、1棟まとめて読むほうがスキャナの前に立つ時間が短く済みます。
監視は Python の常駐の処理で行い、保存から数分おきに新しいファイルを拾います。 引継ぎ担当が待つ必要は無いので、即時でなくて構いません。処理が終わったファイルは処理済みへ移し、移すのは全部屋の処理が成功したときだけにします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 契約書の束のスキャン | 1棟分のPDF。仕切り紙で部屋ごとに分かれる | 受付フォルダ |
| 前の管理会社の一覧 | 部屋番号、借主名、賃料、共益費、駐車場、敷金の預かり額、契約期間 | 共有ドライブ(決まった列に直したもの) |
| 物件の情報 | 物件名、部屋番号の一覧、管理の開始日 | 管理システムの物件の登録 |
| 項目の定義 | 台帳の項目と、契約書での呼び方のゆれ(「家賃」「賃料」「月額使用料」など) | 自社で作る一覧 |
前の管理会社の一覧は、列の並びを決まった形に直してから置きます。 会社ごとに列の名前が違うので、直さずに渡すと突き合わせの列を取り違えます。 直す作業は人が行い、1社につき1回で済みます。
項目の呼び方のゆれの一覧が、読み取りの質を決めます。 「保証金」と「敷金」、「管理費」と「共益費」を同じものとして扱うか、別のものとして扱うかは、自社の台帳の決まりです。生成AIに任せず、一覧で決めて渡します。
データの取得方法を決める
- 仕切り紙で分ける … 2次元コードを読んだページで区切り、部屋番号を付けたファイルにします
- Enterprise Document OCR を呼ぶ … 部屋ごとのファイルを送ります。同期の処理は15ページまで、まとめて送る処理は500ページまでとされているので、15ページを超える部屋はまとめて送る処理にします
- 文字ごとの信頼度と画像の品質スコアを受け取る …
enableSymbolを有効にし、画像の品質スコアも有効にします - 単純な表の書類だけ Form Parser にかける … 覚書の金額の表のように、結合したセルの無い表だけです
| 取るもの | 何に使うか |
|---|---|
| 全ページの文字と、ページ・位置 | 書類の種類と日付の判定、値と根拠の文字列 |
| 文字ごとの信頼度 | 金額と日付の数字が崩れていないかの印 |
| 画像の品質スコア | 0.5を下回ると理由が返る。スキャンし直すかの判断 |
| Form Parser の表(単純な表のみ) | 覚書の金額の行と列 |
金額の欄の信頼度を、文字ごとに見るのが大事です。 「85,000」の「8」だけが低いとき、それは「35,000」かもしれません。金額のどの桁が崩れているかが分かれば、原本のどこを見ればよいかがすぐ分かります。
AIへ渡す前に整形する
- 仕切り紙の確認 … 2次元コードが読めない仕切り紙があれば、その前後の部屋を止めて人へ戻します
- 画像の品質の確認 … 品質スコアが0.5を下回り、
defect_faintやdefect_darkが付いたページはスキャンし直します。古い契約書の写しは、薄いことが多いです - 解像度と圧縮の確認 … スキャンは最低200dpi、300dpi以上が一般に最も良い結果になるとされています。スキャナを300dpiに固定し、非可逆の高圧縮を使いません
- ページの向きと白紙の除去 … 裏が白紙のページを除き、向きをそろえます
- 個人情報の欄を分ける … 借主・連帯保証人の氏名・住所・電話番号・勤務先の範囲は、生成AIに送る文字から外します。部屋番号で結び直します
- 前の管理会社の一覧を部屋番号で引ける形にする … 部屋番号の表記(「101」「1-01」「101号室」)をそろえます
5番目は、外部へ送る範囲を決める作業です。 台帳の項目に借主の氏名は要りますが、それは前の管理会社の一覧と管理システムから取れます。生成AIに渡すのは、金額・期間・特約の文字だけで足ります。
AIに処理させる
させるのは3つです。 書類の種類と日付の判定、台帳の項目への値と根拠の文字列のそろえ、特約の分類です。
| 項目 | させること | させないこと |
|---|---|---|
| 書類の種類 | 契約書/更新合意書/覚書/重要事項説明書/その他 | 書類の有効性の判断 |
| 書類の日付 | 契約日・合意日として書かれた日付 | 日付が無い書類の日付の推定 |
| 賃料・共益費・駐車場 | 月額と、根拠の文字列 | 税込・税抜の換算、日割の計算 |
| 敷金・保証金 | 金額または「賃料の何か月分」と、根拠 | 何か月分から金額への計算 |
| 契約期間 | 始期・終期と、根拠 | 更新後の期間の推定 |
| 更新料・更新事務手数料 | 金額または「新賃料の何か月分」と、根拠 | 書かれていない更新料の補完 |
| 契約の形 | 普通借家か定期借家か、根拠 | 定期借家として有効かの判断 |
| 連帯保証 | 連帯保証人の有無、極度額の記載の有無と金額、保証会社の名称 | 保証の有効性の判断 |
| 特約 | 文言をそのまま写し、分類(原状回復/ペット/短期解約/その他)を付ける | 特約の要約、有効性の判断 |
「計算をしない」を全部の行に通します。 敷金が「賃料の2か月分」と書かれているとき、金額にするのは Python の仕事です。生成AIに計算させると、どの賃料(当初か更新後か)を使ったかが分からなくなります。
国土交通省の標準契約書の頭書には、賃料・共益費・敷金・その他一時金・附属施設使用料の欄があり、更新料の欄はありません。 更新料は本文の条文か、第19条の特約条項の欄に書かれていることが多いので、特約の中から金額を拾う指示を入れます。
指示内容を固定する
あなたは賃貸管理会社で、他社から引き継いだ賃貸借契約の書類を読み、
管理台帳の項目に値をそろえる担当です。法的な判断は一切しません。
【入力】1つの部屋の書類の束のOCR結果(ページ番号付き)。
借主等の氏名・住所・連絡先は除いてあります。
【やること】
1. 書類ごとに、種類(contract / renewal / memorandum / explanation / other)と、
契約日・合意日として書かれた日付を返してください。
2. 書類ごとに、台帳の項目の値と、その根拠にした文字列を返してください。
3. 特約は、文言をそのまま写し、分類を付けてください。
【厳守事項】
- evidence には、OCR結果に実際にある文字列を、一字も変えずに写してください。
見つからない値は value を空にし、status を missing にしてください。
- 金額の計算をしないでください。「賃料の2か月分」は、その文字列のまま
value_text に入れ、value_yen は空にしてください。
- 税込・税抜、日割、端数の処理をしないでください。
- 書類に日付が無い場合、日付を推定しないでください。document_date を空にしてください。
- 前の書類の値で、後の書類の空欄を埋めないでください。書類ごとに、
その書類に書かれていることだけを返してください。
- 手書きで訂正された金額は、訂正後の文字列を value_text に入れ、
corrected を true にしてください。
- 特約を要約しないでください。有効か無効かを書かないでください。
- 項目の呼び方は【項目の呼び方の一覧】に従ってください。一覧に無い呼び方は
other に入れ、原文の項目名を残してください。
【項目の呼び方の一覧】{field_aliases}
【OCR結果】{ocr_pages}
「前の書類の値で、後の書類の空欄を埋めない」が要です。 更新合意書には変わった項目しか書かれていないことが多く、何も言わなければ生成AIは契約書の値で空欄を埋めます。埋めた瞬間、その項目が更新で変わったのか、変わっていないのかが分からなくなります。 重ね合わせは第5章の7番目のとおり、Python が書類の日付で行います。
出力形式を固定する
次の形のJSONで受け取ります。
{
"room_no": "",
"documents": [
{
"doc_type": "contract | renewal | memorandum | explanation | other",
"document_date": "",
"pages": [0],
"fields": [
{ "item": "rent", "value_text": "", "value_yen": "",
"status": "found | missing | unreadable",
"corrected": false, "evidence": "", "page": 0 }
],
"special_terms": [
{ "category": "restoration | pet | early_termination | other",
"text": "", "page": 0 }
]
}
]
}
item は rent / common_fee / parking / deposit / lease_start / lease_end / renewal_fee / lease_type / guarantor / guarantee_limit / guarantee_company / notice_period です。
1つ目の理由は、書類ごとに値を持てることです。 今の条件を1つにまとめて返させると、どの書類のどの値を採ったかが消えます。書類ごとに返させ、重ね合わせは Python の規則で行うので、後から根拠をたどれます。
2つ目は、evidence を機械で確かめられることです。 Python は、evidence の文字列がOCR結果のそのページに本当にあるかを照合し、無ければ unverified にします。 OpenAI API の構造化出力は、strict: true でスキーマへの準拠を指定でき、すべての項目を required に並べ、additionalProperties: false を付けます。項目が欠けたJSONが返ってこないので、照合の処理が単純になります。
3つ目は、拒否を分けて扱えることです。 公式ページでは、安全上の理由でモデルが応じない場合、スキーマに従わない refusal が返るとされています。refusal が返った部屋は処理を止めて人へ回し、空のJSONとして扱いません。
Python が組み立てる、部屋ごとの今の条件と突き合わせの結果は次の表になります。
| 項目 | 契約書 | 最新の書類 | 今の条件 | 引継ぎ一覧 | 判定 |
|---|---|---|---|---|---|
| 賃料 | 85,000 | 82,000(更新合意書) | 82,000 | 85,000 | mismatch |
| 共益費 | 3,000 | - | 3,000 | 3,000 | ok |
| 敷金 | 賃料の2か月分 | - | 170,000 | 85,000 | mismatch |
敷金の行のように、計算を Python に置くと理由が書けます。 「当初の賃料85,000円の2か月分」と書けば、前の管理会社の一覧が1か月分で入っているのか、一部を返したのかを問い合わせる文面になります。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 共有ドライブの受付フォルダ | Python の監視 | スキャンの保存を検知する |
| Google Document AI | API呼び出し | 全ページの文字、信頼度、品質スコア |
| OpenAI API | API呼び出し(構造化出力) | 書類の種類・日付、項目の値、特約の分類 |
| 確認の一覧 | 共有ドライブの表 | 部屋ごとの今の条件と判定 |
| 管理システム | 取り込み用のファイル | 確認の済んだ部屋だけを書き出す |
取り込み用のファイルに書き出すのは、引継ぎ担当が確認を済ませた部屋だけです。 mismatch や unverified が残っている部屋は書き出しません。未確認の値が台帳に入り、最初の請求に使われることを防ぎます。
確認の一覧は、1棟を1枚の表にします。 行が部屋、列が項目で、各セルに今の条件と判定を並べます。mismatch のセルには「契約書82,000(更新合意書 p.3)/一覧85,000」のように両方の値と根拠のページを出します。引継ぎ担当は、原本のどのページを開けばよいかを表から直接たどれます。1棟のうち判定が残っている部屋の数を表の先頭に出し、0になった棟から取り込みます。
人が確認する
mismatchを先に見る … 契約書と一覧のどちらが正しいかを原本で確かめます。どちらにも根拠がある場合は、前の管理会社に問い合わせますunverifiedとunreadableを見る … 根拠の文字列が見つからない値、読めない金額を原本で確かめます- 手書きの訂正(
corrected)を見る … 訂正印の有無と、訂正後の金額を確かめます - 特約の分類を見る … 分類が合っているか、写しが原文と合っているかを確かめます。有効性の判断はしません
- 確認の済んだ部屋を取り込む … 判定の残っていない部屋だけを書き出します
1番目を省かないでください。 一覧の値に合わせて契約書の読み取りを直すのは簡単ですが、一覧のほうが誤っていることがこの業務で見つけたいことです。
目標は、240件をならして1件5分です。 一覧と一致し、根拠の確かめられた部屋は流し見で済みます。問い合わせが要る部屋が、平均を引き上げます。
例外に対処する
| 起きること | 対応 |
|---|---|
| 仕切り紙が読めない・抜けている | 前後の部屋を止め、束を分け直してスキャンし直す |
| 画像の品質スコアが0.5未満 | 理由を一覧に出し、原本をスキャンし直す |
| 1部屋の書類が15ページを超える | まとめて送る処理(500ページまで)に回す |
| 書類に日付が無い | 重ね合わせの順が決まらない。人が書類の順を決める |
| 契約書が無く、一覧だけがある | 台帳には一覧の値を入れ、「契約書なし」の印を付けて前の管理会社に原本を求める |
| 定期借家の契約 | 更新ではなく再契約になる。lease_type で分け、更新の案内の対象から外す |
| 法人契約・社宅代行 | 借主が法人の契約は、一覧の借主名と突き合わせて別に印を付ける |
| 手書きの訂正に訂正印が無い | corrected で出し、人が原本で確かめる |
refusal が返った | 処理を止めて人へ回す。空のJSONとして扱わない |
| Document AI や OpenAI API が応答しない | 受付フォルダに残す。処理済みへ移すのは全部屋の成功時だけ |
4行目と5行目は、古い物件ほど多く出ます。 日付の無い覚書や、入居者が何代も替わって契約書が見つからない部屋です。この2つは、読み取りの工夫では片づきません。 引継ぎの最初の打ち合わせで、前の管理会社に書類の欠けを伝える材料にします。
記録を残す
- 契約書の束のスキャンの原本と、仕切り紙で分けた部屋ごとのファイル
- Document AI が返したJSONの全文と、画像の品質スコア
- OpenAI API の出力と、
evidenceの照合の結果 - 部屋ごとの今の条件の組み立て(どの書類のどの値を採ったか)
- 前の管理会社の一覧(受け取ったまま)と、列を直したもの
- 人が直した記録と、前の管理会社への問い合わせと回答
4つ目を残すのは、引継ぎの後に条件を聞かれたとき答えるためです。 借主から「賃料はいつから82,000円か」と聞かれたら、どの更新合意書から採ったかをすぐ示せます。
5つ目で、受け取ったままの一覧を残すのも同じ理由です。 食い違いがどちらの誤りだったかを、後から説明できるようにします。
04実装レベルの3段階
最小構成では件数がさばけません。 1部屋ずつ貼るので、1棟分でも半日かかります。確かめるための段階です。 半自動化で、1件15分が9分程度になります。 値の取り出しは自動になりますが、新しい順の重ね合わせと一覧との見比べは人が行います。本格構成で5分になり、この段階が本記事の想定です。 差が大きいのは、重ね合わせと突き合わせが、部屋ごとに書類を行き来する作業だからです。
05工数削減シミュレーション
導入後 240件 × 5分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- オーナーからの管理替えで、他社が管理していた物件を毎月まとめて引き継いでいる賃貸管理会社。前の管理会社から紙の契約書の束やスキャンのPDFと、入居者ごとの賃料の一覧を受け取り、管理台帳へ手で打ち直している場合。契約書の書式が前の管理会社やオーナーごとに違い、更新合意書や覚書で条件が変わっている契約が混ざる場合。
- 引き継ぐ物件が年に数棟で、契約書を1件ずつ読んでも負担になっていない場合。前の管理会社から管理システムのデータを項目ごとに受け取れ、契約書は原本の保管だけでよい場合。特約が有効かどうか、借主に請求できるかといった法的な判断を自動化したい場合、この構成では代替できません。
07最小構成で試す方法
- 引き継いだ物件から20部屋を選ぶ(更新合意書や覚書で条件が変わった部屋を半分以上入れる)
- 借主・連帯保証人の氏名や住所の部分を黒く塗りつぶしてからスキャンする
- Document AI の Enterprise Document OCR を管理画面から試し、手書きの金額がどう読めるかを見る
- 読み取った全文を手元のAIサービスに貼り、「書類ごとに種類と日付、賃料・共益費・敷金・契約期間・更新料を、根拠の文字列付きで出してください。計算と補完をしないでください」と指示する
- 出てきた値を、引継ぎ担当が台帳に入れた値と突き合わせる
1番目の「半分以上」が大事です。 条件が変わっていない部屋ばかりで試すと、重ね合わせの難しさが見えないまま次へ進んでしまいます。
| 出てきた内容 | 判断 |
|---|---|
| 書類ごとの値と根拠が正しく出た | 重ね合わせと突き合わせを Python で組む段階に進む |
| 更新合意書の空欄を契約書の値で埋めた | 指示の書き方で直る。構成は有効 |
| 敷金を金額に計算した | 指示で直る。計算は Python に移す |
| 手書きの金額がほとんど読めない | スキャンの設定が先。 300dpiと圧縮を見直す |
2行目は、ほぼ必ず出ます。 失敗ではなく、書類ごとに返させる設計が要る理由が、試しの段階で見えたということです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 更新合意書の空欄が契約書の値で埋まる | 書類ごとに返させ、重ね合わせは Python で行う |
| 契約書に無い金額が台帳に入る | evidence をOCR結果と照合し、無ければ unverified |
| 敷金の「何か月分」が誤った賃料で計算される | 計算を Python に置き、どの賃料を使ったかを残す |
| 頭書の結合した表が崩れて読まれる | Form Parser の表は単純な表が対象。全文の読み取りを主にする |
| 手書きの金額の1桁が崩れる | 文字ごとの信頼度で印を付け、原本で確かめる |
| 古い写しが薄くて読めない | 品質スコアの理由を見て、スキャンし直す |
| 一覧の値に合わせて読み取りを直してしまう | 一覧も誤りうる前提で、どちらにも根拠を求める |
| 保証金と敷金、管理費と共益費が混ざる | 呼び方のゆれの一覧で、自社の台帳の決まりを渡す |
| 定期借家に更新の案内が出る | lease_type で分け、再契約として扱う |
| 極度額の欄の有無が見落とされる | guarantee_limit を項目として持ち、空なら印を付ける |
| 特約の有効性まで書いてしまう | 分類と写しまでにし、判断は宅建士・弁護士に回す |
refusal を空の結果として扱う | 止めて人へ回す |
上の2行が、この構成の失敗のほとんどです。 どちらも「契約書に書かれていない値が台帳に入る」という同じ結果になります。根拠の文字列を機械で照合しているかどうかで、運用に乗るかが決まります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 借主と連帯保証人の氏名・住所・連絡先・勤務先、賃料と敷金の額、家賃債務保証会社の名称、特約の文言、オーナーの情報です。
- 生成AIに送る範囲を、金額・期間・特約の文字に限る … 借主等の氏名・住所の範囲は前処理で外します。台帳の氏名は、前の管理会社の一覧と管理システムから取ります
- APIのデータの扱いを確かめる … OpenAI API に送ったデータの保持と学習への利用の条件を、自社の契約と設定で使い始める前に確かめます
- 特約の有効性を判断させない … 分類と写しまでです。借主への請求の可否は、宅地建物取引士や弁護士の判断です
- 台帳へ未確認の値を入れない …
mismatchとunverifiedが残る部屋は取り込みません。最初の請求は台帳の値で出るので、ここが最後の歯止めです - 前の管理会社から受け取った書類の扱いを決める … 原本を受け取るのか写しなのか、オーナーとの管理委託契約で引継ぎ書類の扱いを確かめます
- スキャンの保存先を限る … 1棟分の借主の情報がまとまったファイルです。共有ドライブの権限を引継ぎ担当に限ります
誤りが起きた場合のリスクは、誤った賃料で請求することと、敷金の預かり額を誤って台帳に残すことです。 前者は借主との信頼を、後者は退去のときの精算を損ねます。どちらも、根拠の照合と一覧との突き合わせを全件で行うことで、引継ぎの月のうちに止めます。
10まず何から始めるか
1週目:項目と一覧の形を決める
管理台帳の項目について、契約書での呼び方のゆれを一覧にします。保証金と敷金、管理費と共益費を同じに扱うかを、ここで決めます。 あわせて、前の管理会社の一覧を直す決まった列の並びを作ります。
2週目:20部屋で試す
条件が変わった部屋を半分以上入れて20部屋を選び、氏名などを塗りつぶしてから読み取りと値の取り出しを試します。更新合意書の空欄が埋められていないかを最優先で見ます。
3週目:仕切り紙を作り、1棟で回す
部屋番号と2次元コードを印刷した仕切り紙を作り、1棟分の束を1回でスキャンして部屋ごとに分けるところまで作ります。
4週目:根拠の照合と重ね合わせを組む
evidence の照合と、書類の日付による重ね合わせを Python で組みます。この時点では一覧との突き合わせはせず、今の条件の組み立てが正しいかだけを見ます。
2か月目: 前の管理会社の一覧との突き合わせと、取り込み用のファイルの書き出しを足します。mismatch の件数と、問い合わせの結果を毎週数えます。3か月目以降: 1件15分が何分になったかを実測します。問い合わせの結果を見て、どの前の管理会社の一覧に誤りが多いかが分かった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| Enterprise Document OCR と Form Parser が一般提供(GA)であること。Enterprise Document OCR の対応言語の表で日本語(ja)に手書きの対応が付いていること。同期の処理の上限が15ページ、まとめて送る処理の上限が Enterprise Document OCR で500ページであること | Google Cloud: Processor list | 2026-10-06 |
enableSymbol で1文字ずつのデータが返ること。画像の品質スコアが0から1で返り、0.5を下回ると8種類の理由が返ること | Google Cloud: Enterprise Document OCR | 2026-10-06 |
| Form Parser がキーと値のペア、表、選択マーク等を取り出すこと。表は行や列をまたぐセルの無い単純な表が対象であること | Google Cloud: Form Parser | 2026-10-06 |
| スキャンは最低200dpi、300dpi以上が一般に最も良い結果になるとされていること。非可逆の形式でファイルを小さくすると精度が落ちうること | Google Cloud: Supported files | 2026-10-06 |
Responses API の構造化出力が text.format に type: "json_schema" と strict: true を指定して使うこと。すべての項目を required に並べ、additionalProperties: false を付けること。安全上の理由で応じない場合に refusal が返り、スキーマに従わないこと | OpenAI API: Structured Outputs | 2026-10-06 |
| 賃貸住宅標準契約書が賃貸借契約書のひな形(モデル)で、使用が法令で義務づけられているものではないこと。平成30年3月版に家賃債務保証業者型と、極度額の記載欄を設けた連帯保証人型があること。令和2年4月1日施行の改正民法で連帯保証人について極度額を設定する必要があること | 国土交通省: 『賃貸住宅標準契約書』について | 2026-10-06 |
| 標準契約書(連帯保証人型)の頭書に、契約期間の始期・終期、賃料・共益費・敷金・その他一時金・附属施設使用料、管理業者の賃貸住宅管理業者登録番号、連帯保証人及び極度額の欄があること。第2条で協議の上更新できるとされ、第19条が特約条項であること | 国土交通省: 賃貸住宅標準契約書 平成30年3月版・連帯保証人型(PDF) | 2026-10-06 |
特約の有効性、敷金の精算、借主への請求の可否は、宅地建物取引士・弁護士とオーナーとの取り決めに従ってください。 本記事は Google Cloud、OpenAI、国土交通省のページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0595)についてのご相談はこちらから。
