核心接口使用(五)Agent

📅 发布时间:2026/7/3 17:04:29 👁️ 浏览次数:
核心接口使用(五)Agent
一、介绍1、简介LangChain4j 的 Agent LLM ToolsAgentExecutor 带循环的执行器负责协调「模型调用 → 工具调用 → 再判断是否结束」。AgentExecutor Agent(LLM Tools) Memory(optional)实际上在 LangChain4j 中Agent 主要通过 AiServices 实现而不是传统的 Agent/AgentExecutor 模式。我理解agent 加了指定提示词的tool。二、demo在前面代码的基础上新增agentGenerate接口/** * 6、agent */ PostMapping(/agentGenerate) public ResponseEntity? agentGenerate(Valid RequestBody ChatRequestDTO request) { try { request.setProvider(siliconflow); request.setModelName(Qwen/Qwen2.5-72B-Instruct); ChatResponseDTO response gatewayService.route(request.getProvider(), request.getModelName()).agentGenerate(request); return ResponseEntity.ok(response); } catch (Exception e) { log.error(Invalid request: {}, e); } return null; }实现Override public ChatResponseDTO agentGenerate(ChatRequestDTO request) { String sessionId request.getSessionId() ! null ? request.getSessionId() : default; if (Boolean.TRUE.equals(request.getClearHistory())) { memoryService.clearMemory(sessionId); } ChatMemory memory memoryService.getOrCreateMemory(sessionId); ChatLanguageModel chatModel OpenAiChatModel.builder() .apiKey(apiKey) .baseUrl(baseUrl) .modelName(request.getModelName()) .timeout(Duration.ofSeconds(60)) .build(); SmartAgent agent AiServices.builder(SmartAgent.class) .chatLanguageModel(chatModel) .tools(searchEmployeeTool, searchLinkTool) .chatMemory(memory) .build(); String response agent.chat(request.getMessage()); return ChatResponseDTO.builder() .content(response) .build(); }自定义的SmartAgent 接口package com.demo.ai.tools; import dev.langchain4j.service.SystemMessage; import dev.langchain4j.service.UserMessage; public interface SmartAgent { SystemMessage(你是一个智能助手可以帮助用户查找员工信息和文档链接。) UserMessage({{it}}) String chat(String userMessage); }和tools的对比这和前面的LangChain4j框架三核心接口使用4调用MCP-CSDN博客第一个demo有什么区别呢1写法区别Assistant 接口只有 UserMessageSmartAgent 接口有 SystemMessage UserMessage多了提示词2执行区别真正的区别应该是自动工具调用 vs 手动工具调用特性AiServices Tools (Agent模式)手动调用工具工具调用决策LLM 自动决定开发者手动决定工具调用循环自动处理可能多轮需要手动实现结果整合自动整合到回复需要手动整合代码复杂度简单一行调用复杂多步处理灵活性较低框架控制较高完全控制适用场景通用对话、多步骤任务需要精确控制的场景使用 AiServices Tools自动工具调用Agent 模式手动直接调用工具非 Agent 模式// LLM 自动决定是否调用工具自动处理工具调用循环 Assistant assistant AiServices.builder(Assistant.class) .chatLanguageModel(chatModel) .tools(searchEmployeeTool, searchLinkTool) // 工具注册给 LLM .chatMemory(memory) .build(); String response assistant.chat(查找张三的员工ID); // LLM 内部流程 // 1. 分析用户请求 // 2. 决定调用 searchEmployee(张三) // 3. 执行工具 // 4. 根据工具结果生成最终回复// 手动决定调用哪个工具手动处理结果 ChatLanguageModel chatModel OpenAiChatModel.builder()...build(); ChatMemory memory memoryService.getOrCreateMemory(sessionId); // 1. 先让 LLM 分析用户意图不提供工具 memory.add(UserMessage.from(查找张三的员工ID)); ResponseAiMessage analysis chatModel.generate(memory.messages()); // 2. 根据 LLM 分析结果手动决定调用工具 String employeeId searchEmployeeTool.searchEmployee(张三); // 3. 手动将工具结果添加到对话中 memory.add(new ToolExecutionResultMessage(employeeId)); // 4. 再次调用 LLM 生成最终回复 ResponseAiMessage finalResponse chatModel.generate(memory.messages());LLM 自主决定是否调用工具自动处理工具调用循环可能需要多轮自动整合工具结果到最终回复支持多步骤任务需要手动判断何时调用工具需要手动管理工具调用流程需要手动整合结果代码更复杂但控制更精确测试看下多了 SystemMessage的agent和没有SystemMessage的单纯tool区别在哪里。为了防止记忆干扰两个请求使用不同的session。1search name① agent可以命中tool② tool需要更精确的提示词才行2seach link① agent② tool需要更精确的提示词3搜索其他① agent换个问法跳出tool② tool多个agent改下代码创建两个agentpackage com.demo.ai.tools; import dev.langchain4j.service.SystemMessage; import dev.langchain4j.service.UserMessage; public interface EmployeeAgent { SystemMessage(你是一个智能助手可以根据用户输入的员工名称帮助用户查找员工的id是多少。) UserMessage({{it}}) String chat(String userMessage); }package com.demo.ai.tools; import dev.langchain4j.service.SystemMessage; import dev.langchain4j.service.UserMessage; public interface LinkAgent { SystemMessage(你是一个智能助手可以根据用户输入的文档名称帮助用户查找文档链接是多少。) UserMessage({{it}}) String chat(String userMessage); }调用修改/*SmartAgent agent AiServices.builder(SmartAgent.class) .chatLanguageModel(chatModel) .tools(searchEmployeeTool, searchLinkTool) .chatMemory(memory) .build();*/ String response null; if(EmployeeTool.equals(request.getAgentName())){ EmployeeAgent agent AiServices.builder(EmployeeAgent.class) .chatLanguageModel(chatModel) .tools(searchEmployeeTool) .chatMemory(memory) .build(); response agent.chat(request.getMessage()); }else if(LinkTool.equals(request.getAgentName())){ LinkAgent agent AiServices.builder(LinkAgent.class) .chatLanguageModel(chatModel) .tools(searchLinkTool) .chatMemory(memory) .build(); response agent.chat(request.getMessage()); }再次测试多agent新开一个session会话1search name tool2search link tool查不到查到了