Google ADKとServiceNow APIを連携したITヘルプデスクAIエージェント開発

サムネイル

こんにちは、情報システム部のエンジニアの大井です。 私たちの日常業務には、社内からのITに関する多種多様な問い合わせ対応が含まれています。 パスワードリセットのような定型的なものから、システム障害の報告まで、その内容は多岐にわたります。これらの問い合わせに迅速かつ効率的に対応することは、従業員の生産性向上とIT部門の業務負荷軽減に直結する重要な課題です。

近年、AIを活用した自動応答システムが、これらの課題解決策として注目されています。 特に大規模言語モデル(LLM)の性能向上は目覚ましく、複雑な問い合わせを理解し、適切に対応できるAIエージェントの実現を可能にしました。この技術の活用で、単純な問い合わせへの自動対応だけでなく、必要に応じた適切なシステム連携も可能となるインテリジェントな仕組みを構築できます。

AIエージェント開発フレームワークとしては、OSSで開発が進むLangGraphなどが有名です。 また、今年に入り、OpenAIやGoogleからも同様のフレームワークが発表され、エージェント開発がより身近なものになりました。本記事では、Google提供の「Agent Development Kit (ADK)」を用いた開発事例を紹介します。 今回開発したのは、企業のIT管理プラットフォーム「ServiceNow」と連携するITヘルプデスクAIエージェント(IT Helpdesk Coordinator Agent)です。 このエージェントは、よくある質問への自動応答と、より複雑なインシデント管理の両方を効率化することを目的としています。

ServiceNowとは

本システムの説明に先立ち、連携先であるServiceNowについて簡単にご説明します。ServiceNowは、企業のITサービス管理を効率化するクラウドベースのプラットフォームです。 問い合わせ管理、インシデント管理、変更管理など、様々なITサービス関連ワークフローを一元的に管理できます。 多くの企業では、社内ITヘルプデスク業務にServiceNowを活用しており、問い合わせ(インシデント)のライフサイクル管理や、よくある質問をまとめたナレッジベースの構築などに利用されています。

ServiceNowの強みの一つとして、豊富なAPI群を提供している点が挙げられます。これらのAPIを活用すれば、外部システムからServiceNow上のデータへアクセスしたり、新たなインシデントの作成が可能です。 本記事で紹介するエージェントシステムも、これらのAPIを駆使し、従業員からの問い合わせを自動で処理し、必要に応じてServiceNow上にインシデントチケットを作成します。

AI Agent の基本仕様

開発した「IT Helpdesk Coordinator Agent」は、次のような流れでITヘルプデスクへの問い合わせ対応を支援します。

  1. 問い合わせ内容の理解: 従業員からの自然言語による問い合わせをLLMが解釈し、その意図(FAQを知りたいのか、問題を報告したいのか等)を把握します。
  2. 適切な対応への振り分け: 問い合わせ内容に基づき、「FAQによる自己解決」または「ServiceNowへのインシデント起票」のどちらが適切かを判断します。
  3. FAQ自動回答: よくある質問に対しては、AIエージェントが関連情報を検索し、自動で回答を生成します。
  4. ServiceNowインシデント作成: 具体的な問題報告(例:「プリンターが故障した」)の場合、AIエージェントが必要な情報をユーザーからヒアリングし、ServiceNow APIを通じてインシデントチケットを自動で作成します。

これにより、ユーザーは簡単な質問への回答を待つ必要がなくなり、複雑な問題は迅速にIT部門へエスカレーションされるようになります。結果として、全体的な解決時間の短縮と従業員の満足度向上が期待できるでしょう。 また、ヘルプデスク担当者は、より専門的な対応が求められる業務に集中できるようになるというメリットもあります。

なぜGoogle ADKなのか?

今回、AIエージェント開発のフレームワークとして、Google Agent Development Kit (ADK) を採用しました。ADKは比較的新しいフレームワークですが、以下の点に魅力を感じています。

  • コードファーストな開発: Pythonコードでエージェントのロジックや連携を直接記述できるため、既存の開発プロセスに馴染みやすく、柔軟な実装が可能です。
  • マルチエージェント設計: 複数の専門的な役割を持つエージェントを組み合わせて、複雑なワークフローを構築できる点が強力です。今回のシステムでも、後述する3つのエージェントが連携して動作します。
  • 柔軟なツール連携: Python関数やOpenAPI仕様など、様々な方法で外部APIや内部ロジック(ツール)をエージェントに組み込むことができます。これにより、ServiceNowのような外部システムとの連携もスムーズに実現します。
  • エコシステムの将来性: Google CloudのVertex AIとの親和性も高く、今後の機能拡張やエコシステムの発展が大いに期待されます。

システムアーキテクチャ:

連携する3つのAIエージェント

このシステムは、ADKのマルチエージェント機能を活用し、役割の異なる3つのエージェントが連携して動作する構成となっています。

アーキテクチャ

図:コーディネーターエージェントがユーザーの問い合わせを分析し、FAQエージェントまたはインシデントエージェントに転送する流れです。

  1. Coordinator Agent (Helpdesk_Coordinator):

    • ユーザーからの最初の問い合わせを受け付ける窓口としての役割を担います。
    • LLMを用いて問い合わせ内容を分析し、「FAQ対応」が適切か「インシデント作成」が必要かを判断します。
    • 分析結果に基づき、適切なサブエージェント (FAQ_Agent または Incident_Agent) に処理を転送します。
  2. FAQ Agent (FAQ_Agent):

    • 一般的な質問への回答を担当します。
    • ADKのFunction Calling機能を使い、内部のFAQ検索ロジック(Python関数)を呼び出して回答を生成する仕組みです。
  3. Incident Agent (Incident_Agent):

    • ServiceNowへのインシデント起票を担当します。
    • ユーザーから問題の詳細や緊急度などをヒアリングします。
    • 収集した情報をもとに、ServiceNow APIと連携する専用ツールを呼び出し、インシデントを作成します。

このような構造にすることで、各エージェントは特定のタスクに集中できるようになります。その結果、システム全体のメンテナンス性や拡張性の向上が期待できます。

エージェントの実装コードと連携のポイント

各エージェントは、ADKの LlmAgent クラスを用いてPythonで定義しました。以下に主要な部分のコードを示します。

FAQ Agent (FAQ_Agent)

# FAQエージェント: よくある質問に回答
faq_agent = LlmAgent(
    name="FAQ_Agent",
    model=GEMINI_MODEL, # 使用するLLMモデルを指定
    instruction=( # エージェントへの指示 (プロンプト)
        """
        あなたは企業内ITサポートのFAQエージェントです。
        最初に「FAQアシスタントにつながりました。」と自己紹介してください。
        提供されたツール (get_faq_answer, search_related_questions) を使用して、
        ユーザーの質問に回答してください。
        """
    ),
    description="ITサポートの一般的な質問に回答するFAQエージェント",
    tools=[get_faq_answer, search_related_questions], # Python関数をツールとして登録
    output_key="faq_response"
)

instruction でエージェントの役割と振る舞いを定義しています。 tools には、FAQ検索用のPython関数 (例: get_faq_answer) などを登録し、Function Calling機能を通じて利用します。 今回は、ベクトルデータベースなど、自身で作成したデータベースを検索することを想定しましたが、ServiceNowのAPIからKnowledge(ナレッジベース)を取得する方法など、異なる実装も考えられます。

Incident Agent (Incident_Agent)

# インシデント作成エージェント
incident_agent = LlmAgent(
    name="Incident_Agent",
    model=GEMINI_MODEL,
    instruction=(
        """
        あなたはServiceNowインシデント作成専門のアシスタントです。
        最初に「インシデント作成アシスタントにつながりました。」と自己紹介してください。
        ユーザーから問題の詳細や緊急度 (1:高, 2:中, 3:低) を聞き取り、
        提供されたツール (例: create_servicenow_incident) を使ってインシデントを作成してください。
        ツールを呼び出す際は、short_description と urgency を必ず指定してください。
        """
    ),
    description="ServiceNowインシデントを作成するエージェント",
    tools=[create_servicenow_incident, update_servicenow_incident, list_servicenow_incidents], # ServiceNow連携ツールをリストで渡す (例)
    output_key="incident_response"
)

ServiceNowと連携するためのカスタムツール(詳細は後述します)を tools リストに含めています。 instruction では、これらのツールを使ってインシデント関連の操作を指示しています。

Coordinator Agent (Helpdesk_Coordinator)

# コーディネーターエージェント
coordinator_agent = LlmAgent(
    name="Helpdesk_Coordinator",
    model=GEMINI_MODEL,
    instruction=(
        "あなたはITヘルプデスクのコーディネーターです。"
        "ユーザーの問い合わせ内容を分析し、以下の基準で適切なサブエージェントに転送してください。\n"
        "- 一般的な質問の場合: transfer_to_agent(agent_name='FAQ_Agent') を呼び出す\n"
        "- 問題報告や障害の場合: transfer_to_agent(agent_name='Incident_Agent') を呼び出す\n"
        "最初に「ITヘルプデスクにつながりました。」と挨拶してください。"
    ),
    description="ユーザー問い合わせを分析し、適切なサブエージェントに転送する",
    output_key="conversation_summary",
    sub_agents=[faq_agent, incident_agent] # サブエージェントを登録
)
  • sub_agents パラメータに、先ほど定義した faq_agentincident_agent を登録します。
  • instruction では、問い合わせ内容に応じて transfer_to_agent という関数を呼び出し、処理を適切に振り分けるよう指示しています。
  • 連携の仕組み: ADKフレームワークが、sub_agents の登録と transfer_to_agent の呼び出しを解釈し、エージェント間の制御フローを実現します。
  • output_key を利用することでセッション情報を共有し、会話の文脈の維持が可能です。

ServiceNow APIとの連携:ADKカスタムツールの活用

Incident_AgentがServiceNowと連携する部分は、ADKのツール機能の具体的な活用例となります。

  • ADKでは、開発者が任意のPython関数を「ツール」として定義し、それをエージェントに提供できます。
  • エージェント(LLM)は、会話の流れや与えられた指示に基づき、これらのツールを適切な引数で呼び出すことができます。

ServiceNow Incident作成ツール

ServiceNowとの連携には、ServiceNowが提供している豊富なREST APIを利用します。例えば、インシデント管理に関連して、以下のようなツール(Python関数)の定義が考えられます。 なお、MCP (Managed Component Provider) の利用も検討しましたが、ServiceNowの公式に公開されているものは見当たりませんでした。

  • インシデント作成ツール: 新しいインシデントチケットを作成します。
def create_servicenow_incident(short_description: str, urgency: int,...) -> dict:
    """ServiceNowに新しいインシデントを作成する"""
    #... ServiceNow API (/api/now/table/incident) へのPOSTリクエスト処理...
    # API呼び出しには認証情報や適切なヘッダーが必要になります。
    pass
  • インシデント更新ツール: 既存のインシデントにコメントを追加したり、状態を変更したりします。
def update_servicenow_incident(incident_sys_id: str, comment: str = None, state: int = None,...) -> dict:
    """既存のServiceNowインシデントを更新する"""
    #... ServiceNow API (/api/now/table/incident/{sys_id}) へのPATCH/PUTリクエスト処理...
    pass
  • インシデント一覧取得ツール: 特定のユーザーに関連するインシデントや、特定の条件に合致するインシデントの一覧を取得します。
def list_servicenow_incidents(user_id: str = None, state: int = None,...) -> dict:
    """ServiceNowインシデントを検索・一覧表示する"""
    #... ServiceNow API (/api/now/table/incident) へのGETリクエスト処理 (クエリパラメータ使用)...
    pass

これらの関数の内部では、requests のようなHTTPクライアントライブラリを用いて、ServiceNowのAPIエンドポイントへリクエストを送信することになります。 その際には、ServiceNowインスタンスのURL、APIアクセスに必要な認証情報(ユーザー名/パスワード、APIキー、OAuthトークンなど)、そして送信データ(インシデントの内容など)を適切に設定する必要があります。 APIからの応答(成功/失敗、作成されたインシデント番号など)を解析し、構造化された辞書形式で返すことで、エージェントはその結果を理解し、ユーザーへの応答生成に利用できるようになります。

このように、ADKのカスタムツール機能を利用すれば、使い慣れたPythonで外部システムとの連携ロジックを実装し、それをAIエージェントの能力として柔軟に組み込むことが可能です。

実装から見えたこと・今後の課題

今回の開発を通じて、ADKの持つ可能性と、いくつかの課題が見えてきました。

良かった点:

  • 迅速なプロトタイピング: コードファーストのアプローチにより、アイデアを素早く形にできました。
  • 役割分担の容易さ: マルチエージェント設計のおかげで、FAQ担当やServiceNow連携担当といった役割分担が明確になり、開発をスムーズに進められました。
  • プロンプトによる柔軟な制御: エージェントの振る舞いを instruction プロンプトで細かく制御できるため、対話の流れやツールの使い方を調整しやすかったです。
  • ツール連携の自由度: Python関数でAPI連携を実装できるため、既存のライブラリや社内標準に合わせて柔軟にツールを構築できました。

課題と今後の展望:

  • プロンプトエンジニアリングの重要性: LLMの性能を最大限に引き出すには、instruction の書き方が非常に重要です。期待通りの動作をさせるためには、試行錯誤が必要でした。
  • ツール連携の安定性: 外部APIとの連携は、ネットワークの遅延やAPI仕様の変更といった外部要因の影響を受けます。エラーハンドリングやリトライ処理をより堅牢にしていく必要があります。
  • FAQの高度化: 現在は静的なFAQデータを利用していますが、今後はServiceNowのKnowledge APIを活用する方法や、社内ドキュメントのRAG (Retrieval-Augmented Generation) との連携を検討します。
  • 評価と改善: ADKには評価フレームワークも用意されているようですので、今後はエージェントの応答品質やタスクの成功率を定量的に評価し、継続的な改善サイクルを回していきたいと考えています。
  • デプロイ: 現在はローカル環境での実行ですが、将来的にはVertex AI Agent EngineやCloud Runといったクラウドサービスへのデプロイも検討していきます。

まとめ

本記事では、「社内IT問い合わせ対応効率化」の課題に対し、Google ADKとServiceNow APIを連携させたITヘルプデスクAIエージェントのプロトタイプ開発事例を紹介しました。

この開発は、技術検証の一環として試作したものであり、ADKの特長であるコードファーストな開発スタイル、マルチエージェント設計、そして柔軟なツール連携を活かすことで、その構築を実現しました。 これにより、従業員からの問い合わせ内容をAIが理解し、「FAQによる自動回答」と「ServiceNowへのインシデント自動起票」へとインテリジェントに振り分けるワークフローの基本的な動作を検証できました。

この仕組みによって、パスワードリセットのような定型的な問い合わせにはAIが即座に対応します。また、システム障害のような複雑な問題もスムーズにServiceNowに記録されるため、従業員の待ち時間が削減されます。 その結果、IT部門の担当者がより専門的な業務に集中できる環境が実現に近づきます。これは、冒頭で述べた「従業員の生産性向上」と「IT部門の業務負荷軽減」という目標達成に向けた、具体的な一歩と言えるでしょう。

今回の開発を通じて、ADKのポテンシャルを大いに実感しました。同時に、プロンプトエンジニアリングの奥深さや、外部システム連携における安定性の確保といった課題も明らかになりました。情報システム部では、今後これらの課題に真摯に取り組みます。 ADKのような新しい技術を積極的に活用し、AIによる業務プロセスの自動化・効率化をさらに推進していきたいと考えています。

この記事が、同様の課題認識をお持ちの方々や、AIエージェント開発にご興味のある皆様にとって、具体的な解決策を検討するうえでの一助となれば幸いです。

関連リソース: