酪農の牧場が牛舎で手書きする分娩・授精と搾乳の記録を読み取り、牛ごとの台帳に転記して、分娩予定の近い牛と出生の届出の残りを拾う
牛舎で手書きされる繁殖ノートと搾乳日報を撮影して読み取り、牛ごとの台帳に転記します。授精日から分娩予定の近い牛を一覧にし、出生の届出がまだの子牛と、出荷しない乳を別に搾る牛を拾います。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- その他
- 対象部門
- 生産
- 対象業務
- データ入力・転記/台帳・マスタ管理
- 主な課題
- 入力作業が多い/属人化している/期限・対応漏れが起きる
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/工数削減/機会損失防止
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 作業者が、朝夕の搾乳のあとに搾乳日報に印とメモを書く。分娩・授精・乾乳などがあれば、繁殖ノートに1行書く
- 夜、事務の担当がノートと日報を事務所へ持ち帰り、書かれた呼び名や下4桁から牛を探して、台帳の事象の履歴に打ち込む
- 授精の行があれば、授精日から分娩予定日と乾乳の予定日を数え、カレンダーに書く
- 分娩の行があれば、子牛を台帳に足し、出生の届出をする一覧に書く
- 搾乳日報で別に搾った牛を、翌日の作業者への申し送りの紙に書き写す
- 週に一度、経営者が台帳とカレンダーを見て、分娩房へ移す牛と乾乳にする牛を決める
- 出生の届出を、まとまったところで Web システムから行う
- 人作業者が、いまと同じく繁殖ノートと搾乳日報に手書きする
- 人朝夕の搾乳のあと、作業者がスマートフォンでその日のノートのページと日報を撮る
- 自動画像の保存をきっかけに、OCRが表と上の欄(日付・朝夕の別)と読み取りの信頼度を返す
- 自動生成AIが、表の行を「分娩」「授精」「乾乳」などの事象に分け、牛の呼び名・子牛の耳標の番号・種雄牛の名前などを文字のまま写す
- 自動呼び名と下4桁と牛床の番号を牛の台帳と照らし、1頭に決まる行だけに10桁の番号を付ける
- 自動授精日と妊娠鑑定の結果から分娩予定日と乾乳の予定日を計算し、予定の近い牛の一覧を作る
- 自動分娩の行から、出生の届出の一覧に子牛を足す。別に搾る牛の一覧を作る
- 人事務の担当が、確認の要る行(牛が決まらない、信頼度の低い欄、番号の桁が合わない)だけを画像と並べて直し、台帳へ確定する
- 人経営者が、予定の近い牛の一覧を見て、分娩房へ移す牛と乾乳にする牛を決める
- 人事務の担当が、出生の届出の一覧の子牛を Web システムで届け出て、済んだ印を付ける
各工程の詳しい説明を読む
- 作業者が、朝夕の搾乳のあとに搾乳日報に印とメモを書く。分娩・授精・乾乳などがあれば、繁殖ノートに1行書く
- 夜、事務の担当がノートと日報を事務所へ持ち帰り、書かれた呼び名や下4桁から牛を探して、台帳の事象の履歴に打ち込む
- 授精の行があれば、授精日から分娩予定日と乾乳の予定日を数え、カレンダーに書く
- 分娩の行があれば、子牛を台帳に足し、出生の届出をする一覧に書く
- 搾乳日報で別に搾った牛を、翌日の作業者への申し送りの紙に書き写す
- 週に一度、経営者が台帳とカレンダーを見て、分娩房へ移す牛と乾乳にする牛を決める
- 出生の届出を、まとまったところで Web システムから行う
(a)夜の打ち直しが毎日たまる。 搾乳と給餌が終わったあとの作業で、疲れた日は翌日に回り、翌日の分と重なります。 3日分たまると、どの記録がどの日のものかを紙で確かめ直すことになります。
(b)牛の特定に時間がかかる。 「ミルク」「32」とだけ書かれた行を、台帳のどの牛か探します。下4桁が同じ牛、呼び名が同じ牛、すでに出荷した牛の呼び名を継いだ牛がいて、書いた作業者に聞かないと分からない行が毎回出ます。
(c)分娩予定を数えるのが特定の人の頭の中にある。 授精日から日数を数えてカレンダーに書く作業は、経営者か事務の担当しかしていません。妊娠鑑定の結果を書き忘れると、受胎していない牛が分娩予定に残り、受胎した牛の予定が抜けます。 分娩房へ移すのが遅れる原因になります。
(d)出生の届出が後回しになる。 子牛が生まれた夜は分娩の対応で手一杯で、届出の一覧に書くのは翌日以降です。届出をまとめてするつもりで、1頭だけ一覧から漏れることがあります。
- 【人】 作業者が、いまと同じく繁殖ノートと搾乳日報に手書きする
- 【人】 朝夕の搾乳のあと、作業者がスマートフォンでその日のノートのページと日報を撮る
- 【自動】 画像の保存をきっかけに、OCRが表と上の欄(日付・朝夕の別)と読み取りの信頼度を返す
- 【自動】 生成AIが、表の行を「分娩」「授精」「乾乳」などの事象に分け、牛の呼び名・子牛の耳標の番号・種雄牛の名前などを文字のまま写す
- 【自動】 呼び名と下4桁と牛床の番号を牛の台帳と照らし、1頭に決まる行だけに10桁の番号を付ける
- 【自動】 授精日と妊娠鑑定の結果から分娩予定日と乾乳の予定日を計算し、予定の近い牛の一覧を作る
- 【自動】 分娩の行から、出生の届出の一覧に子牛を足す。別に搾る牛の一覧を作る
- 【人】 事務の担当が、確認の要る行(牛が決まらない、信頼度の低い欄、番号の桁が合わない)だけを画像と並べて直し、台帳へ確定する
- 【人】 経営者が、予定の近い牛の一覧を見て、分娩房へ移す牛と乾乳にする牛を決める
- 【人】 事務の担当が、出生の届出の一覧の子牛を Web システムで届け出て、済んだ印を付ける
8番目で人が見るのは、確認の要る行だけです。 牛が1頭に決まり、欄の信頼度が基準を満たす行は、一覧で流し見て「確定」を押すだけです。
10番目の届出は、人が行います。 構成が作るのは届け出る子牛の一覧と、届け出に要る項目の下書きまでです。
02今回想定するシステム構成
繁殖ノート・搾乳日報(手書き)
│ 朝夕の搾乳のあとにスマートフォンで撮影
▼【トリガー】画像の保存
Google Document AI(Form Parser)
│ 表(行と列)、上の欄、読み取りの信頼度
▼
Claude API(構造化出力)── 行の事象の分類、呼び名・番号・種雄牛名の書き写し
▼
Python ── 牛の台帳との照合(呼び名・下4桁・牛床 → 10桁)
── 分娩予定日・乾乳の予定日の計算、出生の届出の残りの抽出
▼
牛の台帳(事象の履歴)、予定の近い牛の一覧、届出の一覧、別に搾る牛の一覧
▼
【事務の担当が確認の要る行だけ直す】→【経営者が移す牛・乾乳にする牛を決める】| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Form Parser) | Azure AI Document Intelligence |
| 生成AI | Claude API(事象の分類と書き写し) | OpenAI API、Gemini API |
| 連携 | Python(画像の受け取り、API の呼び出し、台帳の更新) | Google Apps Script |
| 差異計算 | Python(牛の照合、予定日の計算、届出の残りの抽出) | Google Apps Script |
| 保管 | クラウドのストレージ(撮影した画像と読み取りの結果) | 事務所のパソコンの共有フォルダ |
出生の届出のシステムには書き込みません。 牛の個体識別のための情報の管理及び伝達に関する特別措置法の第8条は、牛が出生したときは、その管理者が遅滞なく、出生の年月日、雌雄の別、母牛の個体識別番号、管理者の氏名又は名称及び住所、飼養施設の所在地などを届け出なければならないとしています。この構成は、届け出る子牛と項目の一覧を作るところまでにし、届出は人が行います。 届出の内容が誤っていれば、それは牧場の届出の誤りになるからです。
土台は Document AI の Form Parser です。 公式の説明では、Form Parser はキーと値のペア、表、チェックボックス、汎用のエンティティを OCR のテキストに加えて抽出するとされ、プロセッサの一覧の言語表では、日本語(ja)が手書きに対応する言語として示されています。繁殖ノートの1日分は表として、日報の上の日付と朝夕の別はキーと値のペアとして読みます。
処理する場所に日本のリージョンはありません。 プロセッサの一覧では、Form Parser の対応リージョンは us・eu のほか、asia-southeast1(シンガポール)、asia-south1 などです。記録に個人の情報はほとんど書かれませんが、牛群の繁殖成績は経営の中身です。 国外で処理されることを、牧場の決まりや取引先との約束に照らして確かめます。
Form Parser は学習済みで、追加の学習はできません。 公式の説明では、表は行や列をまたぐセルの無い、表らしい表が対象とされ、値の空いたキーと値のペアは確実には読めないとされています。ノートの様式は、罫線で区切った単純な表にします。
03どうやって実装するのか
処理の起点を決める
撮影した画像がストレージのフォルダに保存されたことを起点にします。 撮るのは朝と夕の搾乳のあとの2回です。繁殖ノートは、その回に書き足したページを撮ります。
1日1回、夜にまとめて動かす形にはしません。 分娩は夜中にもあり、朝の撮影で分娩の行が読まれれば、その日のうちに出生の届出の一覧に子牛が載ります。 (d)の後回しを、撮った時点で止めるのが狙いです。
ファイル名には撮影の日時と、ノートか日報かの別を入れます。処理が終わった画像は処理済みのフォルダへ移し、移すのは成功したときだけにします。 元のフォルダに残っている数が、そのまま未処理の数になります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| ノート・日報の画像 | 1ページか1枚、撮影の日時、朝夕の別 | 作業者のスマートフォン |
| 読み取りの結果 | テキスト、表(行と列)、上の欄、信頼度 | Google Document AI |
| 牛の台帳 | 10桁の個体識別番号、呼び名、牛床の番号、生年月日、在籍か出荷済みか | 表計算の台帳 |
| 事象の履歴 | 牛ごとの分娩・授精・妊娠鑑定・乾乳の確定済みの記録 | 表計算の台帳 |
| 予定の決まり | 授精日から分娩予定日までの日数、分娩予定日から乾乳の予定日までの日数、一覧に載せる日数 | 経営者が獣医師と決める一覧 |
| 呼び名の一覧 | 作業者が使う略称・あだ名と牛の対応 | 事務の担当が作る一覧 |
質を決めるのは、いちばん下の2つです。 予定の決まりは、牧場ごとに経営者が獣医師や授精師と決める値で、生成AIが一般的な日数を持ち出してよいものではありません。 呼び名の一覧は、(b)の「書いた作業者に聞かないと分からない」を減らす材料です。
牛の台帳は、在籍か出荷済みかを必ず持ちます。 呼び名を継いだ牛がいるとき、出荷済みの牛を候補から外すだけで、多くの行が1頭に決まります。
データの取得方法を決める
読み取りは、Python から Form Parser のプロセッサを呼ぶだけです。返ってくる Document から、表と上の欄と信頼度を取り出します。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 全テキスト | text | ほかの欄が startIndex・endIndex で指す原文 |
| 上の欄 | pages[].formFields(fieldName と fieldValue) | 日付、朝夕の別、書いた人 |
| 記録の行 | pages[].tables(headerRows と bodyRows) | 日付・牛・事象・内容の各列 |
| 印の欄 | fieldValue の valueType(filled_checkbox/unfilled_checkbox) | 日報の「別搾り」「乳房炎」の印 |
| 信頼度 | 各要素の layout の信頼度 | 確認の要る欄の印 |
公式の説明では、text が認識されたテキストの唯一の元で、ほかの欄は startIndex と endIndex でその位置を指すとされています。表のセルの文字は、この位置から原文を引いて取り出します。 表は headerRows と bodyRows に分かれ、行や列をまたぐセルの無い表だけを認識するため、rowSpan と colSpan は常に1とされています。
def cell_text(document, cell):
# セルの text_anchor が指す範囲を document.text から切り出す
return "".join(
document.text[int(s.start_index):int(s.end_index)]
for s in cell.layout.text_anchor.text_segments
).strip()
rows = []
for page in document.pages:
for table in page.tables:
for r in table.body_rows:
rows.append([(cell_text(document, c), c.layout.confidence) for c in r.cells])
日報の印は、チェックボックスとして読める様式にします。 公式の説明では、チェックボックスはキーと値のペアとして抽出され、印の付いたものは filled_checkbox、付いていないものは unfilled_checkbox になるとされています。牛床の番号ごとに「別搾り」「乳房炎」の四角を印刷しておくと、印の有無が文字の読み取りとは別の値で返ります。
牛の台帳と予定の決まりは、表計算から毎回読み直します。台帳の更新は人の確定のあとだけなので、読み直しても途中の状態を拾いません。
AIへ渡す前に整形する
- 画像の向きと傾き … スマートフォンで斜めに撮った画像を、紙の四隅で補正します
- 解像度 … 公式の説明では、スキャンは最低200dpi、300dpi以上で一般に最良の結果とされています。撮影の大きさはこれに相当するようにします
- ファイルの形式と大きさ … JPEG か PNG で保存します。オンラインの処理の要求は1ファイル40MBまでで、画像の解像度は40メガピクセルまでです
- 紙の種類の判定 … ノートか日報かを、ファイル名と表の見出しの行で決めます
- 重複の検知 … 同じページを二度撮ったものは、新しいほうだけを使います。ノートは前回までの行も写るので、行の日付で新しい行だけを取り出します
- 呼び名の正規化の準備 … 全角・半角の数字、「No.」「#」の有無をそろえる表を用意します。ここでは置き換えず、照合の段で使います
5番目を省くと、同じ授精が2回記録されます。 ノートは1ページに数日分の行が並ぶので、毎回ページ全体を取り込むと、昨日確定した行がもう一度台帳に入ります。台帳に確定済みの行と、日付・牛・事象が一致する行は取り込みません。
AIに処理させる
生成AIにさせるのは、表の行を事象に分けて、文字を写すことだけです。
| 見るもの | させること | 判断できないときの扱い |
|---|---|---|
| 事象の列と内容 | 「分娩」「授精」「発情」「乾乳」「妊娠鑑定」「治療」「その他」のどれかに分ける | 分けられなければ other |
| 牛の欄 | 書かれた呼び名・番号をそのまま写す | 読めなければ空にし、unreadable |
| 分娩の内容 | 子牛の雌雄、子牛の耳標の番号、難産の書き込みを写す | 書かれていなければ空 |
| 授精の内容 | 種雄牛の名前、ストローの番号、授精した人を写す | 書かれていなければ空 |
| 妊娠鑑定の内容 | 「+」「−」「プラス」「マイナス」「再鑑定」などを書かれたまま写す | 書かれたまま |
牛の特定と日付の計算は、プログラムの側で行います。
| させないこと | 理由 |
|---|---|
| 呼び名から牛の10桁の番号を当てる | 同じ呼び名・同じ下4桁の牛がいる。台帳との照合は決まりで行う |
| 子牛の耳標の番号の桁の補い | 届出に使う番号。読めない桁を埋めると別の牛の番号になる |
| 分娩予定日・乾乳の予定日の計算 | 日数は牧場の決まり。生成AIの一般的な知識で数えさせない |
| 妊娠鑑定の「+」「−」の解釈 | 書かれた記号のまま写し、プログラムが決まった語だけを受胎として扱う |
| 治療や出荷しない乳の期間の判断 | 獣医師の指示による。紙に書かれた日付だけを写す |
1行目がいちばん起きやすい失敗です。 「はな」と書かれていれば、生成AIは台帳にある「はな」を自信を持って選びます。選んだ牛が出荷済みの先代の「はな」でも、文として不自然なところはありません。 照合をプログラムに置くことで、候補が2頭なら必ず人へ回ります。
指示内容を固定する
あなたは酪農の牧場の事務の担当で、牛舎の繁殖ノートと搾乳日報の読み取り結果を、
事象ごとの記録にそろえる係です。
OCRが返した表と上の欄だけを見てください。推測で埋めないでください。
【事象の種類】
calving(分娩)、ai(授精)、heat(発情)、dry_off(乾乳)、
preg_check(妊娠鑑定)、treatment(治療・別搾り)、other
【厳守事項】
- 牛の欄は、書かれた文字をそのまま cow_label に写してください。
台帳の牛を選んだり、10桁の番号を補ったりしないでください。
- 子牛の耳標の番号は、書かれた数字だけを calf_tag に写してください。
読めない桁を埋めたり、桁数を合わせたりしないでください。
読めない場合は空にし、unreadable_cells に入れてください。
- 妊娠鑑定の結果は、「+」「−」「プラス」「再」などを書かれたとおり result_raw に写してください。
受胎したかどうかを判断しないでください。
- 分娩予定日、乾乳の予定日を計算しないでください。
- 治療や別搾りの期間は、紙に書かれた日付や文字だけを写してください。
何日間になるかを推し量らないでください。
- 空いている欄は空のまま写してください。空いている理由を書かないでください。
- 1行に2つの事象が書かれていれば、行を分けて events に入れ、
同じ source_row を付けてください。
【OCRの表】{tables}
【上の欄】{form_fields}
【紙の種類】{sheet_type}
「台帳の牛を選ばない」を明記しているのは、生成AIが親切に照合を始めるからです。 台帳を渡していなくても、「12番は牛床12の牛」と書き添えることがあります。牛床の番号と牛の対応は入れ替えで変わるので、照合は台帳の最新の内容で行います。
「1行に2つの事象」の指示は、ノートの書き方の癖への対応です。 「分娩→そのまま乾乳牛舎から移動」「授精、ついでに鑑定」のように1行にまとめて書く作業者がいます。
出力形式を固定する
次の形のJSONで受け取ります。
{
"image_id": "",
"sheet_type": "breeding_note | milking_report",
"header": { "date": "", "shift": "am | pm | none", "writer": "" },
"events": [
{ "source_row": 0,
"event_date": "",
"cow_label": "",
"stall_no": "",
"event_type": "calving | ai | heat | dry_off | preg_check | treatment | other",
"calf_sex": "",
"calf_tag": "",
"difficult_birth_note": "",
"sire_name": "",
"straw_no": "",
"inseminator": "",
"result_raw": "",
"note_text": "" }
],
"unreadable_cells": [ { "source_row": 0, "field": "" } ]
}
番号も日付も文字列で受けます。 数値の型で受けると、耳標の番号の先頭の0が落ちます。文字のまま受け、桁数と数字だけで成ることをプログラムで確かめます。
Claude の構造化出力は、output_config.format に type: "json_schema" で JSON スキーマを渡して有効にし、オブジェクトには additionalProperties: false が必要とされています。 数値の minimum・maximum や文字列の minLength・maxLength は対応していないとされているので、桁数の確認はプログラムで行います。
後段の照合は、この出力に対して決まりで行います。
| 照合 | 外れたとき |
|---|---|
cow_label と牛床の番号から、在籍の牛が1頭に決まる | 「牛が決まらない」。候補の牛を並べて人へ |
| 子牛の耳標の番号が10桁の数字 | 「番号の桁が合わない」。耳標の実物で確かめる |
| 分娩の行の母牛に、授精と妊娠鑑定の確定済みの記録がある | 「分娩の前の記録が無い」。台帳の抜けを確かめる |
妊娠鑑定の result_raw が決めた語(+、プラス など)に当たる | 当たらなければ「鑑定の結果が読めない」 |
| 読み取りの信頼度が基準を下回る欄がない | 欄に印を付ける |
| 同じ母牛の分娩が、前の分娩から決めた日数より短い間隔で出てくる | 「同じ分娩の二重の記録か、牛の取り違え」 |
分娩予定日は、照合を通った行だけから計算します。 授精日に予定の決まりの日数を足し、妊娠鑑定で受胎が確かめられた授精には「確定」、まだのものには「未確定」と印を付けて、一覧に載せる日数の内に入る牛を並べます。乾乳の予定日も同じ決まりで数えます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 撮影の保存フォルダ | フォルダの監視 | 画像の保存を検知する |
| Google Document AI | API呼び出し | 表・上の欄・チェックボックス・信頼度を返す |
| Claude API | API呼び出し | 事象の分類と文字の書き写し |
| 牛の台帳 | 表計算のファイル | 照合に読み、人が確定した行を事象の履歴へ書く |
| 予定の近い牛の一覧 | 表計算のシートとカレンダー | 分娩予定・乾乳の予定を載せる |
| 出生の届出の一覧 | 表計算のシート | 届け出る子牛と項目、届出済みの印 |
台帳へ書き込むのは、人が確定した行だけです。 生成AIの出力をそのまま事象の履歴に流し込む経路は作りません。授精の行が誤った牛に付くと、その牛の分娩予定も乾乳の予定も連鎖してずれるからです。
出生の届出の一覧は、届出済みの印が付くまで消えません。 届け出たら事務の担当が印を付け、印の無い子牛は毎朝の一覧の先頭に出ます。 届出の Web システムとはつながず、届け出たかどうかは人が記録します。
人が確認する
人が見るのは、印の付いた行だけです。
- 分娩の行を最初に見る … 子牛の耳標の番号の桁、雌雄、母牛が1頭に決まっているかを、画像と並べて確かめます。出生の届出に使う項目なので、ほかの行より先に確定します
- 牛が決まらない行を直す … 候補の牛から選ぶか、書いた作業者に聞きます。選んだら、その呼び名を呼び名の一覧に足します
- 妊娠鑑定の行を確かめる … 結果が読めないもの、受胎とされない語のものを確かめます
- 信頼度の低い欄を直す … 画像と並べて直します
- 予定の近い牛の一覧を経営者が見る … 「未確定」の牛は、鑑定を受けるかを決めます
1番目を先にするのは、届出の期限のためではなく、取り違えが後で直しにくいからです。 子牛の耳標の番号を誤ったまま届けると、修正の手続きが要ります。
目標は、120件をならして1件3分です。 印の無い行は数秒、牛が決まらない行や分娩の行は数分かかります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 牛舎の汚れや水濡れで読めない | unreadable。紙の実物を見て直す |
| 呼び名が台帳に無い | 「牛が決まらない」。作業者に聞き、呼び名の一覧に足す |
| 下4桁が同じ在籍の牛が2頭いる | 牛床の番号で絞る。絞れなければ人へ |
| 子牛の耳標の番号の桁が足りない | 「番号の桁が合わない」。桁を補わない |
| 双子の分娩 | 1行に2頭が書かれていれば行を分け、子牛ごとに届出の一覧へ |
| 死産・生後すぐの死亡 | 生成AIは note_text に写すだけ。届出の要否は人が確かめる |
| 授精の記録の無い牛が分娩した | 「分娩の前の記録が無い」。台帳の抜けを確かめる |
| ノートのページを撮り忘れた | 翌回の撮影で行の日付から拾う。日付が飛んだら印 |
| Document AI が応答しない | フォルダに残し、事務の担当がいまの手順で打ち込む |
5行目と6行目は、届出に関わる例外です。 双子は1頭分しか届出の一覧に載らないと漏れになり、死産は届出の扱いが通常と違う場合があります。どちらも構成が決めず、人に回します。
記録を残す
- 撮影した画像と、撮影の日時・紙の種類・朝夕の別
- OCR が返した
Documentの全文(text、formFields、tables、信頼度) - 生成AIの出力(事象の分類、書き写した文字)
- 照合の結果(牛の特定、番号の桁、鑑定の語、二重の記録)
- 人が直した記録 … どの行の、どの欄を、何から何に直したか、誰が確かめたか
- 予定の計算に使った決まりの値 … 授精日からの日数、乾乳までの日数と、その時点の版
- 出生の届出の一覧の、届出済みの印を付けた日時と人
予定の決まりの値を残すのは、決まりが後から変わるためです。 経営者が獣医師と相談して日数を変えると、過去の分娩予定の意味が変わります。
人が直した記録は、呼び名の一覧を育てる材料になります。 同じ呼び名で毎回人が選んでいるなら、一覧に足せば次から自動で決まります。
04実装レベルの3段階
半自動化で、1件12分が7分程度になります。 読み取りは自動になりますが、牛の特定と予定日の計算は人が続けます。 本格構成で3分になり、この段階が本記事の想定です。 差が大きいのは、時間のかかっていた牛の特定とカレンダーの直しが、照合と計算に置き換わるからです。 段階を飛ばさないでください。 半自動化の1か月で、どの呼び名が決まらないか、どの作業者の番号が読みにくいかが見えます。呼び名の一覧が育たないうちに本格構成に進むと、確認の要る行が多すぎて時間が減りません。
05工数削減シミュレーション
導入後 120件 × 3分 ÷ 60 = 6 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 搾乳牛が数十頭から百数十頭の家族経営や法人の酪農の牧場で、牛舎の作業者が紙のノートや日報に分娩・授精・乾乳・治療を手書きし、経営者や事務の担当が夜にまとめて表計算や牛群管理の台帳へ打ち直している場合。授精日から分娩予定を数えるのが特定の人の頭の中にあり、分娩房へ移すのが遅れたり、出生の届出が後回しになったりしたことがある場合。
- 搾乳の設備や牛群管理のシステムが乳量・発情・繁殖の記録を自動で取っていて、紙に書く記録がほとんど無い牧場。搾乳牛が十数頭で、打ち直しが数分で終わる場合。なお、妊娠の判定、分娩の介助、治療と出荷しない乳の期間の決定、出生の届出そのものは、この構成では代替できません。
07最小構成で試す方法
- 先月の繁殖ノートから10ページと、搾乳日報から10枚を選ぶ(分娩の行、略称で書かれた行、双子や死産の行を入れる)
- そのページについて、台帳に打ち込まれた内容を書き出しておく
- ページの画像を、手元の生成AIの画面に1枚ずつ貼る
- 「この記録を、日付・牛の呼び名・事象・子牛の雌雄・子牛の耳標の番号・種雄牛・妊娠鑑定の結果の表にしてください。読めない欄は空にしてください。番号の桁を補わないでください。計算や推測で埋めないでください」と指示する
- 出てきた表を、打ち込まれた内容と1欄ずつ比べる
20枚で、作業者ごとの書き方の癖はひととおり出ます。 Form Parser とプログラムを組む前に、牛舎で汚れた紙の手書きが表として読めるのかを確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 打ち込まれた内容とほぼ同じ表が出た | OCR の API と照合の処理に進む |
| 耳標の番号の桁を落とした | 撮り方と、番号を書く欄の大きさを見直す。構成は有効 |
| 呼び名から牛を勝手に決めた | 指示と、後段の照合で止められる |
| 読めない行が多い | 紙の置き場所と筆記具が先。 AIの問題ではない |
3行目が出たら、勝手に決めた牛が合っていたかを事務の担当と見てください。 呼び名の一覧の最初の材料になります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 呼び名から牛を推測で決める | 照合はプログラムで行い、決まらなければ人へ |
| 出荷済みの牛の呼び名を継いだ牛と混ざる | 台帳に在籍か出荷済みかを持たせ、候補から外す |
| 子牛の耳標の番号の桁を補う・先頭の0が落ちる | 文字列で受け、桁を補わせない |
| ノートの前の行を毎回取り込んで二重になる | 確定済みの行と日付・牛・事象で照らして外す |
| 生成AIが一般的な日数で分娩予定を数える | 計算させない。 牧場の決まりでプログラムが数える |
| 妊娠鑑定の結果を書き忘れ、未受胎の牛が予定に残る | 「未確定」の印を付け、鑑定を受けるかを経営者が決める |
| 双子の子牛が1頭分しか届出の一覧に載らない | 1行に2頭を書く様式を決め、行を分けさせる |
| 値の空いた欄が読まれない | 値の空いたキーと値のペアは確実には読めない。様式を表にする |
| 国外で処理されることを確かめていない | 日本のリージョンは無い。 牧場の決まりに照らす |
| 出生の届出を自動で行う | 届出は人が行う。 構成は一覧まで |
上の2行が、この構成でいちばん重い失敗です。 どちらも、記録が別の牛に付く経路で、その牛の分娩予定・乾乳の予定を連鎖して狂わせます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 牛の個体識別番号、呼び名、分娩・授精・妊娠鑑定・治療の記録、種雄牛の名前、記入した作業者の名前です。個人の情報は作業者の名前程度ですが、牛群の繁殖成績は経営の中身です。
- 処理の場所を確かめる … Form Parser の対応リージョンに日本はありません。
us・euかシンガポールなどから選びます。繁殖の記録が国外で処理されることを、牧場の決まりや取引先との約束に照らします - 生成AIに渡す範囲を絞る … 生成AIには表と上の欄だけを渡し、牛の台帳は渡しません。照合は Python の側で行います
- 判断を代替しない … 妊娠の判定、分娩の介助、治療と出荷しない乳の期間は、獣医師と経営者が決めます。構成が出すのは、紙に書かれた記録と、決まりで数えた予定までです
- 届出を代替しない … 法第8条は、出生の届出を牛の管理者の義務としています。届出の内容の正しさは牧場が負うもので、構成は届け出る子牛の一覧を作るだけです
- 出荷しない乳の扱いを自動で解除しない … 別に搾る牛の一覧は、紙に書かれた指示を写したものです。一覧から外すのは、獣医師の指示を確かめた人が行います
誤りが起きた場合のリスクは、記録が別の牛に付いて予定がずれることと、届出や別搾りの牛が一覧から漏れることの2つです。前者は照合をプログラムに置き、決まらない行を人へ回すことで、後者は届出済みの印が付くまで消えない一覧で防ぎます。
10まず何から始めるか
1週目:予定の決まりと呼び名の一覧を作る
経営者が獣医師や授精師と相談し、授精日から分娩予定日までの日数、乾乳にする時期、一覧に載せる日数を決めます。あわせて、事務の担当が作業者の使う呼び名・略称を書き出し、牛の台帳と対応させます。
2週目:20枚で試す
先月のノート10ページと日報10枚を、最小構成で表にさせて、打ち込まれた内容と比べます。耳標の番号の桁を落としていないか、呼び名から牛を勝手に決めていないかを最優先で見ます。
3週目:様式と撮り方を決める
ノートの罫線を単純な表にし、日報に牛床の番号ごとの印の四角を印刷します。撮る時刻と置き場所を決め、汚れにくいようにクリアファイルに入れるかを決めます。
4週目:Form Parser から一覧までをつなぐ
画像を保存すると Form Parser が動き、事象ごとの行を一覧に書き出すところまで作ります。この時点では照合と計算を入れず、読み取りの結果だけを見ます。
2か月目: 牛の台帳との照合、分娩予定日と乾乳の予定日の計算、出生の届出の一覧を足し、確認画面で印の付いた行だけを見る運用にします。3か月目以降: 別に搾る牛の一覧を足し、1件12分が何分になったかを実測します。分娩予定の近い牛と届出の残りが毎朝の一覧で見え、数えていた人が休んでも同じように回るようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
Form Parser がキーと値のペア、表、汎用のエンティティを抽出すること。言語の一覧で日本語(ja)が手書きに対応する言語として示されていること(原文の HTML で確認)。対応リージョンが us・eu・asia-southeast1・asia-south1 などで日本のリージョンが無いこと | Google Cloud: Processor list | 2026-10-15 |
| Form Parser が学習済みで追加の学習ができないこと。行や列をまたぐセルの無い表を抽出すること。値の空いたキーと値のペアは確実には読めないこと。チェックボックスがキーと値のペアとして抽出されること | Google Cloud: Form Parser | 2026-10-15 |
text が認識されたテキストの唯一の元で、ほかの欄が startIndex・endIndex で指すこと。formFields が fieldName と fieldValue を持つこと。チェックボックスの valueType が filled_checkbox/unfilled_checkbox になること。表が headerRows と bodyRows に分かれ、rowSpan と colSpan が常に1であること | Google Cloud: Handle the processing response | 2026-10-15 |
| 対応するファイルの形式(JPEG、PNG など)。スキャンは最低200dpi、300dpi以上で一般に最良の結果とされること | Google Cloud: Supported files | 2026-10-15 |
| オンラインの処理の要求のファイルの大きさの上限が40MB、画像の解像度の上限が40メガピクセルであること | Google Cloud: Document AI limits | 2026-10-15 |
構造化出力が output_config.format に type: "json_schema" で JSON スキーマを渡して有効になること。オブジェクトに additionalProperties: false が必要なこと。数値の minimum・maximum や文字列の minLength・maxLength が非対応であること | Claude Docs: Structured outputs | 2026-10-15 |
| 牛が出生したときは、管理者が遅滞なく、出生の年月日、雌雄の別、母牛の個体識別番号、管理者の氏名又は名称及び住所、飼養施設の所在地などを届け出なければならないこと(第8条第1項) | e-Gov 法令API: 牛の個体識別のための情報の管理及び伝達に関する特別措置法 | 2026-10-15 |
| 牛の個体識別番号が重複することのない生涯唯一の10桁の番号で、その番号を印字した耳標を装着すること。所有者に出生・異動等の届出と耳標の装着が義務付けられていること | 静岡県: 牛の個体識別制度について | 2026-10-15 |
妊娠の判定、分娩の介助、治療と出荷しない乳の期間、出生の届出は、獣医師と牧場の担当者が判断・実施してください。 本記事は、上記の公開情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1706)についてのご相談はこちらから。
