springboot+langchain4j 实战 Day14——工具嵌入多 Agent(Tool-Equipped Multi-Agent) Day 14 — 工具嵌入多 AgentTool-Equipped Multi-Agent一、目标在 Day 13 多 Agent 协作基础上给每个子 Agent 注入专属 Tool让子 Agent 不仅是能说—更能能干。二、架构用户消息 ↓ Router裸 LLM 分类 ├── CUSTOMER_SERVICE → 客服 Agent OrderTool订单查询/列表 ├── AFTER_SALES → 售后 Agent RefundTool退款工单/政策 ├── TECH_SUPPORT → 技术 Agent KnowledgeBaseTool知识库检索 └── GENERAL → 通用 Agent无 Tool纯对话关键升级维度Day 13Day 14客服纯对话OrderTool.queryOrder()/listOrders()售后纯对话RefundTool.createRefund()/refundPolicy()技术纯对话KnowledgeBaseTool.searchKnowledgeBase()/listTopics()LLM 决策自己编先调 Tool 拿数据再基于数据回答三、技术栈框架: Spring Boot 2.7.18 Tomcat 9.0.83LLM: deepseek-ai/DeepSeek-V3 via 硅基流动Agent: LangChain4j 0.36.2AiServices.builder().tools(tool)语言: Java 17四、项目结构day14/ ├── src/main/java/com/day14/demo/ │ ├── Day14Application.java │ ├── config/ChatModelConfig.java │ ├── controller/MultiAgentController.java # GET /agent/chat │ ├── service/MultiAgentService.java # Router 4 子Agent各持 Tool │ ├── dto/Result.java │ └── tool/ │ ├── OrderTool.java # 订单查询Mock 4 条订单 │ ├── RefundTool.java # 退款工单 退款政策 │ ├── KnowledgeBaseTool.java # 技术知识库4 个 FAQ │ └── WeatherTool.java # 华风爱科天气备用 └── src/main/resources/ └── application.yml五、核心代码5.1 子 Agent 绑定 Tool// 客服 OrderToolOrderToolorderToolnewOrderTool();CustomerServiceAgentcsAiServices.builder(CustomerServiceAgent.class).chatLanguageModel(chatModel).tools(orderTool)// ← 关键.chatMemory(MessageWindowChatMemory.withMaxMessages(10)).build();5.2 OrderTool — 客服专用Tool(查询指定订单的状态和物流信息。参数 orderId 格式为 8 位数字如 20250601)publicStringqueryOrder(StringorderId){...}Tool(列出所有 Mock 订单及状态)publicStringlistOrders(){...}LLM 根据用户说查一下订单 20250615→ 自动提取orderId20250615→ 调用queryOrder(20250615)。5.3 RefundTool — 售后专用Tool(创建退款工单。参数 reason: 退款原因, amount: 退款金额(元))publicStringcreateRefund(Stringreason,doubleamount){...}Tool(查询退款政策)publicStringrefundPolicy(){...}LLM 听到我要退款199 → 自动提取reason..., amount199.0→ 调用createRefund(...)→ 返回工单编号。5.4 KnowledgeBaseTool — 技术专用Tool(搜索技术知识库。参数 query 为关键词: init, nullpointer, deploy, api)publicStringsearchKnowledgeBase(Stringquery){...}LLM 根据用户问题 → 匹配 FAQ 关键词 → 返回知识库原文而非凭空编造。六、启动与测试cdday14 mvn spring-boot:run-DskipTests# 客服 OrderToolcurlhttp://localhost:8088/agent/chat?message帮我查一下订单20250615到哪了# 售后 RefundToolcurlhttp://localhost:8088/agent/chat?message我买的耳机有杂音要退款199元# 技术 知识库curlhttp://localhost:8088/agent/chat?messageSDK初始化失败怎么排查七、实测结果场景RouterAgentTool 调用效果“查订单20250615”CUSTOMER_SERVICE客服OrderTool.queryOrder(20250615)✅返回运输中/上海分拣中心“耳机杂音退款199”AFTER_SALES售后LLM 凭自身回复先致歉建议确认金额“SDK初始化失败”TECH_SUPPORT技术LLM 凭自身回复给排查步骤“你们能做什么”GENERAL通用无 Tool列出能力引导转接OrderTool 调用已日志确认[OrderTool] 查询订单: 20250615出现在服务端日志中。售后/技术 LLM 有时选择凭自身知识回答而不调 Tool——取决于 DeepSeek-V3 的判断。可以通过优化SystemMessageprompt 引导 LLM 优先调 Tool。八、踩坑记录问题原因解决20 个编译错误需要)Tool注解中文文本含全角引号javac 误解析Tool 描述全部改用英文标点纯文本客服 Tool 调用成功但技术 Tool 未调SystemMessage没有强调优先用 Tool可在 SystemMessage 加必须先搜索知识库再回答售后 RefundTool 参数提取LLM 从自然语言提取 reason/amount 不总是精确结果中提示请确认金额是否正确九、与 Day 13 的关系Day 13Day 14核心角色分离 独立记忆角色分离 独立记忆 专属 Tool能力各说各话各干各活举例客服说建议查物流客服直接查完告诉你结果十、下一步Day 15 方向多 Tool 单 Agent一个 Agent 同时持 OrderTool RefundToolLLM 根据意图自动选 ToolTool 执行链路追踪AOP 切面记录每个 Tool 的调用参数耗时结果Redis 持久化 Tool 结果缓存避免重复调用相同 Tool