Java开发者必看:四种高效调用AI大模型的实战指南(SpringAI+LangChain4j+SDK+HTTP)
1. Java调用AI大模型的四种方式概览作为Java开发者想要在项目中集成AI大模型能力现在有四种主流技术方案可选SpringAI、LangChain4j、原生SDK和HTTP API。每种方式各有特点适合不同场景SpringAISpring官方推出的AI集成框架与Spring生态无缝衔接适合已有Spring项目快速接入LangChain4jJava版的LangChain提供更灵活的AI应用编排能力适合复杂场景原生SDK各大模型厂商提供的Java SDK直接调用最底层APIHTTP API最通用的调用方式适合轻量级集成我在实际项目中使用过这四种方式发现它们各有优缺点。比如最近一个电商项目需要接入商品描述生成功能开始用HTTP API快速验证效果后期切换到SpringAI实现生产环境部署。下面我会结合具体代码带你体验每种方式的实战要点。2. 原生SDK接入实战2.1 阿里云百炼SDK集成以阿里云通义千问为例首先需要在Maven中添加SDK依赖dependency groupIdcom.alibaba/groupId artifactIddashscope-sdk-java/artifactId version2.21.10/version /dependency获取API Key后可以这样调用大模型public class QwenSDKDemo { public static void main(String[] args) { Generation gen new Generation(); Message systemMsg Message.builder() .role(Role.SYSTEM) .content(你是一个专业的Java技术顾问) .build(); Message userMsg Message.builder() .role(Role.USER) .content(如何优化Java中的HashMap性能) .build(); GenerationParam param GenerationParam.builder() .apiKey(your-api-key) .model(qwen-plus) .messages(Arrays.asList(systemMsg, userMsg)) .build(); GenerationResult result gen.call(param); System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent()); } }踩坑提醒SDK版本更新较快建议定期检查Maven仓库中的最新版本。我在项目中曾因使用旧版本导致某些新功能不可用。2.2 SDK方式的优缺点优点官方维护功能最全类型安全有完整的JavaDoc支持通常包含重试机制等生产级特性缺点绑定特定厂商切换成本高版本更新可能导致兼容性问题3. HTTP API直接调用3.1 使用HttpClient调用对于没有官方SDK的模型可以直接调用HTTP API。以下是使用Java 11的HttpClient示例public class HttpAIDemo { public static void main(String[] args) throws Exception { String apiKey your-api-key; String endpoint https://api.example.com/v1/chat/completions; String requestBody { model: qwen-plus, messages: [ {role: system, content: 你是一个代码助手}, {role: user, content: 用Java实现快速排序} ] } ; HttpClient client HttpClient.newHttpClient(); HttpRequest request HttpRequest.newBuilder() .uri(URI.create(endpoint)) .header(Authorization, Bearer apiKey) .header(Content-Type, application/json) .POST(HttpRequest.BodyPublishers.ofString(requestBody)) .build(); HttpResponseString response client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body()); } }3.2 使用第三方库简化对于更复杂的场景可以使用OkHttp或Apache HttpClient// 使用OkHttp示例 OkHttpClient client new OkHttpClient(); MediaType mediaType MediaType.parse(application/json); RequestBody body RequestBody.create(mediaType, requestBody); Request request new Request.Builder() .url(endpoint) .post(body) .addHeader(Authorization, Bearer apiKey) .build(); try (Response response client.newCall(request).execute()) { System.out.println(response.body().string()); }性能提示在生产环境中记得复用HttpClient实例而不是每次创建新实例这样可以显著提升性能。4. SpringAI集成方案4.1 快速入门配置SpringAI是目前最便捷的Java集成方案。首先添加依赖dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-alibaba-spring-boot-starter/artifactId version1.0.0/version /dependency然后在application.yml中配置spring: ai: alibaba: chat: api-key: your-api-key model: qwen-plus4.2 基础使用示例注入ChatClient即可使用RestController public class AIController { private final ChatClient chatClient; public AIController(ChatClient chatClient) { this.chatClient chatClient; } GetMapping(/ask) public String ask(RequestParam String question) { return chatClient.call(question); } }4.3 高级功能实现SpringAI支持流式响应和函数调用GetMapping(value /stream, produces MediaType.TEXT_EVENT_STREAM_VALUE) public FluxString stream(RequestParam String message) { return chatClient.stream(message); } // 函数调用示例 Bean public FunctionCallback weatherFunction() { return FunctionCallback.builder() .withName(getWeather) .withDescription(获取指定城市的天气) .withResponseConverter((response) - response) .withFunction((city) - weatherService.getWeather(city)) .build(); }实战经验在电商项目中我们使用函数调用实现了一个智能客服系统当用户询问北京天气如何时会自动调用天气查询函数。5. LangChain4j深度集成5.1 基础配置LangChain4j提供了更灵活的AI应用编排能力。首先添加依赖dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-openai/artifactId version0.28.0/version /dependency5.2 创建AI服务定义接口并实现AI服务interface Assistant { String chat(String message); } Assistant assistant AiServices.create(Assistant.class, model); String answer assistant.chat(Java中的volatile关键字有什么用);5.3 实现RAG应用LangChain4j特别适合实现检索增强生成(RAG)应用EmbeddingModel embeddingModel new AllMiniLmL6V2EmbeddingModel(); EmbeddingStoreTextSegment embeddingStore new InMemoryEmbeddingStore(); // 加载文档 Document document FileDocumentLoader.load(path/to/file.pdf); TextSplitter splitter new RecursiveCharacterTextSplitter(); ListTextSegment segments splitter.split(document); // 生成嵌入并存储 ListEmbedding embeddings embeddingModel.embedAll(segments).content(); embeddingStore.addAll(embeddings, segments); // 创建检索器 RetrieverTextSegment retriever embeddingStore.asRetriever(); ContentRetriever contentRetriever DefaultContentRetriever.builder() .retriever(retriever) .build(); Assistant assistant AiServices.builder(Assistant.class) .chatLanguageModel(model) .contentRetriever(contentRetriever) .build();性能优化对于大量文档建议使用持久化向量数据库如Milvus或Pinecone替代内存存储。6. 技术选型建议根据项目需求选择合适的技术方案方案适合场景学习曲线灵活性原生SDK需要深度使用特定模型功能中等低HTTP API快速验证或轻量级集成低高SpringAISpring项目需要快速生产级集成低中LangChain4j复杂AI应用需要灵活编排高高对于大多数Java项目我建议先用HTTP API快速验证想法中小型项目使用SpringAI复杂AI应用采用LangChain4j只有在需要特定功能时才使用原生SDK最近我在一个知识管理系统项目中就采用了LangChain4jRAG的方案实现了基于私有文档的智能问答系统效果非常不错。