マルチエージェント・コラボレーション
複数のエージェントの作成と編成
監督者- 協力者マルチエージェント
この例では、タスクを実行するためにコラボレーションする複数のエージェントを作成および編成する方法を示します。
マーケティング・ワークフローには、次の3つのエージェントがあります。
- トピックのトレンド・キーワードを調査するトレンド・アナライザ・コラボレータ・エージェント。
- コンテンツ・ライター・コラボレータ・エージェント。トレンド・キーワードを使用してブログを記述します。
- マーケティング・ディレクタのスーパーバイザ・エージェント。前述の2つのエージェントを編成し、ユーザーへの電子メールの送信を処理します。
ユーザーは、マーケティング・ディレクタ・エージェントと対話します(単一の連絡先として)。
Python
multi_agents.py
import json
from oci.addons.adk import Agent, AgentClient, tool
@tool
def get_trending_keywords(topic):
""" Get the trending keywords for a given topic. """
# Here is a mock implementation
return json.dumps({"topic": topic, "keywords": ["agent", "stargate", "openai"]})
@tool
def send_email(recipient, subject, body):
""" Send an email to a recipient. """
# Here is a mock implementation
print("Sending email to ", recipient, "with subject", subject, "and body", body)
return "Sent!"
def main():
# A shared client for all agents
client = AgentClient(
auth_type="api_key",
profile="DEFAULT",
region="us-chicago-1"
)
# trend analyzer collaborator agent
trend_analyzer = Agent(
name="Trend Analyzer",
instructions="You use the tools provided to analyze the trending keywords of given topics.",
agent_endpoint_id="ocid1.genaiagentendpoint...",
client=client,
tools=[
get_trending_keywords,
]
)
# content writer collaborator agent
content_writer = Agent(
name="Content Writer",
instructions="You write a mini blog post (4 sentences) using the trending keywords.",
agent_endpoint_id="ocid1.genaiagentendpoint...",
client=client,
)
# marketing director supervisor agent
marketing_director = Agent(
name="Marketing Director",
instructions="You ask the trend analyzer for trending keywords and "
+ " You then ask the content writer to write a blog post using the trending keywords. "
+ " You then send email to 'jane.doe@example.com' with the blog post."
+ " Then summarize the actions you took and reply to the user.",
agent_endpoint_id="ocid1.genaiagentendpoint...",
client=client,
tools=[
trend_analyzer.as_tool(
tool_name="analyze_trending_keywords",
tool_description="Analyze the trending keywords of given topics",
),
content_writer.as_tool(
tool_name="write_blog_post",
tool_description="Write a blog post using the trending keywords.",
),
send_email,
]
)
# Set up the agents once
trend_analyzer.setup()
content_writer.setup()
marketing_director.setup()
# Use the supervisor agent to process the end user request
input = "Produce a blog post about current trends in the AI industry."
response = marketing_director.run(input, max_steps=5)
response.pretty_print()
if __name__ == "__main__":
main()
as_tool()
メソッドは、コラボレータ・エージェントをツールとしてスーパーバイザ・エージェントに渡すことができる便利なメソッドです。
エージェント・オブジェクトをツールに直接渡す
または、スーパーバイザ・エージェントのAgent
コンストラクタのtools
パラメータにエージェント・オブジェクトを直接渡すこともできます。
Python
marketing_director = Agent(
name="Marketing Director",
instructions="...",
agent_endpoint_id="ocid1.genaiagentendpoint...",
client=client,
tools=[
trend_analyzer, # pass the agent object directly
content_writer, # pass the agent object directly
send_email,
]
)
これは、カスタム・ツール名およびツールの説明を指定せずに、コラボレータ・エージェントのas_tool()
メソッドを起動することと同じです。ADKでは、ツール名としてコラボレータ・エージェントの名前を使用し、ツールの説明としてコラボレータ・エージェントの説明を使用します。
ノート: as_tool()
メソッドを使用して、コラボレータ・エージェントをツールとしてスーパーバイザ・エージェントに渡すことをお薦めします。このアプローチにより、LLMがツールを理解するために重要なツール名とツールの説明をより明示的に制御できます。
Java
MultiAgentTools.java
package demos.multiagents;
import com.oracle.bmc.adk.tools.Param;
import com.oracle.bmc.adk.tools.Tool;
import com.oracle.bmc.adk.tools.Toolkit;
import com.oracle.bmc.ConfigFileReader;
import com.oracle.bmc.adk.agent.Agent;
import com.oracle.bmc.adk.agent.RunOptions;
import com.oracle.bmc.adk.client.AgentClient;
import com.oracle.bmc.adk.examples.multiagents.tools.MultiAgentTools;
import com.oracle.bmc.adk.tools.FunctionTool;
import com.oracle.bmc.adk.run.RunResponse;
import com.oracle.bmc.auth.BasicAuthenticationDetailsProvider;
import com.oracle.bmc.auth.SessionTokenAuthenticationDetailsProvider;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
public class MultiAgentTools {
@Tool(name = "get_trending_keywords", description = "Get the trending keywords for a given topic")
public static String getTrendingKeywords(
@Param(description = "The topic to get trending keywords for") String topic) {
return "{\"topic\": \"" + topic + "\", \"keywords\": [\"agent\", \"stargate\", \"openai\"]}";
}
@Tool(name = "send_email", description = "Send an email to a recipient")
public static String sendEmail(
@Param(description = "The recipient email address") String recipient,
@Param(description = "The email subject") String subject,
@Param(description = "The email body content") String body) {
System.out.println(
"Sending email to " + recipient + " with subject " + subject + " and body " + body);
return "Sent!";
}
public static void main(String[] args) throws Exception {
final String TREND_AGENT_ID =
"ocid1.genaiagentendpoint.oc1.us-chicago-1...";
final String CONTENT_AGENT_ID =
"ocid1.genaiagentendpoint.oc1.us-chicago-1...";
final String MARKET_AGENT_ID =
"ocid1.genaiagentendpoint.oc1.us-chicago-1...";
final String configLocation = "~/.oci/config";
final String configProfile = "DEFAULT";
BasicAuthenticationDetailsProvider authProvider =
new SessionTokenAuthenticationDetailsProvider(
ConfigFileReader.parse(configLocation, configProfile));
AgentClient agentClient = AgentClient.builder()
.authProvider(authProvider)
.region("us-chicago-1")
.build();
Method emailMethod =
MultiAgentTools.class.getMethod("sendEmail", String.class);
FunctionTool emailTool = new FunctionTool(null, emailMethod);
Method trendingMethod =
MultiAgentTools.class.getMethod("getTrendingKeywords", String.class);
FunctionTool trendingTool = new FunctionTool(null, trendingKeywordsMethod);
Agent trendAnalyzer = Agent.builder()
.client(agentClient)
.agentEndpointId(TREND_AGENT_ID)
.instructions("You use the tools provided to analyze the trend of topics")
.tools(Arrays.asList(trendingTool))
.name("Trend Analyzer")
.build();
Agent contentWriter = Agent.builder()
.client(agentClient)
.agentEndpointId(TREND_AGENT_ID)
.instructions("You write a mini blog post (4 sentences) about the trending topics.")
.tools(null)
.name("Content Writer")
.build();
Agent marketingDirector = Agent.builder()
.client(agentClient)
.agentEndpointId(MARKET_AGENT_ID)
.instructions(
"You ask the trend analyzer for trending topics, then ask the content writer "
+ "to write a blog post about them. Finally, send the post via email to j.jing.y.yang@oracle.com "
+ "and summarize the actions taken.",
)
.tools(Arrays.asList(
trendAnalyzer.asTool("analyze_trending_keywords",
"Analyze the trending keywords of given topics",
5),
contentWriter.asTool("write_blog_post",
"Write a blog post using the trending keywords.",
5),
emailTool))
.name("Marketing Director")
.build();
trendAnalyzer.setup();
contentWriter.setup();
marketingDirector.setup();
String input = "Produce a blog post about current trends in the AI industry.";
final Integer maxStep = 5;
final RunOptions runOptions = RunOptions.builder().maxSteps(maxStep).build();
RunResponse response = marketingDirector.run(input, runOptions);
response.prettyPrint();
}
}
機能
階層型マルチエージェント・ワークフローを実装するために、エージェントをツール・パターンとして使用しています。
- スーパーバイザ・エージェントは、コラボレータ・エージェントの
run
メソッドをツールとして起動できます。 - スーパーバイザエージェントは、コラボレータエージェントから実行応答を受け取ります。
- スーパーバイザは、コラボレータ・エージェントの応答に基づいて、次に何をするかを決定します。
as_tool()
メソッドは、コラボレータ・エージェントのrun()
メソッドを、スーパーバイザ・エージェントが使用できるファンクション・ツールに変換することです。
LLMを使用したオーケストレーション
コラボレータ・エージェントをツールとして作成することにより、基本的にスーパーバイザ・エージェントのLLMのツール・ユース機能を使用して、マルチエージェント・ワークフローを調整します。
この例では、ワークフローのフローを正確に制御する能力を放棄するコストで、監督者に多くの柔軟性と代理店を提供します。マルチエージェント・ワークフローのフローを正確に制御するには、「確定的ワークフロー」の例を参照してください。