0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【ADK2.0】実践④ Google ADKでチャット窓口とワークフローを合体(Chat / Task / Single Turn)

0
Posted at

はじめに

本記事は、ADK2.0の新機能を、実際に手を動かして検証した結果をまとめています。
前回までで、下書き生成から編集長の承認まで一連のグラフワークフローができあがりました。

今回は、このワークフローをユーザーとチャットするコーディネーターの裏側で動かしてみます。
前回までの部分と、今回追加する部分を図にすると以下のようになります。

※濃いグレーが今回追加するコーディネーター部分、薄いグレーが前回まで(1〜3本目)に作ったワークフロー。

前回までのグラフワークフロー(下書き→並列レビュー→差し戻し→編集長承認→公開)はそのまま活かしつつ、その手前にユーザーと会話するコーディネーターを追加する、というのが今回のポイントです。

過去の記事はこちら↓

記事 内容
【ADK2.0】実践① Google ADKで構築するグラフ構造のAIエージェント 下書き生成→文字数チェック(グラフワークフローの基本)
【ADK2.0】実践② Google ADKで複数レビュアーを並列実行(Fan-out / Fan-in) 並列レビュー+差し戻しループ
【ADK2.0】実践③ Google ADKでAIエージェントに承認処理を挟む(Human-in-the-Loop) 編集長の承認(HITL)

1. Chat/Task/SingleTurnモードとは

ADK 2.0では、LLMエージェントに3つの役割モードが導入されました。

  • Chat:ユーザーと複数ターンの会話をする。サブエージェントとして使う場合のデフォルトで、呼び出し元への制御の返却には明示的な操作(transfer_to_agent)が必要
  • Task:ユーザーと会話しながらタスクを進めるが、完了すると自動的に呼び出し元へ制御が戻る
  • SingleTurn:ユーザーと会話せず、1回のやり取りでタスクを完結する。ワークフロー内のノードとして使う場合のデフォルト

公式ドキュメントには、旅行プランナーを題材にしたこんな例が載っていました。

from google.adk import Agent

# SingleTurnモード:ユーザーとは会話せず、1回のやり取りでタスクを完結
weather_agent = Agent(
    name="weather_checker",
    mode="single_turn",
    tools=[get_weather],
)

# Taskモード:質問しながら進められ、完了したら自動でコーディネーターに戻る
flight_agent = Agent(
    name="flight_booker",
    mode="task",
    tools=[search_flights, book_flight],
)

# コーディネーター(Chatモード:sub_agentを持つ場合のデフォルト)
travel_planner = Agent(
    name="travel_planner",
    # 委譲用ツールが自動生成
    sub_agents=[weather_agent, flight_agent],
)

sub_agentsに指定すると、それぞれのエージェント名に対応した委譲用ツールが自動生成される、というのも地味に便利なポイントですね。

参考:Collaborative workflows(公式ドキュメント)

2. コーディネーターにワークフローを組み込む

このパターンを、これまで作ってきたブログ執筆ワークフローに当てはめてみます。

Workflowはsub_agentsに渡せない

公式サンプルではsub_agentsに個別のAgentを渡していましたが、これまで作ってきたblog_writer_workflowは複数ノードから成るWorkflowオブジェクトです。

WorkflowBaseAgentではなくBaseNodeを継承したクラスのため、sub_agentsBaseAgentを期待する)には直接渡せません。
同様にAgentToolで包む方法も、BaseAgentを前提としているため使えません。

そこで、コーディネーターを外側の別エージェントにするのではなく、同じグラフの最初のノードとして組み込む形にしました。

from google.adk import Agent
from google.adk import Workflow

# ユーザーと会話してトピックを聞き出すコーディネーター
# mode="task" にすることで、会話が完了すると自動的に次のノードへ進む
coordinator = Agent(
    name="coordinator",
    model="gemini-3.6-flash",
    mode="task",
    instruction="""あなたはブログ編集部の窓口です。
    ユーザーと会話して、書いてほしい記事のトピックを聞き出してください。
    トピックが決まったら会話を終えてください。
    レビューや承認待ちで時間がかかる場合があることを、あらかじめユーザーに伝えてください。""",
)

# draft_agent, grammar_reviewer, ... など、それ以外のノード定義は前回記事と同じものを使用

root_agent = Workflow(
    name="blog_writer_workflow",
    edges=[
        # coordinatorがユーザーとやり取りしてトピックを固め、
        # 完了したらdraft_agentに処理を渡す
        ("START", coordinator, draft_agent),

        # ===================================================
        # 前回記事までに作成したワークフローを埋め込む(そのまま)
        # ===================================================
    ],
)

mode="task"を指定することで、コーディネーターはユーザーと複数ターンやり取りしながらトピックを固め、完了すると自動的にdraft_agentに処理が進む、という挙動を意図しています。

委譲先が単体のAgentではなくWorkflowの場合は、sub_agentsではなくグラフのノードとして直接組み込む必要あり。

3. 動かしてみる

コーディネーターに話しかけると、トピックについて何度かやり取りがあり、決まったところでdraft_agentに処理が進みました。

image.png

image.png

その後は裏側で下書き生成・並列レビュー・差し戻し・編集長承認の一連の流れがそのまま機能しました。

4. 触ってみた所感

「コーディネーターの裏でグラフ全体を動かす」というのは、sub_agentsではなく「グラフの最初のノードとしてコーディネーターを組み込む」形で実現することになりました。
1つのグラフの中に、ユーザーと会話するノードと、会話せず黙々と処理するノードが混在できるのが良かったです。

一方で、複数ノードから成るWorkflowを、さらに大きな構成にどう組み込むかという点は、公式ドキュメントのサンプルだけではカバーしきれていない部分もありそうで、今後も新しいパターンが出てくるかもしれません。


まとめ

4本にわたって、ADK 2.0の新機能を「ブログ執筆エージェント」というお題で検証してきました。

通して触ってみて感じたのは、ADK 2.0は「AIの柔軟さ」と「コードによる確実な制御」を、グラフという1つの表現方法の中でうまく共存させている、というところです。

1.x時代に感じていた「プロンプトに頼らざるを得ない曖昧さ」が、随所で解消されており、フローの制御ができるようになったことで、より複雑な処理をエージェントに任せることができるようになるのではと感じました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?