LangChain4j Spring Boot 集成 —— 小白也能懂的通俗版
先搞懂为什么要集成 Spring BootSpring Boot 是 Java 生态的事实标准而 LangChain4j 原本是用代码手动构建各种组件ChatModel、AI Service、工具等。Spring Boot Starter 的作用就是让你不用写一行初始化代码靠配置文件 注解就能把整个 AI 管线跑起来。打个比方没有 Starter 时你要自己搭积木有了 Starter 就像乐高套装拆封直接拼好。⚡核心结论一句话加两个依赖、配几行application.properties、给接口标个AiService你的 AI 服务就变成了标准的 Spring Bean到处都能Autowired注入使用。 文章结构总览主题作用Spring Boot Starters通过配置自动创建 ChatModel、EmbeddingModel 等AiService 声明式 AI接口标注后自动注册为 Spring Bean自动组件注入ChatModel、Memory、Tools 自动装配显式组件注入多模型场景下精确指定用哪个 BeanFlux 流式响应返回FluxString实现 SSE 推送可观测性ChatModelListener自动监听请求/响应/异常测试官方提供的集成测试示例支持的版本Java 17 Spring Boot 3.2一、Spring Boot Starters —— 零代码初始化依赖命名规范langchain4j-{integration-name}-spring-boot-starter比如 OpenAIdependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j-open-ai-spring-boot-starter/artifactIdversion1.3.0-beta9/version/dependency配置文件搞定一切# application.properties langchain4j.open-ai.chat-model.api-key${OPENAI_API_KEY} langchain4j.open-ai.chat-model.model-namegpt-4o langchain4j.open-ai.chat-model.log-requeststrue langchain4j.open-ai.chat-model.log-responsestrue就这么几行OpenAiChatModel就已经在 Spring 容器里了。直接用RestControllerpublicclassChatController{privatefinalChatModelchatModel;publicChatController(ChatModelchatModel){this.chatModelchatModel;}GetMapping(/chat)publicStringmodel(RequestParam(valuemessage,defaultValueHello)Stringmessage){returnchatModel.chat(message);}}如果需要流式模型把配置里的chat-model改成streaming-chat-model就行。二、AiService —— 声明式 AI 服务最核心的功能 ✨引入额外依赖dependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j-spring-boot-starter/artifactIdversion1.3.0-beta9/version/dependency定义一个接口加上AiService注解AiServiceinterfaceAssistant{SystemMessage(You are a polite assistant)Stringchat(StringuserMessage);}它就是一个标准的 Spring Bean启动时 LangChain4j Starter 会自动扫描所有AiService接口生成实现类并注册到容器中。直接使用RestControllerclassAssistantController{AutowiredAssistantassistant;// ← 跟普通 Service 一样注入GetMapping(/chat)publicStringchat(Stringmessage){returnassistant.chat(message);}}三、自动组件注入 —— 不需要你手动组装如果 Spring 上下文里有以下组件它们会自动注入到 AI Service自动注入的组件说明ChatModel聊天模型StreamingChatModel流式聊天模型ChatMemory对话记忆ChatMemoryProvider记忆提供者ContentRetrieverRAG 内容检索器RetrievalAugmentorRAG 增强器带Tool注解的方法来自Component/Service类的工具方法举个例子ComponentpublicclassBookingTools{privatefinalBookingServicebookingService;publicBookingTools(BookingServicebookingService){this.bookingServicebookingService;}Tool(获取预订详情)publicBookinggetBookingDetails(StringbookingNumber,StringcustomerName){returnbookingService.getBookingDetails(bookingNumber,customerName);}Tool(取消预订)publicvoidcancelBooking(StringbookingNumber,StringcustomerName){bookingService.cancelBooking(bookingNumber,customerName);}}这些Tool方法会被自动发现并注册到你的AiService中完全不需要手动.tools(...)。四、显式组件注入 —— 多模型场景下的精确控制如果你有两个以上的 ChatModel比如同时接了 OpenAI 和 Ollama自动注入就不够了需要显式指定# OpenAI langchain4j.open-ai.chat-model.api-key${OPENAI_API_KEY} langchain4j.open-ai.chat-model.model-namegpt-4o-mini # Ollama langchain4j.ollama.chat-model.base-urlhttp://localhost:11434 langchain4j.ollama.chat-model.model-namellama3.1用wiringMode EXPLICIT来精确绑定AiService(wiringModeEXPLICIT,chatModelopenAiChatModel)interfaceOpenAiAssistant{SystemMessage(You are a polite assistant)Stringchat(StringuserMessage);}AiService(wiringModeEXPLICIT,chatModelollamaChatModel)interfaceOllamaAssistant{SystemMessage(You are a friendly assistant)Stringchat(StringuserMessage);}chatModel xxx的值是 Spring 容器中 Bean 的名称。五、监听 AI Service 注册事件你可以在运行时拿到所有已注册的 AI Service 及其工具信息ComponentclassAiServiceRegisteredEventListenerimplementsApplicationListenerAiServiceRegisteredEvent{OverridepublicvoidonApplicationEvent(AiServiceRegisteredEventevent){Class?aiServiceClassevent.aiServiceClass();ListToolSpecificationtoolSpecificationsevent.toolSpecifications();for(inti0;itoolSpecifications.size();i){System.out.printf([%s]: [Tool-%s]: %s%n,aiServiceClass.getSimpleName(),i1,toolSpecifications.get(i));}}}适合用来做动态工具目录注册、API 文档自动生成等场景。六、Flux —— 流式响应的优雅写法想让 AI Service 返回流式数据只需改返回类型为FluxStringAiServiceinterfaceAssistant{SystemMessage(You are a polite assistant)FluxStringchat(StringuserMessage);// ← 不再是 String而是 Flux}需要额外引入langchain4j-reactor模块。底层对接的是 Spring WebFlux / Project Reactor可以直接用于 SSEServer-Sent Events推送到前端。七、可观测性Observability—— 监控 AI 调用只要定义一个ChatModelListenerBean就会被自动注入到所有由 Starter 创建的模型中ConfigurationclassMyConfiguration{BeanChatModelListenerchatModelListener(){returnnewChatModelListener(){privatestaticfinalLoggerlogLoggerFactory.getLogger(MyConfiguration.class);OverridepublicvoidonRequest(ChatModelRequestContextrequestContext){log.info(请求: {},requestContext.chatRequest());}OverridepublicvoidonResponse(ChatModelResponseContextresponseContext){log.info(响应: {},responseContext.chatResponse());}OverridepublicvoidonError(ChatModelErrorContexterrorContext){log.error(错误: {},errorContext.error().getMessage());}};}}三个回调覆盖全生命周期onRequest→onResponse/onError。可以方便地接入 Zipkin、Prometheus、ELK 等监控系统。八、支持的版本要求版本Java17Spring Boot3.2九、测试官方提供了完整的集成测试示例低层 API 示例ChatModel Controller高层 API 示例AI Service Controller客户支持 Agent 集成测试CustomerSupportAgentIT 面试高频追问Q1AiService和普通Service有什么区别答Service只是一个标记里面的逻辑是你自己写的AiService是一个元数据处理注解Spring 启动时 LangChain4j 会扫描它并为接口生成代理实现——自动装配 ChatModel、Tools、Memory 等组件。本质上它是一个智能工厂。Q2什么时候需要用显式注入而不是自动注入答当你只有一个 ChatModel 时自动注入就够了。当有多个同类型的 Bean比如多个不同厂商的 LLM时就需要用wiringMode EXPLICIT精确指定每个 AI Service 用哪个模型。Q3Spring Boot Starter 是怎么发现Tool方法的答它会扫描所有Component或Service标注的类找到里面被Tool注解的方法把它们注册到每个 AI Service 的工具列表中。这就是为什么你不需要手动.tools(...)。Q4ChatModelListener 能做什么实际用途答三大场景① 日志审计——记录每次 AI 调用的输入输出② 性能监控——统计耗时、token 用量③ 告警通知——出错时触发钉钉/企业微信/Slack 提醒。Q5Starter 不支持哪些场景答如果你的项目不是 Spring Boot比如纯 Servlet 项目、Quarkus、Micronaut就不能用这个 Starter。不过 LangChain4j 有对应的 Quarkus/Micronaut/Helidon 集成方案。纯 Java 项目也可以用原始的AiServices.builder()手动构建。✅ 总结Spring Boot Starter 让 LangChain4j 真正融入企业级 Java 开发两个依赖搞定一切langchain4j-*-spring-boot-starterlangchain4j-spring-boot-starter配置文件驱动application.properties里写好 apiKey 和 model name无需写初始化代码AiService注解接口即服务启动时自动生成实现类注册为 Spring Bean自动装配ChatModel、Memory、Tools 全部自动注入零样板代码显式注入多模型场景下精确指定每个 AI Service 用哪个后端Flux 流式改个返回类型就支持 SSE 推送ChatModelListener一个 Bean 监听所有模型的请求/响应/异常注册事件监听运行时获取 AI Service 及工具清单适合做 API 文档