
用Langchain4j构建具备工具调用能力的Java智能体在当今AI技术快速发展的背景下大语言模型(LLM)已不再局限于简单的问答功能。通过Langchain4j框架Java开发者可以轻松构建能够理解复杂指令并执行具体操作的智能体(AI Agent)。本文将深入探讨如何利用Langchain4j的AiService注解和Function Calling功能为Java应用赋予大脑和手脚。1. Langchain4j与智能体架构设计Langchain4j是一个专为Java/Kotlin开发者设计的轻量级开源库它借鉴了Python生态中LangChain框架的设计理念但提供了更符合Java习惯的API。其核心价值在于简化大语言模型(如OpenAI、Anthropic、阿里云Qwen等)与Java应用的集成过程。智能体的核心架构包含三个关键组件认知层由大语言模型构成负责理解自然语言和推理决策记忆层管理对话历史和上下文信息工具层提供具体功能实现如数据库查询、API调用等// 智能体基础架构示例 public interface TravelAssistant { SystemMessage(你是一个专业的旅行助手) String planTrip(UserMessage String request); }2. 工具定义与Function Calling实现Function Calling(工具调用)是智能体的核心能力之一它允许LLM在适当的时候调用预定义的工具函数。以下是实现步骤2.1 定义工具接口首先创建一个包含工具方法的类并使用Tool注解标记Component public class TravelTools { Tool(name 酒店查询, value 根据城市和日期查询可用酒店) public ListHotel searchHotels( P(城市) String city, P(入住日期) LocalDate checkInDate, P(离店日期) LocalDate checkOutDate ) { // 实际调用酒店API的逻辑 return hotelService.search(city, checkInDate, checkOutDate); } Tool(name 天气查询) public WeatherInfo getWeather(P(城市) String city) { return weatherService.getByCity(city); } }2.2 配置智能体服务通过AiService注解将工具集成到智能体中AiService( chatModel qwenChatModel, tools travelTools ) public interface TravelAssistant { String chat(MemoryId String sessionId, UserMessage String message); }2.3 工具调用流程当用户询问北京下周天气如何时系统会LLM识别需要调用天气查询工具自动提取城市参数(北京)和时间参数(下周)执行getWeather工具方法将结果返回给LLM生成自然语言回复3. 对话记忆与上下文管理有效的对话记忆管理是构建连贯智能体的关键。Langchain4j提供了多种记忆存储方案存储类型特点适用场景内存存储简单高效开发测试、短期会话Redis存储分布式支持生产环境、多实例部署MongoDB存储结构化存储需要长期保留的对话历史// MongoDB记忆存储配置示例 Configuration public class MemoryConfig { Bean ChatMemoryStore mongoChatMemoryStore(MongoTemplate mongoTemplate) { return new MongoChatMemoryStore(mongoTemplate); } Bean ChatMemoryProvider chatMemoryProvider(ChatMemoryStore store) { return memoryId - MessageWindowChatMemory.builder() .id(memoryId) .maxMessages(20) .chatMemoryStore(store) .build(); } }4. 生产环境部署与优化将智能体投入生产环境需要考虑以下关键因素4.1 性能优化策略批量处理对多个工具调用进行并行处理缓存机制缓存常用工具调用结果超时控制设置合理的工具调用超时时间// 带超时控制的工具调用示例 Tool(name 航班查询) public ListFlight searchFlights(P(出发地) String from, P(目的地) String to, P(日期) LocalDate date) { return TimeLimiter.decorateFutureSupplier( Executors.newSingleThreadExecutor(), () - CompletableFuture.supplyAsync( () - flightService.search(from, to, date) ) ).get(5, TimeUnit.SECONDS); }4.2 安全与权限控制实现工具调用的权限验证public class SecurityAspect { Around(annotation(tool) args(..,sessionId)) public Object checkPermission(ProceedingJoinPoint pjp, Tool tool, String sessionId) { if(!permissionService.checkToolAccess(sessionId, tool.name())) { throw new SecurityException(无权限使用此功能); } return pjp.proceed(); } }4.3 监控与日志记录工具调用的关键指标Aspect Component public class MonitoringAspect { Around(annotation(dev.langchain4j.agent.tool.Tool)) public Object monitorToolUsage(ProceedingJoinPoint pjp) { long start System.currentTimeMillis(); String toolName ((MethodSignature)pjp.getSignature()).getMethod() .getAnnotation(Tool.class).name(); try { Object result pjp.proceed(); metrics.recordSuccess(toolName, System.currentTimeMillis()-start); return result; } catch (Exception e) { metrics.recordFailure(toolName); throw e; } } }5. 典型应用场景案例5.1 电商客服智能体AiService(tools {orderTool, productTool, refundTool}) public interface CustomerServiceAgent { String handleInquiry(MemoryId String customerId, UserMessage String message); }功能工具示例订单状态查询产品推荐退货流程启动5.2 数据分析智能体AiService(tools {queryTool, visualizationTool}) public interface DataAnalysisAgent { String analyze(UserMessage String request, V(dataSource) String dataSource); }工具能力执行SQL查询生成图表可视化数据透视分析5.3 IT运维智能体AiService(tools {monitoringTool, deploymentTool, ticketTool}) public interface DevOpsAgent { String handleRequest(MemoryId String userId, UserMessage String request); }运维功能服务器状态检查应用部署工单管理在实际项目中我们构建了一个内部IT支持智能体集成了12个工具接口。通过6个月的运行数据统计平均处理时间从人工处理的15分钟降低到45秒准确率达到92%显著提升了IT支持效率。