Media > AI活用ユースケース > カスタマーサポート > 市役所の税務課に届く住民税・固定資産税の問い合わせメールに、条例・手引き・過去の回答から回答案を作り、職員の確認に回す

市役所の税務課に届く住民税・固定資産税の問い合わせメールに、条例・手引き・過去の回答から回答案を作り、職員の確認に回す

実装ステータス:構成例 技術的に実現可能な構成として設計したもの。自社未検証

市の税務課にWebフォームとメールで届く住民税・固定資産税の問い合わせに、市税条例・課税の手引き・過去の回答例を根拠にした回答案を作ります。職員は案と根拠を確かめて直し、自分で送ります。

サマリー
生成AI
Azure OpenAI Service/ChatGPT/Claude
AIサービス
Azure AI/OpenSearch
連携・自動化
Power Automate
対象業界
自治体
対象部門
カスタマーサポート
対象業務
問い合わせ対応/書類作成
主な課題
人手が足りない/問い合わせが多い/属人化している
AIで行う処理
生成
主な効果
品質標準化/対応スピード向上/工数削減
導入難易度
★★★★☆
実装レベル
本格構成
費用感
RAG・個別開発(大)
人間の確認
必須
現在工数
120h/月
AI導入後
40h/月
想定削減
67%
年間削減
960h
モデル条件による試算値です。実在企業の実績ではありません。

01導入前 / 導入後の業務フロー

導入前(Before)
  1. 担当の職員が共有メールボックスとフォームの受付一覧を開き、未対応の問い合わせを1件ずつ読む
  2. 質問を住民税・固定資産税・都市計画税・軽自動車税などに分け、担当の係に回す
  3. 回答する職員が、例規集で条例・規則を探し、課税の手引きの該当ページを開く
  4. 過去の回答のフォルダを開き、似た質問への回答があるかを探す
  5. 個別の課税の中身に触れる質問かどうかを判断し、触れる場合は電話か窓口へ案内する文を書く
  6. 回答文を書き、係長に回して確認を受ける
  7. 確認が終わったら、共有メールボックスから返信し、受付一覧に対応済みと記録する
導入後(After)
  1. 自動フォームの送信とメールの受信をきっかけに、問い合わせを受付の一覧に登録する
  2. 自動本文から、マイナンバー・宛名番号・通知書番号など課税の資料を特定しうる番号を伏せる
  3. 自動生成AIが、質問を税目と論点に分け、個別の課税の中身に触れるかどうかを判定する
  4. 自動論点ごとに、条例・規則・手引き・過去の回答を検索で引く
  5. 自動生成AIが、引いた文書だけを根拠に回答案を作り、文ごとに根拠の文書の番号を付ける
  6. 自動根拠の番号が実在するか、引用した文が文書に本当にあるかをプログラムで照合する
  7. 自動個別の中身に触れる質問には、本人を確かめる経路(電話・窓口)を案内する文面だけを作る
  8. 人担当の職員が、回答案と根拠を並べた画面で確かめ、直して係長に回す
  9. 人係長が確認し、職員が共有メールボックスから返信する
  10. 自動送った文面と直した箇所を記録し、過去の回答の候補として残す
各工程の詳しい説明を読む
  1. 担当の職員が共有メールボックスとフォームの受付一覧を開き、未対応の問い合わせを1件ずつ読む
  2. 質問を住民税・固定資産税・都市計画税・軽自動車税などに分け、担当の係に回す
  3. 回答する職員が、例規集で条例・規則を探し、課税の手引きの該当ページを開く
  4. 過去の回答のフォルダを開き、似た質問への回答があるかを探す
  5. 個別の課税の中身に触れる質問かどうかを判断し、触れる場合は電話か窓口へ案内する文を書く
  6. 回答文を書き、係長に回して確認を受ける
  7. 確認が終わったら、共有メールボックスから返信し、受付一覧に対応済みと記録する

(a)根拠を探すのに時間がかかる。 質問の答え自体は職員が知っていても、返信には根拠を正確に書く必要があるため、条例と手引きの該当箇所を毎回開き直します。 条例・規則・手引き・国の通知のどれに書いてあるかが質問ごとに違い、探す場所が一定しません。

(b)個別の中身に触れるかの線引きが職員ごとに違う。 「去年と比べて高い理由」を一般論で返す職員もいれば、電話へ案内する職員もいます。一般論のつもりで書いた文が、読み手によってはその人の課税の説明として読めることがあり、慎重な職員ほど返信に時間をかけます。

(c)過去の回答が使えない。 同じ質問に回答した記録はあるのに、探し出せないか、見つかっても制度の改正前の内容かが分かりません。結局、毎回ゼロから書くことになります。

(d)通知書の発送後に返信が遅れる。 件数が集中する時期は、確認待ちの回答が係長の机にたまり、返信が数日遅れると、同じ人から電話がかかってきて二重の対応になります。

  1. 【自動】 フォームの送信とメールの受信をきっかけに、問い合わせを受付の一覧に登録する
  2. 【自動】 本文から、マイナンバー・宛名番号・通知書番号など課税の資料を特定しうる番号を伏せる
  3. 【自動】 生成AIが、質問を税目と論点に分け、個別の課税の中身に触れるかどうかを判定する
  4. 【自動】 論点ごとに、条例・規則・手引き・過去の回答を検索で引く
  5. 【自動】 生成AIが、引いた文書だけを根拠に回答案を作り、文ごとに根拠の文書の番号を付ける
  6. 【自動】 根拠の番号が実在するか、引用した文が文書に本当にあるかをプログラムで照合する
  7. 【自動】 個別の中身に触れる質問には、本人を確かめる経路(電話・窓口)を案内する文面だけを作る
  8. 【人】 担当の職員が、回答案と根拠を並べた画面で確かめ、直して係長に回す
  9. 【人】 係長が確認し、職員が共有メールボックスから返信する
  10. 【自動】 送った文面と直した箇所を記録し、過去の回答の候補として残す

3番目が、この設計の分かれ目です。 個別の中身に触れると判定された質問には、AIは制度の説明も書かず、経路の案内だけを書きます。 一般論の説明を付けると、(b)のように読み手がその人の課税の説明と受け取るからです。

8番目と9番目は、いまと同じ2段の確認を残します。 減るのは①〜③の探す・書く時間で、送る前に人が2回見る形は変えません。

02今回想定するシステム構成

構成図
Webフォーム/課の代表メールアドレス
   ▼【トリガー】フォームの送信・メールの受信
Azure Functions(受付の登録と前処理)
   ├──▶ 課税の資料を特定しうる番号を伏せる
   ▼
Azure OpenAI(構造化出力)── 税目と論点の分類、個別の中身に触れるかの判定
   ▼
Azure AI Search(ハイブリッド検索)
   │   条例・規則/課税の手引き/過去の回答(承認済みのものだけ)
   ▼
Azure OpenAI(構造化出力)── 根拠の番号を付けた回答案
   ▼
Azure Functions ── 根拠の照合、案内文の差し込み
   ▼
【担当の職員が確認 → 係長が確認】
   ▼
共有メールボックスから返信(送信は人)
役割想定する製品代替候補
生成AIAzure OpenAI(Microsoft Foundry)OpenAI API、Claude API
連携Azure Functions(受付、番号を伏せる処理、根拠の照合)Power Automate
連携Azure AI Search(条例・手引き・過去の回答の検索)Amazon OpenSearch Service
保管Azure SQL Database(受付、回答案、確認と修正の記録)庁内のデータベース
確認画面庁内の業務用の Web 画面(回答案と根拠を並べて表示)共有メールボックスの下書き

課税の基幹システムにはつなぎません。 宛名や課税額を引く経路をこの構成に持たせないことで、AIがその人の課税の資料を読むことが、仕組みとして起きないようにします。 個別の質問への回答は、いまと同じく本人を確かめたうえで職員が基幹システムを見て行います。

Azure OpenAI を選ぶ理由は2つです。 1つは、構造化出力で JSON スキーマに沿った出力を受けられることです。公式の説明では、Chat Completions API と Responses API の両方で構造化出力が使え、指定した JSON スキーマに従うとされています。判定と回答案と根拠の番号を決まった形で受けられるので、後段の照合を規則で書けます。

もう1つは、データの扱いです。 公式の説明では、プロンプトと出力は他のお客様に提供されず、OpenAI にも提供されず、許可なく基盤モデルの学習に使われないとされています。ただし、Global や DataZone のデプロイでは処理の場所が指定の地域の外に広がりうるとされているので、デプロイの種類は市の情報セキュリティポリシーに合わせて選びます。

Azure AI Search は、検索の部品として使います。 ハイブリッド検索は、フルテキストのクエリとベクトルのクエリを1つの要求で並列に実行し、逆ランク融合(RRF)で結果をまとめるとされています。「賦課期日」「納期」のような条文の言葉は全文検索で、「家を売った年の税金」のような住民の言い回しはベクトル検索で拾えます。

03どうやって実装するのか

Step1

処理の起点を決める

フォームの送信とメールの受信を、そのつど起点にします。 1日1回まとめる形にはしません。通知書の発送後は1日に数十件届くため、まとめると朝の一覧が長くなり、(d)の遅れがそのまま残ります。

フォームは送信のたびに受付の一覧へ書き込み、メールは共有メールボックスへの着信を Azure Functions が受け取ります。どちらの経路で届いても、同じ受付番号の体系に載せます。 経路ごとに一覧が分かれると、同じ人がフォームとメールで二重に送ってきたときに気づけません。

自動返信は、受付の確認だけにします。 「受け付けました。回答には数日かかることがあります。個別の税額のお問い合わせは、ご本人の確認のため電話または窓口でお受けしています」という定型文を返し、AIの回答案を自動で送ることはしません。

Step2

入力データを集める

データ中身取得元
問い合わせ件名、本文、届いた日時、経路(フォーム/メール)フォームの受付一覧、共有メールボックス
条例・規則市税条例、同施行規則の条ごとの本文と改正日例規集(公開している本文)
課税の手引き課で作った手引きの節ごとの本文と版課の共有フォルダ(PDF)
過去の回答質問の要旨、回答の本文、回答した日、係長の承認の有無送信済みの回答から整えたもの
案内の定型文電話・窓口の案内、受付時間、持ち物課で用意する一覧

質を決めるのは、過去の回答の入れ方です。 送信済みのメールをそのまま入れると、住民の氏名や住所、個別の税額がそのまま検索の対象になります。 過去の回答は、質問と回答の一般的な部分だけを書き起こし直し、係長が承認したものだけを入れます。

フォームには「お名前」「ご連絡先」の欄がありますが、AIには渡しません。 回答案を作るのに氏名は要らないからです。返信の宛先は、受付の一覧の側で持ちます。

Step3

データの取得方法を決める

条例・規則は、例規集で公開している本文を条ごとに分けて取り込みます。1つの文書を条単位に分けておくと、回答案の根拠を「第何条」で示せます。 手引きは節ごとに分け、版と改訂日を付けます。

取るものどこから何に使うか
条例・規則の条例規集の本文回答の根拠(条ごとの番号付き)
手引きの節課の共有フォルダ手続きと計算の説明の根拠
承認済みの過去の回答回答の記録の表言い回しと、よくある質問の型
案内の定型文課の一覧個別の質問への案内

索引は、文書が変わるたびに作り直します。 条例の改正、手引きの改訂、過去の回答の追加のたびに、Azure Functions が索引を更新します。索引の各文書には「いつの版か」を持たせ、改正前の版は検索の対象から外します。

検索は、論点ごとにハイブリッド検索で上位を取ります。取る件数は論点あたり5件ほどに絞ります。 多く渡すほど、関係の薄い文書を根拠にした文が混ざります。

論点ごとの検索の要求は、次のような形になります。search に論点の要旨を、vectorQueries に同じ要旨の埋め込みを入れ、税目と「最新の版か」をフィルターで絞ります。

{
  "search": "年の途中で家屋を売却した場合の固定資産税の納税義務者",
  "vectorQueries": [
    { "kind": "vector", "vector": [0.0], "k": 50, "fields": "contentVector" }
  ],
  "filter": "tax_type eq 'fixed_asset' and is_current eq true",
  "select": "doc_id, doc_type, title, article, content, revised_on",
  "top": 5
}

select で返す欄は、人が読める本文と根拠の表示に要るものだけにします。 doc_type には「条例」「規則」「手引き」「過去の回答」を入れておき、確認画面で根拠の種類が分かるようにします。同じ内容が条例と手引きの両方にあるときは、条例の条を先に示すように並べ替えます。

Step4

AIへ渡す前に整形する

  1. 番号を伏せる … 12桁のマイナンバー、宛名番号、通知書番号、口座番号に当たる並びを [番号] に置き換えます
  2. 氏名・住所を外す … フォームの氏名・住所の欄は渡しません。本文中の住所は町名までに丸めます
  3. 引用の除去 … メールの返信で付いてくる過去のやり取りを切り落とし、新しい本文だけにします
  4. 添付の扱い … 通知書の写真などの添付はAIに渡さず、「添付あり」の印だけを付けます
  5. 重複の検知 … 同じ送信元から同じ内容が短時間に届いたものを束ねます
  6. 長さの確認 … 極端に長い本文は、質問の部分だけを先に人が確かめる扱いにします

4番目は省かないでください。 納税通知書の写真には、氏名・住所・税額・宛名番号が全部写っています。添付をAIに渡すと、伏せたはずの情報が画像のまま入ります。 添付があった問い合わせは、ほぼ個別の質問なので、そのまま本人確認の経路へ回す候補にします。

Step5

AIに処理させる

させるのは2段です。 1段目で質問を論点に分けて個別の中身に触れるかを判定し、2段目で引いた文書だけを根拠に回答案を作ります。

段させること判断できないときの扱い
1段目税目(住民税/固定資産税/都市計画税/その他)と論点を分ける税目が読み取れなければ unknown
1段目個別の課税の中身に触れるかを判定する迷ったら individual に倒す
2段目論点ごとに、引いた文書だけを根拠に回答の文を書く根拠が無ければ書かずに no_source
2段目文ごとに根拠の文書の番号と、根拠にした箇所の写しを付ける写しを付けられない文は書かない
2段目個別の論点には、案内の定型文の番号だけを付ける定型文が合わなければ needs_human

個別の中身に触れる、の判定の例です。

質問判定
住民税の納期は何月かgeneral
年の途中で売った家の固定資産税は誰が払うのかgeneral
私の住民税が去年より高い理由を教えてほしいindividual
届いた通知書の税額が合っているか見てほしいindividual
父が亡くなったが、父の家の税金はどうなるかgeneral と individual が混在

最後の行のような混在が、実際には多くあります。 一般的な手続きの説明は書き、亡くなった方の課税の中身は書かずに窓口へ案内します。論点ごとに判定を分けるのは、この混在を扱うためです。

させないこと理由
個人の税額の計算・推定その人の課税の資料が無く、推定は誤りの元になる
減免・課税の取消ができるかの判断要件の確認と決定は職員が行う
賦課の誤りかどうかの判断資料を見なければ判断できない
根拠の無い説明の追加職員が確かめようのない文が混ざる
返信の送信送るのは職員
Step6

指示内容を固定する

あなたは市役所の税務課で、住民からの問い合わせへの回答案を作る担当です。
渡された【参照文書】だけを根拠にしてください。
あなたが知っている税の知識で補わないでください。

【1段目で付けた論点と判定】{issues}
  各論点に scope(general / individual)が付いています。

【回答案の書き方】
- scope が general の論点だけ、回答の文を書いてください。
- 文ごとに、根拠にした参照文書の doc_id と、
  根拠にした箇所をそのまま写した quote を付けてください。
  quote は参照文書の文字列と一字一句同じにしてください。
- 参照文書に根拠が無い論点は、文を書かず status を no_source にしてください。
- scope が individual の論点には、文を書かないでください。
  guide_id に案内の定型文の番号だけを入れてください。
- 個人の税額を計算したり、推定したりしないでください。
  「おそらく」「一般的には高くなります」のような書き方もしないでください。
- 減免や課税の取消ができるかどうかを書かないでください。
  手続きの名前と窓口だけを書いてください。
- 日付と月は、参照文書に書かれたものをそのまま写してください。
  市の条例で定める納期は、参照文書の条例の条から写してください。
- 問い合わせの本文にある[番号]の部分には触れないでください。
- 住民に向けた丁寧な文体で書いてください。
  ただし、条文の言葉を言い換えて意味を変えないでください。

【問い合わせ】{inquiry}
【参照文書】{documents}
【案内の定型文の一覧】{guides}

「あなたが知っている税の知識で補わない」を最初に置く理由は、税の質問ほどモデルが答えを知っているからです。 一般的な地方税の知識で書いた文は、その市の条例の納期や手続きと食い違うことがあります。根拠を参照文書に限ることで、職員が確かめる先が1つに決まります。

quote を一字一句同じにさせるのは、後段で機械的に照合するためです。 写しが文書に無ければ、その文は根拠が無いものとして案から外します。

Step7

出力形式を固定する

次の形のJSONで受け取ります。

{
  "inquiry_id": "",
  "tax_type": "resident | fixed_asset | city_planning | other | unknown",
  "issues": [
    {
      "issue_id": "",
      "summary": "",
      "scope": "general | individual",
      "status": "answered | no_source | guided | needs_human",
      "sentences": [
        { "text": "", "doc_id": "", "quote": "" }
      ],
      "guide_id": ""
    }
  ],
  "has_attachment": false,
  "draft_greeting": "",
  "draft_closing": ""
}

1つ目の理由は、論点ごとに判定と回答を分けて持てることです。 混在した質問でも、一般の論点には文があり、個別の論点には案内の番号だけがある形で受けられます。職員は、どの論点が案内に回ったかを一目で確かめられます。

2つ目は、根拠の照合を規則で書けることです。 Azure Functions が quote を参照文書の本文と照らし、見つからない文には印を付けて画面で赤く出します。

構造化出力では、スキーマのすべてのフィールドを必須にし、オブジェクトに additionalProperties: false を設定する必要があるとされています。 使わない欄は空文字や空の配列で返させます。文字数の上限や正規表現のような maxLength・pattern は使えないとされているので、長さや形式の確認はプログラムの側で行います。

照合外れたとき
doc_id が参照文書にあるその文を外し、needs_human
quote が文書の本文にそのままあるその文に印を付けて職員に見せる
scope が individual なのに sentences がある文を捨て、案内だけにする
文の中に税額らしい数字がある印を付けて職員に見せる

3行目は、プロンプトで禁じたことが守られなかった場合の受け皿です。 指示だけに頼らず、出力の側でも個別の論点の文を捨てます。

Step8

システムへ連携する

つなぎ先方式内容
Webフォーム送信時の通知受付の一覧へ登録する
共有メールボックス着信の通知受付の一覧へ登録する
Azure AI SearchAPI呼び出し論点ごとにハイブリッド検索で文書を引く
Azure OpenAIAPI呼び出し論点の判定と回答案の作成
確認画面庁内の Web 画面回答案・根拠の写し・照合の結果を並べる
共有メールボックス職員の操作返信は職員が送る

Azure OpenAI の「On Your Data」の機能は使いません。 公式の説明では、持ち込みデータのシナリオでは構造化出力がサポートされていないとされています。検索は Azure Functions の側で行い、引いた文書をプロンプトに入れて渡します。 こうすると、どの文書を渡したかを記録にも残せます。

Step9

人が確認する

全件を人が確かめます。 減らすのは探す時間と書く時間で、確認そのものは減らしません。

  1. 個別の論点を先に見る … individual と判定された論点が本当に個別か、逆に general の中に個別の中身が混ざっていないかを見ます
  2. 根拠の写しを見る … 画面で文と写しを並べ、写しがその文の言っていることを本当に支えているかを確かめます
  3. 日付と月を見る … 納期・期限・受付時間は、条例と手引きの最新の版と照らします
  4. 直して係長に回す … 直した箇所は、どの文をどう直したかが記録に残ります
  5. 係長が確かめて、職員が送る … 送信は共有メールボックスから職員が行います

1番目がいちばん大事です。 general の中に「あなたの場合は」のような文が混ざっていれば、それは個別の中身に触れています。迷ったら案内の文面に置き換えます。

目標は、1件5分です。 案が根拠付きで出ているので、探す時間がほぼ無くなり、確かめて直す時間が中心になります。

係長の確認は、職員が直した箇所を中心に見ます。 確認画面では、AIの案から職員が変えた文に色を付けて出し、照合で外れた文と個別の論点を一覧の先頭に並べます。変えていない文と照合を通った文は流し読みにし、判断の入った箇所に時間を使います。

Step10

例外に対処する

起きること対応
根拠が見つからない論点があるno_source。職員が書き、承認後に過去の回答へ加える候補にする
通知書の写真などの添付があるAIに渡さない。個別の質問として本人確認の経路を案内する
制度の改正の直後索引の版を確かめる。改正前の過去の回答が引かれていないかを見る
苦情や強い不満が書かれている回答案は作るが、係長が先に読む印を付ける
税以外の質問が混ざる担当課の案内だけにし、他課の内容は書かない
外国語で届く回答案は日本語で作り、訳は別の手順で行う
同じ人から同じ内容が何度も届く束ねて1件として扱い、最初の受付番号に寄せる
Azure OpenAI が応答しない受付の一覧に未処理として残し、職員がいまの手順で書く

3行目は、毎年4月前後に必ず起きます。 税制改正は年度単位で入るので、条例と手引きを改訂した日に、改正前の過去の回答を検索の対象から外す作業を手順に入れておきます。

最後の行の止まり方も決めておきます。 生成AIが止まっても受付の登録だけは続くようにし、未処理の問い合わせが受付の一覧から消えないことを優先します。復旧したあとに未処理分をまとめて流すと、古い問い合わせほど後回しになるので、届いた順に処理し直します。

Step11

記録を残す

  • 問い合わせの受付番号、届いた日時、経路、伏せた後の本文
  • 1段目の論点と判定、2段目の回答案(JSONの全文)
  • そのとき渡した参照文書の doc_id と版
  • 根拠の照合の結果(外れた文と理由)
  • 職員と係長が直した箇所 … どの文を、どう直したか
  • 送った文面と送った日時、送った職員

伏せる前の本文は、AIの記録には残しません。 原本は共有メールボックスとフォームの受付に残っているので、記録の側に同じ個人情報を二重に持たないようにします。

直した箇所の記録は、検索とプロンプトを直す材料になります。 同じ論点で毎回同じ直しが入るなら、手引きの書き方か、過去の回答の入れ方に原因があります。

04実装レベルの3段階

最小構成:伏せた問い合わせと条文を手でAIの画面に貼り、回答案を作らせる / 1件ごとの回答案の下書き
半自動化:上記+受付の一覧から問い合わせを取り、条例と手引きを検索して回答案を一覧に書き出す / 根拠の検索と下書き
本格構成:上記+番号を伏せる処理、論点の判定、根拠の照合、確認画面、修正の記録まで動かす / 回答案の作成と、個別の質問の振り分け

最小構成では件数がさばけません。 1件ずつ貼るので、月480件には使えません。判定と根拠付けが成り立つかを確かめるための段階です。 半自動化で、1件15分が9分程度になります。 根拠の検索は自動になりますが、個別の中身に触れるかの判断と、根拠の照合を職員がすべて行います。本格構成で5分になり、この段階が本記事の想定です。 差が大きいのは、判定と照合が自動になり、職員の仕事が「確かめる」に寄るからです。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、根拠が見つからない論点の偏りが見えます。そこを手引きと過去の回答に足してから本格構成に進むほうが、no_source が減ります。

05工数削減シミュレーション

前提値(モデル条件)
対象人数
6 名
月間件数
480 件
1件あたり現在時間
15 分
1件あたり導入後時間
5 分
現在  480件 × 15分 ÷ 60 = 120 時間/月
導入後 480件 × 5分 ÷ 60 = 40 時間/月
月間削減時間
80h
削減率
67%
年間削減時間
960h
年間金額換算(時間単価3,000円)
288万円
モデル条件による試算であり、実際の効果は業務内容・運用方法によって異なります。

自社条件で導入効果を整理したい方へ

このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。

AI活用について相談する

06向いている企業・向いていない企業

向いている
  1. 人口が数十万人規模で、市民税課・資産税課にWebフォームとメールの問い合わせが月に数百件届き、職員が1件ずつ条例や手引きを開いて返信を書いている市区町村。過去の回答をフォルダやメールの送信済みに持っているが、探し出せずに毎回書き直している場合。納税通知書の発送後に問い合わせが集中し、返信が数日遅れることがある場合。
向いていない
  1. 問い合わせの大半が電話で、メールやフォームの件数が月に数十件にとどまる場合。条例・規則・手引きが最新の版で整理されておらず、どれを根拠にすればよいかが職員にも分からない場合(先に文書の整理が要ります)。なお、個人の課税額の算定、減免・課税の取消の判断、賦課の誤りかどうかの判断、本人確認を経ない個別の課税内容の開示は、この構成では代替できません。

07最小構成で試す方法

  1. 先月届いた問い合わせから30件を選ぶ(うち10件は、個別の課税の中身に触れていたものを入れる)
  2. 氏名・住所・番号をすべて伏せた写しを作る
  3. 市税条例の該当する条と、手引きの該当する節を、テキストで用意する
  4. Azure OpenAI の画面(Foundry のプレイグラウンド)に、条文と手引きと問い合わせを貼る
  5. 「渡した文書だけを根拠に、論点ごとに回答案を書き、文ごとに根拠の箇所を写してください。個人の税額や課税の中身に触れる論点は、回答を書かずに窓口へ案内してください」と指示する
  6. 出てきた案を、当時実際に送った回答と並べて比べる

最初に見るのは、10件の個別の問い合わせです。 ここで一般論の説明を書いてしまうなら、本格構成の前に判定の指示を直します。

出てきた内容判断
当時の回答と同じ根拠で案が出た検索とワークフローの連携に進む
個別の質問に一般論の説明を書いた判定を1段目に分ければ直る。構成は有効
渡していない知識で書いた指示の書き方と、根拠の照合で直る
根拠の文書が見つからない質問が多い手引きの整理が先。 AIの問題ではない

4行目が出たら、それも収穫です。 職員が毎回探していた理由が、文書に書かれていないことだったと分かります。

08実装時につまずきやすいポイント

問題対策
一般の質問の回答に「あなたの場合」が混ざる論点ごとに判定し、個別の論点の文を出力の側で捨てる
添付の通知書が画像のまま渡る添付はAIに渡さない。 印だけを付ける
改正前の過去の回答が引かれる索引に版を持たせ、改正前を外す
送信済みメールをそのまま索引に入れる住民の氏名と税額が検索の対象になる。 書き起こし直して承認したものだけ
根拠の写しが原文と一字違う照合で外し、職員に見せる
モデルの知識で納期を書く納期は条例で定める。 条例の条から写させる
On Your Data で構造化出力が使えない検索は自前で行い、文書をプロンプトに入れる
文字数の上限をスキーマで縛れないmaxLength は非対応。長さはプログラムで確かめる
返信を自動で送ってしまう送信は職員。 下書きまでにする
苦情の強い問い合わせに定型の文が出る係長が先に読む印を付ける
自動返信の文面がAIの回答と食い違う自動返信は受付の確認だけにする

上の2行が、この構成でいちばん重い失敗です。 どちらも、本人を確かめないまま課税の中身が文面に出る経路です。守秘義務に関わるので、指示だけでなく仕組みの側で塞ぎます。

6行目もよく起きます。 住民税の普通徴収の納期は、地方税法で6月・8月・10月・1月中に市町村の条例で定めるとされており、具体の日付は市ごとに違います。 モデルが一般的な知識で書いた日付は、その市の条例と合っているとは限りません。

09セキュリティ・AIガバナンス上の注意点

この構成で扱うデータ: 住民が書いた問い合わせの本文(氏名・住所・税額・家族の事情が書かれていることがある)、添付の通知書の写真、市の条例と手引き、過去の回答です。

  1. 課税の資料をAIに渡さない … 地方税法では、地方税の事務に従事する者が知り得た秘密を漏らすと罰則があるとされています。課税の基幹システムにつながず、添付も渡さないことで、AIが課税の資料を読む経路を作りません
  2. 番号と氏名を伏せてから渡す … マイナンバー・宛名番号・通知書番号は前処理で伏せます。伏せる前の本文はAIの記録に残しません
  3. データの扱いを確かめる … 公式の説明では、プロンプトと出力は他のお客様にも OpenAI にも提供されず、許可なく学習に使われないとされています。一方で、不正使用の監視でプロンプトと出力が保存され、人が確認する場合があるとされ、変更の申請ができるとされています。 市の個人情報の取り扱いの規程に合わせて、申請の要否を決めます
  4. 処理の場所を確かめる … Global や DataZone のデプロイでは処理の場所が指定の地域の外に広がりうるとされています。住民の問い合わせを扱うので、デプロイの種類を先に決めます
  5. 送信は職員が行う … 回答案の誤りは、そのまま市の回答として住民に届きます。送る前に2人が見る形を残します
  6. この構成は課税の判断を代替しません … 税額の算定、減免、賦課の誤りの判断は、職員が資料を見て行います。AIが出すのは、条例と手引きに書かれていることの説明までです

誤りが起きた場合のリスクは、誤った制度の説明を送ることと、個別の課税の中身を本人確認なしに伝えることの2つです。 前者は根拠の照合と2段の確認で防ぎ、後者は課税の資料をそもそも渡さない設計で防ぎます。

10まず何から始めるか

1週目:文書をそろえる

市税条例・同施行規則の最新の本文と、課税の手引きの最新の版を集めます。手引きは節ごとに見出しを付け直し、改訂日を入れます。 あわせて、本人確認が要る問い合わせへの案内の定型文を3〜5種類作ります。

2週目:30件で試す

先月の問い合わせから30件を選び、伏せた写しで最小構成を試します。個別の質問10件で、一般論の説明を書かないかを最優先で見ます。

3週目:過去の回答を書き起こす

よく来る質問の上位50件について、過去の回答を一般的な部分だけに書き直し、係長が承認します。これが検索の対象になる過去の回答の最初の版です。

4週目:市の情報セキュリティの担当と話す

どのネットワークからクラウドの生成AIを使えるか、デプロイの種類をどうするか、不正使用の監視の変更を申請するかを決めます。ここが決まらないうちに作り始めると、後で作り直しになります。

2か月目: 受付の一覧から問い合わせを取り、検索と回答案の作成までをつなぎ、一覧に書き出します(半自動化)。3か月目以降: 番号を伏せる処理、論点の判定、根拠の照合、確認画面を足し、1件15分が何分になったかを実測します。通知書の発送後の繁忙期を一度越え、返信の遅れが縮んだことを確かめた時点で、この構成は完成です。


11関連ユースケース

12この仕組みを理解するための記事

13技術仕様の確認日・参考情報

技術仕様確認日:2026-10-14/最終更新:2026-10-14
確認した内容情報源確認日
地方税に関する調査・徴収の事務に従事している者または従事していた者が、事務に関して知り得た秘密を漏らし、または窃用した場合、2年以下の拘禁刑または100万円以下の罰金に処するとされること(第22条)。個人の市町村民税と固定資産税の賦課期日が当該年度の初日の属する年の1月1日であること(第318条・第359条)。普通徴収の個人の市町村民税の納期が6月・8月・10月・1月中に、固定資産税の納期が4月・7月・12月・2月中に、市町村の条例で定めるとされること(第320条・第362条)e-Gov 法令API: 地方税法2026-10-14
Chat Completions API と Responses API の両方で構造化出力が使えること。すべてのフィールドを必須にし、オブジェクトに additionalProperties: false を設定する必要があること。文字列の maxLength・pattern などが非対応であること。持ち込みデータ(On Your Data)のシナリオでは構造化出力がサポートされないことMicrosoft Learn: Azure OpenAI で構造化出力を使用する方法2026-10-14
プロンプトと出力が他のお客様や OpenAI に提供されず、許可なく基盤モデルの学習に使われないこと。Global・DataZone のデプロイでは処理の場所が指定の地域の外に広がりうること。不正使用の監視でプロンプトと出力が保存・確認される場合があり、変更の申請ができることMicrosoft Learn: Azure が販売する Foundry モデルのデータ、プライバシー、セキュリティ2026-10-14
ハイブリッド検索が、フルテキストのクエリとベクトルのクエリを1つの要求で並列に実行し、逆ランク融合(RRF)で結果をまとめること。フィルターやセマンティックランカーと組み合わせられることMicrosoft Learn: ハイブリッド検索の概要(Azure AI Search)2026-10-14

個別の課税の内容、減免、賦課の誤りの判断は、税務課の職員が資料を確かめて行ってください。 本記事は、上記の公開情報で確認できた範囲だけを扱っています。

実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。

自社の業務に使えるAI活用候補を整理します

このユースケース(UC-1502)についてのご相談はこちらから。

AI活用について相談する
目次