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で構築するグラフ構造のAIエージェント

0
Posted at

はじめに

Agent Development Kit(ADK)の2.0が、Python版は2026年5月19日、Go版は2026年6月30日にGAしています。
2.0について今までちゃんと触れてきていなかったので、新機能を一通り触ってみようと思います。

今回のゴールは、グラフワークフローの基本であるノード・エッジ・条件分岐を理解し、最小構成を実際に動かしてみることです。


1. ADK 1.x時代の課題

これまでのADKにはSequentialAgentParallelAgentといった、決まったパターンの組み合わせしかありませんでした。単純な直列・並列処理なら問題ないのですが、

  • 「Aの結果によってBに進むかCに進むか」を分けたい
  • 「条件を満たすまでBを繰り返したい」

といった柔軟な制御をしようとすると、長大なプロンプトの中に条件分岐のロジックを書き込むしかなく、思った通りに動いてくれない・デバッグしづらい、という課題がありました。

2. ADK 2.0のグラフワークフローとは

ADK 2.0では、Workflowクラスを使って処理の流れをグラフとして明示的に定義できます。

  • ノード(Node):Agent(LLM)、Tool、あるいは単なるPython関数
  • エッジ(Edge):ノード同士のつながり、条件による分岐

AIによる非決定的な推論(Agent)と、コードによる決定的な処理(関数)を、同じグラフの中で自由に組み合わせられるのがポイントです。

参考:Graph-based agent workflows(公式ドキュメント)

3. 最小構成のワークフローを作る

AIブログ執筆エージェントというお題で実際にエージェントを実装していこうと思います。
まずは「トピックを渡すと、ブログ記事の下書きを1つ返す」だけの、ノード1つのワークフローを作ります。

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

draft_agent = Agent(
    name="draft_agent",
    model="gemini-3.6-flash",
    instruction="""あなたはブログ記事のライターです。
    与えられたトピックについて、800字程度の日本語のブログ記事の下書きを書いてください。
    本文のみを出力し、前置きや後書きは不要です。""",
    output_schema=str,
)

root_agent = Workflow(
    name="blog_writer_workflow",
    edges=[
        ("START", draft_agent),
    ],
)

edges("START", draft_agent)と書くだけで、「開始したらdraft_agentを実行する」という最小のワークフローが完成します。この時点ではまだ1ノードだけのシンプルな構成です。

4. 条件分岐を追加する

ここからが本題です。
下書きの文字数をチェックする関数ノードを追加し、

  • 十分な文字数があれば → finalize_agentで記事を仕上げる
  • 文字数が足りなければ → request_more_contentで追記を依頼する

という条件分岐を実装します。

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

draft_agent = Agent(
    name="draft_agent",
    model="gemini-3.6-flash",
    instruction="""あなたはブログ記事のライターです。
    与えられたトピックについて、800字程度の日本語のブログ記事の下書きを書いてください。
    本文のみを出力し、前置きや後書きは不要です。""",
    output_schema=str,
)

def check_length(node_input: str):
    """下書きの文字数をチェックし、次に進むルートを決める"""
    if len(node_input) < 600:
        return Event(route=["TOO_SHORT"])
    return Event(route=["OK"])

finalize_agent = Agent(
    name="finalize_agent",
    model="gemini-3.6-flash",
    instruction="""渡された下書きに、タイトルと簡単な導入文を追加して、
    ブログ記事として仕上げてください。""",
    output_schema=str,
)

def request_more_content(node_input: str):
    return f"文字数が不足しています。下書きに具体例を1つ追加してください:\n\n{node_input}"

root_agent = Workflow(
    name="blog_writer_workflow",
    edges=[
        ("START", draft_agent, check_length),
        (check_length, {
            "OK": finalize_agent,
            "TOO_SHORT": request_more_content,
        }),
    ],
)

ポイントは2つです。

  1. check_lengthのようなルーティング用の関数は、Event(route=[...])を返すことで「次にどのルートに進むか」を宣言する
  2. edgesの中で(check_length, {"OK": finalize_agent, "TOO_SHORT": request_more_content})のように辞書形式で書くと、ルートの値に応じて実行するノードを振り分けられる

これだけで、「AIエージェント(draft_agent)→ コードによる判定(check_length)→ 条件によって異なるAIエージェント(finalize_agent / request_more_content)」という、AIと決定的なロジックが混在するワークフローが組めました。

例えば、「BigQueryに関する初心者向けの記事を書いて」と指示した場合

image.png

下書きに対して文字数チェックが走る→OK判定となり、最終記事として出力されていることが分かりますね。(finalize_agentではdraft_agentと同じ文章が出力)

参考:Build graph routes for workflow agents(公式ドキュメント)

5. 触ってみた所感

ADK 1.xでSequential/Parallelを組み合わせていた頃と比べて、一番違うと感じたのは処理の流れがコードとして目に見えるようになった点です。
「Aの後にBかCのどちらに進むか」というロジックが、プロンプトの中の自然言語ではなく、edgesの定義として明示的にコードに現れるので、自分で読み返したときの見通しがかなり良くなったと感じました。

まだ最小構成しか試していませんが、これだけでも「グラフで書く」ことによる、1.xと2.0の考え方の違いは十分に感じられました。


まとめ

ADK 2.0の目玉機能であるグラフベースのワークフローについて、以下簡単に実践してみました。

  • ノード(Agent・関数)とエッジで処理の流れを定義する基本
  • ルーティング用の関数と辞書形式のエッジで条件分岐を実装する方法

次回は、この下書きを複数のレビュアーで並列チェックし、指摘があれば下書きに差し戻すループを組み込む形に拡張してみます。

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?