longchain4j实战 -- Multi-Agent协调机制实战

一、为什么需要 Multi-Agent?

随着大模型应用的发展,单 Agent 架构在简单场景下可以满足需求,但是面对企业复杂业务时会遇到一些问题。

例如,一个数据平台智能助手,需要同时具备:

  • Flink 任务分析能力
  • Kafka 消费分析能力
  • 数据血缘查询能力
  • SQL 优化能力
  • 元数据检索能力

如果全部能力放在一个 Agent 中:

复制代码
Data Agent

Tools:

queryFlinkJob()

queryKafkaLag()

queryLineage()

generateSQL()

queryMetadata()

...

随着 Tool 数量增加,会导致:

  1. Prompt 越来越复杂;
  2. Tool 选择准确率下降;
  3. 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领毛衣+可拆卸围巾)  
- 北风干燥,随身带 **护手霜+润唇膏** 预防皴裂  
- 午间阳光强但升温有限,**切勿随意减外套**!

> 🌈 今日虽冷但有晴光,穿暖和点也能享受冬日明朗!记得全副武装再出门哦~
相关推荐
SXJR1 个月前
spring boot + langchain4j +milvus实现向量存储
java·spring boot·后端·大模型·milvus·rag·langchain4j
星轨zb1 个月前
[Corner项目实战]Spring Boot + LangChain4j Tool Calling实战:让AI自动选择推荐策略
人工智能·spring boot·后端·langchain4j
java1234_小锋1 个月前
LangChain4j 中流式响应(Streaming Response)如何实现?与同步调用相比需要注意哪些问题?
langchain4j
java1234_小锋1 个月前
LangChain4j 开发Java Agent智能体- 多模态支持
java·开发语言·langchain4j
java1234_小锋1 个月前
LangChain4j 中 EmbeddingStore 的作用是什么?如何集成常见的向量数据库(如 PGVector、Chroma)?
langchain4j
java1234_小锋1 个月前
LangChain4j 开发Java Agent智能体- 对话与提示词工程(Prompt)
java·开发语言·prompt·langchain4j
星轨zb1 个月前
LangChain4j 集成 Spring Boot:会话记忆 NPE 的根源与 ChatMemoryProvider 正确配置
java·spring boot·后端·langchain4j
阿昌喜欢吃黄桃1 个月前
Java优质开源AI项目
java·ai·langchain·开源·rag·springai·langchain4j