公立図書館が利用者の手書きの購入リクエストカードを読み取り、書名・著者・出版社を選書の候補一覧に転記して、所蔵済みのものを拾う
利用者が手で書いた購入リクエストカードを読み取り、書名・著者・出版社を選書の候補一覧に転記します。書誌の候補を引いて ISBN をそろえ、所蔵済み・発注中・未所蔵の区分を付けて司書の確認に回します。
- 生成AI
- Azure OpenAI Service/Claude
- AIサービス
- AWS Textract/Azure AI/Google Document AI
- 対象業界
- 教育/自治体
- 対象部門
- 購買
- 対象業務
- データ入力・転記/情報検索
- 主な課題
- 人手が足りない/入力作業が多い/情報が見つからない
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 対応スピード向上/工数削減/検索時間短縮
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 各館のカウンターで利用者がカードを書き、職員が受付日と受付館を書き足す
- 分館のカードは週2回の連絡便で中央館に届く
- 資料係が1枚ずつ書名と著者で図書館システムの蔵書検索をする
- 見つからなければ、書名を変えて検索し直し、出版社の情報や書誌のデータベースで本を特定する
- 所蔵済みなら予約に切り替え、発注中なら発注の情報に予約を付ける
- 未所蔵なら、書名・著者・出版社・ISBN・希望の理由を選書の候補一覧に入力する
- 利用者に結果を連絡する。カードは処理済みの箱に入れて一定期間保管する
- 人各館の職員がカードに受付日と受付館を書き足し、その館の複合機でスキャンする
- 自動スキャンしたPDFの保存をきっかけに処理が動き、1枚ずつに分けて向きと解像度を確かめる
- 自動Azure AI Document Intelligence のカスタム テンプレート モデルが、書誌の欄、利用者の欄、チェック欄を信頼度つきで返す
- 自動利用者の欄を切り離し、予約と連絡の処理用の保管先にだけ置く
- 自動生成AIが、書かれた書名・著者・出版社から書誌を探すための検索語を作る。書名を言い換えて決めることはしない
- 自動国立国会図書館サーチの API で書誌の候補を引き、ISBN と出版社と出版年をそろえる
- 自動候補の ISBN と書名で、自館の所蔵・発注中・予約の一覧を照らす
- 自動カードごとに `所蔵済み` / `発注中` / `未所蔵` / `特定できず` を付け、同じ本の希望をまとめる
- 人司書が確認の一覧で、候補の中からその本を選び、区分を確かめる
- 人所蔵済み・発注中は予約に切り替え、未所蔵は選書の候補一覧に確定する
- 人選書会議で、購入するかどうかを決める
各工程の詳しい説明を読む
- 各館のカウンターで利用者がカードを書き、職員が受付日と受付館を書き足す
- 分館のカードは週2回の連絡便で中央館に届く
- 資料係が1枚ずつ書名と著者で図書館システムの蔵書検索をする
- 見つからなければ、書名を変えて検索し直し、出版社の情報や書誌のデータベースで本を特定する
- 所蔵済みなら予約に切り替え、発注中なら発注の情報に予約を付ける
- 未所蔵なら、書名・著者・出版社・ISBN・希望の理由を選書の候補一覧に入力する
- 利用者に結果を連絡する。カードは処理済みの箱に入れて一定期間保管する
(a)書名がうろ覚えで、検索が1回で当たらない。 「〇〇の作り方の本(黄色い表紙)」「テレビで紹介された本」のように、書名が正確でないカードが少なくありません。 資料係は検索語を変えながら何度も引き、1枚に何分もかかるカードが毎週何十枚も出ます。
(b)所蔵済みの本がリクエストされる。 貸出中で棚に無い本を、利用者は「無い本」と思って購入を希望します。検索が当たらないまま未所蔵として候補一覧に入ると、同じ本を2冊目として選書会議にかけることになります。 会議の場で気づけばよいのですが、気づかずに発注することもあります。
(c)手書きの字が読めない。 子どもの字、崩した字、カタカナの外国人の著者名は、読み違えると検索が当たりません。 読めないカードは受付館に問い合わせますが、受け付けた職員も覚えていないことがあります。
(d)同じ本の希望が分館ごとに別々に届く。 話題の本は複数の館で同じ週にリクエストされ、1件ずつ処理すると、候補一覧に同じ本が何行も並びます。 何人が希望したかは選書の材料になるのに、集計は手作業です。
- 【人】 各館の職員がカードに受付日と受付館を書き足し、その館の複合機でスキャンする
- 【自動】 スキャンしたPDFの保存をきっかけに処理が動き、1枚ずつに分けて向きと解像度を確かめる
- 【自動】 Azure AI Document Intelligence のカスタム テンプレート モデルが、書誌の欄、利用者の欄、チェック欄を信頼度つきで返す
- 【自動】 利用者の欄を切り離し、予約と連絡の処理用の保管先にだけ置く
- 【自動】 生成AIが、書かれた書名・著者・出版社から書誌を探すための検索語を作る。書名を言い換えて決めることはしない
- 【自動】 国立国会図書館サーチの API で書誌の候補を引き、ISBN と出版社と出版年をそろえる
- 【自動】 候補の ISBN と書名で、自館の所蔵・発注中・予約の一覧を照らす
- 【自動】 カードごとに
所蔵済み/発注中/未所蔵/特定できずを付け、同じ本の希望をまとめる - 【人】 司書が確認の一覧で、候補の中からその本を選び、区分を確かめる
- 【人】 所蔵済み・発注中は予約に切り替え、未所蔵は選書の候補一覧に確定する
- 【人】 選書会議で、購入するかどうかを決める
9番目が、この設計の分かれ目です。 候補が1件に絞れ、所蔵の照合も当たったカードは一覧で流し見て終わりにし、候補が複数のカードと特定できなかったカードにだけ時間を使います。
5番目で生成AIに書名を決めさせないのは、意図してのことです。 「料理の本(黄色い表紙)」から、生成AIはそれらしい書名を1つ作れます。作った書名で所蔵を照らすと、実在しない本が未所蔵として候補一覧に入ります。 生成AIは検索語を作るだけにし、本があるかどうかは書誌の検索の結果で確かめます。
02今回想定するシステム構成
購入リクエストカード(手書き。書誌の欄・利用者の欄・チェック欄) │ 各館の複合機でスキャン(300dpi、PDF) ▼【トリガー】スキャンの保存先フォルダへの保存 Azure Functions ├──▶ 1枚ずつに分割、向き・解像度の確認 ▼ Azure AI Document Intelligence(カスタム テンプレート モデル) │ 書名・著者・出版社・出版年・理由、利用者番号・氏名、チェック欄、各信頼度 ▼ Azure Functions ── 利用者の欄を切り離して予約用の保管先へ ▼ Azure OpenAI ── 書誌を探す検索語の組み立て(構造化出力) ▼ 国立国会図書館サーチ API(OpenSearch)── 書誌の候補、ISBN、出版社、出版年 ▼ Azure Functions ── 自館の所蔵・発注中・予約の一覧と照合、同じ本の希望をまとめる ▼ 判定(所蔵済み / 発注中 / 未所蔵 / 特定できず) ▼ 【司書が候補を選んで確認】 ├──▶ 予約への切り替え(図書館システムの画面で) └──▶ 選書の候補一覧へ
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Azure AI Document Intelligence(カスタム テンプレート モデル) | Google Document AI(Form Parser)、AWS Textract(英文の書類に限る。日本語のカードには使えない) |
| 生成AI | Azure OpenAI(Microsoft Foundry)(書誌を探す検索語の組み立て。構造化出力) | Claude API |
| 連携 | Azure Functions(保存を起点に読み取りを呼び、書誌の照会と所蔵の照合をして一覧に書き出す) | Azure Logic Apps |
| 書誌の照会 | 国立国会図書館サーチ API(OpenSearch) | 図書館システムの書誌データベース、取次の書誌データ |
図書館システムは新しく足すものではありません。 この構成は所蔵・発注中・予約の一覧を読むだけで、予約への切り替えは司書が図書館システムの画面で行います。所蔵の一覧は、図書館システムから毎日書き出してもらう形で足ります。
読み取りの土台は、Document Intelligence のカスタム テンプレート モデルです。 公式ページでは、ラベル付けしたキーと値のペア、選択マーク、テーブル、領域、署名を抽出でき、決まった見た目の様式を持つ書類に向くとされています。図書館のリクエストカードは自館で様式を決めているので、この型に当たります。カスタム モデルの言語の一覧では、テンプレート モデルの手書きの文字の抽出に日本語(ja)が載っています。
書誌の照会には、国立国会図書館サーチの検索用 API を使います。 公式の API 仕様の概要では、SRU、OpenSearch、OpenURL の検索用 API が提供され、OpenSearch は https://ndlsearch.ndl.go.jp/api/opensearch に URL でパラメータを付けて呼び、XML(RSS)で返るとされています。利用のページでは、営利企業・団体の利用には利用申請が要り、非営利で収益を得ない利用は申請が不要とされています。 公立図書館の業務での利用でも、継続してアクセスする場合は利用申請のフォームから連絡先と利用内容を知らせるよう協力が求められているので、始める前に連絡しておきます。
03どうやって実装するのか
処理の起点を決める
各館でスキャンしたカードがフォルダに保存されたことを起点にします。 分館のカードを連絡便で中央館に送るのをやめ、受け付けた館でその日のうちにスキャンします。 紙の移動を待たないので、利用者への連絡が連絡便の分だけ早くなります。
保存先は館ごとに分け、ファイル名にスキャンした日時と館のコードを入れます。 1日分を1つのPDFにまとめる運用でも、後段でカード1枚ずつに分けます。カードの紙は、スキャンしたあとも受付館で一定期間保管します。
処理が終わったファイルは処理済みのフォルダへ移し、移すのは成功したときだけにします。 残っているファイルが、そのまま未処理の数です。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| カードのPDF | スキャンした画像。受付館、スキャンした日時 | スキャンの保存先 |
| 読み取り結果 | 書名・著者・出版社・出版年・理由、利用者番号・氏名・連絡先、チェック欄、それぞれの信頼度 | Azure AI Document Intelligence |
| 書誌の候補 | 書名、著者、出版社、出版年、ISBN、資料の種別 | 国立国会図書館サーチ API |
| 所蔵・発注中・予約の一覧 | ISBN、書誌ID、書名、所蔵の館と冊数、発注中か、予約の件数 | 図書館システムの毎日の書き出し |
| 選書の候補一覧 | 今月すでに候補に入っている本と、希望の件数 | 共有の表 |
質を決めるのは、下の2つです。 所蔵の一覧に ISBN が無い古い資料は、書名でしか照らせません。選書の候補一覧を引かないと、先週すでに候補に入れた本が、また新しい行として入ります。
利用者の欄は、この表のうち書誌の処理には使いません。 読み取った利用者番号・氏名・連絡先は、カードの ID と結び付けて別の保管先に置き、予約への切り替えと連絡のときにだけ司書が開きます。
データの取得方法を決める
読み取りは、Azure Functions からカスタム モデルを呼ぶだけです。モデルはカードの欄ごとにラベルを付けて学習します。 公式ページでは、テンプレート モデルは様式が変わると精度が下がり、様式ごとに最低5枚のサンプルで学習し、複数の様式のモデルを1つのエンドポイントに合成できるとされています。古い様式のカードが残っている館があれば、その版も5枚以上で学習して合成します。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 書名・著者・出版社・出版年 | ラベルを付けたフィールドの値と信頼度 | 検索語の材料 |
| 希望の理由 | ラベルを付けたフィールド | 選書会議の材料(要約しない) |
| 利用者番号・氏名・連絡先 | ラベルを付けたフィールド | 予約と連絡(書誌の処理には渡さない) |
| チェック欄 | 選択マークの selected/unselected と信頼度 | 購入希望か、取り寄せも可か |
書誌の照会は、OpenSearch に書名と著者を付けて呼びます。 仕様の概要のリクエスト例では、title に書名を、cnt に件数を付け、dpid=iss-ndl-opac で国立国会図書館の蔵書に絞る例が示されています。ISBN が書かれていれば、ISBN から先に引きます。
返ってくる候補には、同じ書名の別の形態が混ざります。 書名で引くと、図書のほかに録音資料や点字資料などが並ぶことがあるので、資料の種別で図書に絞ってから、出版年の新しい順に並べます。 絞り込んでも複数残るものは、そのまま司書に見せます。
API にはまとめて投げません。 利用のページは、同時リクエスト数に制限があり、継続して大量にアクセスすると遮断することがあるとしています。カード1枚ずつ、順番に呼びます。 1日数十枚なら、それで足ります。
AIへ渡す前に整形する
- 1枚ずつに分ける … まとめてスキャンしたPDFを、カードの外枠で区切ります。A4に4枚並べてスキャンする館があれば、その並べ方を決めておきます
- 向きを確かめる … 読み取り結果のページの角度を見て、逆さのものは回して読み直します
- 画像の寸法と文字の大きさを確かめる … 寸法は50×50から10,000×10,000ピクセルの間、文字の最小の高さは1024×768の画像で12ピクセルです。小さなカードの細い字のために300dpiでスキャンします
- 書名の表記をそろえる … 全角と半角、長音、括弧の中の補足(「黄色い表紙」など)を分けて持ちます
- ISBN の形を確かめる … 書かれていれば、桁数とチェックの数字を確かめます。合わないものは書かれたまま残し、引かない
- 二重のスキャンを見つける … 同じ受付館・受付日・利用者番号・書名のカードは、二重に処理しません
- 利用者の欄を切り離す … 書誌の処理に回すデータから、利用者番号・氏名・連絡先を外します
4番目で括弧の中を分けるのは、検索を当てるためです。 「料理の本(黄色い表紙)」を丸ごと書名として引くと何も当たりません。補足は検索語に入れず、司書が候補を選ぶときの手がかりとして一覧に残します。
7番目を最初の段で行うのは、後の段に利用者の情報を流さないためです。 生成AIに渡すデータにも、書誌の照会に送るデータにも、利用者の欄が入る経路を作りません。
AIに処理させる
OCRにさせるのは、カードに書かれた文字をそのまま値にすることです。 生成AIにさせるのは、書かれた書名・著者・出版社から、書誌の検索に投げる検索語の組み合わせを作ることだけです。
| 見るもの | 判定の仕方 | 判断できないときの扱い |
|---|---|---|
| 書名の欄 | 読み取りの信頼度が十分か | 低ければ 判読要確認。検索語にはするが結果を確定しない |
| 書名の正確さ | 書誌の候補が1件に絞れるか | 複数なら候補を並べる。0件なら 特定できず |
| 著者の欄 | 候補の著者と一致するか | 姓だけ・読みだけなら、候補の絞り込みにだけ使う |
| 所蔵 | 候補の ISBN と書名が所蔵の一覧にあるか | ISBN で当たれば確定、書名だけで当たれば 所蔵の可能性 |
| 同じ本の希望 | 候補の ISBN が同じカードをまとめる | ISBN が無ければまとめない |
4行目の区別が、所蔵済みの見落としを防ぐ要です。 ISBN で当たったものは同じ本ですが、書名だけで当たったものは、版や文庫化で別の本のことがあります。 所蔵の可能性 として司書に見せ、同じ本かを決めてもらいます。
| させないこと | 理由 |
|---|---|
| 書名の推定・言い換えの確定 | 実在しない本が候補一覧に入る |
| 購入するかどうかの判断 | 選書の方針に基づいて司書と選書会議が決める |
| 希望の理由の要約・評価 | 利用者の言葉のまま選書会議に出す |
| 利用者の情報の扱い | 生成AIには渡さない |
| ISBN の補完 | 書かれていない、合わない ISBN を作らない |
2行目と3行目は、選書の公平さのためです。 理由を要約させると、生成AIの言い回しで希望の強さが変わって見えます。理由は書かれたまま一覧に置きます。
指示内容を固定する
あなたは公立図書館の資料係で、利用者が手で書いた購入リクエストカードの
書誌の欄から、書誌のデータベースで本を探すための検索語を作る担当です。
OCRが返した書名・著者・出版社・出版年の文字だけを見てください。
【やること】
1. 書誌の検索に投げる検索語の組み合わせを、可能性の高い順に最大3つ作る
各組み合わせは title(書名の語)、creator(著者の語)、publisher(出版社の語)からなる
2. 書名の欄のうち、書名そのものでない補足(表紙の色、紹介された番組など)を
notes に分けて書く
3. 書かれた文字に読み違いの可能性がある箇所を、ocr_doubt に書く
【厳守事項】
- 書かれていない書名、著者、出版社を作らないでください。
「〇〇の新しい料理の本」から、具体的な書名を作らないでください。
書名の語は、カードに書かれた語の中から選んでください。
- 略記の展開は、カードに書かれた語が明らかに略記であるときだけにし、
展開した場合は expanded に true を付けてください。
- 本が実在するかどうか、図書館が持っているかどうかを書かないでください。
- 購入すべきかどうか、どんな本かの説明を書かないでください。
- ISBN を書かないでください。書かれていた ISBN は別に扱います。
- 読めない字は「〓」のまま残し、前後から補わないでください。
- 書名の欄が空なら、queries を空にして title_missing を true にしてください。
【書名の欄(OCRの結果のまま)】{title_text}
【著者の欄】{creator_text}
【出版社の欄】{publisher_text}
【出版年の欄】{year_text}
「書名の語はカードに書かれた語の中から選ぶ」が、この指示の芯です。 何も言わなければ、生成AIは知っている本の書名を補ってきます。補った書名で検索が当たると、利用者が希望していない本が候補に入ります。 検索語を作らせても、語の出どころはカードに限ります。
「実在するか、持っているかを書かない」も同じ理由です。 それを確かめるのは書誌の検索と所蔵の照合で、生成AIの記憶ではありません。
出力形式を固定する
カードごとに、次の形のJSONにまとめます。 生成AIが返すのは queries と notes と ocr_doubt の部分だけで、構造化出力でスキーマを固定します。公式ページでは、構造化出力はJSONスキーマへの準拠を保証し、Chat Completions では response_format に、Responses では text.format にスキーマを置き、strict を true にするとされています。
{
"card_id": "",
"branch": "",
"received_on": "",
"written": { "title": "", "creator": "", "publisher": "", "year": "",
"isbn": "", "reason": "", "confidence_min": 0 },
"notes": "",
"ocr_doubt": [],
"queries": [ { "title": "", "creator": "", "publisher": "", "expanded": false } ],
"candidates": [
{ "isbn": "", "title": "", "creator": "", "publisher": "", "year": "",
"holding": "所蔵済み | 発注中 | 所蔵の可能性 | 未所蔵",
"matched_by": "isbn | title" }
],
"status": "所蔵済み | 発注中 | 未所蔵 | 特定できず | 判読要確認",
"same_book_cards": []
}
1つ目の理由は、written と candidates を別の層に置けることです。 written はカードに書かれた文字のまま、candidates は書誌の検索と所蔵の照合の結果です。司書が候補を選び直しても、書かれた文字は変わりません。
2つ目は、matched_by で照合の確からしさが分かることです。 isbn で当たったものと title で当たったものを、一覧で色を分けて見せます。
3つ目は、same_book_cards で同じ本の希望をまとめられることです。 選書会議には、1冊の本について何館から何件の希望があったかを1行で出せます。
status | 決め方 |
|---|---|
所蔵済み | 候補が1件で、ISBN で所蔵の一覧に当たった |
発注中 | 候補が1件で、ISBN で発注中の一覧に当たった |
未所蔵 | 候補が1件で、ISBN でも書名でも所蔵・発注中に当たらない |
特定できず | 候補が0件、または複数で絞れない |
判読要確認 | 書名の欄の信頼度が低い |
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| スキャンの保存先 | Azure Functions の Blob トリガー | 保存を検知して処理を始める |
| Azure AI Document Intelligence | API の呼び出し(カスタム モデル) | カードの欄ごとの値と信頼度を返す |
| Azure OpenAI | API の呼び出し(構造化出力) | 書誌を探す検索語を返す |
| 国立国会図書館サーチ API | OpenSearch の URL を呼ぶ | 書誌の候補と ISBN を返す |
| 図書館システム | 毎日の書き出しファイルを読む | 所蔵・発注中・予約の一覧 |
| 選書の候補一覧 | 共有の表への書き出し | 司書が確定した未所蔵の本を入れる |
図書館システムへは書き込みません。 予約への切り替えは、司書が図書館システムの画面で行います。読み取りの結果から予約を自動で作ると、取り違えた本の予約が利用者の名前で入ります。
国立国会図書館サーチの API を使う画面や一覧には、利用のページが求めるとおり、API を用いていることを明記します。 職員だけが見る一覧でも、出どころが分かるように列の見出しに書いておきます。
人が確認する
司書が詳しく見るのは 特定できず と 判読要確認、それに 所蔵の可能性 を含むカードです。 所蔵済み と 発注中 と、候補が1件の 未所蔵 は、一覧で書かれた書名と候補の書名を並べて流し見ます。
所蔵の可能性を先に見る … 書名だけで当たった所蔵が、同じ本か別の版かを決めます。所蔵済みの見落としは、ここで止めます特定できずの候補を選ぶ … 複数の候補から選ぶか、蔵書検索で引き直します。分からなければ利用者に問い合わせます判読要確認をカードの画像で見る … 書かれた文字を直してから、もう一度書誌を引きます- 区分を確定する … 所蔵済み・発注中は予約へ、未所蔵は選書の候補一覧へ
- 直したら記録する … どの候補を選んだか、区分をどう直したかを残します
1番目を省かないでください。 書名だけで当たった本を未所蔵として流すと、第3章の(b)がそのまま残ります。
目標は、900件をならして1件1.2分です。 詳しく見るのは2割前後の想定で、それより多い月は、スキャンの解像度か、カードの書名の欄の書き方の案内を見直す合図です。
例外に対処する
| 起きること | 対応 |
|---|---|
| 書名の欄が空 | 特定できず。希望の理由に書名らしいものがあっても補わない |
| 書誌の候補が0件 | 自費出版や近刊の可能性。蔵書検索と出版社の情報を人が見る |
| 書誌の候補が多すぎる | 著者と出版年で絞り、残ったものを並べる |
| ISBN の形が合わない | 書かれたまま残し、書名で引く |
| 雑誌・新聞のリクエスト | 資料の種別で分け、雑誌の担当に回す |
| 他館からの取り寄せも可にチェック | 未所蔵でも相互貸借の候補として印を付ける。決めるのは司書 |
| 学習していない様式のカード | 読まずに 判読要確認。新しい様式は5枚以上で学習して合成する |
| 書誌の API が応答しない | 時間を置いて再実行。処理済みへ移すのは成功時だけ |
| 同じカードが二度スキャンされる | 受付館・受付日・利用者番号・書名で照らし、二重に処理しない |
上の2行は、AIの問題ではありません。 書名の無いカードと、まだ書誌が出ていない本は、どの構成でも人が調べることになります。それを 特定できず として最初から分けておくことが、確認を速くします。
記録を残す
- カードの画像と、受付館・受付日・スキャンした日時
- Document Intelligence が返した結果の全文と信頼度
- 生成AIに渡した書誌の欄と、返ってきた検索語
- 書誌の API に投げた検索語と、返ってきた候補
- そのとき照らした所蔵の一覧の日付
- 司書が選んだ候補と、区分を直した記録
- 利用者の欄(書誌の処理のログとは別の保管先に置き、保管の期限を決める)
5つ目で所蔵の一覧の日付を残すのは、照合の結果が日によって変わるためです。 前日に受け入れた本は、当日の一覧にしか載りません。いつの一覧と照らしたかが無いと、所蔵済みの見落としがどこで起きたかを追えません。
最後の行は、保管の期限を先に決めます。 予約と連絡が済んだあとの利用者の欄は、自館の個人情報の取り扱いの規程に沿って消します。
04実装レベルの3段階
最小構成では件数がさばけません。 確かめるための段階です。 半自動化で、1件4分が2.5分程度になります。 転記と書誌の候補は自動になりますが、所蔵の照合と、同じ本の希望をまとめる作業が手で残ります。 本格構成で1.2分になり、この段階が本記事の想定です。
05工数削減シミュレーション
導入後 900件 × 1.2分 ÷ 60 = 18 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 中央館と分館を持ち、紙のリクエストカードで購入の希望を月に数百件受け付けている市区町村の公立図書館。カードの書名や著者が略記・うろ覚えのことが多く、選書担当が1件ずつ蔵書検索と書誌の確認をしている場合。図書館システムから所蔵・発注中・予約の一覧を毎日書き出せる場合。学校図書館や大学図書館で、紙の購入希望票を受けている場合。
- 購入の希望をほぼすべてWebの予約・リクエストの画面で受けていて、紙のカードがほとんど無い場合。月の件数が数十件で、司書が目で見て足りる場合。図書館システムから所蔵の一覧を書き出せず、照合の先が無い場合。なお、購入するかどうかの判断は選書の方針に基づいて司書が行うもので、この構成では代替できません。
07最小構成で試す方法
- 先月のカードから30枚を選ぶ(書名がうろ覚えのもの、所蔵済みだったもの、字の読みにくいものを必ず入れる)
- 利用者の欄を紙で隠してから300dpiでスキャンし、Document Intelligence のスタジオでレイアウト モデルにかける
- 書名・著者・出版社の欄の手書きが、どの程度読めているかを1枚ずつ見る
- 読めた書名と著者で、国立国会図書館サーチの画面を引き、候補が何件出るかを数える
- 当時の資料係の処理の結果(所蔵済み・未所蔵)と突き合わせる
30枚は必ずやってください。 カスタム モデルを学習する前に、手書きの書名が読めて、書誌が引けるのかを確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 書名が読め、候補が1〜数件に絞れる | カスタム テンプレート モデルの学習に進む |
| 書名は読めるが、候補が0件のカードが多い | 書名がうろ覚えのカードの割合が高い。検索語を作る段の効き目が大きい |
| 手書きの多くが読めない | スキャンの解像度とカードの欄の大きさを見直す |
2行目が出ても、構成は有効です。 うろ覚えのカードこそ、資料係が時間をかけていたカードだからです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 生成AIがそれらしい書名を作る | 書名の語はカードに書かれた語から選ばせる |
| 書名だけで当たった所蔵を所蔵済みにする | 所蔵の可能性 として必ず司書に見せる |
| 書誌の候補に録音資料・点字資料が混ざる | 資料の種別で図書に絞る |
| 括弧の補足ごと書名として引いて当たらない | 補足を notes に分けて検索語から外す |
| 利用者の欄が書誌の処理に流れる | 最初の段で切り離す |
| 希望の理由を要約させて意味が変わる | 理由は書かれたまま置く |
| API にまとめて投げて遮断される | 1枚ずつ順番に呼ぶ |
| 前日に受け入れた本が未所蔵になる | 所蔵の一覧を毎日書き出し、照らした日付を残す |
| 同じ本の希望が何行も並ぶ | ISBN でまとめる |
| 古い様式のカードが読めない | 様式ごとに学習して合成する |
上の2行が、この構成の失敗のほとんどです。 どちらも「本が特定できたように見える」という同じ見た目から出発しています。書かれた文字と特定した本を別の層に置き、照合の確からしさを matched_by で残すかどうかで、運用に乗るかが決まります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 利用者の利用者番号・氏名・連絡先と、その利用者が希望した本の書名・希望の理由です。
- 誰が何を希望したかを外へ出さない … 利用者の欄は最初の段で切り離し、生成AIにも書誌の API にも渡しません。 選書の候補一覧にも、希望の件数だけを載せます
- 子どもの利用者のカードを考える … 子どもの書いたカードも同じ流れで処理します。生成AIに渡すのは書誌の欄の文字だけで、生成AIを使うのは職員だけです。 利用者が生成AIに触れる経路は作りません
- 購入の判断を代替しない … 購入するかどうかは、選書の方針に基づいて司書と選書会議が決めることです。 この構成が出すのは、どの本の希望か、所蔵しているかという事実だけです
- 処理する場所を確かめる … Azure OpenAI の公式ページでは、プロンプトと応答は顧客が指定した地域で処理されるが、Global や DataZone の展開ではその地域の外で処理されうるとされています。書誌の欄だけを渡す設計でも、展開の種類を選ぶときに確かめてください
- 外部の API の利用条件を守る … 国立国会図書館サーチの API は、利用目的によって利用申請やデータ提供機関の許諾が要る場合があり、API を用いていることの明記が求められています
- カードの紙と画像の保管の期限を決める … 利用者の欄が写った画像は、紙のカードと同じ扱いで保管し、期限が来たら消します
誤りが起きた場合のリスクは、所蔵済みの本を重ねて発注することと、取り違えた本で利用者に連絡することの2つです。 前者は書名だけの照合を確定扱いにすると起き、後者は生成AIの作った書名を候補にすると起きます。どちらも設計で防げるので、そこだけは守ります。
10まず何から始めるか
1週目:30枚で読めるかを試す
先月のカードから30枚を選び、利用者の欄を隠してスキャンし、スタジオのレイアウト モデルにかけます。手書きの書名がどれだけ読めるかと、読めた書名で書誌が引けるかを見ます。
2週目:所蔵の一覧の書き出しを決める
図書館システムから、ISBN・書誌ID・書名・所蔵の館・発注中・予約の件数を毎日書き出せるかを、保守の業者と確かめます。あわせて、国立国会図書館サーチの API の利用を連絡します。
3週目:カスタム テンプレート モデルを学習する
カードの様式ごとに5枚以上にラベルを付けて学習します。 利用者の欄にもラベルを付け、切り離しの処理を先に作ります。
4週目:中央館だけで一覧まで作る
中央館のスキャンの保存先を起点に、読み取りから書誌の候補の一覧までをつなぎます。この時点では所蔵の照合をせず、書誌の候補が当たるかだけを見ます。
2か月目: 所蔵・発注中の一覧と照らし、status と same_book_cards を足します。3か月目以降: 分館に広げ、1件4分が何分になったかを実測します。所蔵の可能性 の件数と、司書が選び直した候補の数を見て、カードの書き方の案内を見直した時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| カスタム テンプレート モデルがキーと値のペア、選択マーク、テーブル、領域、署名を抽出し、決まった様式の書類に向くこと。様式ごとに最低5枚で学習し、1つのエンドポイントに合成できること | Microsoft Learn: Custom template model | 2026-10-15 |
| カスタム テンプレート モデルの手書きの文字の抽出に日本語(ja)が含まれること | Microsoft Learn: Language support — custom models | 2026-10-15 |
| 選択マークが選択の状態と信頼度つきで返ること。入力の寸法が50×50〜10,000×10,000ピクセル、文字の最小の高さが1024×768の画像で12ピクセルであること | Microsoft Learn: Layout model | 2026-10-15 |
| 信頼度が0〜1の推定の確率で、重要な場面では人の確認に回す判断に使えること | Microsoft Learn: Accuracy and confidence scores | 2026-10-15 |
| 営利企業・団体の利用には利用申請が要り、非営利で収益を得ない利用は申請が不要であること。継続してアクセスする場合は利用申請のフォームから連絡を求めていること。同時リクエスト数に制限があり、大量アクセスは遮断されうること。API を用いていることの明記が求められること | 国立国会図書館サーチ: APIのご利用について | 2026-10-15 |
検索用 API として SRU・OpenSearch・OpenURL があり、OpenSearch のアクセスURLが https://ndlsearch.ndl.go.jp/api/opensearch で XML(RSS)で返ること。title・cnt・dpid=iss-ndl-opac を付けたリクエスト例 | 国立国会図書館サーチ: API仕様の概要 | 2026-10-15 |
構造化出力がJSONスキーマへの準拠を保証し、response_format または text.format にスキーマを置き、strict を true にすること | Microsoft Learn: Structured outputs | 2026-10-15 |
| プロンプトと応答が顧客の指定した地域で処理され、Global や DataZone の展開ではその地域の外で処理されうること | Microsoft Learn: Data, privacy, and security for Azure OpenAI | 2026-10-15 |
購入するかどうか、利用者の情報をどう扱うかは、自館の選書の方針と個人情報の取り扱いの規程で決めてください。 本記事は公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1623)についてのご相談はこちらから。
