引言
近年来,AI智能体(Agent)技术飞速发展,从单一功能的聊天机器人进化为能够自主决策、调用工具、协同工作的多智能体系统。多智能体系统(Multi-Agent System)通过将复杂任务拆分为多个子任务,由不同专业智能体并行或顺序执行,最终整合结果,大幅提升了AI处理复杂问题的能力。本文将带你用Java实现一个旅游规划多智能体系统,包含天气查询、景点推荐、行程规划三个专业智能体,它们将协作完成一次完整的旅行规划任务。
为什么用Java实现多智能体?
Java作为企业级开发的主流语言,拥有庞大的生态、出色的稳定性和跨平台能力。Google开源的ADK for Java(Agent Development Kit)为Java开发者提供了构建、编排智能体的强大工具,支持多种协作模式(顺序、并行、循环等),并能与MCP(Model Context Protocol)协议无缝集成,让智能体轻松调用外部工具和服务。
项目概述
我们将构建一个"旅游规划师"多智能体系统,包含三个核心智能体:
- 天气查询智能体:查询目的地的实时天气,并根据天气提供出行建议。
- 景点推荐智能体:结合天气和用户偏好(历史、美食、自然等)推荐景点。
- 行程规划智能体:整合天气和景点信息,生成详细的每日行程。
系统采用并行执行 + 顺序汇总的混合流程:先让天气和景点智能体并行工作,再由行程智能体整合结果,输出完整的旅行计划。
技术选型
- Java 17
- Google ADK for Java 0.3.0+:智能体框架
- Maven:项目构建
- Jackson:JSON处理(可选)
环境准备
Maven依赖
在pom.xml中添加以下依赖:
xml
<dependencies>
<!-- Google ADK for Java -->
<dependency>
<groupId>com.google.adk</groupId>
<artifactId>adk-java</artifactId>
<version>0.3.0</version>
</dependency>
<!-- Jackson for JSON (可选,用于工具类) -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
</dependencies>
配置API密钥
在src/main/resources/application.properties中配置Google AI Studio的API密钥(从Google AI Studio获取):
properties
google.ai.api.key=YOUR_API_KEY_HERE
项目结构
travel-planner-multiagent/
├── pom.xml
├── src/main/java/com/example/travel/
│ ├── TravelPlannerApplication.java # 主类
│ ├── agents/
│ │ ├── WeatherAgent.java # 天气智能体
│ │ ├── AttractionAgent.java # 景点智能体
│ │ └── ItineraryAgent.java # 行程智能体
│ └── tools/
│ └── WeatherTool.java # 天气查询工具
└── src/main/resources/application.properties
代码实现
1. 工具类:WeatherTool
首先,我们创建一个工具类,用于模拟天气查询。实际应用中可替换为调用真实天气API。
java
package com.example.travel.tools;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.util.Random;
public class WeatherTool {
private static final ObjectMapper MAPPER = new ObjectMapper();
private static final Random RANDOM = new Random();
public JsonNode getWeather(String city) {
String[] conditions = {"晴朗", "多云", "小雨", "大雨", "阴天"};
String condition = conditions[RANDOM.nextInt(conditions.length)];
int temperature = 5 + RANDOM.nextInt(30); // 5~34度
ObjectNode result = MAPPER.createObjectNode();
result.put("city", city);
result.put("condition", condition);
result.put("temperature", temperature);
return result;
}
public String getWeatherAdvice(JsonNode weather) {
String condition = weather.get("condition").asText();
if (condition.contains("雨")) {
return "建议携带雨具,选择室内活动";
} else if (condition.equals("晴朗")) {
return "适合户外活动,注意防晒";
}
return "天气适宜,可正常出行";
}
}
2. 智能体1:WeatherAgent
使用LlmAgent创建天气查询智能体,并注册WeatherTool。
java
package com.example.travel.agents;
import com.example.travel.tools.WeatherTool;
import com.google.adk.agents.LlmAgent;
public class WeatherAgent {
public static LlmAgent create() {
WeatherTool tool = new WeatherTool();
return LlmAgent.builder()
.name("weather-agent")
.description("查询目的地天气并提供出行建议")
.instruction("""
你是一个专业的天气查询助手。
根据用户提供的城市名称,使用WeatherTool查询天气,
返回包含温度、天气状况和出行建议的格式化报告。
""")
.model("gemini-2.0-flash")
.tools(tool)
.outputKey("weatherInfo") // 输出键,供后续智能体引用
.build();
}
}
3. 智能体2:AttractionAgent
景点推荐智能体,它依赖天气信息(通过{weatherInfo}占位符引用)和用户偏好。
java
package com.example.travel.agents;
import com.google.adk.agents.LlmAgent;
public class AttractionAgent {
public static LlmAgent create() {
return LlmAgent.builder()
.name("attraction-agent")
.description("根据天气和用户偏好推荐景点")
.instruction("""
你是一个景点推荐专家。
根据天气信息 {weatherInfo} 和用户偏好(如历史文化、美食等),
推荐3-5个适合的景点,包含简介和建议游览时间。
""")
.model("gemini-2.0-flash")
.outputKey("attractions")
.build();
}
}
4. 智能体3:ItineraryAgent
行程规划智能体整合天气和景点信息,生成每日行程。
java
package com.example.travel.agents;
import com.google.adk.agents.LlmAgent;
public class ItineraryAgent {
public static LlmAgent create() {
return LlmAgent.builder()
.name("itinerary-agent")
.description("整合天气和景点信息,生成完整行程")
.instruction("""
你是一个行程规划师。
根据天气信息 {weatherInfo} 和景点推荐 {attractions},
结合用户天数要求,生成详细的每日行程,包含餐饮和交通建议。
""")
.model("gemini-2.0-flash")
.outputKey("itinerary")
.build();
}
}
5. 主类:组合多智能体系统
在TravelPlannerApplication中,我们使用ParallelAgent和SequentialAgent编排智能体。
java
package com.example.travel;
import com.example.travel.agents.AttractionAgent;
import com.example.travel.agents.ItineraryAgent;
import com.example.travel.agents.WeatherAgent;
import com.google.adk.agents.LlmAgent;
import com.google.adk.agents.ParallelAgent;
import com.google.adk.agents.SequentialAgent;
import com.google.adk.runners.FlowRunner;
import com.google.adk.sessions.InMemorySessionStore;
public class TravelPlannerApplication {
public static void main(String[] args) {
// 创建智能体
LlmAgent weatherAgent = WeatherAgent.create();
LlmAgent attractionAgent = AttractionAgent.create();
LlmAgent itineraryAgent = ItineraryAgent.create();
// 并行执行天气和景点查询
ParallelAgent researchAgent = ParallelAgent.builder()
.name("research-agent")
.description("并行收集天气和景点信息")
.subAgents(weatherAgent, attractionAgent)
.build();
// 顺序执行:先研究,再规划行程
SequentialAgent travelPlanner = SequentialAgent.builder()
.name("travel-planner")
.description("旅游规划师")
.subAgents(researchAgent, itineraryAgent)
.build();
// 运行器
FlowRunner runner = FlowRunner.builder()
.sessionStore(new InMemorySessionStore())
.build();
String userQuery = "我想去北京旅游3天,喜欢历史文化和美食,帮我规划一下";
System.out.println("用户输入: " + userQuery);
System.out.println("=".repeat(50));
String result = runner.run(travelPlanner, userQuery);
System.out.println("最终行程:\n" + result);
}
}
运行效果
运行主类后,控制台输出示例:
用户输入: 我想去北京旅游3天,喜欢历史文化和美食,帮我规划一下
==================================================
最终行程:
【第一天】
上午:参观故宫博物院(历史文化的精髓,建议3-4小时)
中午:在故宫附近的四季民福烤鸭店享用北京烤鸭
下午:游览景山公园,俯瞰故宫全景
晚上:逛王府井小吃街,品尝北京特色小吃
【第二天】
上午:前往颐和园(皇家园林,建议3-4小时)
中午:在颐和园附近品尝老北京炸酱面
下午:参观圆明园遗址公园
晚上:观看老舍茶馆的京剧表演
【第三天】
上午:游览天坛公园(了解古代祭天文化)
中午:在前门大街品尝爆肚、卤煮等小吃
下午:逛大栅栏商业街,购买伴手礼
傍晚:结束愉快的北京之旅
扩展:集成MCP工具
ADK for Java支持通过MCP协议调用外部工具。假设我们有一个基于SSE的MCP天气服务器(如前文所述),可以轻松集成:
java
McpToolClient weatherMcpClient = McpToolClient.builder()
.serverUrl("http://localhost:8080/sse")
.build();
LlmAgent agent = LlmAgent.builder()
.name("weather-agent")
.tools(weatherMcpClient) // 使用MCP工具
.build();
更多协作模式
除了并行和顺序,ADK还支持:
- LoopAgent:循环执行直到满足条件
- Sub-Agents:主智能体动态调用子智能体(如研究总监模式)
- 混合流程:嵌套组合多种模式
例如,Sub-Agents模式适用于主智能体根据用户问题灵活决定调用哪些子智能体的场景。
总结
本文通过一个旅游规划多智能体系统demo,展示了如何使用Google ADK for Java构建能够协作完成任务的多智能体应用。我们实现了:
- 三个专业智能体:天气查询、景点推荐、行程规划
- 并行+顺序混合流程,提升效率并保证依赖关系
- 工具注册与使用
- 与MCP协议的集成扩展
Java开发者可以借助ADK for Java快速构建复杂的智能体工作流,将AI能力无缝集成到现有企业应用中。多智能体系统正在成为AI应用的新范式,掌握这一技术将为你打开无限可能。
参考资源
希望这篇实战文章能帮助你开启Java多智能体开发的旅程!如果你有任何问题或想法,欢迎在评论区交流讨论。