一、为什么需要 Multi-Agent?
随着大模型应用的发展,单 Agent 架构在简单场景下可以满足需求,但是面对企业复杂业务时会遇到一些问题。
例如,一个数据平台智能助手,需要同时具备:
- Flink 任务分析能力
- Kafka 消费分析能力
- 数据血缘查询能力
- SQL 优化能力
- 元数据检索能力
如果全部能力放在一个 Agent 中:
Data Agent
Tools:
queryFlinkJob()
queryKafkaLag()
queryLineage()
generateSQL()
queryMetadata()
...
随着 Tool 数量增加,会导致:
- Prompt 越来越复杂;
- Tool 选择准确率下降;
- Agent 难以维护。
因此,更合理的方式是:
将不同领域能力拆分成多个专业 Agent,再由一个协调 Agent 负责任务分发。
这种模式称为:
Supervisor Agent(主管 Agent)模式。
二、Supervisor Agent 架构
整体架构如下:
html
用户
|
v
Supervisor Agent
(任务分析与调度)
|
+---------+---------+
v v
Flink Agent Kafka Agent
v v
Flink Tools Kafka Tools
| |
v v
Flink系统 Kafka系统
其中:
Supervisor Agent(主agent)
负责:
- 理解用户需求;
- 判断需要调用哪个 Agent;
- 汇总多个 Agent 返回结果。
专业 Agent
负责:某一个领域的问题解决。
例如:
Flink Agent:
负责实时计算任务分析。
Kafka Agent:
负责消息队列问题分析。
三、LangChain4j 中 多Agent 协同实现案例
下面我们以一个天气穿搭助手底层多agent实现举例说明
java
/**
* Supervisor 多 Agent 协同 Demo(基于 langchain4j)
* <p>
* 与 {@link MultiAgentDemo} 的「手工流水线编排」不同,这里采用 <b>Supervisor 模式</b>:
* <pre>
* ┌──────────────────┐
* 用户请求 ─────▶ │ Supervisor Agent │ (大模型自主规划调用顺序)
* └────────┬─────────┘
* │ 通过 AgentTools 调用
* ┌─────────────┴──────────────┐
* ▼ ▼
* ┌────────────┐ ┌────────────┐
* │ 天气 Agent │ │ 穿衣 Agent │
* │(WeatherSkill) │ │
* └────────────┘ └────────────┘
* </pre>
* Supervisor 不写死调用流程,而是把两个子 Agent 当作工具,由 LLM 决定先查天气、再给穿搭建议。
*/
主代码
java
package org.utils;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;
public class SupervisorDemo {
public static void main(String[] args) {
// 1. 构建底层大模型(与 LongChainUtil 保持一致)
OpenAiChatModel model =
OpenAiChatModel.builder()
.baseUrl("http://xxxn.com/v1")
.apiKey("desfrwsfdwedwe")
.modelName("deepseek-reasoner")
.build();
// 2. 创建两个专家 Agent
//天气查询agent
WeatherAgent weatherAgent = AiServices.builder(WeatherAgent.class)
.chatLanguageModel(model)
.tools(new WeatherSkill())
.build();
//穿搭agent
OutfitAgent outfitAgent = AiServices.builder(OutfitAgent.class)
.chatLanguageModel(model)
.build();
// 3. 把两个专家 Agent 包装成工具,交给 Supervisor
SupervisorAgent supervisor = AiServices.builder(SupervisorAgent.class)
.chatLanguageModel(model)
.tools(new AgentTools(weatherAgent, outfitAgent))
.build();
// 4. 用户只需向 Supervisor 提一个复合诉求,剩下的调度由它自主完成
System.out.println("========== 用户提问 ==========");
String request = "我在北京,今天该怎么穿?";
System.out.println(request + "\n");
String answer = supervisor.execute(request);
System.out.println("========== Supervisor 最终答复 ==========");
System.out.println(answer);
}
}
穿衣agent定义
java
package org.utils;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
/**
* 穿衣 Agent
* 职责:根据「天气 Agent」给出的天气信息,为用户提供穿衣打扮建议。
* 它不查询天气,只对已知的天气结论进行推理。
*/
public interface OutfitAgent {
@SystemMessage("你是一个专业的穿搭顾问。" +
"用户会给你一段当地天气描述,你需要根据温度、天气状况和风力," +
"给出具体、贴心的穿衣打扮建议(包括上衣、下装、外套、配饰等),语言亲切自然。")
String suggestOutfit(@UserMessage String weatherInfo);
}
天气助手agent定义
java
package org.utils;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
/**
* 天气 Agent
* 职责:负责查询当地天气。它绑定了 {@link WeatherSkill},
* 会根据用户提问自动调用天气查询工具,并输出结构化的天气结论。
*/
public interface WeatherAgent {
@SystemMessage("你是一个天气查询助手。" +
"当用户询问某地天气时,你必须调用天气查询工具获取真实数据," +
"然后用一句话简洁客观地描述该城市的天气、温度和风力,不要给出穿衣建议。")
String queryWeather(@UserMessage String message);
}
主agent定义
java
package org.utils;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
/**
* Supervisor Agent(主管 / 调度 Agent)
* <p>
* 它本身不直接干活,而是通过 {@link AgentTools} 拥有「天气 Agent」和「穿衣 Agent」的调用能力。
* 面对用户的复杂诉求(如「我在北京今天该怎么穿」),由它背后的大模型自主规划:
* 先调用天气专家拿到天气,再把天气结论交给穿搭专家,最后汇总答复用户。
*/
public interface SupervisorAgent {
@SystemMessage("你是一个智能调度主管,手下有两个专家工具:" +
"1. 天气专家(weatherAnalyze)------查询某城市的天气;" +
"2. 穿搭专家(outfitAnalyze)------根据天气给出穿衣建议。" +
"当用户询问穿衣相关问题时,你需要:先调用天气专家查询当地天气," +
"再把查到的天气描述交给穿搭专家获取穿衣建议," +
"最后把天气情况和穿衣建议整合成一段完整、友好的回复返回给用户。")
String execute(@UserMessage String request);
}
把「天气 Agent」和「穿衣 Agent」分别包装成一个 {@link Tool} 方法,
java
package org.utils;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
/**
* Agent Tools ------ Supervisor 模式的桥梁。
* <p>
* 把「天气 Agent」和「穿衣 Agent」分别包装成一个 {@link Tool} 方法,
* 交给 {@link SupervisorAgent} 使用。这样 Supervisor 背后的大模型
* 就能像调用普通工具一样,自主决定何时调用哪个专家 Agent。
*/
public class AgentTools {
private final WeatherAgent weatherAgent;
private final OutfitAgent outfitAgent;
public AgentTools(WeatherAgent weatherAgent, OutfitAgent outfitAgent) {
this.weatherAgent = weatherAgent;
this.outfitAgent = outfitAgent;
}
@Tool("调用天气专家:查询指定城市的当地天气情况")
public String weatherAnalyze(@P("需要查询天气的城市,例如:北京") String city) {
System.out.println("【Supervisor -> 天气 Agent】city=" + city);
return weatherAgent.queryWeather("请查询" + city + "今天的天气");
}
@Tool("调用穿搭专家:根据一段天气描述给出穿衣打扮建议")
public String outfitAnalyze(@P("一段当地天气的文字描述") String weatherInfo) {
System.out.println("【Supervisor -> 穿衣 Agent】weatherInfo=" + weatherInfo);
return outfitAgent.suggestOutfit("这是当地天气信息:" + weatherInfo + "。请给出穿衣打扮建议。");
}
}
执行结果
bash
我在北京,今天该怎么穿?
【Supervisor -> 天气 Agent】city=北京
【天气技能被调用】查询城市:北京
【Supervisor -> 穿衣 Agent】weatherInfo=晴,气温-3℃到5℃,北风4级
========== Supervisor 最终答复 ==========
<think>
我们完成了整个流程:首先调用天气专家获取北京天气(晴,-3℃ ~ 5℃,北风4级),然后将天气描述交给穿搭专家。穿搭专家返回了详细的穿衣建议。
现在需要将天气情况和穿衣建议整合成一段完整、友好的回复给用户。
回复结构:
1. 先告知用户查询到的实时天气情况(简洁客观,来自weatherAnalyze的结果)。
2. 自然地过渡到穿衣建议(来自outfitAnalyze的详细建议)。
3. 保持语气友好,结尾可以加个暖心小表情。
注意:
- 不要直接复制工具返回的原始文本,要整合成流畅的一段话。
- 穿搭专家的回复已经很详细友好,可以直接引用核心建议,但需调整表述使其更口语化。
- 确保包含所有关键信息:温度范围、风力、具体穿衣层次(内衣/中层/外套/下装/鞋袜/配饰)、特殊提醒(防风、干燥、温差)。
最终回复将这样组织:
"北京今天天气是晴,气温在-3℃到5℃之间,北风4级,体感会比较冷哦!穿衣方面建议..."
然后精选穿搭专家的建议要点,用更简洁的口语表达,最后加上温馨提示。
</think>
根据查询到的北京实时天气:**晴,气温 -3℃ ~ 5℃,北风 4 级**,结合穿搭专家的建议,以下是今日的穿衣指南:
### ☀️ 天气特点 & 穿衣核心
虽然阳光充足,但低温+大风会让**体感温度明显低于实际气温**,重点要 **"防风+锁温"**!
### 👗 推荐搭配方案
1. **🧥 外套**
✅ **中长款防风羽绒服/厚棉服**(长度过臀更佳)
❌ 避免单薄大衣或毛呢外套(挡不住4级北风)
2. **👚 内搭**
→ **贴身层**:加绒保暖内衣/高领羊毛衫(吸湿锁温)
→ **中间层**:厚针织毛衣/抓绒卫衣(建议选宽松款方便穿脱)
3. **👖 下装**
✅ **加绒保暖裤+防风外裤** 或 **厚羊毛裤单穿**
❌ 单穿牛仔裤/薄休闲裤(寒风易穿透)
4. **🥾 脚部**
→ **鞋子**:防滑雪地靴/加绒马丁靴(鞋帮护住脚踝)
→ **袜子**:加厚羊毛袜(可叠穿两双普通袜替代)
5. **🧣 必备配件**
⭐ **厚围巾**(裹住脖子防灌风)
⭐ **护耳毛线帽**(避免头部散热)
⭐ **防风手套**(露指关节易冻伤)
### 💡 温馨小贴士
- 出门前 **重点检查围巾/帽子是否戴严实**------4级风会瞬间带走热量❄️
- 室内外温差超15℃,内搭选 **方便穿脱的层次**(如V领毛衣+可拆卸围巾)
- 北风干燥,随身带 **护手霜+润唇膏** 预防皴裂
- 午间阳光强但升温有限,**切勿随意减外套**!
> 🌈 今日虽冷但有晴光,穿暖和点也能享受冬日明朗!记得全副武装再出门哦~