Media > AI活用ユースケース > カスタマーサポート > 自社製品の GitHub に届く Issue を読み、不具合・要望・質問と影響する部品で分けてラベルと担当の候補を付け、似た既存の Issue を重複の候補として示す

自社製品の GitHub に届く Issue を読み、不具合・要望・質問と影響する部品で分けてラベルと担当の候補を付け、似た既存の Issue を重複の候補として示す

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

自社製品の GitHub リポジトリに Issue が立つたびに、不具合・要望・質問と、影響する部品を判定します。ラベルと担当の候補、足りない情報を尋ねるコメントの下書き、重複の候補を当番の開発者に示し、承認されたものだけを反映します。

サマリー
生成AI
ChatGPT/Claude/Gemini
連携・自動化
Make/n8n/Zapier
対象業界
IT・SaaS/製造/金融
対象部門
カスタマーサポート/研究開発
対象業務
分類・仕分け/情報検索
主な課題
人手が足りない/属人化している/情報が見つからない
AIで行う処理
分類
主な効果
対応スピード向上/属人化解消/工数削減
導入難易度
★★★☆☆
実装レベル
本格構成
費用感
ノーコード連携(中)
人間の確認
条件付き
現在工数
60h/月
AI導入後
18h/月
想定削減
70%
年間削減
504h
モデル条件による試算値です。実在企業の実績ではありません。

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

導入前(Before)
  1. 当番が、新しい Issue の通知を Slack で受け取る
  2. Issue を開き、種類(不具合・要望・質問)と影響する部品を判断する
  3. 似た Issue が既にないか、題名の語でリポジトリの Issue を検索する
  4. 重複なら「Duplicate of #番号」とコメントして閉じる
  5. 重複でなければ、種類と部品のラベルを付け、部品の担当を割り当てる
  6. 版や再現の手順が足りなければ、尋ねるコメントを書く
  7. 質問なら、ドキュメントの該当箇所を探して答えるか、サポートの担当に回す
導入後(After)
  1. 自動Issue が立つと、GitHub の webhook が n8n に届く
  2. 自動署名を確かめ、すぐに受け取りの応答を返す
  3. 自動ボットが立てた Issue や対象外の action を外し、本文の秘密情報らしい文字列を伏せる
  4. 自動GitHub の検索 API(`hybrid`)で、似た既存の Issue を10件集める
  5. 自動Claude が、種類・部品・足りない情報・重複の候補を判定する
  6. 自動ワークフローが、部品の対応表からラベルと担当の候補を引き、聞き返しのコメントの下書きを作る
  7. 自動当番に Slack で案を送る
  8. 人当番が案を確かめ、「反映する」か「反映しない」を選ぶ
  9. 自動「反映する」なら、ラベルと担当を付け、聞き返しのコメントを投稿する。重複と認めたものには「Duplicate of #番号」のコメントを投稿する
  10. 人当番が、重複を閉じるかを決める
各工程の詳しい説明を読む
  1. 当番が、新しい Issue の通知を Slack で受け取る
  2. Issue を開き、種類(不具合・要望・質問)と影響する部品を判断する
  3. 似た Issue が既にないか、題名の語でリポジトリの Issue を検索する
  4. 重複なら「Duplicate of #番号」とコメントして閉じる
  5. 重複でなければ、種類と部品のラベルを付け、部品の担当を割り当てる
  6. 版や再現の手順が足りなければ、尋ねるコメントを書く
  7. 質問なら、ドキュメントの該当箇所を探して答えるか、サポートの担当に回す

(a)重複を探すのに時間がかかる。 「決済画面が閉じない」「支払い後に戻れない」「完了の画面で固まる」。同じ不具合を利用者は違う言葉で書くので、題名の語の検索では見つかりません。 見つからずに受け付けると、同じ不具合を2人の開発者が調べ始めます。

(b)部品の判断が当番によって違う。 Web の SDK から呼んだサーバーの API で起きた不具合を、Web に付ける当番とサーバーに付ける当番がいます。担当が違えば、Issue は数日寝かされます。

(c)足りない情報の聞き返しが遅れる。 当番が忙しい週は聞き返しが翌日以降になり、利用者は放置されたと感じます。

(d)脆弱性らしい報告が公開の場に書かれる。 署名の検証を回避できる、といった報告が公開の Issue に書かれることがあります。当番がすぐ気づかないと、詳細が公開のまま残ります。

  1. 【自動】 Issue が立つと、GitHub の webhook が n8n に届く
  2. 【自動】 署名を確かめ、すぐに受け取りの応答を返す
  3. 【自動】 ボットが立てた Issue や対象外の action を外し、本文の秘密情報らしい文字列を伏せる
  4. 【自動】 GitHub の検索 API(hybrid)で、似た既存の Issue を10件集める
  5. 【自動】 Claude が、種類・部品・足りない情報・重複の候補を判定する
  6. 【自動】 ワークフローが、部品の対応表からラベルと担当の候補を引き、聞き返しのコメントの下書きを作る
  7. 【自動】 当番に Slack で案を送る
  8. 【人】 当番が案を確かめ、「反映する」か「反映しない」を選ぶ
  9. 【自動】 「反映する」なら、ラベルと担当を付け、聞き返しのコメントを投稿する。重複と認めたものには「Duplicate of #番号」のコメントを投稿する
  10. 【人】 当番が、重複を閉じるかを決める

8番目が、この設計の分かれ目です。 当番は Issue を読んで検索する代わりに、AIの区分と、GitHub の検索が出した候補から選ばれた重複が当たっているかを見ます。 公開のリポジトリに書き込むものは、すべて当番が確かめたものになります。

4番目を5番目より先に置いているのも、意図してのことです。 過去の Issue をAIに思い出させると、存在しない番号や、別のリポジトリの番号を挙げることがあります。 候補は GitHub の検索で集め、AIはそのなかから選ぶだけにします。

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

構成図
【トリガー】Issue の作成・再開(GitHub の webhook → n8n の Webhook ノード)
   ▼
n8n
   ├─ Code ── X-Hub-Signature-256 の検証、対象外の action とボットを外す
   ├─ Code ── 秘密情報らしい文字列を伏せる
   ├─ HTTP Request(GitHub の資格情報)── 検索 API(search_type=hybrid)で似た Issue を10件
   ├─ Data Table ── 部品と担当・ラベルの対応表
   ▼
Basic LLM Chain + Anthropic Chat Model + Structured Output Parser
   │   種類、部品、足りない情報、重複の候補の判定
   ▼
Code ── 対応表からラベルと担当を引く、聞き返しの下書き
   ▼
Slack(Send and Wait for Response:Approval)── その週の当番へ
   ▼
【当番が反映するかを選ぶ】
   ▼
GitHub / HTTP Request ── ラベルと担当の付与、コメントの投稿
役割想定する製品代替候補
ワークフローn8nMake、Zapier
生成AIClaude(n8n の Anthropic Chat Model ノード)OpenAI API、Gemini API
保管n8n の Data Table(対応表、案と当番の判断)スプレッドシート
通知Slack(n8n の Slack ノード)Microsoft Teams

webhook を受けるのに、n8n の GitHub Trigger ではなく Webhook ノードを使います。 n8n の GitHub Trigger の公式ページでは、イベントの一覧に Issue comment や Pull request はありますが、Issues のイベントは見当たりません。 GitHub のリポジトリの設定で webhook の送り先を n8n の Webhook ノードにし、Issues のイベントだけを送らせます。

n8n を選ぶのは、検索・判定・承認・反映を1つの流れにでき、対応表をワークフローの外に持てるからです。 部品と担当の対応は Data Table にあり、担当が替わっても、ワークフローを直さずに表を直すだけで済みます。

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

Step1

処理の起点を決める

GitHub のリポジトリの webhook で、Issues のイベントを n8n の Webhook ノードに送ります。 GitHub の公式ページでは、issues のイベントの action に opened・edited・reopened・labeled・closed・transferred・typed などがあります。この構成で動かすのは opened と reopened だけで、それ以外は受け取った直後に外します。

受け取ったら、まず署名を確かめます。 GitHub の公式ページでは、X-Hub-Signature-256 のヘッダーに、webhook の秘密の値を鍵にして受け取った本文そのものから作った HMAC-SHA256 の値が入り、こちらで同じ計算をして一定の時間で比べる関数で照合し、単純な == で比べないように、とされています。n8n の Webhook ノードは、オプションの Raw Body で加工前の本文を受け取れます。加工後の JSON から計算し直すと、値が合いません。

応答はすぐ返します。 GitHub の公式ページでは、届いてから10秒以内に2XXで応答し、時間がかかる処理は後ろの待ち行列で行うよう勧めています。Webhook ノードの応答を Immediately にし、検索とAIの判定は応答の後で行います。

X-GitHub-Delivery のヘッダーで、同じ配送を二度処理しないようにします。 公式ページでは、この値は配送ごとに一意で、配送をやり直しても元と同じ値とされています。Data Table に記録した値と照らします。

Step2

入力データを集める

データ中身取得元
Issue の内容番号、題名、本文、作成者、テンプレートの欄(版・環境・再現の手順)webhook の本文
似た既存の Issue番号、題名、状態(開いている・閉じた)、本文の冒頭、ラベルGitHub の検索 API
部品の対応表部品ID、部品名、説明、部品のラベル、担当、当番の Slack IDData Table
種類の説明不具合・要望・質問の意味と、迷ったときの順プロンプト
必須の情報の一覧種類ごとに、そろっていてほしい欄(不具合なら版・環境・再現の手順)Data Table

質を決めるのは、部品の対応表の「説明」です。 「Webhook の署名検証:加盟店のサーバーで受け取る Webhook の署名を検証するライブラリ。決済の通知を受け取れない、署名が合わない、という報告はここ」。利用者が書く言葉で説明しておくと、部品の判定が当たります。

テンプレートの欄は、見出しで区切って本文に入ります。 欄が空のままの Issue は、見出しの下が空か「_No response_」のような文言になります。ワークフローが欄ごとに切り出し、空の欄を「足りない情報」の手がかりにします。

Step3

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

取るものどこから何に使うか
Issue の内容Webhook ノードの受け取った本文判定の対象
似た既存の IssueGET /search/issues(search_type=hybrid)重複の候補
部品の対応表Data Table ノードの Getラベルと担当の決定

似た Issue は、GitHub の検索 API で集めます。 公式ページでは、/search/issues に search_type を指定でき、semantic は埋め込みによる意味の検索、hybrid は意味の検索と語の検索を組み合わせたものとされています。題名と本文の冒頭を検索の語にし、repo: と is:issue で対象のリポジトリの Issue に絞ります。

検索 API には回数と長さの上限があります。 公式ページでは、検索 API は認証して1分に30回、semantic と hybrid は認証が必須で1分に10回とされています。検索の語は256文字まで(演算子と修飾子を除く)で、AND・OR・NOT は5つまでとされています。題名と本文の冒頭を、256文字に収まるように切ります。

意味の検索が日本語の Issue でどこまで効くかは、公開ページからは分かりません。 最初に過去の重複の組で確かめ、hybrid で拾えない組が多ければ、語の検索(既定)と並べて候補を集めます。

Step4

AIへ渡す前に整形する

  1. 対象の絞り込み … action が opened・reopened 以外、作成者がボット、対象外のリポジトリを外します
  2. テンプレートの欄の切り出し … 見出しごとに値を取り、空の欄を記録します
  3. 伏せ字 … アクセスキー、API キー、トークン、接続文字列らしい文字列を [MASKED] に置き換えます
  4. 検索の語の作成 … 題名と本文の冒頭から、記号とコードの断片を除き、256文字以内にします
  5. 候補の整形 … 検索結果の10件を、番号・題名・状態・本文の冒頭400文字・ラベルにそろえます
  6. 自分自身を外す … 検索結果に、いま立った Issue 自身が入っていれば外します

3番目は、利用者が設定ファイルやログを貼るためです。 決済の SDK の Issue には、テスト用ではない API キーが貼られることがあります。 伏せたうえで、見つけたこと自体を当番に知らせます。 キーの失効を利用者に勧めるのは、当番が判断します。

6番目を忘れると、AIが「この Issue 自身と重複」と判定します。 立った直後の Issue が検索に出るかは時間によるので、番号で必ず外します。

Step5

AIに処理させる

Basic LLM Chain に、Issue の区分と重複の候補の判定をさせます。 公式ページでは、Basic LLM Chain はプロンプトを決めるノードで、出力の形を求めるときは Structured Output Parser などのパーサーをつなぐとされています。

させること中身
種類不具合(bug)・要望(feature)・質問(question)のどれか
部品対応表の部品IDから1〜2つ
影響の広さの手がかり特定の環境だけか、その部品を使う全員か、本文に書かれた範囲で
足りない情報種類ごとの必須の情報のうち、本文から読み取れないもの
重複の候補検索の10件のうち、同じ不具合・同じ要望と言えるもの
脆弱性の疑い認証・署名・権限の回避など、公開の場で扱うべきでない報告か
させないこと理由
担当者の選択部品から対応表で引く
優先順位・重大度の決定開発のリードが決める
候補の10件の外の番号を挙げる存在しない番号を挙げるおそれがある
原因や直し方の回答受付の段階では調べていない
Issue を閉じるかの判断当番が決める

「影響の広さの手がかり」は、決めるのではなく、書かれていることを拾うだけにします。 「iOS 17 の一部の端末で」と書かれていれば特定の環境、「全加盟店で決済が通らない」と書かれていれば全員。書かれていなければ「不明」です。 優先順位はこの手がかりを見て人が決めます。

Step6

指示内容を固定する

Basic LLM Chain のシステムメッセージに、次のように書きます。

あなたは決済SDKの開発チームで、新しい Issue を受け付ける当番を補助します。

【入力】
- 新しい Issue(番号、題名、本文、テンプレートの欄と空の欄)
- 部品の一覧(部品ID、部品名、説明)
- 種類ごとの必須の情報の一覧
- GitHub の検索で集めた似た Issue の候補(最大10件。番号、題名、状態、本文の冒頭)

【判定すること】
1. type: bug / feature / question のどれか。
   不具合の報告を含むなら、要望や質問が混ざっていても bug を選んでください。
2. components: 部品IDを1つ、関係が明らかなら2つまで。分からなければ ["unknown"]。
3. scope_hint: 本文に書かれた影響の範囲を写してください。書かれていなければ "不明"。
4. missing_info: 必須の情報のうち、本文から読み取れないものの名前。
5. duplicates: 候補のなかから、同じ不具合・同じ要望と言えるものを選び、
   番号、"same" か "related"、理由を1文で書いてください。
6. security_concern: 認証・署名・権限の回避など、公開の場で詳しく扱うべきでない
   報告なら true にしてください。

【厳守事項】
- duplicates に入れてよいのは、候補の一覧にある番号だけです。
  候補にない番号を挙げないでください。
- 同じ部品の Issue というだけで same にしないでください。
  症状と条件がそろって同じと言えるときだけ same にしてください。
- 担当者、優先順位、重大度、原因、直し方は書かないでください。
- [MASKED] の中身を推測しないでください。
- missing_info は、本文のどこにも書かれていないものだけにしてください。
  テンプレートの欄が空でも、本文の別の場所に書かれていれば足りています。

「候補の一覧にある番号だけ」が最も大事な一文です。 書いておかないと、AIは「#1024 と似ています」のように、候補に無い番号を作って挙げることがあります。ワークフローでも、候補に無い番号は捨てます。

「欄が空でも、本文の別の場所に書かれていれば足りている」も効きます。 利用者は版をテンプレートの欄ではなく本文の冒頭に書くことがあります。欄だけを見て聞き返すと、書いたのに読まれていないと受け取られます。

Step7

出力形式を固定する

Structured Output Parser で、次の形に決めます。 公式ページでは、JSON の例から生成するとすべての項目が必須として扱われ、JSON Schema で定義することもでき、$ref を使った参照には対応しないとされています。

{
  "issue_number": 2481,
  "type": "bug | feature | question",
  "components": ["webhook-signature"],
  "scope_hint": "",
  "missing_info": ["sdk_version", "repro_steps"],
  "duplicates": [
    { "number": 2310, "relation": "same | related", "reason": "" }
  ],
  "security_concern": false
}

1つ目の理由は、ワークフローが中身を検査できることです。 components が対応表に無い部品IDなら unknown に直し、duplicates の番号が候補に無ければ捨てます。検査を通ったものだけが当番への案になります。

2つ目は、ラベルと担当を規則で決められることです。 種類のラベルは type から、部品のラベルと担当は components から対応表で引きます。部品が2つなら担当の候補も2人になり、当番がどちらかを選びます。

3つ目は、security_concern で流れを分けられることです。 true なら、ラベルの案も聞き返しの下書きも作らず、セキュリティの担当の Slack に直接知らせます。 公開の Issue への書き込みは、セキュリティの担当が決めます。

当番に送る案は、次の形にします。

欄中身
見出しIssue の番号・題名・作成者
区分種類、部品、影響の広さの手がかり
反映の案付けるラベル、担当の候補
聞き返し足りない情報と、コメントの下書き
重複の候補番号・題名・状態・関係・理由
注意伏せ字にした文字列があったこと
Step8

システムへ連携する

つなぎ先方式内容
GitHub(イベント)リポジトリの webhook → Webhook ノードIssue の作成・再開の受け取り
GitHub(検索)HTTP Request(GitHub の資格情報)似た Issue の候補
Anthropic のモデルAnthropic Chat Model ノード区分と重複の判定
SlackSlack ノードの Send and Wait for Response案の提示と、反映するかの選択
GitHub(反映)HTTP Request(Update an issue)/ GitHub ノード(Issue の Create Comment)ラベル・担当の付与、コメントの投稿
Data TableData Table ノード対応表、配送の記録、案と判断

ラベルと担当は、REST API の「Update an issue」で付けます。 公式ページでは、labels と assignees は渡した値で今の設定を置き換え、空の配列を渡すと消えるとされています。今付いているラベルを取ってから足し合わせて渡します。 足し合わせずに渡すと、利用者や他の開発者が付けたラベルが消えます。

機械用のアカウントには、トリアージの権限を持たせます。 公式ページでは、Issue を編集できるのは作成者と、書き込みの権限かトリアージの役割を持つ人で、書き込みの権限が無いとラベルと担当の変更は黙って捨てられるとされています。反映の後に Issue を取り直し、ラベルが付いたかを確かめます。

重複の印は、コメントで付けます。 GitHub の公式ページでは、新しいコメントの本文に「Duplicate of #番号」と書くと「重複として印が付いた」というタイムラインの出来事が加わり、コメントする人にはそのリポジトリへの書き込みの権限が要るとされています。この印は閉じることとは別で、閉じるのは当番が行います。

当番への確認には、Slack の Send and Wait for Response を承認の形で使います。 公式ページでは、Slack の中で承認・却下でき、承認できる人を指定でき、誰が応じたかが出力に残るとされています。承認できる人を、その週の当番に限ります。 n8n が Slack から公開の HTTPS で届くこと、Interactivity の受け口、Signing Secret が要ります。

Step9

人が確認する

その週の当番が、Slack の案を確かめます。

  1. 伏せ字と脆弱性の知らせを先に見る … キーが貼られていたら、ラベルより先に利用者への連絡を決めます
  2. 重複の候補を見る … same の候補を開き、症状と条件が同じかを見ます
  3. 部品と担当を見る … 部品が2つのときは、どちらの担当にするかを選びます
  4. 聞き返しの下書きを読む … 足りない情報が本当に書かれていないかを本文で確かめます
  5. 反映するかを選ぶ … 外れがあれば「反映しない」を選び、自分で付けます

2番目で重複と認めても、すぐには閉じません。 「Duplicate of #番号」のコメントで利用者に元の Issue を示し、利用者が「違う」と返せる時間を置いてから閉じます。 自動で閉じると、別の不具合を見落とします。

目標は、1件をならして3分です。 案が当たっていれば1分で終わり、重複の候補を読み比べるものは数分かかります。

Step10

例外に対処する

起きること対応
署名が合わない処理せずに記録する。本文を加工してから計算していないかを確かめる
同じ配送が二度届くX-GitHub-Delivery で照らして二度目を捨てる
検索 API の回数の上限に当たる待ってからやり直す。hybrid は1分に10回
検索の語が長すぎる256文字以内に切ってから送る
候補に無い番号が返るその候補を捨て、記録に残す
対応表に無い部品が返るunknown にして当番に部品を選ばせる
ラベルが付いていない機械用のアカウントの権限を確かめる。黙って捨てられる
当番が決めた時間までに選ばない反映せずに残し、次の当番の朝の一覧に載せる
n8n が止まっていたGitHub の配送の記録から、届かなかった配送をやり直す

最後の行は、GitHub が自動ではやり直さないためです。 公式ページは、サーバーが戻ったら届かなかった配送をやり直すよう勧めています。止まっていた間に立った Issue は、案が作られないまま残ります。

Step11

記録を残す

  • 配送のID、Issue の番号、受け取った日時、外した理由
  • 伏せ字にした箇所の種類(中身は残さない)
  • 検索の語と、候補の10件の番号
  • AIの判定(種類、部品、足りない情報、重複の候補、脆弱性の疑い)と、検査で直した箇所
  • 当番の選択と、応じた人と時刻、当番が直したラベルと担当
  • 反映したラベル・担当・コメントのID

当番が直したラベルと担当を残すのは、対応表の説明を直すためです。 ある部品がいつも別の部品に直されるなら、説明の言葉が利用者の書き方と合っていません。

04実装レベルの3段階

最小構成:Issue を手で生成AIの画面に貼り、区分を出させる / 1件ごとの区分
半自動化:上記+n8n で webhook を受け、検索の候補とAIの判定を Slack に送る / 区分と重複の候補の提示
本格構成:上記+対応表からのラベルと担当、承認、GitHub への反映、記録 / 受付の判定から反映まで

最小構成では、重複の候補を集める手間が残ります。 確かめるための段階です。 半自動化で、1件10分が5分程度になります。 読んで区分を決める①と、重複を探す②の大半は無くなりますが、ラベルと担当を付けてコメントを書く③が残ります。本格構成で3分になり、この段階が本記事の想定です。 差が出るのは、ラベル・担当・聞き返しの書き込みが、承認のボタン1つになるからです。 段階を飛ばさないでください。 半自動化の1か月で部品の説明と検索の語を直してから反映を足すほうが、公開の場に出る外れが減ります。

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

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

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

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

AI活用について相談する

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

向いている
  1. SDK・CLI・ライブラリ・機器の制御ソフトなどを GitHub で公開し、利用者から月に数百件の Issue を受けている開発チーム。当番の開発者が Issue を読んでラベルと担当を付けているが、重複を探す時間が長く、担当によって付け方が違う場合。部品ごとの担当者が決まっている場合。
向いていない
  1. Issue が月に数十件で、当番が全件を丁寧に読める場合。部品の区分や担当が決まっておらず、ラベルの付け方も定まっていない場合(先に区分を決めるほうが効果が大きい)。脆弱性の報告を公開の Issue で受けている場合(先に非公開の窓口を整える)。なお、修正の優先順位と、Issue を閉じるかどうかの判断はこの構成では代替できません。

07最小構成で試す方法

  1. 過去3か月の Issue から50件を選ぶ(当時重複として閉じたもの、部品の付け直しがあったものを混ぜる)
  2. 部品の一覧と説明を書く
  3. 手元の生成AIの画面に、部品の一覧と1件の Issue を貼り、「種類と部品と足りない情報を挙げてください」と指示する
  4. 重複として閉じたものは、元の Issue を含む候補の10件を GitHub の画面の検索で集めて貼り、「同じ不具合のものを選んでください」と指示する
  5. 当時の判断と突き合わせる

50件は必ずやってください。 ワークフローを組む前に、「部品の説明だけで判定が当たるのか」と、重複の元の Issue が検索の候補に入ってくるのかを確かめます。

出てきた内容判断
種類と部品が当時とほぼ同じで、重複も選べるn8n で組む段に進む
部品がいつも隣の部品になる部品の説明を書き直す。構成は有効
重複の元が検索の候補に入らない検索の語の作り方が先。 AIの問題ではない

3行目が出たら、検索の語を題名だけにするか本文の冒頭まで含めるかを変えて、元の Issue が入るかを見てください。

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

問題対策
署名がいつも合わないRaw Body で受け、加工前の本文で計算する
利用者が付けたラベルが消えるlabels は置き換え。今のラベルと足し合わせて渡す
ラベルが付かないのにエラーが出ない書き込みの権限が無いと黙って捨てられる。反映後に取り直して確かめる
候補に無い番号を重複に挙げる候補の一覧にある番号だけを許し、それ以外は捨てる
新しい Issue 自身を重複に挙げる検索結果から番号で外す
重複の元が候補に入らない検索の語の作り方を変える。意味の検索の効き方を確かめる
GitHub が配送を失敗と数える10秒以内に応答する。Webhook ノードの応答を Immediately にする
同じ Issue に案が二度届くX-GitHub-Delivery で照らす
脆弱性の報告にラベルを付けて目立たせるsecurity_concern が true なら案を作らず、セキュリティの担当へ
重複を自動で閉じてしまう印のコメントまでにし、閉じるのは当番
担当をAIが選ぶAIは部品まで。担当は対応表で引く

上の3行が、この構成でいちばん起きやすい失敗です。 どれも GitHub の仕様から来ていて、AIの精度とは関係ありません。 特に2行目は、利用者や他の開発者の作業を黙って消します。

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

この構成で扱うデータ: 公開のリポジトリの Issue の本文、作成者のアカウント名、利用者が貼った設定やログです。公開の Issue でも、貼られたキーやログには秘密の情報が含まれることがあります。

  1. 秘密情報らしい文字列を渡す前に伏せる … 伏せたことを当番に知らせ、キーの失効を勧めるかを当番が決めます
  2. 脆弱性の疑いは公開の場で扱わない … ラベルもコメントも付けず、セキュリティの担当に直接知らせます。 非公開の報告の窓口を案内するかは、その担当が決めます
  3. 公開の場への書き込みは当番が承認する … ラベル・担当・コメントは、すべて当番の承認を経ます
  4. 機械用のアカウントの権限を絞る … 対象のリポジトリのトリアージに要る権限だけを持たせます
  5. webhook の署名を必ず確かめる … 確かめないと、誰でも n8n に偽の Issue を送り込めます

誤りが起きた場合のリスクは、誤った重複の印で別の不具合が見落とされることと、公開の場に不適切な書き込みが残ることの2つです。 前者は閉じる判断を当番に残すことで、後者はすべての書き込みを承認の後にすることで防ぎます。

10まず何から始めるか

1週目:部品の対応表を作る

12の部品について、利用者の言葉での説明、部品のラベル、担当を Data Table にまとめます。あわせて、種類ごとの必須の情報を決めます。

2週目:50件で試す

過去の Issue から50件を選び、手元の生成AIの画面で区分と重複の判定をさせて、当時の判断と突き合わせます。重複の元が検索の候補に入ってくるかを最優先で見ます。

3週目:受け口と権限を整える

n8n の Webhook ノードを用意し、リポジトリの webhook を Issues のイベントだけで設定します。機械用のアカウントにトリアージの権限を付け、署名の秘密の値を決めます。

4週目:判定を Slack に送る

webhook を受けて署名を確かめ、検索の候補とAIの判定を当番の Slack に送るところまで作ります。この時点では GitHub に書き込みません。

2か月目: 対応表からのラベルと担当、Slack での承認、GitHub への反映を足します。3か月目以降: 当番が直した部品と担当を数えて説明を直し、1件10分が何分になったかを実測します。当番の週でも、自分の開発とレビューが止まらなくなった時点で、この構成は完成です。


11関連ユースケース

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

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

技術仕様確認日:2026-10-14/最終更新:2026-10-15
確認した内容情報源確認日
Webhook ノードの応答(Immediately など)、Raw Body のオプション、テスト用と本番用の URLn8n Docs: Webhook2026-10-14
GitHub Trigger のイベントの一覧に Issue comment・Pull request などがあり、Issues が見当たらないことn8n Docs: GitHub Trigger2026-10-14
GitHub ノードの Issue に Create・Create Comment・Edit・Get・Lock があり、無い操作は HTTP Request で資格情報を使って呼べることn8n Docs: GitHub2026-10-14
Basic LLM Chain がプロンプトを決め、出力の形を求めるときにパーサーをつなぐことn8n Docs: Basic LLM Chain2026-10-14
JSON の例から生成するとすべての項目が必須になること、$ref に対応しないことn8n Docs: Structured Output Parser2026-10-14
Slack の中で承認・却下でき、承認できる人を指定でき、誰が応じたかが残ること。公開の HTTPS、Interactivity、Signing Secret が要ることn8n Docs: Approvals in Slack2026-10-14
Data Table ノードの行の操作に Insert・Upsert・Get などがあることn8n Docs: Data table2026-10-14
issues のイベントの action(opened・edited・reopened・labeled・transferred・typed など)GitHub Docs: Webhook events and payloads2026-10-14
X-Hub-Signature-256 が本文から作る HMAC-SHA256 であり、一定の時間で比べる関数で照合することGitHub Docs: Validating webhook deliveries2026-10-14
10秒以内に2XXで応答すること、X-GitHub-Delivery がやり直しでも同じ値であること、止まった後に届かなかった配送をやり直すことGitHub Docs: Best practices for using webhooks2026-10-14
Update an issue の labels・assignees が置き換えであること、編集できる人、書き込みの権限が無いと変更が黙って捨てられることGitHub Docs: REST API endpoints for issues2026-10-14
/search/issues の search_type(semantic・hybrid)、検索の回数の上限(1分に30回、semantic・hybrid は10回)、256文字と演算子5つまでの上限GitHub Docs: REST API endpoints for search2026-10-14
「Duplicate of #番号」のコメントでタイムラインに重複の印が付き、書き込みの権限が要ることGitHub Docs: Marking issues or pull requests as a duplicate2026-10-14

脆弱性の報告の受け方と、公開の場での扱いは、自社のセキュリティの担当と決めてください。 本記事は n8n と GitHub の公開ページで確認できた範囲だけを扱っています。

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

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

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

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