住民からのごみの分け方・出し方の問い合わせに、分別辞典と収集日程を根拠にチャットで答え、辞典に無い品目は担当課へ回す
「このフライパンは何ごみか」「うちの地区の燃えないごみは何曜日か」という住民の問い合わせに、チャットで品目と地区を聞き取り、市の分別辞典と収集日程を引いた結果だけで答えます。辞典に無い品目は答えずに担当課へ回します。
- 生成AI
- Azure OpenAI Service/ChatGPT/Claude
- 対象業界
- 不動産/自治体
- 対象部門
- カスタマーサポート/総務
- 対象業務
- 問い合わせ対応/情報検索
- 主な課題
- 人手が足りない/問い合わせが多い/情報が見つからない
- AIで行う処理
- 対話
- 主な効果
- 品質標準化/対応スピード向上/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 電話や窓口で、住民から品目の名前と、どこに住んでいるかを聞く
- 品目があいまいなときは、材質、大きさ、電池が入っているかなどを聞き返す
- 分別辞典の冊子かPDFを開き、五十音の見出しで品目を探す。見つからなければ似た言い方で探し直す
- 町名から地区を調べ、収集カレンダーでその区分の曜日と次の収集日を確かめる
- 区分、出し方の注意、次の収集日を口頭で伝える
- 辞典に無い品目は、担当の職員に聞きに行くか、折り返しの連絡を約束する
- 受付記録の表に、品目、地区、回答の内容を1行で書く
- 【住民】 公式サイトのチャット窓口に、品目の名前と住んでいる町名を書く
- 自動Azure OpenAI が、品目の言い方を検索の言葉に直し、辞典を引く関数の呼び出しを返す
- 自動プログラムが分別辞典の表を引き、候補の行を返す
- 自動候補が複数あれば、Azure OpenAI が材質や大きさを住民に聞き返す
- 自動町名から地区を引き、収集日程の表からその区分の次の収集日を計算して返す
- 自動Azure OpenAI が、引いた行の区分・出し方・次の収集日だけを使って回答の文を作る
- 自動辞典に行が無い品目は、区分を答えずに「担当課で確認します」と返し、引き継ぎの記録を作る
- 人担当課が引き継ぎの一覧を毎日見て、住民へ折り返す。区分を決めたら辞典に行を足す
- 人電話で受けた問い合わせは、職員が同じチャットの画面で引く
- 人週に一度、回答の記録を抜き取りで読み、誤った案内がないかを確かめる
各工程の詳しい説明を読む
- 電話や窓口で、住民から品目の名前と、どこに住んでいるかを聞く
- 品目があいまいなときは、材質、大きさ、電池が入っているかなどを聞き返す
- 分別辞典の冊子かPDFを開き、五十音の見出しで品目を探す。見つからなければ似た言い方で探し直す
- 町名から地区を調べ、収集カレンダーでその区分の曜日と次の収集日を確かめる
- 区分、出し方の注意、次の収集日を口頭で伝える
- 辞典に無い品目は、担当の職員に聞きに行くか、折り返しの連絡を約束する
- 受付記録の表に、品目、地区、回答の内容を1行で書く
(a)同じ質問に何度も答えている。 問い合わせの多くは、辞典に載っている品目の区分と、地区の収集日です。調べれば分かることを、住民の代わりに職員が調べています。 辞典のPDFは公式サイトにありますが、1,800品目から探すのは住民には手間で、電話のほうが早いと思われています。
(b)品目が辞典のどこにあるか見つからない。 住民の言い方と辞典の見出しが合いません。「保冷剤」を「ほ」で探しても、辞典では「保冷剤(ソフトタイプ)」「保冷剤(ハードタイプ)」に分かれていることがあります。見出しの言い方を知っている職員ほど早く、新しく来た職員ほど遅くなります。
(c)材質と大きさで区分が分かれる。 同じ「かご」でも、プラスチック製か金属製か、一辺が何センチを超えるかで区分が変わります。聞き返しが足りないと、誤った区分を伝えることになります。 誤って出されたごみは収集されずに残り、別の苦情になって返ってきます。
(d)辞典に無い品目の扱いが担当者で違う。 似た品目から推して答える職員もいれば、折り返しにする職員もいます。推した答えは記録に残らず、辞典にも足されません。
- 【住民】 公式サイトのチャット窓口に、品目の名前と住んでいる町名を書く
- 【自動】 Azure OpenAI が、品目の言い方を検索の言葉に直し、辞典を引く関数の呼び出しを返す
- 【自動】 プログラムが分別辞典の表を引き、候補の行を返す
- 【自動】 候補が複数あれば、Azure OpenAI が材質や大きさを住民に聞き返す
- 【自動】 町名から地区を引き、収集日程の表からその区分の次の収集日を計算して返す
- 【自動】 Azure OpenAI が、引いた行の区分・出し方・次の収集日だけを使って回答の文を作る
- 【自動】 辞典に行が無い品目は、区分を答えずに「担当課で確認します」と返し、引き継ぎの記録を作る
- 【人】 担当課が引き継ぎの一覧を毎日見て、住民へ折り返す。区分を決めたら辞典に行を足す
- 【人】 電話で受けた問い合わせは、職員が同じチャットの画面で引く
- 【人】 週に一度、回答の記録を抜き取りで読み、誤った案内がないかを確かめる
7番目が、この設計の分かれ目です。 辞典に無い品目で、AI が似た品目から区分を推して答えると、住民は市の回答として受け取ります。答えないことを正常な結果として扱い、担当課へ回る道を最初から作ります。
9番目も大事です。 電話はなくなりません。職員が同じ画面で引けば、電話の1件も②の2分がほぼ消えます。
02今回想定するシステム構成
住民(公式サイトのチャット窓口)/電話を受けた職員(庁内の同じ画面) │ 品目の名前・町名(写真は受け付けない) ▼ チャットのプログラム(会話の履歴を持つ) │ ▼ Azure OpenAI(Microsoft Foundry)── 関数呼び出し │ lookup_item(品目の言葉) │ resolve_district(町名) │ get_next_collection(地区, 区分, 基準日) ▼ プログラムが関数を実行(すべて読み取りのみ) ├── 分別辞典の表(品目・読み・別名・区分・出し方・注意・更新日) ├── 町名と地区の対応表 └── 収集日程の表(地区×区分の曜日・週)+休みと振替の表 ▼ Azure OpenAI ── 構造化出力で最終の回答を返す │ answered / clarifying / escalated / out_of_scope ▼ 住民へ回答(辞典の行番号と更新日を添える) └──▶ escalated は引き継ぎの一覧へ ──【担当課が折り返し・辞典に追加】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 生成AI | Azure OpenAI(Microsoft Foundry)(聞き返し・関数の呼び出し・回答文) | OpenAI API、Claude API |
| 辞典の照合 | 自団体のサーバーで動くチャットのプログラム | 自団体のクラウド環境の関数実行サービス |
| 保管 | 分別辞典・地区対応表・収集日程の表(データベース) | 表計算ファイルを定期的に読み込む形 |
| 通知 | 庁内メール・グループウェア | 庁内チャット |
分別辞典と収集日程は、新しく作るものではありません。 冊子の元になっている表を、品目ごとに1行の形に整え、別名の列と更新日の列を足すのが最初の準備作業です。 収集日程は、地区×区分の曜日と週の表に、休みと振替の表を添えます。
Azure OpenAI を選ぶ理由は、データの扱いが文書で示されていることです。 Microsoft Learn では、プロンプトと応答は他の顧客に提供されず、OpenAI にも提供されず、許可なく基盤モデルの学習に使われないとされています。モデルはステートレスで、プロンプトや応答はモデルに保存されないとも説明されています。
辞典を引くのは、関数呼び出しです。 要求に関数を含めると、モデルは文脈から関数を呼ぶかどうかを決め、呼ぶときは引数を JSON で返すとされています。関数を実行するのはアプリケーションの側で、その結果をモデルに返すので、実行される動作をこちらで制御できます。 辞典の検索をモデルの知識に頼らず、表を引いた結果に閉じられるのは、この仕組みがあるからです。
辞典を検索の仕組みにつなぐ形は取りません。 構造化出力は、自分のデータを接続する「持ち込みデータ」のシナリオや Foundry Agents Service では現時点でサポートされていないとされています。品目は1行ずつの表なので、文章の検索より、表を引く関数のほうが確実です。
03どうやって実装するのか
処理の起点を決める
住民がチャット窓口に最初の一文を書いたことを起点にします。 公式サイトのごみのページと、分別辞典のPDFのページにチャットの入口を置きます。辞典を探しに来た人が、そのまま聞ける場所に置くのが要点です。
電話を受けた職員は、庁内の同じ画面を開いて、住民から聞いた言葉をそのまま打ちます。住民向けと職員向けで仕組みを分けません。 分けると、辞典の更新がどちらか一方にしか届かない期間ができます。
会話の履歴はプログラムの側で持ち、毎回の要求にその会話のやり取りだけを入れます。 会話ごとに識別子を振り、30分で区切ります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 住民の発言 | 品目の名前、町名、材質や大きさの答え | チャット窓口 |
| 分別辞典 | 品目ID、品目名、読み、別名、区分、出し方、注意、更新日 | 清掃担当課の表 |
| 町名と地区の対応表 | 町名(丁目まで)、地区番号 | 清掃担当課の表 |
| 収集日程 | 地区×区分の曜日、第何週か、休みと振替の日付 | 清掃担当課の表 |
| 基準日 | 問い合わせを受けた日の日付 | プログラムの時計 |
質を決めるのは、分別辞典の別名の列です。 住民は「ホッカイロ」「使い捨てカイロ」「カイロ」と言います。辞典の見出しが1つでも、別名に言い方を並べておけば、プログラムの照合で引けます。 別名の列が空のままでは、AI が言い換えても辞典に届きません。
更新日の列は、回答に添えるために持ちます。 区分の変更があった品目は、古い冊子を見た住民と食い違います。「この案内は何月何日時点の辞典です」と書ければ、食い違いの理由を住民が自分で読めます。
基準日を AI に渡さず、プログラムの時計から取るのも意図してのことです。 「次の収集日」を計算する関数に基準日を入れ、日付の計算はすべてプログラムが行います。
データの取得方法を決める
データは3つの関数で取ります。AI が呼べるのはこの3つだけで、すべて読み取りのみです。
| 関数 | 引数 | 返すもの |
|---|---|---|
lookup_item | 品目の言葉(AIが住民の言葉から作る) | 候補の行(品目ID、品目名、区分、出し方、注意、更新日、一致の種類)を最大5件 |
resolve_district | 町名 | 地区番号。見つからなければ not_found |
get_next_collection | 地区番号、区分 | 次の収集日と、その次の収集日。休みと振替を反映したもの |
lookup_item の照合はプログラムが行います。 品目名と別名の完全一致、読みの一致、部分一致の順に引き、どの段階で一致したかを「一致の種類」として返します。 AI はこの値を見て、完全一致なら答え、部分一致なら住民に確かめます。
関数の説明文には上限があります。 ツールと関数の説明は、現在1,024文字に制限されているとされています。引数の書き方の注意は説明文に短く書き、長い規則はシステムメッセージの側に置きます。
関数の定義は、たとえば次のように書きます。
{
"type": "function",
"function": {
"name": "lookup_item",
"description": "市の分別辞典から品目を探す。住民の言い方を、辞典の見出しに近い一般的な品目名に直して渡す。材質や大きさが分かっていれば含める。",
"strict": true,
"parameters": {
"type": "object",
"properties": {
"query": { "type": "string", "description": "品目名。例: 使い捨てカイロ、プラスチック製のかご" },
"material": { "type": ["string", "null"], "enum": ["plastic", "metal", "wood", "glass", "cloth", "paper", "mixed", null] }
},
"required": ["query", "material"],
"additionalProperties": false
}
}
}
material を省略可能にせず、null を許す形で必須にしています。 構造化出力では、すべてのフィールドを必須にし、additionalProperties を false にする必要があるとされ、省略可能な項目は null との共用体で表すとされています。
AIへ渡す前に整形する
- 発言の長さの確認 … 1回の発言が長すぎるものは切り詰め、品目名と町名の部分だけを渡します
- 個人情報の除去 … 住民が氏名、番地、電話番号を書いた場合は、プログラムの側で伏せ字にしてから渡します。収集日の計算に要るのは町名(丁目まで)だけです
- 町名の正規化 … 全角と半角、「丁目」と数字の書き方をそろえてから対応表を引きます
- 辞典の表の検査 … 毎朝、区分の列が空の行、別名が他の品目と重複している行を洗い出し、担当課へ知らせます
- 収集日程の検査 … 休みと振替の表が、向こう60日分そろっているかを毎朝確かめます。足りなければ、次の収集日を答えない設定に切り替えます
- 関数の結果の整形 … 候補の行は、AI に要る列だけに絞って返します
2番目を軽く見ないでください。 住民は親切に「○○町3丁目5番の山田です」と書きます。番地と氏名は回答にまったく要らないので、渡さないのが一番安全です。
AIに処理させる
させるのは、住民の言葉を関数の引数に直すこと、足りない条件を聞き返すこと、関数が返した行だけで回答文を作ることの3つです。
| させること | 中身 | 判断できないときの扱い |
|---|---|---|
| 品目の言い換え | 「100均のかご」を「プラスチック製のかご」のように、辞典の見出しに近い言葉にする | 何の品目か分からなければ聞き返す |
| 聞き返し | 候補が材質・大きさ・電池の有無で分かれるとき、その違いだけを聞く | 2回聞いても決まらなければ escalated |
| 町名の確認 | 町名が無ければ聞く。地区が引けなければ町名を確かめる | 引けなければ収集日を答えない |
| 回答文の作成 | 区分、出し方、注意、次の収集日を、関数の結果のとおりに並べる | 結果に無いことは書かない |
| 範囲外の見分け | 事業所のごみ、不法投棄の通報、粗大ごみの申込みの手続き | out_of_scope として窓口を案内 |
| させないこと | 理由 |
|---|---|
| 辞典に無い品目の区分を決める | 区分の決定は担当課の仕事。推した答えが市の回答になる |
| 似た品目から区分を推す | 材質が同じでも、大きさや危険性で区分が分かれる |
| 収集日を自分で計算する | 休みと振替を知らない。計算は関数が行う |
| 手数料や申込み方法を答える | 辞典の範囲外。粗大ごみの手続きの窓口へ案内する |
| 家電4品目の処分先を自分で説明する | 辞典の「市で収集しないもの」の行に書かれた案内だけを返す |
1行目がいちばん起きやすい失敗です。 辞典に「電動歯ブラシ」が無いとき、AI は「電気製品なので小型家電の回収へ」と答えたくなります。その答えが合っているかどうかではなく、辞典に根拠が無いことが問題です。
家電4品目は、辞典の側に行を持たせます。 環境省の説明では、家庭用エアコン、テレビ、電気冷蔵庫・電気冷凍庫、電気洗濯機・衣類乾燥機が家電リサイクル法の対象で、消費者は廃棄するときに収集運搬料金とリサイクル料金を支払い、小売業者には引取りが義務付けられているとされています。市の案内の文面は辞典の行に書き、AI にはその行を返させるだけにします。
指示内容を固定する
あなたは市の清掃担当課の案内係です。住民からの、ごみの分け方・出し方・
収集日の質問に答えます。
【使ってよい情報】
- lookup_item、resolve_district、get_next_collection の3つの関数が
返した結果だけを使ってください。
- 自分の知識で、ごみの区分、出し方、収集日を答えないでください。
- 提供された関数以外を使おうとしないでください。
【進め方】
1. 品目の名前が分かったら lookup_item を呼んでください。住民の言い方は、
一般的な品目名に直してから渡してください。
2. 結果の match_type が exact なら、その行で答えてください。
3. 候補が複数あるときは、候補どうしで違う点(材質・大きさ・電池の有無)
だけを、1回に1つ質問してください。区分名を住民に選ばせないでください。
4. 収集日を聞かれたら、町名を確かめて resolve_district を呼び、
get_next_collection で次の収集日を取ってください。
日付を自分で計算しないでください。
5. 関数に渡す値を推測しないでください。品目や町名があいまいなら、
住民に聞き返してください。
【答えてはいけないこと】
- lookup_item の結果が0件のときは、区分を答えないでください。
似た品目から推して答えないでください。status を escalated にし、
「担当課で確認して連絡します」と伝えてください。
- 同じ品目で2回聞き返しても1つに決まらないときも escalated にしてください。
- 粗大ごみの申込み方法や手数料、事業所のごみ、不法投棄の通報は
out_of_scope にし、案内先の窓口だけを伝えてください。
- 住民が氏名や番地を書いても、回答に繰り返さないでください。
【回答の書き方】
- 区分、出し方、注意、次の収集日の順に、短く書いてください。
- 使った辞典の行の item_id と updated_at を必ず sources に入れてください。
- 結果に書かれていないことを付け足さないでください。
「関数に渡す値を推測しない」を明記しているのは、公式の案内に沿ったものです。 Microsoft Learn では、関数で使う値を推測せず、要求があいまいなら明確化を求めるようシステムメッセージで指示する例が示されています。町名が無いまま、ありそうな地区で収集日を引かれると、住民は誤った曜日にごみを出します。
出力形式を固定する
最終の回答は、構造化出力で次の形の JSON にします。
{
"status": "answered | clarifying | escalated | out_of_scope",
"reply_text": "",
"items": [
{
"query": "",
"item_id": "",
"item_name": "",
"category": "",
"how_to": "",
"note": "",
"updated_at": ""
}
],
"collection": {
"district": "",
"category": "",
"next_dates": []
},
"question": "",
"escalation": {
"item_words": "",
"reason": "not_in_dictionary | unresolved_after_two_questions | district_not_found"
},
"sources": []
}
1つ目の理由は、status で後段の処理を分けられることです。 answered はそのまま住民に表示し、escalated は引き継ぎの一覧に1行を足し、out_of_scope は窓口の案内を添えます。文の中身を読まずに、値だけで分岐できます。
2つ目は、回答文と根拠を別の欄に置けることです。 reply_text は住民向けの文、items と sources は辞典の行です。抜き取りで確かめるとき、文と行を並べて読めば、行に無いことを書いていないかがすぐ分かります。
3つ目は、escalation.reason で担当課の仕事が分かれることです。 not_in_dictionary は辞典に足す品目の候補、district_not_found は町名の対応表の不備です。同じ「答えられなかった」でも、直す先が違います。
構造化出力は、指定した JSON スキーマに従って応答させる機能で、有効な JSON だけを保証していた従来の JSON モードとは違い、スキーマへの準拠まで求められるとされています。スキーマは最大100個のオブジェクトプロパティ、最大5レベルの入れ子までとされており、この形はその範囲に収まります。
並列の関数呼び出しは使いません。 構造化出力は並列関数呼び出しではサポートされず、使う場合は parallel_tool_calls を false にするとされています。品目を引いてから地区を引く順番が決まっているので、並列にする利点もありません。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| チャット窓口 | 公式サイトに埋め込んだ画面 | 住民の発言を受け、回答を表示する |
| Azure OpenAI | Chat Completions API(v1) | 関数の呼び出しと、構造化出力の回答 |
| 分別辞典・地区対応表・収集日程 | データベースの読み取り | 3つの関数の中身 |
| 引き継ぎの一覧 | データベースへの追記 | escalated の会話を1行ずつ足す |
| 担当課への通知 | 庁内メール | 引き継ぎの件数を毎朝知らせる |
辞典への書き込みは、この構成からは行いません。 AI にも関数にも、辞典を書き換える経路を持たせません。区分を決めて辞典に足すのは、担当課の職員が表を直す作業です。 関数は読み取りだけの権限で動かします。
モデルが返した関数呼び出しは、実行する前にプログラムが検証します。 呼ぶ関数の名前が3つのどれかか、引数が型どおりかを見ます。Microsoft Learn でも、モデルが生成した関数呼び出しを常に確認すること、関数には必要最小限のアクセス権だけを与えることが勧められており、データベースへの問い合わせなら読み取り専用のアクセス権にする例が挙げられています。
JSON の読み込みの失敗にも備えます。 関数呼び出しの JSON 応答が常に有効とは限らないため、エラーを処理するロジックを足す必要があるとされています。読めなかったときは同じ要求を1回だけやり直し、それでも読めなければ escalated にします。
人が確認する
人が見るのは、escalated の引き継ぎと、抜き取りの記録だけです。 answered の回答を1件ずつ承認する設計にはしません。承認を挟むと、住民は答えを待つことになり、電話のほうが早くなります。
- 引き継ぎの一覧を毎朝見る …
not_in_dictionaryの品目について、区分を決めて住民に折り返します。折り返しの期限は、受け付けた翌開庁日までとします - 決めた区分を辞典に足す … 品目名と、住民が使った言い方を別名に入れます。次に同じ品目を聞かれたとき、引き継ぎにならずに答えられます
- 週に一度、50件を抜き取って読む …
reply_textとitemsを並べ、行に無いことを書いていないかを見ます - 誤りを見つけたら記録する … どの会話の、どの文が、辞典のどの行と食い違ったかを残します
2番目を省かないでください。 折り返しだけで終えると、同じ品目がまた引き継ぎになります。引き継ぎの件数が月を追って減っていくかどうかが、辞典の整備が進んでいるかの目安です。
3番目の抜き取りで見るのは、根拠の外に出ていないかです。 関数の結果に無いことを付け足していれば、指示を直します。
例外に対処する
| 起きること | 対応 |
|---|---|
| 辞典に品目が無い | escalated。区分を答えず、担当課で確認すると伝える |
| 2回聞き返しても品目が決まらない | escalated。住民の言葉のまま引き継ぐ |
| 町名が対応表に無い | 町名を聞き直す。引けなければ収集日を答えず escalated |
| 休みと振替の表が足りない | 次の収集日を答えない。曜日だけを案内し、公式サイトの告知を案内する |
| 関数呼び出しの JSON が読めない | 1回だけやり直す。だめなら escalated |
| 定義していない関数を呼ぼうとする | 実行しない。1回だけやり直す |
| 事業所のごみ、不法投棄の通報 | out_of_scope。担当の窓口を案内する |
| 粗大ごみの申込み | out_of_scope。申込みの窓口を案内する |
| Azure OpenAI が応答しない | 「ただいま案内できません」と表示し、辞典のPDFと電話番号を示す |
上の3行が大半を占めます。 どれも AI の問題ではなく、辞典と対応表の穴の問題です。 引き継ぎの理由を数えれば、どこを直せばよいかが分かります。
記録を残す
- 会話の識別子、受け付けた日時、入口(住民のチャット/職員の画面)
- 住民の発言(伏せ字にした後のもの)と、AI の回答(
reply_text) - 呼んだ関数の名前、引数、返った結果
- 最終の JSON(
status、items、collection、escalation、sources) - そのとき参照した辞典の行の更新日
- 引き継ぎの処理(折り返した日時、決めた区分、辞典に足した日)
- 抜き取りの結果と、誤りの記録
3つ目の関数の記録が、いちばん役に立ちます。 誤った案内が見つかったとき、AI が言い換えを誤ったのか、辞典の行が誤っていたのか、日程の表が古かったのかを、呼んだ引数と返った結果で切り分けられます。
04実装レベルの3段階
最小構成では、1,800品目を貼りきれません。 問い合わせの多い品目に絞った表で、答えない動きができるかを確かめる段階です。 半自動化は、職員だけが使う形です。 住民に公開する前に、電話を受けた職員が同じ画面で引きます。1件5分のうち②の2分がほぼ消え、誤った案内が出ても職員がその場で気づけます。 ここで1か月、引き継ぎの理由と抜き取りの結果を数えます。 本格構成で住民に公開し、この段階が本記事の想定です。 差が大きいのは、住民が自分で聞いた分だけ、電話そのものが減るからです。
05工数削減シミュレーション
導入後 2,400件 × 1.5分 ÷ 60 = 60 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- ごみの分け方・出し方・収集日の問い合わせが、電話と窓口とメールで月に千件を超える市区町村。品目ごとの分別辞典(五十音順の品目一覧)と、地区ごとの収集日程を表の形で持っている、または作れる場合。問い合わせの多くが「これは何ごみか」「何曜日に出せばよいか」で、職員が冊子と収集カレンダーを引いて答えている場合。辞典に無い品目の判断を、担当課が週に一度まとめて行える体制がある場合。管理物件の入居者からごみ出しの問い合わせを受ける賃貸管理会社にも同じ形が当てはまる。
- 分別辞典が冊子の紙面にしかなく、品目ごとの区分を表に起こす人手を確保できない場合。問い合わせの中心が粗大ごみの申込み受付や手数料の支払いで、案内より手続きそのものが重い場合。問い合わせが月に数十件で、担当者が直接答えて足りる場合。なお、辞典に無い品目の区分の決定と、不法投棄や事業系ごみの扱いの判断は、この構成では代替できません。
07最小構成で試す方法
- 先月の受付記録から、問い合わせの多い品目を50件選ぶ(うち10件は、辞典に無かった品目を入れる)
- 分別辞典の表から、その50件に関係しそうな行を抜き出して1つの表にする
- 手元の生成AIの画面に、表と次の指示を貼る
- 「この表だけを根拠に、住民の質問に答えてください。表に無い品目は区分を答えず『担当課で確認します』と答えてください。材質や大きさで分かれるときは聞き返してください」と指示する
- 50件の質問を住民の言い方のまま1件ずつ入れ、当時の職員の回答と突き合わせる
辞典に無い10件を必ず入れてください。 この構成で確かめたいのは、答えられる品目の正しさより、答えてはいけない品目で答えないかどうかです。
| 出てきた内容 | 判断 |
|---|---|
| 表の行どおりに答え、無い品目は答えなかった | 関数呼び出しの形に進む |
| 表に無い品目を似た品目から推して答えた | 指示の書き方で直る。関数の結果が0件のときの扱いを先に決める |
| 住民の言い方で表の行に届かない | 別名の列が足りない。 AI の問題ではない |
3行目はよく出ます。 届かなかった言い方をそのまま別名に入れ、同じ50件で取り直してください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 辞典に無い品目を似た品目から推して答える | 0件のときは escalated と決め、指示にも書く。 抜き取りで推した答えを探す |
| 住民の言い方で辞典の行に届かない | 別名の列を足す。届かなかった言い方を毎週別名に入れる |
| 町名が無いまま収集日を答える | 関数に渡す値を推測させない。町名が無ければ聞き返す |
| 年末年始に通常の曜日で答える | 休みと振替の表が60日分そろっているかを毎朝確かめる |
| 聞き返しが多すぎて住民が離れる | 候補どうしで違う点だけを、1回に1つ聞く |
| 関数の説明文に規則を書きすぎる | 説明は1,024文字の上限がある。長い規則はシステムメッセージへ |
| 構造化出力と並列の関数呼び出しを併用する | 併用はサポートされない。parallel_tool_calls を false にする |
| 定義していない関数を呼ぼうとする | 実行前に名前と引数を検証する。システムメッセージに一文を入れる |
| 住民が氏名や番地を書く | プログラムの側で伏せ字にしてから渡す |
| 家電4品目の処分先を AI が自分で説明する | 辞典の「市で収集しないもの」の行に案内を書き、それを返させる |
| 辞典の区分の変更が回答に届かない | 辞典の表を正本にし、冊子とPDFは表から作る |
上の3行が、この構成の失敗のほとんどです。 どれも「分からないのに答える」という同じ形をしています。答えないことを正常な結果として扱えているかで、運用に乗るかが決まります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 住民が書いた品目の名前と町名です。住民が自分から氏名、番地、電話番号を書くことがあります。分別辞典と収集日程は公開している情報です。
- 外部へ渡すのは、品目と町名までに限る … 収集日の計算に番地は要りません。氏名、番地、電話番号はプログラムの側で伏せ字にしてから渡します
- 処理する地域を選ぶ … Global や DataZone のデプロイでは、指定した地域の外でも処理されうるとされています。住民の発言を扱う構成なので、指定した地域内で処理されるデプロイの種類を選びます
- 区分の決定を AI に任せない … 辞典に無い品目の区分は、担当課が決めて辞典に足します。 AI が推した区分が市の回答として広がると、収集されないごみと苦情が返ってきます
- 不正使用の監視の扱いを確かめる … Microsoft Learn では、不正使用の兆候が検出された場合にプロンプトと応答のサンプルがレビューのために選ばれることがあり、管理対象の顧客は不正使用の監視の変更を申請できるとされています。団体の方針に照らして、申請が要るかを決めてください
- 関数には読み取りの権限だけを与える … 辞典、対応表、日程の表を書き換えられる権限を、AI から呼べる経路に持たせません
誤りが起きた場合のリスクは、誤った区分や曜日を案内して、ごみが収集されずに残ることです。 前者は辞典に無い品目を推して答えると起き、後者は日程の表が古いか、町名を推して引くと起きます。どちらも「根拠が無いときに答えない」で防げるので、そこだけは設計で守ります。
10まず何から始めるか
1週目:分別辞典の表に2つの列を足す
冊子の元になっている表に、別名の列と更新日の列を足します。1,800品目すべてを一度に埋める必要はありません。先月の受付記録で多かった上位200品目から埋めます。 電話を受けている職員に、住民がよく使う言い方を書き出してもらうと早く進みます。
2週目:50件で試す
先月の問い合わせから50件を選び、うち10件は辞典に無かった品目にします。手元の生成AIに表の一部を貼り、無い品目で答えないかを最優先で見ます。
3週目:引き継ぎの流れを決める
辞典に無い品目を誰が、いつまでに、どう決めて辞典に足すのかを、担当課と決めます。 ここが決まらないうちに住民に公開すると、引き継ぎの一覧が積み上がるだけになります。町名と地区の対応表も、丁目まで引ける形にそろえます。
4週目:職員向けの画面をつなぐ
3つの関数を作り、Azure OpenAI の関数呼び出しで辞典と収集日程を引く画面を、電話を受ける職員だけで使い始めます。この時点では住民に公開しません。
2か月目: 職員の画面で、引き継ぎの理由と抜き取りの結果を毎週数え、届かなかった言い方を別名に足します。3か月目以降: 住民向けのチャット窓口を公開し、1件5分が何分になったかと、電話の件数を実測します。引き継ぎの件数が月を追って減り、辞典の更新が1週間以内に回答へ届くようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
要求に関数を含めるとモデルが呼ぶかどうかを決め、引数を JSON で返すこと。関数はアプリケーションが実行し結果をモデルに返すこと。tool_choice の既定が auto で、名前付きの指定や none があること。関数で使う値を推測せず明確化を求める指示の例、提供した関数だけを使う指示の例。JSON 応答が常に有効とは限らずエラー処理が要ること。関数呼び出しの検証と最小限の特権(読み取り専用)の推奨。関数がプロンプトのトークンを使うこと。ツールと関数の説明が1,024文字に制限されること | Microsoft Learn: 関数呼び出しを使用する方法 | 2026-09-29 |
構造化出力が指定した JSON スキーマに従わせる機能で、従来の JSON モードと違いスキーマへの準拠まで求めること。すべてのフィールドを必須にし additionalProperties を false にすること、省略可能な項目は null との共用体で表すこと。最大100個のオブジェクトプロパティ・5レベルの入れ子。並列関数呼び出しではサポートされず parallel_tool_calls を false にすること。持ち込みデータのシナリオと Foundry Agents Service では現時点でサポートされないこと | Microsoft Learn: Azure OpenAI で構造化出力を使用する方法 | 2026-09-29 |
| プロンプトと応答が他の顧客や OpenAI に提供されず、許可なく基盤モデルの学習に使われないこと。モデルがステートレスであること。Global・DataZone 以外のデプロイでは指定した地域内で処理されること。不正使用の監視でサンプルがレビューのために選ばれうること、管理対象の顧客が監視の変更を申請できること | Microsoft Learn: Azure が販売する Foundry モデルのデータ、プライバシー、セキュリティ | 2026-09-29 |
| 家電リサイクル法の対象が家庭用エアコン、テレビ、電気冷蔵庫・電気冷凍庫、電気洗濯機・衣類乾燥機の4品目であること。消費者が収集運搬料金とリサイクル料金を支払うこと、小売業者に引取りが義務付けられていること | 環境省: 家電リサイクル法の概要 | 2026-09-29 |
分別の区分と収集日程は、各自治体の辞典と告知が正本です。 本記事は架空の市の辞典を前提にした構成で、特定の自治体の区分を示すものではありません。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0378)についてのご相談はこちらから。
