住民アンケートの自由記述を施策ごとに分類し、意見の集約と代表的な声の一覧を作る
住民アンケートの自由記述を意見ごとに分け、総合計画の施策の一覧から当てはまる施策を選びます。施策ごとの件数と要旨、代表的な声の一覧を毎月そろえ、進行管理と庁議の資料に使える形にします。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- 教育/自治体
- 対象部門
- 経営企画
- 対象業務
- 分類・仕分け/集計・分析
- 主な課題
- データ分析に時間がかかる/人手が足りない/属人化している
- AIで行う処理
- 分類
- 主な効果
- 判断支援/品質標準化/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 各経路のスプレッドシートから、自由記述の欄に記入がある回答を1つのシートに集める
- 1件ずつ読み、当てはまる施策を施策の一覧から探して、コードを横の列に書く
- 複数の意見が入っている回答は、行をコピーして意見ごとに分ける
- 施策ごとに件数を数え、進行管理表に書き写す
- 施策ごとに回答を読み返して要旨を書き、庁議の資料用に代表的な声を数件選ぶ
- 緊急の対応が要りそうな意見(危険な場所の指摘、虐待の疑いなど)は、気づいた時点で担当課に転送する
- 自動毎日夜に、各経路のスプレッドシートから前日分の自由記述を集める
- 自動空欄、「特になし」だけの回答、同じ人の重複送信を除く
- 自動氏名・電話番号・メールアドレスのような記述を伏せる
- 自動Gemini が回答を意見の単位に分け、意見ごとに施策のコード、意見の種類、緊急の要否を返す
- 自動緊急の要否が「要」のものは、その日のうちに担当課と企画政策課へ通知する
- 自動月末に、施策ごとの件数を集計し、Gemini が施策ごとの要旨と代表的な声の候補を返す
- 人企画政策課が、確信度の低い分類と「該当なし」、無作為に選んだ一部の分類を確かめる
- 人代表的な声の候補から庁議の資料に載せるものを選び、個人が特定できる記述が無いかを確かめる
- 自動確定した分類と件数を進行管理表に書き込む
各工程の詳しい説明を読む
- 各経路のスプレッドシートから、自由記述の欄に記入がある回答を1つのシートに集める
- 1件ずつ読み、当てはまる施策を施策の一覧から探して、コードを横の列に書く
- 複数の意見が入っている回答は、行をコピーして意見ごとに分ける
- 施策ごとに件数を数え、進行管理表に書き写す
- 施策ごとに回答を読み返して要旨を書き、庁議の資料用に代表的な声を数件選ぶ
- 緊急の対応が要りそうな意見(危険な場所の指摘、虐待の疑いなど)は、気づいた時点で担当課に転送する
(a)分け方が、担当者によって違う。 「通学路の歩道が狭い」は、道路の施策か、子どもの安全の施策か、教育の施策か。3名がそれぞれの判断で分けているため、同じ意見が月によって違う施策に入ります。 件数の増減が、住民の声の変化なのか分け方の変化なのか区別がつきません。
(b)複数の意見が入った回答で、意見が消える。 3番目の手作業は時間がかかるため、忙しい月は最初の意見だけで分類してしまいます。 後ろに書かれた意見は、どの施策の件数にも入りません。
(c)代表的な声を選ぶ根拠が無い。 庁議の資料に載せる声は、担当者が印象に残ったものを選んでいます。強い言葉の意見ほど選ばれやすく、多数の穏やかな意見が埋もれます。 「この声は何件のうちの1件か」を示せないため、資料を見た幹部が意見の重みを判断できません。
(d)緊急の意見が、月末まで見つからない。 6番目は「気づいた時点」ですが、読み込みが月末に集中するので、月初めに書かれた危険箇所の指摘が、3週間後に担当課へ届くことがあります。
- 【自動】 毎日夜に、各経路のスプレッドシートから前日分の自由記述を集める
- 【自動】 空欄、「特になし」だけの回答、同じ人の重複送信を除く
- 【自動】 氏名・電話番号・メールアドレスのような記述を伏せる
- 【自動】 Gemini が回答を意見の単位に分け、意見ごとに施策のコード、意見の種類、緊急の要否を返す
- 【自動】 緊急の要否が「要」のものは、その日のうちに担当課と企画政策課へ通知する
- 【自動】 月末に、施策ごとの件数を集計し、Gemini が施策ごとの要旨と代表的な声の候補を返す
- 【人】 企画政策課が、確信度の低い分類と「該当なし」、無作為に選んだ一部の分類を確かめる
- 【人】 代表的な声の候補から庁議の資料に載せるものを選び、個人が特定できる記述が無いかを確かめる
- 【自動】 確定した分類と件数を進行管理表に書き込む
7番目が、この設計の分かれ目です。人が見るのは全件ではありません。 確信度の低いものと、どの施策にも当たらないとされたものだけを見ます。それに加えて、確信度が高いものからも毎月一定数を無作為に選んで見ます。 高いものを一切見ないと、分類の癖が変わっても気づけないからです。
5番目を毎日にしているのも、意図してのことです。 分類は月次で足りますが、危険箇所や虐待の疑いの指摘は、月末まで待たせてはいけません。 読む作業を日次に分けたことで、第3章の(d)が解消します。
02今回想定するシステム構成
フォームの回答(常設アンケート/窓口の満足度調査/イベント/提案フォーム) │ 各経路のスプレッドシートにたまる ▼【トリガー】毎日 夜(時間主導型のトリガー) 連携スクリプト(Google Apps Script) ├──▶ 空欄・「特になし」・重複の除外 ├──▶ 氏名・電話番号・メールアドレスの伏せ字 ▼ Gemini API(構造化出力。施策のコードは列挙型で限定) │ ① 意見の単位への分割 ② 施策のコード(主・副) │ ③ 意見の種類 ④ 緊急の要否 ⑤ 確信度 ▼ 分類結果のシート ──▶ 緊急「要」は担当課へ当日通知 ▼【月末】 集計(スプレッドシートの関数) ── 施策ごとの件数 ▼ Gemini API ── 施策ごとの要旨と、原文からの代表的な声の候補 ▼ 【人:確信度の低いもの・該当なし・無作為の一部を確認/代表的な声を選ぶ】 ▼ 進行管理表・庁議の資料
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 処理 | Gemini API(意見の分割、施策の分類、要旨と代表的な声の候補) | Claude API、OpenAI API |
| 連携 | Google Apps Script(回答の収集、伏せ字、API呼び出し、通知) | Python の定期実行 |
| 集計 | Google スプレッドシート(施策ごとの件数と月次の比較) | Looker Studio |
| 保管 | Google ドライブ(原文、分類結果、確定版) | 庁内のファイルサーバー |
フォームとスプレッドシートは、新しく足すものではありません。 今ある回答のシートを読むだけで、各課のアンケートの作り方は変えません。最初の準備作業は、総合計画の施策の一覧に、施策ごとの「含まれる例」と「含まれない例」の列を足すことです。
土台になるのは、Gemini API の構造化出力です。 Google のドキュメントでは、出力を JSON にし、JSON Schema でその形を指定できるとされています。分類の用途では、enum で選べる値を列挙できるとされており、42の施策のコードをそのまま列挙に入れます。これで、一覧に無いコードが返ることを形式の段階で防げます。
ただし、形式が正しいことと値が正しいことは別です。 ドキュメントでも、出力は構文として正しい JSON であっても、値はアプリケーションの側で検証するようにと書かれています。また、JSON Schema の一部の機能だけに対応しており、非常に大きい、または深く入れ子になったスキーマは拒否されることがあるとされています。施策のコードを列挙に入れるのは42個なので、この範囲に収まる想定です。
月末の要旨づくりには、Batch API を使えます。 標準の50%の費用で、目標の処理時間は24時間とされ、多くの場合はそれより早いとされています。月次の集約は、その日のうちに返ってこなくても困らない処理です。 一方、日次の分類は緊急の通知があるので、通常の呼び出しで行います。
03どうやって実装するのか
処理の起点を決める
毎日の夜に1回、前日分の回答を処理します。 回答が送信されるたびに動かす方法もありますが、同じ人が続けて何度も送る重複を、1日単位のほうが見分けやすいためです。Google Apps Script の時間主導型のトリガーで、毎日決まった時間帯に動かします。
動く時刻は、ちょうどではありません。 Google のドキュメントでは、毎日9時のトリガーを作ると9時から10時の間のどこかの時刻が選ばれ、その時刻が日々保たれるとされています。「夜の1時間のどこか」と考えて、職員の出勤前に終わる時間帯を選びます。 また、トリガーは作った人のアカウントで動くとされています。担当者個人のアカウントで作ると、異動したときに止まるので、課で管理するアカウントで作ります。
月末の集約は、別のトリガーで動かします。 月の最終日の翌朝に、その月の分類結果を施策ごとにまとめ、要旨と代表的な声の候補を作ります。日次の分類と月次の集約を分けておくと、どちらかが失敗しても、もう一方をやり直すだけで済みます。
処理済みの印は、回答のシートの側に付けません。 各課のシートは各課のものなので、書き込むと各課の集計を壊すおそれがあります。分類結果のシートに回答のIDを持たせ、そこに無いIDだけを未処理として拾います。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 自由記述の回答 | 回答ID、送信日時、経路、設問の文、自由記述の本文 | 各経路のスプレッドシート |
| 設問の情報 | どの課の、何についてのアンケートか | 経路ごとの設定表 |
| 施策の一覧 | 施策のコード、施策名、基本目標、含まれる例、含まれない例 | 総合計画の施策の一覧 |
| 意見の種類 | 要望、苦情、評価(良い)、提案、質問の5種類と、その定義 | 企画政策課が決めた一覧 |
| 緊急の基準 | 危険箇所、虐待の疑い、生命・身体に関わる訴え、差別的な内容の定義 | 企画政策課と各課で決めた一覧 |
質を決めるのは、施策の一覧の「含まれる例、含まれない例」です。 施策名は「安心して子育てできるまち」のように抽象的なので、名前だけでは「通学路の歩道」がここに入るのか道路の施策に入るのかが決まりません。第3章の(a)で3名の判断が分かれた例を、そのまま「含まれる例、含まれない例」に書き込みます。 担当者の暗黙の判断を、一覧の側に移すということです。
設問の情報も渡します。 同じ「対応が遅い」という記述でも、窓口の満足度調査なら窓口の施策、イベントのアンケートならそのイベントの施策です。どの設問への答えかが分からないと、分類の手がかりが半分になります。
データの取得方法を決める
各経路のスプレッドシートを、Google Apps Script から読みます。 経路ごとの設定表に、シートのIDと、自由記述の列、送信日時の列、設問の文を書いておきます。新しいアンケートを分類の対象に加えるときは、設定表に1行足すだけにします。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 前日分の回答 | 各経路のシート(送信日時で絞る) | 分類の対象 |
| 設問の文と所管の課 | 経路ごとの設定表 | 分類の手がかり |
| 施策の一覧 | 総合計画の施策の一覧 | 選択肢と、判断の例 |
| その月の分類結果 | 分類結果のシート | 月末の集約 |
施策の一覧は、毎回その時点の内容を読みます。 施策の見直しは年度の途中でも起きます。一覧を処理の中に書き込んでしまうと、見直しの後も古いコードで分類し続けます。 一覧から列挙の値を毎回作り、スキーマに入れます。
AIへ渡す前に整形する
- 空の回答を除く … 空欄、「特になし」「なし」「とくにありません」だけの回答は、分類に回しません
- 重複を除く … 同じ経路で、同じ本文が短い時間に続けて送られたものは1件にまとめます
- 個人の情報を伏せる … 氏名らしい記述、電話番号、メールアドレス、住所の番地を
[氏名]のような記号に置き換えます - 長すぎる回答を確かめる … 数千字の回答は、それだけ別に処理します。ほかの回答とまとめて送ると、その1件に引きずられます
- まとめて送る単位を決める … 1回の呼び出しに20件ずつ、回答IDを付けて渡します
- 列挙の値を作る … 施策の一覧からコードの一覧を作り、「該当なし」を1つ足してスキーマに入れます
3番目は、Gemini に渡す前に行います。 伏せ字をAIに任せると、伏せる前の本文が外に出ます。住民が自由記述の欄に自分の名前や電話番号を書くことは珍しくありません。 「連絡してほしい」という意図で書かれた連絡先は、伏せたうえで、担当課への通知の側に元の回答IDで結び付けます。
6番目の「該当なし」を省くと、無理に近い施策へ入れます。 市の施策と関係のない意見(国の制度への意見、民間の店舗への苦情など)は、どこにも当てはまらないことを答えとして選べるようにしておきます。
AIに処理させる
させるのは、回答を意見の単位に分け、意見ごとに決まった一覧から値を選ぶことです。 日次の分類で選ぶのは次の5つです。
| 選ぶもの | 選び方 | 判断できないときの扱い |
|---|---|---|
| 意見の区切り | 1つの回答の中の、別々の事柄についての記述を分ける | 分けられなければ1意見のまま |
| 施策のコード(主) | 施策の一覧の「含まれる例、含まれない例」に照らして1つ | 当てはまらなければ NONE |
| 施策のコード(副) | 2つ目に関係する施策があれば1つ | 無ければ空 |
| 意見の種類 | 要望、苦情、評価、提案、質問のいずれか | 決められなければ other |
| 緊急の要否 | 緊急の基準のいずれかに当たるか | 迷えば review |
右端の列の review が、この構成で最も大事な値です。 緊急の要否で迷ったときに「否」を選ばせると、見逃した1件は月末まで誰の目にも触れません。 迷ったら人に回す値を、あらかじめ用意しておきます。
月末の集約でさせるのは、施策ごとに2つのことです。 1つは、その月の意見の要旨を3文以内で書くこと。もう1つは、意見の中から代表的な声の候補を原文のまま5件選ぶことです。候補には、その声が施策の中で多数の意見に近いのか、少数だが重要な意見なのかの区分を付けさせます。
| させないこと | 理由 |
|---|---|
| 施策の一覧に無い見出しを作る | 月ごとに比べられなくなる |
| 代表的な声を言い換える | 住民が書いていない言葉が住民の声として回る |
| 件数を数える | 集計はスプレッドシートの関数で行う |
| 意見の良し悪しを評価する | どの意見を重く見るかは施策の担当課と幹部が決める |
| 伏せ字を元に戻そうとする | 個人の情報を推測で補わない |
3行目を機械の集計にしているのは、AIに件数を書かせると、要旨の文に合わせて数が丸まるからです。 「多くの意見が」と書いた要旨の横に、実際には3件しかない、ということが起きます。件数は関数で数え、AIには件数を渡したうえで要旨を書かせます。
指示内容を固定する
あなたは市役所の企画政策課で、住民アンケートの自由記述を
総合計画の施策ごとに整理する職員を補助します。
【作業】
渡した回答を1件ずつ読み、次のことをしてください。
1. 1つの回答に別々の事柄が書かれていれば、意見の単位に分けてください。
分けたそれぞれに、元の本文の該当部分をそのまま text に写してください。
2. 意見ごとに、【施策の一覧】から最も当てはまる施策を1つ選んでください(main)。
2つ目に関係する施策があれば、1つだけ選んでください(sub)。
3. 意見の種類を、要望・苦情・評価・提案・質問から選んでください。
4. 【緊急の基準】に当たるかを判定してください。
【厳守事項】
- 施策は【施策の一覧】のコードから選んでください。一覧に無い見出しを
作らないでください。どれにも当たらなければ NONE を選んでください。
- 施策を選ぶときは、施策名ではなく「含まれる例」「含まれない例」を
手がかりにしてください。
- 設問の文と所管の課も手がかりにしてください。同じ「対応が遅い」でも、
窓口の満足度調査なら窓口の施策です。
- text は、元の本文を写してください。要約や言い換えをしないでください。
- 緊急の基準に当たるか迷ったら、urgent を review にしてください。
迷ったときに no を選ばないでください。
- [氏名][電話]などの伏せ字は、そのままにしてください。
元の内容を推測しないでください。
- 意見の良し悪しや、施策への評価を書かないでください。
- confidence には、施策の選択にどれだけ確信があるかを high / low で
入れてください。「含まれる例」に近い例が無ければ low にしてください。
【設問】{question}(所管:{department})
【施策の一覧】{policy_list}
【意見の種類の定義】{opinion_types}
【緊急の基準】{urgent_rules}
【回答】{responses}
「施策名ではなく例を手がかりに」を明記しないと、名前の語感で選びます。 「安心・安全なまち」という施策名があれば、安全という語が入った意見を何でもそこへ入れます。判断の根拠を、担当者が書いた例の側に置かせます。
「迷ったときに no を選ばない」は、緊急の判定の要です。 生成AIは、判断に迷うと穏当な側を選ぶ傾向があります。緊急の判定では、穏当な側が見逃しの側です。 そこで、迷った場合の値を指示の中で指定します。
出力形式を固定する
日次の分類は、次の形のJSONで受け取ります。
{
"results": [
{
"response_id": "",
"opinions": [
{
"text": "",
"main": "P-2-3 | NONE",
"sub": "",
"type": "request | complaint | praise | proposal | question | other",
"urgent": "no | yes | review",
"urgent_reason": "",
"confidence": "high | low"
}
]
}
]
}
main と sub の値は、施策の一覧から作った列挙です。P-2-3 は「基本目標2の施策3」のような施策のコードで、42個のコードと NONE のほかは返らないようにスキーマで限ります。
1つ目の理由は、text で意見の分割を確かめられることです。 分けた意見ごとに元の本文の該当部分が付くので、連携スクリプトは、text が元の回答の本文に含まれるかを文字列として照合します。 含まれなければ言い換えが起きているので、その回答は人の確認に回します。
2つ目は、urgent を3つの値で持てることです。 yes と review はどちらも当日の通知に回しますが、通知の文面を変えます。yes は担当課が対応を始めるもの、review は企画政策課がまず読むものです。
3つ目は、confidence で人の確認の範囲を決められることです。 low と NONE は全件を人が見ます。high は、その月の件数の5%を無作為に選んで見ます。
月末の集約は、施策ごとに次の形で受け取ります。
{
"policy": "P-2-3",
"count": 0,
"summary": "",
"voices": [
{ "response_id": "", "text": "", "position": "majority | minority_important" }
]
}
count はAIが書くものではなく、渡した件数をそのまま返させます。 連携スクリプトは、返ってきた count が渡した件数と同じかを確かめます。voices の text も、元の意見の本文に含まれるかを照合します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 各経路のスプレッドシート | Google Apps Script から読み取り | 前日分の回答を集める |
| Gemini API | Google Apps Script から呼び出し | 日次の分類と、月末の要旨・代表的な声の候補 |
| 分類結果のシート | 書き込み | 意見ごとの分類、確信度、緊急の要否 |
| 担当課への通知 | メール | 緊急の yes と review を当日中に |
| 進行管理表 | 確定後に書き込み | 施策ごとの件数と要旨 |
各経路のシートには書き込みません。 各課のアンケートは各課のもので、分類の結果を書き戻す必要はありません。分類結果のシートに回答IDで結び付ければ、元の回答はいつでも引けます。
進行管理表への書き込みは、人の確認が済んでからにします。 分類結果のシートは下書きで、進行管理表は庁内で共有される確定版です。確認の前に書き込むと、見直す前の件数が庁議の資料に使われます。
人が確認する
人が見るのは、次の4種類です。
- 緊急の
yesとreview… 当日のうちに企画政策課が読み、担当課への連絡を確かめます。reviewの多くは緊急ではありませんが、判断は人が行います - 確信度が
lowのものとNONE… 施策を選び直します。選び直した結果は、施策の一覧の「含まれる例」に足す候補にします - 確信度が
highのものから無作為に5% … 分類が正しいかを確かめます。誤りが続く施策があれば、一覧の例を見直します - 代表的な声の候補 … 庁議の資料に載せるものを選び、個人が特定できる記述が無いかを確かめます
2番目の選び直しを、一覧の側に返すことが大事です。 人が直したものをそのままにすると、翌月も同じ種類の意見が low で出てきます。直した理由を「含まれる例」に書き足すと、翌月からその種類は high で分類されるようになります。 この構成は、そうして一覧が育つことを前提にしています。
4番目では、原文であることを逆手に取られないよう注意します。 原文のまま載せるので、特定の地域名や店名、家族構成から、書いた人が分かることがあります。 載せるかどうかは、個人が推測できないかで判断してください。
目標は、1,500件をならして1件0.4分です。 low と NONE が全体の1割、high の抜き取りが5%という想定です。low が2割を超える月は、新しい種類の意見が増えているか、施策の見直しが一覧に反映されていません。
例外に対処する
| 起きること | 対応 |
|---|---|
| 返ったコードが施策の一覧に無い | 形式では防いでいるが、念のため照合し、あれば NONE 扱いで人へ |
text が元の本文に含まれない | 言い換えが起きている。その回答を人の確認に回す |
| 1件の回答が数千字ある | 単独で処理し、意見の分割の結果を人が確かめる |
| 外国語で書かれた回答 | 分類はそのまま行い、代表的な声の候補からは外す。翻訳は別の工程で扱う |
| 施策の一覧が年度途中で見直された | 見直し前の月の分類は、そのときのコードのまま残す。比べるときに対応表を使う |
| 同じ人が同じ意見を大量に送る | 前処理でまとめ、件数には1件として入れる |
| API の上限に達する・応答しない | その日の分を未処理のまま残し、翌日にまとめて処理する。緊急の判定が遅れた旨を記録する |
月末の count が渡した件数と違う | 要旨を採用せず、再実行する |
| 月末の Batch のジョブが終わらない | 48時間で完了しないジョブは期限切れとされる。期限切れになったら通常の呼び出しで施策ごとに作り直す |
上の2行は、形式を指定していても起きうると考えて作ります。 ドキュメントにもあるとおり、形式が正しいことは値が正しいことを保証しません。 照合は、後段の連携スクリプトに必ず置きます。
記録を残す
- 元の回答(伏せ字の前)と、伏せ字の後の本文。伏せ字の前の本文は、閲覧できる人を限った場所に置く
- Gemini に渡した本文と、返ってきたJSONの全文
- そのとき使った施策の一覧の版
- 人が選び直した分類と、その理由
- 緊急の通知を出した日時と、担当課が受け取った日時
- 月末の要旨と代表的な声の候補、庁議の資料に採用したもの
3つ目の「施策の一覧の版」を残すのは、施策が見直されるためです。 年度の途中で施策が統合されると、同じコードが見直しの前後で違う範囲を指します。 版が残っていないと、前年同月と比べるときに、件数の増減の意味が分からなくなります。
4つ目は、一覧を育てる材料です。 選び直しの理由がたまると、どの施策の「含まれる例」が足りないかが見えてきます。
04実装レベルの3段階
最小構成では、件数がさばけません。 貼り付けの手間がかかるので、月1,500件には使えません。分類ができるかを確かめるための段階です。 半自動化で、1件1.6分が0.8分程度になります。 分類は自動になりますが、件数の集計と要旨、代表的な声の選定は手作業で残ります。本格構成で0.4分になり、この段階が本記事の想定です。 差が出るのは、月末の要旨づくりと代表的な声を選ぶ作業が、施策ごとに回答を読み返す手作業だからです。 段階を飛ばさないでください。 半自動化で2か月ほど回すと、low の多い施策と、NONE に入る意見の種類が分かります。一覧を整えてから本格構成に進むほうが、人の確認が少なく済みます。
05工数削減シミュレーション
導入後 1,500件 × 0.4分 ÷ 60 = 10 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 公式サイトの常設アンケート、窓口の満足度調査、各課のイベント・説明会のアンケートなどで、自由記述の回答が毎月数百件から千件以上集まる市区町村。総合計画や実施計画に施策の体系があり、意見を施策ごとに整理して進行管理や庁議の資料に使いたい場合。自由記述の読み込みと分類を企画課の少人数が手作業で行っていて、担当者によって分け方が違う場合。教育委員会や学校が保護者アンケートを施策の体系で整理したい場合。
- 自由記述が月に数十件で、担当者が全件を読んで整理できる規模の場合。施策の体系が決まっておらず、何に分類するかが定まっていない場合。アンケートが年1回の市民意識調査だけで、毎月の集約の必要がない場合。なお、意見に対してどの施策をどう見直すかの判断と、個別の意見への回答の要否の判断は、この構成では代替できません。
07最小構成で試す方法
- 先月の自由記述から200件を選ぶ(うち数十件は、複数の意見が入っているものを入れる)
- その200件について、先月の担当者が付けた施策のコードを用意する
- 施策の一覧に、判断が分かれやすい施策から順に「含まれる例、含まれない例」を書き足す
- 利用が認められている生成AIの画面に、施策の一覧と回答を数十件ずつ貼り、施策を選ばせる
- 出てきた分類を、担当者の分類と見比べる
200件は、個人の情報を伏せてから使ってください。 試す段階でも、住民の書いた本文が外部のサービスに渡ります。Gemini API の利用規約では、無償のサービスに機密情報や個人の情報を送らないよう書かれています。 試すときも、有償の利用として契約した環境を使ってください。
| 出てきた内容 | 判断 |
|---|---|
| 担当者と同じ施策が大半で、違うものは担当者の間でも分かれていた | 連携スクリプトの構築に進む |
| 施策名の語感で選んでいる | 「含まれる例」が足りない。一覧を先に整える |
| 複数の意見を1つにまとめている | 指示の書き方で直る。構成は有効 |
1行目の「担当者の間でも分かれていた」を確かめるのが、この試験の目的の1つです。 AIと担当者が違う施策を選んだとき、別の担当者に聞くと、また違う施策を選ぶことがあります。 そういう意見こそ、一覧の例として書き足すべきものです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 施策名の語感で分類する | 「含まれる例、含まれない例」を手がかりにさせる。 一覧を先に整える |
| 一覧に無い見出しを作る | 施策のコードを列挙にし、NONE を用意する |
| 複数の意見が1つにまとまる | 意見の単位への分割を先にさせ、text に原文を写させる |
| 代表的な声が言い換えられる | text が元の本文に含まれるかを照合する |
| 緊急の意見を「否」にする | 迷ったら review にさせる。 当日に人が読む |
| 要旨の「多くの意見」が数と合わない | 件数は関数で数え、AIに渡して要旨を書かせる |
| 伏せ字をAIに任せる | 渡す前に連携スクリプトで伏せる |
| 無償の環境で試す | 規約で個人の情報を送らないよう書かれている。 有償の環境を使う |
| 施策の見直しの後も古いコードで分類する | 毎回その時点の一覧から列挙を作る |
high のものを全く見ない | 無作為に5%を毎月見る |
| 担当者の異動で毎日の処理が止まる | トリガーは作った人のアカウントで動く。 課で管理するアカウントで作る |
上の2行が、この構成の失敗のほとんどです。 どちらも、施策の一覧が名前だけで、判断の例が無いところから起きます。一覧に例をそろえるかどうかで、運用に乗るかが決まります。
最後の行は、4月に起きます。 人事異動の直後、毎日の分類が止まっていることに誰も気づかず、月末になって1か月分が未処理のまま見つかるという形です。分類結果のシートに前日の件数が入っていない朝は、課の共有の宛先へ知らせる仕組みを一緒に作っておいてください。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 住民が書いた自由記述の本文、送信日時、どのアンケートへの回答か、そして自由記述の中に住民が自分で書いた氏名や連絡先、家族の状況です。
- 無償のサービスに住民の本文を送らない … Gemini API の利用規約では、無償のサービスに送った内容は Google の製品の改善に使われ、人が読んで注釈を付けることがあるとされ、機密情報や個人の情報を送らないよう書かれています。有償のサービスでは、入力や応答を製品の改善に使わないとされています。必ず有償の利用として契約してください
- 伏せ字は渡す前に行う … 住民は、連絡してほしくて自由記述の欄に電話番号を書くことがあります。伏せる前の本文は、閲覧できる人を限った場所に残します
- 代表的な声は、個人が推測できないかで選ぶ … 原文のまま載せるので、地域名や店名、家族構成から書いた人が分かることがあります
- 緊急の判定を自動で完結させない … 通知までは自動、対応の判断は担当課です。AIが「否」とした意見に緊急のものが無いかは、抜き取りで確かめます
- 分類を住民への回答に使わない … この構成は庁内の整理のためのものです。個別の意見に回答するかどうかは、担当課が本文を読んで決めます
- アンケートの案内に、意見を整理に使う旨を書く … 自由記述を生成AIで分類することを、各課のアンケートの案内や個人情報の取扱いの説明と照らしてください
誤りが起きた場合のリスクは、緊急の意見を見逃すことと、住民が書いていない言葉を住民の声として示すことの2つです。 前者は迷ったときに「否」を選ばせると、後者は言い換えを許すと起きます。どちらも指示と照合で防げるので、そこは設計で守ります。
10まず何から始めるか
1週目:施策の一覧に例を書き足す
総合計画の施策の一覧に、「含まれる例」と「含まれない例」の列を足します。42の施策すべてを一度に埋める必要はありません。先月、担当者の間で分け方が分かれた施策から埋めます。 あわせて、意見の種類と緊急の基準を決めます。
2週目:200件で試す
先月の自由記述から200件を選び、個人の情報を伏せてから生成AIの画面で分類させます。担当者の分類と比べ、施策名の語感で選んでいないかを最優先で見ます。
3週目:連携スクリプトを作る
経路ごとの設定表を作り、前日分の回答を集めて伏せ字にし、Gemini API で分類して結果のシートに書き出すところまで作ります。この時点では通知を出さず、分類の一覧だけを見ます。
4週目:緊急の通知を足す
yes と review の当日通知を足し、各課に受け取り方を伝えます。通知の宛先は、各課の個人ではなく課の共有の宛先にします。
2か月目: 月末の集約と代表的な声の候補を足し、進行管理表への反映を人の確認の後に行う流れを作ります。low と NONE の件数を毎週数えます。3か月目以降: 選び直した分類を一覧の例に書き戻し、1件1.6分が何分になったかを実測します。low の割合が下がり、四半期の庁議の資料を施策ごとの件数と代表的な声でそろえられた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
出力を JSON にし、JSON Schema で形を指定できること。enum で分類の選択肢を列挙できること。JSON Schema の一部の機能だけに対応し、非常に大きい・深く入れ子になったスキーマは拒否されることがあること。出力が構文として正しい JSON でも、値はアプリケーションの側で検証するよう書かれていること | Google AI for Developers: Structured outputs | 2026-09-29 |
| Batch API が標準の50%の費用であること。目標の処理時間が24時間で、多くの場合それより早いこと。インラインの要求は合計20MB未満、JSONL のファイルは1ファイル2GBまでであること。48時間で完了しないジョブは期限切れになること | Google AI for Developers: Batch API | 2026-09-29 |
| 無償のサービスに送った内容が製品の改善に使われ、人が読んで注釈を付けることがあること。無償のサービスに機密情報や個人の情報を送らないよう書かれていること。有償のサービスでは入力や応答を製品の改善に使わないとされていること | Google AI for Developers: Gemini API Additional Terms of Service | 2026-09-29 |
| 時間主導型のトリガーが毎分から月1回までの間隔で設定できること。開始の時刻は少しずらされ、9時のトリガーなら9時から10時の間の時刻が選ばれて日々保たれること。トリガーは作った人のアカウントで動くこと。トリガーの割り当ての上限があること | Google for Developers: Installable Triggers(Apps Script) | 2026-09-29 |
自由記述の扱いは、各団体の個人情報の取扱いの規程と、各アンケートの案内に従ってください。 本記事は Google の公開ドキュメントで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0319)についてのご相談はこちらから。
