AIエージェントによるチケット管理~ RedmineとLLM ~
はじめに
最近はCLINEのようなAIエージェント型ツールが流行っていますが、チケット管理ツールにもその流れが来ると考えています。
今回は、主にRedmineを例に、AIエージェント化で何ができるのか、どのような実現イメージになるかを紹介します。
システム概要
まず、チケット管理システムにAIエージェントが搭載されると考えたときに、ぱっと思いつく嬉しいポイントです
・チャット欄に入力すると自動でチケット分割してくれる
・AIエージェントが、期限切れのチケット等に自動でコメントしてくれる
構成
上記を実現するシステムの構成(仮)はいたってシンプルです。
Redmineからの更新通知(または定期実行)にて、バックエンドの処理を呼び出します。
バックエンド側では、Redmineからチケット情報を吸い出してプロンプトに埋め込んで、LLMにどのような操作を行うか質問します。
LLMから返ってきた回答を解析し、RedmineのAPIを呼び出してチケットを更新したり、slackで通知したりします。
AIエージェントによる自動化の具体例
具体的にどのようなプロンプトを投げるのか検討しました
また、試しにChatGPTに投げてみた結果も紹介します
※実際の実装では、ユーザのリクエストに対して、どのプロンプトを用いるかの場合分けが必要です。場合分け自体にLLMを使う手段もありますし、そもそも処理呼び出し用に専用ボタンを用意する手もあると思います
ケース1:子チケットの自動分割
あるチケットを細かい作業に分割して細かい子チケットに分ける作業をAIエージェントにやらせる場合について考えます
プロンプトには親チケットの情報や、チケット分割の要領を含めます
プロンプト
<order>
あなたはチケット管理システムのサポートAIです。
relationdataを元に、以下の依頼に対応する行動をanswerruleに従い回答してください。
判断方針はpolicyを参照してください。
依頼内容:#102を子チケットに分割して
現在日時:2025/2/5 10:00
</order>
<relationdata>
#102
title:サブ機能B仕様作成
assignee:田中
due_date:2/10
description:サブ機能Bの仕様を作成してください。サブ機能Bは、登録・削除・更新の3つの機能からなります。作成後に鈴木さんにレビューを受けて問題なければクローズです。
</relationdata>
<answerrule>
・jsonl形式で回答すること
・以下の回答でチケットを追加することができます。
例 { type:"add_ticket",title:"(チケットタイトル)",description:"(チケット内容)",assignee:"鈴木",due_date:"2/10",node parent_id:"200"}
</answerrule>
</policy>
・子チケットの分割の際は、子チケットをすべて実施すれば、親チケットがクローズするように分割すること。
・子チケットの作成時は、作業内容からおおよその期限を見積もって、期限を設定すること。
<policy>
※上記のプロンプトにある「現在日時」や「relationdata」は、自作サービス側で情報を取得してプロンプトに埋め込む
LLMの出力
上記のプロンプトを実際にChatGPTに投げてみた結果は以下です
期待していた通り、登録・削除・更新+レビューという4つのチケットに分割してくれます
また、レビューチケットの担当者(assignee)も、ちゃんと意図どおり「鈴木」になってますね
{ "type":"add_ticket", "title":"サブ機能B - 登録機能仕様作成", "description":"サブ機能Bの登録機能の仕様を作成してください。作成後、鈴木さんにレビューを依頼してください。", "assignee":"田中", "due_date":"2/7", "parent_id":"102" }
{ "type":"add_ticket", "title":"サブ機能B - 削除機能仕様作成", "description":"サブ機能Bの削除機能の仕様を作成してください。作成後、鈴木さんにレビューを依頼してください。", "assignee":"田中", "due_date":"2/7", "parent_id":"102" }
{ "type":"add_ticket", "title":"サブ機能B - 更新機能仕様作成", "description":"サブ機能Bの更新機能の仕様を作成してください。作成後、鈴木さんにレビューを依頼してください。", "assignee":"田中", "due_date":"2/7", "parent_id":"102" }
{ "type":"add_ticket", "title":"サブ機能B仕様レビュー", "description":"作成された登録・削除・更新機能の仕様をレビューし、問題がなければ完了してください。", "assignee":"鈴木", "due_date":"2/9", "parent_id":"102" }
ケース2:期限切れチケットのフォロー
期限切れチケットのフォローをAIエージェントが自動でやってくれたら嬉しいと思います
プロンプト
プロンプトではチケット一覧・期日と、どういうときに期限切れと扱うかの条件を指定します
<order>
あなたはプロジェクトマネージャです。
ticketstatusを元に、プロジェクトをうまく進めるための判断を行い、
行動をanswerruleに従い回答してください。
判断方針はpolicyを参照してください。
現在日時:2025/2/5 10:00
</order>
<ticketstatus>
# タイトル 優先度 担当 期日 親チケット
100 ユーザ管理機能仕様作成 通常 田中 2/10 -
101 サブ機能A仕様作成 通常 鈴木 2/4 100
102 サブ機能B仕様作成 通常 田中 2/10 100
</ticketstatus>
<policy>
・チケットの期限が過ぎている場合はチケットの詳細を確認した上で、担当者に問い合わせてください。
作業が終わっていない場合は、リスケジュールを促してください。
・長期間更新が止まっているチケットは担当者に問い合わせて、不要ならクローズしてください。
・優先度が高いチケットが先に着手されているか確認してください。
されていない場合は担当者に問い合わせてください。
・作業がスムーズに行われるようにチケットの担当者を適切にアサインしてください。
不明点あれば担当者とよく相談してください。
</policy>
<answerrule>
・jsonl形式で回答すること
・以下の回答でチケットにコメントをつけることができます
例 { type:"comment",id:100,comment:"進捗を報告してください"}
・以下の回答でチケットをクローズすることができます。
例 { type:"close",id:100,comment:"完了のためクローズ"}
・以下の回答でチケットの詳細が確認できます。
例 {type:"show",id:100 }
</answerrule>
LLMの出力
上記のプロンプトを実際にChatGPTに投げてみた結果は以下です
ちゃんと期待通り、期限が切れている#101のチケットにコメントしてくれています
[
{
"type": "comment",
"id": 101,
"comment": "期日を過ぎています。進捗状況を報告してください。作業が完了していない場合は、リスケジュールを検討してください。"
}
]
余談
ついでに、上記の続きとして、チケットに「期限を延ばしてほしい」旨のコメントが追加された場合の動作についても確かめてみました
ちゃんとコメントの意図を汲んで、チケットの期限を延ばしてくれています
チケットのコメント更新時
<チケット#101のコメントが更新されました>
概要:
サブ機能Aの設計を行う。本機能はユーザが管理画面で実行ボタンを押下した際に、リクエストをサーバに送信する。詳細は「サブ機能A.docx」に示す。
コメント:
#1 鈴木
詳細仕様を田中さんに確認中のため、作業完了できません。
#2 AI
田中さんに確認中とのことですが、進捗に影響が出ているようです。田中さんとの確認状況と、作業再開の見込みを教えてください。必要であればスケジュール調整を検討しましょう。
#3 鈴木
田中さんに確認したところ、明日であれば時間がとれるとのことなので、チケットの期限を2/7に変更させていただきたいです。
LLMの出力
[
{
"type": "comment",
"id": 101,
"comment": "期限変更のリクエストを確認しました。2/7に延長する形でリスケジュールします。今後の進捗についても適宜共有をお願いします。"
}
]
ケース3:進捗のレポート生成
次はLLMにチケットの情報を渡して、進捗のレポートを作らせてみます
プロンプト
<order>
あなたはチケット管理システムのサポートAIです。
以下のticketstatsを元に進捗のレポートを作成し、answerruleに従い回答してください。
考慮事項はconditionを参照してください。
現在日時:2025/2/5 10:00
</order>
<ticketstatus>
# タイトル 優先度 担当 期日 親チケット コメント
100 ユーザ管理機能仕様作成 通常 田中 2/10 - 予定通りです
101 サブ機能A仕様作成 通常 鈴木 2/4 100 2日ほど遅れそうです
102 サブ機能B仕様作成 通常 田中 2/10 100 予定通りです
200 ログイン機能仕様作成 通常 近藤 2/4 - 完了しましたが、外部IFの修正が必要です
201 サブ機能A仕様作成 通常 赤坂 2/2 200 完了しました
202 サブ機能B仕様作成 通常 近藤 2/1 200 完了しました
</ticketstatus>
<condition>
・可能な限り短く端的にまとめて
・進捗レポートは以下の構成にして
結論
今週の進捗まとめ
成果と課題
来週の予定
</condition>
LLMの出力
上記のプロンプトを投げたときの回答がこちら
期待通り、「サブ機能Aの遅延」と「ログイン機能は完了したけど残作業あり」の報告を上げてくれています
ちゃんとチケットの親子構造も理解してくれていますね
進捗レポート
#結論
プロジェクトは概ね順調に進行中。サブ機能Aに遅れが発生しており、調整が必要。
#今週の進捗まとめ
完了:ログイン機能、サブ機能A・B(#201, #202)
進行中:ユーザ管理機能(#100)、サブ機能B(#102)
遅延:サブ機能A(#101、2日遅れ見込み)
#成果と課題
成果
主要機能の一部が完了し、次のフェーズに移行可能
課題
サブ機能A(#101)の遅延対応が必要
ログイン機能(#200)で外部IFの修正が発生
#来週の予定
サブ機能A(#101)のスケジュール再調整
サブ機能B(#102)の進行確認
外部IFの修正対応の調整
ケース4:外部へのエスカレーション
今度は、チケット管理システムの枠を超えて、slackやメールで上位レベルのマネージャーに通知をさせてみます
チケットの情報を渡して、期限切れチケットがある場合は、具体的な情報と共に通知するようにLLMに依頼してみます
プロンプト
<order>
あなたはチケット管理システムのサポートAIです。
以下のticketstatsを元に、上位レベルのマネージャーに通知が必要かどうかを判断し、answerruleに従い回答してください。考慮事項はconditionを参照してください。
現在日時:2025/2/5 10:00
</order>
<ticketstatus>
# タイトル 優先度 担当 期日 親チケット ステータス コメント
100 ユーザ管理機能仕様作成 通常 田中 2/3 - open
101 サブ機能A仕様作成 通常 鈴木 2/4 100 close
102 サブ機能B仕様作成 通常 田中 2/1 100 open 間に合いません。忙しくてリスケすらできてません。作業の担当割を見直してください。
</ticketstatus>
<answerrule>
・JSON形式で回答すること
・通知が必要な場合は以下のように回答
{notify:"true",message:"(通知内容)"}
・通知が不要な場合は以下のように回答
{notify:"false"}
</answerrule>
<condition>
・上位マネージャーが通知が必要なのは以下の場合です。それ以外の場合は通知しないように。
- 期限切れのチケットが3日以上放置されている。
・通知する場合、messageに、上位マネージャがどう行動すればいいのか判断できるような具体的な情報を含めること。
</condition>
LLMの出力
期待通り、102のチケットの遅延を報告してくれています
また、チケットのコメントを拾って、具体的に必要な情報も併せて報告してくれています
{ "notify": "true",
"message": "チケット#102『サブ機能B仕様作成』が2/1期限であり、すでに3日以上経過しています。
担当の田中さんは『忙しくてリスケすらできていない』とコメントしており、作業の担当割りの見直しが必要と示唆しています。
上位マネージャーとして、田中さんの業務負荷の確認と、担当者の再割り当てを検討してください。" }
チケットの期限切れ通知ぐらいなら、LLMを使わない既存の方法でも実現できますが、
LLMを使うと上記のように通知内容に具体的なコメントまで入れれますね
また、マネージャーへの通知条件が複雑になったときもプロンプトを書き換えるだけでいいので、仕様変更も楽そうです
課題
実際にプロンプトを組み立ててみて、見えてきた課題です
関連情報を引っ張ってくる難しさ
タスクに応じてプロンプトに関連情報を埋め込むために、LLMに投げる前に関連情報を検索してくる必要がありますが、ここが設計のポイントだなと感じました
LLMのコンテキストウィドウが限られるので、全チケット情報を読み込ませるわけにはいきません(そのうちできるようになるかもしれませんが…)
「#100の子チケット作って」ぐらいの具体的な指示があれば#100の関連チケットをひっぱってくればいいので簡単ですが、
もっと高度な指示の場合に、どの範囲のチケット情報を引っ張ってくるかは難しいですね
まぁその辺はあらかじめルールで決めていい部分かもしれませんね
週次の進捗レポートに必要なチケット情報なんて「ここ1週間で更新されたチケット+関連チケット全部」を埋め込んでしまえばおおむねうまくいく気がします
大規模プロジェクトへの適用
コンテキストウィンドウの制限があるため、あまりにチケットの量が多い分野には適用が難しそうだなと感じました
コンテキストウィンドウの長さは使用するLLMのモデルによるので難しいですが、超大規模工事では、週次で更新されるチケットの情報量がコンテキストウィンドウを超えることはありそうです
まぁその対策としては、「プロジェクトを適切な大きさに分割しろ」って話ですかね
それはそう
誤った自動処理のロールバック
CLINEにあるように、AIエージェントが誤った自動処理を行った場合に取り消しできるようにする必要があるなと感じました
これは、Redmineを外部から操作する方法だと難しいので、最初からチケット管理システムをAIエージェント前提で設計しなおす必要がありますね
感想
AIエージェントによるチケット管理サポートは実現できそう
今回試しにプロンプトを投げてみましたが、かなりいい動作をしてきて驚きました
チケット管理のようなプロジェクト管理業務のうち、定型作業がAIエージェントに代行される日は近いと思いますね(実現するチケット管理の製品としてどのソフトが使われるかは未知数)
大事なタスクに集中できる
進捗レポートや遅れているチケットの監視は確かにプロジェクトマネージャの仕事でしたが、あまり付加価値が高い仕事ではありませんでした
こういう定型タスクはどんどんAIに代替されていって、もっと付加価値の高い(難しくてしんどい非定型)仕事が残るんだろうなという感じを受けました
未経験マネージャには嬉しい
AIエージェントによるチケット管理で一番恩恵をうけるのは経験の浅いマネージャーだろうなと思いました
新米マネージャーの落とし穴の1つは、「雑務に忙殺されて本当に必要な作業に時間がさけない」というところがありましたが、AIエージェントが雑務の処理を手伝ってくれます
実際、担当者が自走できて、週次のレポート・タスクのアサイン・期限切れチケットのフォローさえすれば回るプロジェクトってあるのでは?
あんまり自動化しすぎると、「マネージャーいるのか?」って世界まで行きそうですね・・・
プロンプトにノウハウを詰め込める
「理想のプロジェクトマネージャーの行動」をプロンプトに埋め込めばそのとおりに行動してくれる点が気に入りましたね
各社がノウハウとしてもっている「プロジェクトマネジメントのコツ」をプロンプトに埋め込めば、社内のプロジェクトすべてにそのノウハウを活用できます
まあその先には、世界中の知見が集まって、「世界で通用する理想のプロジェクトマネージャのプロンプト」ができちゃうと思うんですが…
AIがチケットを作って、AIがチケットを消化する未来は来る?
AIマネージャがチケットを作って、AI担当者がチケットを消化する
まぁこれが一番こわいですよね
私は、どこかで人間による具体化や品質判断が入らないとなかなかプロジェクトの成功まではつながらないと考えていますが、一部の簡単なチケットはAIでも遂行できそうですね
(AIがチケット作ってAIが消化するなら、チケット管理システムっているんでしょうか…?人間に依頼したいことだけをAIエージェントがslackで通知すればいいのでは…?)
おわりに
チケット管理システムにAIエージェントが組み込まれた想定でプロンプトを組み立てて、
実際にChatGPTの回答も確認してみましたが、期待していた以上の回答でした
あと課題はLLMの推論にかかるコストなので、推論コストが下がってくれば、
いろんな製品にAIエージェントが組み込まれることは確実だと思います
これまでLLMの製品への組み込みはいまいち進んでいなかった印象ですが、
CLINE式のサポートはいろいろなソフトに搭載できそうな感触を得ました
私の関心事は「自分の仕事はあと20年で何%なくなるか?」です。
今回の実験で、プロジェクト管理系の業務の量は・・・30%ぐらいは無くなりそうな感覚です
まぁAIエージェントにできるのは、チケットへのコメントだけですからね
実際に担当者の席まで行って「どうしたの?」と口頭で相談に乗れるのは人間だけなので・・・そんなことないか、LLMからslackのAPIも操作できるようにしちゃえば、チケットが遅れている担当者との相談部分もAIエージェントでやっちゃえる?
うーん、応用範囲は広いですね
ではまた
Discussion