多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

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

longchain4j实战 -- Multi-Agent协调机制实战 一、为什么需要 Multi-Agent随着大模型应用的发展单 Agent 架构在简单场景下可以满足需求但是面对企业复杂业务时会遇到一些问题。例如一个数据平台智能助手需要同时具备Flink 任务分析能力Kafka 消费分析能力数据血缘查询能力SQL 优化能力元数据检索能力如果全部能力放在一个 Agent 中Data Agent Tools: queryFlinkJob() queryKafkaLag() queryLineage() generateSQL() queryMetadata() ...随着 Tool 数量增加会导致Prompt 越来越复杂Tool 选择准确率下降Agent 难以维护并且单agent存在如下问题问题一上下文容量有限单个 Agent 的上下文窗口有上限200K 甚至 1M tokens当你让它同时理解需求、搜索代码、写实现、写测试、做审查→ 上下文被各种信息塞满→ 模型注意力分散关键信息被挤出→ 结果是每个环节都做到 60 分没有一个做到 90 分问题二角色冲突写代码的人给自己的代码打分 → 天然倾向高分同一个 Agent 既生成代码又审查代码 → 自我审查等于没审查→ 研究发现自我审查发现缺陷的概率比独立审查低 60%问题三缺乏对抗验证单 Agent 的推理路径是线性的没有另一个视角来挑战它的假设→ 错误假设一直延续到执行结束才暴露→ 修正成本 全部重来问题四无法并行搜索代码 分析架构 研究方案明明可以并行单 Agent 只能串行执行→ 用户等待时间 所有步骤耗时之和因此更合理的方式是将不同领域能力拆分成多个专业 Agent再由一个协调 Agent 负责任务分发。这种模式称为Supervisor Agent主管 Agent模式。二、Supervisor Agent 架构整体架构如下用户 | 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实现举例说明/** * Supervisor 多 Agent 协同 Demo基于 langchain4j * p * 与 {link MultiAgentDemo} 的「手工流水线编排」不同这里采用 bSupervisor 模式/b * pre * ┌──────────────────┐ * 用户请求 ─────▶ │ Supervisor Agent │ 大模型自主规划调用顺序 * └────────┬─────────┘ * │ 通过 AgentTools 调用 * ┌─────────────┴──────────────┐ * ▼ ▼ * ┌────────────┐ ┌────────────┐ * │ 天气 Agent │ │ 穿衣 Agent │ * │(WeatherSkill) │ │ * └────────────┘ └────────────┘ * /pre * Supervisor 不写死调用流程而是把两个子 Agent 当作工具由 LLM 决定先查天气、再给穿搭建议。 */主代码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定义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定义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定义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} 方法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 。请给出穿衣打扮建议。); } }执行结果我在北京今天该怎么穿 【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领毛衣可拆卸围巾 - 北风干燥随身带 **护手霜润唇膏** 预防皴裂 - 午间阳光强但升温有限**切勿随意减外套** 今日虽冷但有晴光穿暖和点也能享受冬日明朗记得全副武装再出门哦~
返回列表