初めに
ADKでエージェントを作成する際、データ取得・解析・回答生成などを1つにまとめるとInstructionが肥大化し、内容が曖昧になったり処理が冗長になったりして精度や速度が落ちることがあります。
そのため、役割ごとにsub_agentへ分割することが重要ですが、思ったように利用されなかったり順序通りに実行されないこともあります。
そこで役立つのがSequential agentsです。これを使えば、複数のsub_agentを確実に順番通り実行できます。
この記事では、このSequential agentsを実際に試してみたいと思います。
ADKとは
ADKとはAgent Development Kit
の略で、AIエージェントを作成するためのフレームワークです。
このフレームワークはGoogleから提供されており、現在はPythonとJavaの2言語で利用することができます。
LLMはGoogleが提供しているモデルをオンラインで利用することが可能です。
Vertex AI
、もしくはGoogle AI Studio
のモデルを利用することができます。
以前こちらの記事でADKを用いてAIエージェントを作成してみましたので、よければご覧ください。
Sequential agents
Sequential agentsは、サブエージェントを順番に実行するためのエージェントです。
出典: Google ADK Docs – Sequential Agents
以下公式ドキュメントです。
Sequential agents を試してみる
以前作成した「PHPフレームワークFlowの仕様を回答するAIエージェント」をSequential agentsに拡張します。
以前はRAGからデータを取得して回答するだけでしたが、その回答をレビューするようなAIエージェントを作成してみましょう。
実装
ということで実装してみました。
import os
from google.adk.agents.llm_agent import LlmAgent
from google.adk.agents.sequential_agent import SequentialAgent
from google.adk.tools.retrieval.vertex_ai_rag_retrieval import VertexAiRagRetrieval
from vertexai.preview import rag
from dotenv import load_dotenv
load_dotenv()
# RAGから情報を検索するエージェントを作成
rag = VertexAiRagRetrieval(
name="flow_rag_documentation",
description=(
'This is documentation od PHP web Framework Flow'
),
rag_resources=[
rag.RagResource(
rag_corpus= os.environ.get("RAG_CORPUS"),
)
],
similarity_top_k=1,
vector_distance_threshold=0.6,
)
access_information_agent_instruction = """
あなたはPHPフレームワークFlowに関する質問に答えるエージェントです。
必要に応じてflow_rag_documentationを見て、質問に答えてください。
"""
access_information_agent = LlmAgent(
name="access_information_agent",
model=os.environ.get("MODEL"),
instruction=access_information_agent_instruction,
tools=[rag],
output_key="flow_information",
)
# 回答をレビューするエージェントを作成
review_response_agent_instruction = """
あなたはPHPフレームワークFlowの質問に回答するエージェントの一部です。
生成された回答をレビューしてください。
以下のルールに従ってください。
1. 日本語がおかしい場合は、自然な日本語に修正してください。
2. 質問に対する回答が不十分な場合かどうかを確認し、不十分な場合はそのことを謝るような一文を追加してください。
3. 回答の最初に「質問に対する感謝」を述べてください。
4. RAGに書いてないことを書かれた際は、答えられない旨を丁寧に伝えたください。
"""
review_response_agent = LlmAgent(
name="genetrate_response_agent",
model=os.environ.get("MODEL"),
instruction=review_response_agent_instruction,
output_key="flow_response",
)
# SequentialAgentを定義
# 作成したLLMエージェントをsub_agents に実行したい順番に並べる
root_agent = SequentialAgent(
name="flow_agent",
sub_agents=[
access_information_agent,
review_response_agent,
],
description=(
'This is a sequential agent that answers questions about the PHP web framework Flow.'
),
)
ポイント
- LlmAgentを二つ用意
access_information_agent
review_response_agent
- SequentialAgentを作成
-
sub_agents
:作成したLLMエージェントを実行したい順番に並べる
-
各LLMにoutput_keyを指定しています。
これは各エージェントの実行結果をセッションに登録することで別のエージェントから参照できるらしいです(が、なしでもうまくいったので、いまいちわかっていません)。
動作確認
UIを立ちあげて実行してみましょう。
$ adk web
質問を投げると、二つのエージェントの回答が順番に生成されています。
そのうち、後ろのほうがレビュー後の回答ですね。
指定した通り、挨拶などが加えられています。
終わりに
Sequential agentsを用いることで、サブエージェントを順番に実行することを確認できました。各エージェントの回答が表示されるため、開発中のデバッグはしやすそうな一方、最後の回答だけ表示したい場合はどうすればいいのか気になります。ADK側で指定できるのか、呼び出し元でなんとかするのか、この辺も今度調べてみようと思います。
ここまでご覧いただきありがとうございました!