1. Java调用AI大模型的四种方式概览
作为Java开发者,想要在项目中集成AI大模型能力,现在有四种主流技术方案可选:SpringAI、LangChain4j、原生SDK和HTTP API。每种方式各有特点,适合不同场景:
- SpringAI:Spring官方推出的AI集成框架,与Spring生态无缝衔接,适合已有Spring项目快速接入
- LangChain4j:Java版的LangChain,提供更灵活的AI应用编排能力,适合复杂场景
- 原生SDK:各大模型厂商提供的Java SDK,直接调用最底层API
- HTTP API:最通用的调用方式,适合轻量级集成
我在实际项目中使用过这四种方式,发现它们各有优缺点。比如最近一个电商项目需要接入商品描述生成功能,开始用HTTP API快速验证效果,后期切换到SpringAI实现生产环境部署。下面我会结合具体代码,带你体验每种方式的实战要点。
2. 原生SDK接入实战
2.1 阿里云百炼SDK集成
以阿里云通义千问为例,首先需要在Maven中添加SDK依赖:
<dependency> <groupId>com.alibaba</groupId> <artifactId>dashscope-sdk-java</artifactId> <version>2.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(); HttpResponse<String> 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> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-alibaba-spring-boot-starter</artifactId> <version>1.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 Flux<String> 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> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-openai</artifactId> <version>0.28.0</version> </dependency>5.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(); EmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>(); // 加载文档 Document document = FileDocumentLoader.load("path/to/file.pdf"); TextSplitter splitter = new RecursiveCharacterTextSplitter(); List<TextSegment> segments = splitter.split(document); // 生成嵌入并存储 List<Embedding> embeddings = embeddingModel.embedAll(segments).content(); embeddingStore.addAll(embeddings, segments); // 创建检索器 Retriever<TextSegment> 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 | 快速验证或轻量级集成 | 低 | 高 |
| SpringAI | Spring项目,需要快速生产级集成 | 低 | 中 |
| LangChain4j | 复杂AI应用,需要灵活编排 | 高 | 高 |
对于大多数Java项目,我建议:
- 先用HTTP API快速验证想法
- 中小型项目使用SpringAI
- 复杂AI应用采用LangChain4j
- 只有在需要特定功能时才使用原生SDK
最近我在一个知识管理系统项目中,就采用了LangChain4j+RAG的方案,实现了基于私有文档的智能问答系统,效果非常不错。