取引先から届くサステナビリティ・人権の調査票に、過去の回答から回答案を作る
取引先から届くサステナビリティや人権の調査票を設問ごとに切り出し、過去に別の取引先へ出した回答と社内資料から、出どころ付きの回答案を作ります。担当者の作業は、過去のファイルを探すことから、出てきた案が今も正しいかを確かめることに変わります。
- 利用ツール
- Amazon Kendra/Azure AI/ChatGPT/Claude/Gemini/Make/n8n/OpenSearch/Power Automate
- 対象業界
- IT・SaaS/その他/商社/小売/製造
- 対象部門
- 経営企画/購買
- 対象業務
- 情報検索/書類作成
- 主な課題
- 人手が足りない/属人化している/情報が見つからない
- AIで行う処理
- 検索(RAG)
- 主な効果
- 品質標準化/工数削減/検索時間短縮
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 取引先の調達部門から調査票がメールで届き、購買部が受ける
- 購買部が経営企画部のサステナビリティ推進担当へ転送する
- 担当者が調査票を開き、設問を上から読んで部署ごとに振り分ける
- 過去に別の取引先へ出した調査票を共有フォルダから探し、似た設問を目で探す
- 見つかった回答を、今回の様式の言い回しに合わせて書き直す
- 見つからない設問を、人事・調達・環境安全・法務へメールで問い合わせる
- 排出量や残業時間などの数値を、各部署の集計表から取り直す
- 回答がそろったら様式へ書き写し、部門長の承認を得て返送する
- 人届いた調査票を受付フォルダに保存し、提出期限を入れる
- 自動設問を1問ずつ切り出し、設問番号と記入欄の位置を保持する
- 自動設問をカテゴリに分け、担当部署を割り当てる
- 自動設問の意味で回答台帳を検索し、候補の過去回答を出どころごと取り出す
- 自動数値を求める設問を見分け、実績値台帳から最新の値と基準期間を引く
- 【AI】 候補と社内資料から回答案を作り、確認すべき点と「未確認」の設問を返す
- 自動1年より前の回答を使った設問に「要確認」の印を付ける
- 自動回答案シートを作り、担当部署ごとに確認依頼を出す
- 人各部署が「要確認」「未確認」「数値」の設問だけを確かめ、直す
- 人取りまとめ担当が全体を通して読み、部門長へ承認依頼を出す
- 人部門長が承認し、取りまとめ担当が様式へ転記して提出する
- 自動提出した回答を回答台帳へ登録し、次回の候補にする
各工程の詳しい説明を読む
- 取引先の調達部門から調査票がメールで届き、購買部が受ける
- 購買部が経営企画部のサステナビリティ推進担当へ転送する
- 担当者が調査票を開き、設問を上から読んで部署ごとに振り分ける
- 過去に別の取引先へ出した調査票を共有フォルダから探し、似た設問を目で探す
- 見つかった回答を、今回の様式の言い回しに合わせて書き直す
- 見つからない設問を、人事・調達・環境安全・法務へメールで問い合わせる
- 排出量や残業時間などの数値を、各部署の集計表から取り直す
- 回答がそろったら様式へ書き写し、部門長の承認を得て返送する
問題は6つあります。
(a)過去の回答が見つからない。 ファイル名は「A社様_CSR調達アンケート_2024.xlsx」のようになっており、中身は開くまで分かりません。 設問の言い回しが違うため、ファイル内の検索も効きません。3年分30件を開いて探すより、担当部署に聞き直すほうが速いことがあります。
(b)探せる人が1人しかいない。 どの調査票にどの回答を書いたかは担当者の記憶の中にあります。その担当者が不在だと、回答作成が止まります。
(c)確認先が部署をまたぐ。 1件の調査票に、人事・調達・環境安全・法務の4部署へ聞く設問が混ざります。4通のメールを出し、4回催促し、返ってきた文面をまとめ直します。 ここが一番時間を食います。
(d)同じ質問を何度も部署に投げている。 「外国人労働者の在留資格の確認手順」は、取引先が変わっても同じ答えです。それでも毎回人事部に聞くため、部署側にも同じ説明を書く手間が出ています。
(e)数値が古いまま写される。 排出量や残業時間を過去の回答から持ってくると、前年度の値を今年度の値として出すことになります。誤った情報を提出したことになります。
(f)答えられない設問が空欄のまま出る。 制度が無い、まだ把握していない、という設問があります。締切に追われると、空欄か、意味の曖昧な一文で埋められます。
- 【人】 届いた調査票を受付フォルダに保存し、提出期限を入れる
- 【自動】 設問を1問ずつ切り出し、設問番号と記入欄の位置を保持する
- 【自動】 設問をカテゴリに分け、担当部署を割り当てる
- 【自動】 設問の意味で回答台帳を検索し、候補の過去回答を出どころごと取り出す
- 【自動】 数値を求める設問を見分け、実績値台帳から最新の値と基準期間を引く
- 【AI】 候補と社内資料から回答案を作り、確認すべき点と「未確認」の設問を返す
- 【自動】 1年より前の回答を使った設問に「要確認」の印を付ける
- 【自動】 回答案シートを作り、担当部署ごとに確認依頼を出す
- 【人】 各部署が「要確認」「未確認」「数値」の設問だけを確かめ、直す
- 【人】 取りまとめ担当が全体を通して読み、部門長へ承認依頼を出す
- 【人】 部門長が承認し、取りまとめ担当が様式へ転記して提出する
- 【自動】 提出した回答を回答台帳へ登録し、次回の候補にする
自動化されるのは「設問を切り出す」「部署へ振り分ける」「過去の回答を探す」「数値を引く」「回答案を作る」「鮮度を判定する」の6つです。残るのは、その回答を出してよいかを決めることです。 取引先へ出した回答は取引の条件や監査の対象になるため、この構成が作るのは回答案までで、提出は自動化しません。
部署への確認そのものは無くなりません。 減るのは、全設問を投げることです。候補も社内資料も無い設問と、1年より前の回答しか無い設問だけが部署へ回ります。
02今回想定するシステム構成
取引先から届く調査票(Excel / PDF / Webポータルの画面)
│ メール添付 → SharePoint の受付フォルダへ保存(提出期限を入力)
▼【トリガー】ファイルが作成されたとき
Power Automate のクラウドフロー
│
├──▶ 設問の切り出し(Excel はセル位置、PDF は OpenAI API の input_file)
├──▶ カテゴリの判定と担当部署の割り当て(カテゴリ表 / 担当部署表)
│
├──▶ 設問の埋め込み(OpenAI API)
│ ▼
│ Azure AI Search(回答台帳+社内資料のインデックス)
│ search + vectorQueries → RRF → セマンティックランカー
│ ▼ 候補の過去回答(出どころ付き・上位5件)
│
├──▶ 数値を求める設問 ──▶ 実績値台帳から基準期間の合う値を引く
├──▶ OpenAI API ── 回答案・確認すべき点・未確認の判定(JSON)
├──▶ 回答案シート(SharePoint リスト)へ書き込み
├──▶ 担当部署へ確認依頼 ──【人】人事 / 調達 / 環境安全 / 法務
└──▶ 承認 - 開始して承認を待機 ──【人】部門長が最終承認
▼
様式へ転記して提出 ──【人】
▼
提出した回答を回答台帳へ登録 → 埋め込みを作り直す(台帳が育つ)| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 処理 | OpenAI API | Claude API、Gemini API |
| 検索基盤 | Azure AI Search | Amazon Kendra、OpenSearch |
| 連携 | Power Automate | Make、n8n |
保管先は SharePoint、通知先は Microsoft Teams とメールを想定します。回答台帳・実績値台帳・回答案シートは SharePoint のリストか Excel で持ちます。
Azure AI Search を置いているのは、「設問の意味」で引く部分がこの構成の中心だからです。 ハイブリッド検索は、1つのリクエストに search(全文検索)と vectorQueries(ベクトル検索)の両方を含め、並列に実行して逆ランク融合(RRF)で結果をマージします。
この題材では、両方が要ります。 「強制労働」「紛争鉱物」のような専門用語は完全一致で引けるため全文検索が効き、「働く人が自分の意思で辞められる仕組みがあるか」のような言い換えはベクトル検索でないと当たりません。公式の説明でも、高度に特殊化された専門用語・日付・人名は完全一致が識別できるためキーワード検索のほうが性能が出る、とされています。そこへセマンティックランカーを重ねます。 初期の結果に二次のランク付けを加える機能で、queryType=semantic と semanticConfiguration を指定します。@search.rerankerScore(4から0)が付くため、「候補には出すが、スコアが低いものは使わせない」という線引きが作れます。
処理は OpenAI API に任せます。ここで生成AIに求めるのは、長い文章を作る力より、指示した制約を守る力です。 数値を書かない、根拠の無い設問は「未確認」と返す、という約束を守らせるため、構造化された出力を強制できることが条件になります。
03どうやって実装するのか
処理の起点を決める
調査票が受付フォルダに保存されたときを起点にします。SharePoint の受付フォルダを Power Automate の「ファイルが作成されたとき」で監視します。
届く経路は、取引先からのメール添付、取引先のWebポータルからの通知、業界団体からの一斉配信の3つです。経路ごとに自動化しようとせず、受付フォルダという入口を1つ作るほうが確実です。 メールの添付を自動保存する作りにもできますが、見積書や図面が大量に混ざります。最初は人が受付フォルダへ置く運用から始めます。
保存のときに、提出期限と提出先を入力させます。 期限から逆算して、担当部署への確認依頼の締切(期限の7日前)と部門長の承認依頼の締切(3日前)を自動で置きます。この逆算が無いと、期限の前日に「未確認が30問あります」と分かることになります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 調査票のファイル | 設問番号、設問文、選択肢、記入欄の位置、字数制限、提出期限 | 受付フォルダ |
| 回答台帳 | 回答ID、設問文、回答本文、カテゴリ、提出先、提出日、承認者、根拠資料 | Azure AI Search のインデックス |
| 社内資料 | 人権方針、行動規範、調達ガイドライン、就業規則の該当条文、化学物質管理基準、事業継続計画 | 文書管理の共有フォルダ |
| 実績値台帳 | 指標名、基準期間、値、単位、算定方法、出典、確定日、社外公表の可否 | 各部署が更新する表 |
| 担当部署表 | カテゴリ、担当部署、担当者、代理者 | 取りまとめ担当が作る |
| 言い換え表 | 同じ内容を指す別の言い方(時間外労働/残業/超過勤務 など) | 取りまとめ担当が育てる |
| 前回の提出内容 | 同じ取引先へ前年に出した回答 | 回答台帳 |
回答台帳に「承認者」と「根拠資料」の列を必ず持たせてください。 この2列が無いと、出どころが「いつ、どこへ出したか」までしか書けません。確認する人が知りたいのは「誰が責任を持って出した回答なのか」です。
実績値台帳を作ることが、この構成でいちばん手間のかかる部分です。 排出量は環境安全部の集計表、残業時間は勤怠システム、外国人労働者の人数は人事の名簿、と今はばらばらの場所にあります。1枚の表にまとめ、各部署が四半期ごとに書き込む運用へ変えます。 言い換え表も要ります。Azure AI Search では、フィールドにシノニムマップを割り当ててセマンティック構成に含めると、再ランクの処理でも設定したシノニムが自動で適用されると公式の説明にあります。
データの取得方法を決める
Excelの調査票: Power Automate の Excel のコネクタで読みます。ただし取引先が作ったExcelは「テーブル」として定義されていないことがほとんどで、記入欄のセル位置が様式ごとに違います。シートの範囲をそのまま読み取り、シート名とセル番地を必ず保持してください。 回答を同じセルへ戻すために要ります。
PDFの調査票: OpenAI API にファイルとして渡します。公式の説明では、コンテンツの配列に type: "input_file" を指定し、file_id(Files API でアップロード)、file_data(base64。filename も要る)、file_url の3つの方法があります。1ファイル50MB未満、合計も50MBまでです。 視覚に対応したモデルには、抽出したテキストとページの画像の両方が渡されます。テキストだけを抜き出すと設問と記入欄の対応が崩れるため、表の形をした調査票にはこの渡し方が向いています。
回答台帳と社内資料: Azure AI Search の1つのインデックスに入れ、type のフィールドで「過去回答」と「社内資料」を分けます。検索は両方まとめて実行します。 過去回答が無くても、社内資料に根拠がある設問はあるためです。
インデックスのフィールドは、セマンティック構成に合わせて3層に分けます。公式の説明では、要約のモデルは「title」「keywords」「content」から入力を組み立て、title は128トークン、keywords は128トークン、content は残りのトークンという上限が置かれています。title には設問の要旨、keywords にはカテゴリ名と言い換え表の語、content には設問文と回答本文を入れます。上限を超えた内容は無視されるため、1レコード=1設問+1回答を基本にします。
AIへ渡す前に整形する
- 設問の切り出し … 設問番号、設問文、選択肢、字数制限、記入欄の位置(シート名とセル番地、またはページ番号)を取り出します。枝番は親子の関係で持ちます
- 設問の正規化 … 全角と半角のそろえ、改行の除去、注記の分離を行います。表示用には原文を残します
- カテゴリの判定 … 12の区分に分けます。労働時間と賃金/強制労働と児童労働/外国人労働者/安全衛生/差別とハラスメント/化学物質/温室効果ガスと省エネ/廃棄物と水/紛争鉱物/贈収賄と公正な競争/下請取引/事業継続。担当部署表で部署を決めます
- 数値設問の判別 … 「量」「率」「時間」「人数」「件数」といった語、単位の記載、記入欄の書式から機械的に見分け、実績値台帳の
metric_keyを当てます - 設問の埋め込み … OpenAI API の埋め込みで、正規化した設問文をベクトルにします。入力の上限は8,192トークン、
dimensionsで次元を落とせ、ベクトルは長さ1に正規化されているためコサイン類似度は内積だけで計算できます - 候補の検索 … Azure AI Search のハイブリッド検索を実行します。
searchに正規化した設問文、vectorQueriesに埋め込みを渡します - 候補の絞り込み …
@search.rerankerScoreの低いものを外し、上位5件を候補にします - 鮮度の判定 … 提出日が今日から365日より前の候補に印を付けます。根拠資料の改定日が提出日より後の場合も、365日以内であっても印を付けます
- 実績値の取り出し … 数値設問には、実績値台帳から
metric_keyと基準期間の合う行を引きます。合う行が無ければ、値を入れずに「未確認」として担当部署へ回します
6番目に注意が必要です。 公式の説明では、セマンティックランカーを使う場合は k を50に設定するとされ、既定のランク付けで上位50件に入った結果だけが再ランクの対象になります。 対象が数千件でも、実際に見られるのは50件です。カテゴリで絞り込んでから検索すると、この50件の質が上がります。
8番目が「1年以上前の回答は必ず人に回す」の実装です。 日付の比較で済むため、生成AIには渡しません。改定日の条件を足しているのは、半年前の回答でも規程が変わっていれば誤りになるからです。
AIに処理させる
計算処理に任せること:
| 処理 | 内容 |
|---|---|
| 設問の切り出しと割り当て | セル位置・ページ番号の保持、カテゴリ表と担当部署表 |
| 数値設問の判別 | 単位の記載、記入欄の書式、語尾 |
| 候補の検索 | ハイブリッド検索とセマンティックランカー |
| 鮮度の判定 | 提出日から365日、根拠資料の改定日 |
| 実績値の取り出し | 実績値台帳から基準期間の合う行を引く |
生成AI(OpenAI API)にさせること:
| 処理 | 内容 |
|---|---|
| 設問の読み取り | 様式ごとの言い回しを、社内の言葉に直して何を聞かれているかを特定する |
| 候補の突き合わせ | 検索で出た過去回答が、この設問に本当に答えているか |
| 回答文の作成 | 候補と社内資料から、この様式の記入欄に入る文を作る |
| 選択肢の選定 | 選択式の設問で、どの選択肢に当たるか |
| 確認すべき点 | この案を出す前に人が確かめるべきこと |
| 未確認の識別 | 候補も社内資料も無い設問を「未確認」として返す |
数値を書かせないことが、この構成でいちばん重要な制約です。 過去回答には数値が入っており、何も言わなければ生成AIはそれを新しい回答にそのまま写します。前年度の排出量を今年度の値として提出することになります。 そこで、数値が要る設問では回答文の中に数値の位置だけを空けさせ、実際の値は後段の処理が実績値台帳から入れます。
「未確認」を選べるようにしてください。 これが無いと、生成AIは候補のいちばん近い回答を無理に当てはめて、それらしい文を作ります。社内に無い制度をあるものとして取引先へ表明したことになります。
指示内容を固定する
あなたは、取引先から届くサステナビリティ・人権に関する調査票に対して、
自社の回答案を作る担当者です。
下に与えた「過去の回答の候補」と「社内資料の抜粋」だけを使って、
1つの設問への回答案を作ってください。
【厳守事項】
- 回答案は、下に与えた候補回答と社内資料に書かれている内容だけで作ってください。
与えられていない制度、方針、取り組み、認証を書かないでください。
- 数値(排出量、労働時間、人数、比率、金額、件数、年月日)を回答案に書かないでください。
数値が必要な設問だと判断した場合は needs_number を true にし、
answer_draft では数値の位置を {{数値}} と書いて空けてください。
候補回答に書かれている数値を写すことは、理由を問わず禁止です。
- 候補回答にも社内資料にもこの設問に対応する記載が無い場合は、
status を "未確認" にし、answer_draft を空にしてください。
それらしい回答を作らないでください。
- 使った候補回答の answer_id を、必ず used_sources に入れてください。
社内資料を使った場合は、資料名と条項・見出しまで used_documents に書いてください。
与えられていない answer_id や資料名を作らないでください。
- 候補回答に stale: true の印が付いている場合、その候補を使うことはできますが、
confirm_points に「前回の回答から1年以上経過。実態が変わっていないか担当部署に確認」
と書いてください。
- 選択式の設問では、選択肢の文字列を一字一句そのまま selected_choice に入れてください。
どの選択肢にも当たらない場合は空にし、status を "未確認" にしてください。
- 字数の上限が指定されている設問では、その字数に収めてください。
- 回答案は、自社を主語にした事実の記述にしてください。
意気込み、方針の言い換え、「努めています」のような曖昧な述語を足さないでください。
- confirm_points には、この案を出す前に人が確かめるべき点だけを書いてください。
無ければ空にしてください。
【今日の日付】{today}
【提出先】{customer_name}
【調査票の様式名】{form_name}
【設問】
設問番号: {question_no}
設問文: {question_text}
選択肢: {choices}
字数の上限: {max_length}
カテゴリ: {category}
担当部署: {department}
【過去の回答の候補】(answer_id / 設問文 / 回答本文 / 提出先 / 提出日 / 承認者 / 根拠資料 / stale)
{candidates}
【社内資料の抜粋】(資料名 / 条項・見出し / 本文 / 改定日)
{documents}
数値の禁止を厳守事項の2番目に置いているのは、ここが最も破られやすいからです。 「当社の温室効果ガス排出量は」と書き始めた文は、数値が無いと終われません。{{数値}} という置き場所を先に与えると、文を完成させたまま数値だけを空けられます。
answer_id を写させることで、後段で機械的に検証できます。 返ってきた answer_id が渡した候補の中に無ければ、その出どころは作られたものです。その設問は「未確認」に書き換えて人に回します。 出どころを付けること自体ではなく、付いた出どころが本物かを確かめられることが目的です。 「意気込みを足さない」も効きます。これが無いと「今後も継続的に改善に努めてまいります」といった文が付き、字数制限のある欄では必要な事実が押し出されます。
出力形式を固定する
{
"question_no": "",
"status": "回答案あり | 未確認",
"answer_draft": "",
"selected_choice": "",
"needs_number": false,
"metric_key": "",
"used_sources": [
{
"answer_id": "",
"customer": "",
"answered_on": "",
"approver": ""
}
],
"used_documents": [
{
"doc_name": "",
"section": ""
}
],
"confirm_points": [],
"department": ""
}
OpenAI API の Structured Outputs を使います。公式の説明では、text.format に type: "json_schema" と strict: true とスキーマを渡すと応答がスキーマに沿った形になり、モデルが必須のキーを落としたり列挙にない値を作ったりする心配が無くなります。 strict では、スキーマのフィールドをすべて required に並べ、オブジェクトに additionalProperties: false を付けます。そのため「空でよい項目」という概念がありません。 空文字列や空の配列を入れる約束にします。
status は enum で2つに固定します。「要確認」は生成AIには選ばせません。 鮮度は前処理で決まるため、回答案シートへ書き込む段階で、stale の候補を使った設問を機械的に「要確認」へ上書きします。安全上の理由で応答が拒否された場合は refusal のフィールドに入り、構造化された出力とは別に返るためプログラムで見分けられます。 その設問は「未確認」として人に回します。
JSONにする理由は、様式へ戻すためです。 設問番号と記入欄のセル位置を保持しているので、answer_draft と selected_choice を対応するセルへ書き戻せます。
システムへ連携する
回答案シートを SharePoint のリストに作ります。1行を1設問にします。
| 列 | 中身 |
|---|---|
| 調査票ID / 提出先 / 提出期限 | 受付時に入力した内容 |
| 設問番号 / 設問文 / 記入欄の位置 / カテゴリ / 担当部署 | 前処理の結果 |
| 状態 | 回答案あり/要確認/未確認/数値待ち |
| 回答案 / 選択肢 | answer_draft(数値は置き場所のまま)と selected_choice |
| 出どころ | used_sources(提出先・提出日・承認者)と used_documents |
| 確認すべき点 | confirm_points |
| 実績値 | 実績値台帳から引いた値と基準期間 |
| 部署の確認 | 担当部署が入れる(このままでよい/直した/答えられない) |
| 部門長の承認 | 承認の結果とコメント |
担当部署への確認依頼は、部署ごとに1通にまとめます。 人事部には人事が見る設問だけを送ります。120問の一覧をそのまま4部署へ回すと、誰も自分の担当箇所を探しません。
部門長の最終承認には、Power Automate の承認の機能を使います。 公式の説明では、承認 - 開始して承認を待機のアクションを追加し、割り当て先にメールアドレスを入れ、タイトルと詳細を設定します。承認者は、メールの受信箱からでも承認センターからでも応答できます。 承認の種類はドロップダウンから選べ、カスタム値も入力できます。実行期間が30日を超える可能性がある場合は、承認のデータを Microsoft Dataverse に保存し、承認の作成 (v2) に基づく別のフローで応答を処理する形が案内されています。 調査票は、海外工場への照会が入ると1か月を超えることがあります。
提出後に、確定した回答を回答台帳へ登録します。 ここが「台帳が育つ」動線です。登録するのは部門長が承認して実際に提出した文だけで、却下された案や直される前の案は登録しません。 提出先・提出日・承認者・根拠資料・カテゴリを付け、埋め込みを作り直してインデックスへ入れます。この1工程を飛ばすと、半年後も候補の数が今のままです。
人が確認する
確認は4段階に分けます。全設問を人が読む設計にはしません。
- 担当部署の確認 … 「要確認」「未確認」「数値待ち」の設問だけを、人事・調達・環境安全・法務が見ます。「回答案あり」で確認すべき点も無い設問は、部署へ回しません
- 取りまとめ担当の通し読み … 全設問を上から読み、設問どうしの矛盾と、様式の記入ルール(字数、選択肢の記号)を確かめます
- 部門長の最終承認 … 取引先へ出す文書として承認します。この承認が無い限り提出しません
- 提出後の登録 … 確定した回答を回答台帳へ登録します
1番目の線引きが、削減の中身です。 月120問のうち、候補があり鮮度も新しく確認すべき点も無い設問は、想定で7割から8割です。部署の手が要るのは20問から30問になります。
確認を速くするための設計が効きます。
- 回答案の横に、使った過去回答の本文と提出先・提出日・承認者を並べて表示する
- 「要確認」の設問には、どの候補が古いのかと、その後に改定された規程名を出す
- 数値の設問には、実績値台帳から引いた値と基準期間を、調査票が求める期間と並べて出す
- 前回の同じ取引先への提出内容を、別の列で必ず見せる
4番目が効きます。 同じ取引先には毎年ほぼ同じ様式が来るため、前年と回答が変わっている設問だけを見れば確認はさらに短くなります。 なお部門長が承認するのは、内容と、答えていないことの両方です。
例外に対処する
| 起きること | 対応 |
|---|---|
| 候補も社内資料も出ない設問 | 「未確認」として担当部署へ回す。空欄や曖昧な一文で埋めない |
出どころの answer_id が渡した候補に無い | その回答案を捨て、「未確認」に書き換えて人へ回す |
| 実績値台帳に基準期間の合う行が無い、または期間が調査票と食い違う | 値を入れず「数値待ち」として回す。近い期間の値で代用しない |
| 1年より前の回答しか候補に無い、または根拠の規程が回答後に改定されている | 「要確認」として担当部署へ回す |
| Excelの記入欄が結合セルで戻せない | 位置を記録し、回答案シートから人が転記する |
| PDFが50MBを超える | ページで分割して渡す。分割の位置を記録する |
| 設問が入れ子で、条件によって回答が変わる | 親の設問の回答が確定してから子の設問を処理する |
| 取引先のポータルに直接入力しか認められない | 回答案シートから人が入力する。転記の時間は残る |
| 未公表の数値を求められている | 実績値台帳の「社外公表の可否」を見て止め、経営企画と法務の判断へ回す |
| 提出期限に間に合わない | 期限の7日前の時点で未確認の件数を取りまとめ担当へ通知し、取引先へ延長を相談する |
記録を残す
この記録は、次回の調査票を軽くするための材料になります。
- 調査票ごとの設問数、状態の内訳(回答案あり/要確認/未確認/数値待ち)、提出までの日数
- 設問ごとに、使った候補回答の
answer_idと@search.rerankerScore - 担当部署の確認結果(このままでよい/直した/答えられない)と、直した場合の前後の文
- 部門長の承認結果とコメント、差し戻しの理由
- 「未確認」のまま提出した設問と、その理由を決めた人
- 実績値台帳から引いた値、基準期間、引いた日時
「部署がこのままでよいと答えた割合」を必ず残してください。 この割合が上がれば、部署へ回す設問をさらに絞れます。下がっているなら、候補の鮮度か検索の絞り込みに問題があります。
04実装レベルの3段階
半自動化の時点で、150分が80分程度になります。 消えるのは「過去の回答を探す」と「部署へ全設問を投げる」の2つです。本格構成で54分になりますが、そこで減るのは数値を集める時間と承認のやり取りです。 推すのは本格構成です。 そして「提出後の台帳への登録」を、後回しにしないでください。 これが無いと、回答台帳は最初に書き出した3年分のまま増えず、半年後も候補の数が同じで「要確認」の割合だけが上がります。 登録の工程は、提出のフローの最後に1つ足すだけです。
05工数削減シミュレーション
導入後 10件 × 54分 ÷ 60 = 9 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 大手の取引先から届くサステナビリティ・人権・取引慣行の調査票が月5件以上あり、1件あたりの設問が40問を超える企業。過去2〜3年分の提出済み調査票が電子ファイルで残っており、労働時間や排出量などの実績値を集計する担当部署が社内で決まっていること。取引先ごとに様式は違うが、聞かれている中身はほぼ同じという状態になっている場合。
- 調査票が年に数件しか届かない場合。人権方針や行動規範、調達ガイドラインが文書化されておらず、回答を毎回その場で作文している場合。実績値の集計が年1回の報告書を作るときにしか行われておらず、調査票が求める基準期間の数値を取り出せない場合。取引先が指定するWebポータルへの直接入力しか認められず、社内で下書きを作ること自体ができない場合。
07最小構成で試す方法
- 直近で提出した調査票を3件選び、設問と回答を6列(設問文、回答本文、提出先、提出日、承認者、根拠資料)でスプレッドシートに書き出す
- これから提出する調査票を1件選び、設問を30問だけ取り出す
- 生成AIのチャット画面に、上記のプロンプトと1問分の設問、書き出した回答の全件を貼り付ける
- 出てきた回答案・出どころ・確認すべき点を、取りまとめ担当が確かめる
- 30問を繰り返す
見るのは次の3点です。
| 見る点 | 判断 |
|---|---|
| 回答案が、そのまま使えるか直せば使える割合 | 6割を下回るなら、回答の書き出し方(1設問1行になっているか)を見直す |
出どころの answer_id が実在するか | 1件でも実在しないものが出たら、機械での照合を必ず入れる |
| 数値を書いてしまった設問の数 | 0でなければ、厳守事項の書き方を強める |
3番目を必ず数えてください。 検索を組む前に、この制約が守られるかだけは確かめられます。守られないなら、数値を含む設問を生成AIに渡さない設計に切り替えます。
検索の部分を作らず、ここまでは2日から3日で試せます。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 過去の回答をファイル単位で登録し、検索が当たらない | 1レコード=1設問+1回答に分ける。長い回答は設問ごとに割る |
| 言い回しが違う設問に候補が出ない | 全文検索とベクトル検索を両方使い、言い換え表をシノニムマップに入れる |
| 候補は出るが、聞かれていることが微妙に違う | @search.rerankerScore で下限を決め、低いものを外す |
| 数千件の台帳から探しているのに精度が上がらない | 再ランクの対象は上位50件まで。カテゴリで絞ってから検索する |
| 回答台帳の長い本文が切れている | title・keywords・content に分け、1件を短く保つ |
| 過去の数値がそのまま回答に入る | 生成AIに数値を書かせず、実績値台帳から機械的に埋める |
| 出どころが実在しない回答IDになっている | 返ってきた回答IDを候補と照合し、無ければ「未確認」へ書き換える |
| 答えられない設問に、それらしい文が入る | status に「未確認」を用意し、作らないことを厳守事項に書く |
| Excelの回答を元のセルへ戻せない | シート名とセル番地を最初に保持する。行や結合セルを触らない |
| 台帳が増えず、要確認ばかりになる | 提出後の登録を、提出のフローの最後の工程に組み込む |
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 従業員の労働時間と賃金、外国人労働者の在留資格の運用、安全衛生の事故件数、温室効果ガスの排出量、化学物質の取扱量、下請取引の状況、内部通報の件数、取引先の名称。公開情報より、未公表の社内の実態のほうが多く含まれます。
- 未公表の実績値を外部AIへ送ること … 排出量や事故件数には、統合報告書の公表前の数値が含まれます。実績値台帳の「社外公表の可否」を見て、公表前の行は生成AIへ渡さない設計にします
- 個人が特定できる情報 … 内部通報や労働災害の記録に個人が分かる記述が混ざることがあります。台帳へ登録する前に、個人名と部署名を外します。 入力を学習に使わないことが契約で保証されるサービスを選びます
- 取引先の名前 … 回答台帳には「どの取引先から何を聞かれたか」が残り、守秘義務の対象になることがあります。 閲覧権限を取りまとめ担当と各部署の担当者に限ります
- 回答が自社の表明になること … 回答は取引の条件や監査の根拠になり、誤った回答は契約上の問題になり得ます。 最終承認を部門長が行う設計を、運用が慣れても外さないでください
- 是正が必要な事実の扱い … 法令や取引先の基準を満たしていない項目が見つかることがあります。回答をどう書くかは生成AIの仕事ではありません。 事実の説明と是正の期限は法務と経営が決めます
- 回答の一貫性 … 同じ事実について取引先ごとに違う回答を出すと問題になります。回答台帳を1つにまとめることは、この一貫性のためでもあります
- 自動実行してよい範囲 … 設問の切り出し、部署への振り分け、候補の検索、回答案の作成、実績値の取り出し、確認依頼の送付までです。提出、数値の確定、「未確認」のまま出す判断は人が行います
誤りが起きた場合のリスクは、古い数値をそのまま提出すること、社内に無い制度をあるものとして表明すること、公表前の実績値を外へ出すことの3つです。1番目と2番目は、数値を生成AIに書かせない設計と「未確認」の逃げ道で防ぎます。 3番目は、実績値台帳の側で機械的に止めます。
10まず何から始めるか
1週目:過去の調査票を1設問1行に書き出す
直近3年分の提出済み調査票から10件を選び、設問文・回答本文・提出先・提出日・承認者・根拠資料の6列で書き出します。承認者と根拠資料が分からない行は、空欄にせず「不明」と入れてください。 不明が多ければ、それ自体が今の運用の記録が足りていないという発見です。
2週目:30問で試す
これから提出する調査票を1件選び、30問で最小構成を試します。そのまま使える割合、出どころが実在する割合、数値を書いてしまった件数の3つを数えます。 数値が1件でも入ったら、厳守事項の書き方を直して繰り返します。
3週目:実績値台帳とカテゴリ表を作る
過去1年の調査票で聞かれた数値の項目を洗い出し、それだけを埋めた実績値台帳を作ります。 あわせて、設問のカテゴリ12区分と担当部署表を作り、各部署の責任者に見せて担当を確認してもらいます。
4週目以降: 回答台帳を検索できるようにし、設問の切り出しから回答案シートの作成までをつなぎます。1件の調査票を、新しい流れと今までの流れの両方で作って比べてください。
2か月目以降: 実績値の自動取得と部門長の承認をつなぎます。提出後に回答台帳へ登録する工程を、必ずこの段階で入れてください。 ここから、月を追うごとに「要確認」の割合が下がります。
6か月目以降: 「未確認」のまま提出した設問を集めて振り返ります。同じ設問が複数の取引先から聞かれているなら、それは社内に制度が無いという事実です。 ここまで来ると、この仕組みは調査票に答える道具から、取引先が何を求めているかを社内へ伝える道具になります。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
text.format に type: "json_schema" と strict: true とスキーマを渡すと応答がスキーマに沿うこと。strict では全フィールドを required に並べ additionalProperties: false を付けること。拒否は refusal に入り区別できること | OpenAI: Structured Outputs | 2026-09-24 |
dimensions で次元を落とせ、入力の上限が8,192トークンであること。ベクトルは長さ1に正規化され、コサイン類似度を内積だけで計算できること | OpenAI: Embeddings | 2026-09-24 |
PDFを type: "input_file" で渡す方法が file_id・file_data(filename が必要)・file_url の3つあること。1ファイル50MB未満で合計も50MBであること。視覚に対応したモデルにはテキストとページ画像の両方が渡ること | OpenAI: PDF files | 2026-09-24 |
1つのリクエストに search と vectorQueries を含め、並列に実行して逆ランク融合(RRF)でマージすること。専門用語・日付・人名では完全一致が識別できるためキーワード検索が有効なこと。セマンティックランカーを使う場合は k を50にし、queryType=semantic と semanticConfiguration を指定すること | Azure AI Search: ハイブリッド検索の概要 | 2026-09-24 |
BM25 または RRF の初期結果に二次のランク付けを加え、上位50件だけが再ランクの対象になること。@search.rerankerScore が4から0で付くこと。title(128トークン)・keywords(128トークン)・content(残り)から入力を組み立て、上限超過分は無視されること。シノニムマップが再ランクでも適用されること。queryType=semantic を含み検索文字列が空でないときに課金されること | Azure AI Search: セマンティック ランキングの概要 | 2026-09-24 |
| 「承認 - 開始して承認を待機」で承認を管理でき、割り当て先にメールアドレス、タイトルと詳細を設定すること。承認の種類はドロップダウンから選びカスタム値も入力できること。承認者はメールの受信箱からでも承認センターからでも応答できること。30日を超える可能性がある場合は承認データを Microsoft Dataverse に保存し「承認の作成 (v2)」に基づく別のフローで処理すること | Power Automate: 承認ワークフローを作成し、テストします | 2026-09-24 |
取引先ごとの調査票の様式と設問の並びは1社ずつ異なります。この部分は利用環境に応じた個別実装が必要です。 情報開示の基準と未公表の数値の扱いは、法務部門と経営企画部門に確認してください。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0210)についてのご相談はこちらから。
