以下是使用 原始 HTTP 客户端(如 Apache HttpClient 或 OkHttp)、Spring AI 和 LangChain4j 开发 AI 应用的主要差异,包括功能特性、开发效率、可扩展性等方面,并附有完整的代码示例和详细注释。
一、技术选型对比概览
特性 | 原始 HttpClient/OkHttp | Spring AI | LangChain4j |
---|---|---|---|
抽象层级 | 低(直接调用 API) | 中高(封装模型调用逻辑) | 高(提供链式结构与提示工程支持) |
模型适配能力 | 手动处理请求/响应 | 支持 OpenAI、Anthropic 等主流模型 | 支持 LLM、Chat Model、Embedding 等多种模型 |
提示工程支持 | 无 | 基础支持(Prompt, PromptTemplate) | 强大(PromptTemplate, Chain, Memory, Tool) |
工具集成 | 需手动集成 | 可通过 Spring Boot 自动配置 | 支持自定义工具(Tool) |
内存管理 | 无 | 可通过 ChatMemory 实现上下文保持 | 支持 ChatMemory |
可维护性 | 较低(需手动处理错误、序列化等) | 高(依赖注入 + 统一接口) | 高(模块化设计 + 可插拔组件) |
学习曲线 | 低(适合熟悉 REST 调用的开发者) | 中 | 高(涉及 AI 编排概念) |
社区生态 | 成熟通用 HTTP 客户端 | Spring 生态整合良好 | Java 领域专用 AI 框架 |
二、完整代码示例
1. 使用原始 OkHttp 调用 OpenAI ChatGPT 接口
import okhttp3.*;
import java.io.IOException;
public class RawHttpClientExample {
// 替换为你的 OpenAI API Key
private static final String API_KEY = "your_openai_api_key";
private static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
// 构建请求体 JSON
String jsonBody = "{\n" +
" \"model\": \"gpt-3.5-turbo\",\n" +
" \"messages\": [\n" +
" {\"role\": \"user\", \"content\": \"你好,请介绍一下你自己\"}\n" +
" ]\n" +
"}";
RequestBody body = RequestBody.create(jsonBody, JSON);
// 构建请求
Request request = new Request.Builder()
.url("https://api.openai.com/v1/chat/completions")
.post(body)
.addHeader("Authorization", "Bearer " + API_KEY)
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
System.out.println(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}
⚠️ 注意事项:
- 需要手动处理 JSON 序列化与反序列化。
- 错误处理、重试机制等都需要自己实现。
- 不具备提示模板、记忆等功能。
2. 使用 Spring AI 调用 OpenAI
Maven 依赖:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>0.8.0</version>
</dependency>
示例代码:
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
public class SpringAiService {
@Value("${spring.ai.openai.api-key}")
private String apiKey;
private final ChatClient chatClient;
public SpringAiService(ChatClient chatClient) {
this.chatClient = chatClient;
}
public String askQuestion(String question) {
return chatClient
.prompt()
.user(userSpec -> userSpec.text(question))
.call()
.content();
}
}
application.yml
配置:
spring:
ai:
openai:
api-key: your_openai_api_key
model: gpt-3.5-turbo
✅ 优势:
- 自动封装了模型调用逻辑。
- 支持提示模板、记忆、流式输出等高级功能。
- 易于集成到 Spring Boot 应用中。
3. 使用 LangChain4j 调用 OpenAI
Maven 依赖:
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
<version>0.24.0</version>
</dependency>
示例代码:
import dev.langchain4j.chain.ConversationalRetrievalChain;
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.memory.ChatMemory;
import dev.langchain4j.memory.InMemoryChatMemory;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.retriever.EmbeddingStoreRetriever;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
public class LangChain4jExample {
public static void main(String[] args) {
// 创建聊天模型
OpenAiChatModel chatModel = OpenAiChatModel.withApiKey("your_openai_api_key");
// 创建记忆存储
ChatMemory chatMemory = InMemoryChatMemory.withMaxMessages(10);
// 创建 Embedding Store(用于检索)
EmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();
EmbeddingModel embeddingModel = dev.langchain4j.model.openai.OpenAiEmbeddingModel.withApiKey("your_openai_api_key");
// 构建检索器
EmbeddingStoreRetriever retriever = EmbeddingStoreRetriever.from(embeddingStore, embeddingModel);
// 构建问答链
ConversationalRetrievalChain chain = ConversationalRetrievalChain.builder()
.chatLanguageModel(chatModel)
.retriever(retriever)
.chatMemory(chatMemory)
.build();
// 添加文档内容(模拟知识库)
Document document = Document.from("Java 是一种广泛使用的编程语言,由 Sun Microsystems 在 1995 年发布。");
embeddingStore.add(embeddingModel.embed(document.content()).content());
// 进行问答
String answer = chain.invoke("Java 是什么?");
System.out.println(answer);
}
}
✅ 优势:
- 支持记忆、检索、工具调用等复杂流程。
- 支持链式结构,便于构建复杂的 AI Agent。
- 提供模块化的组件,易于扩展。
三、总结表格
功能点 | 原始 HttpClient/OkHttp | Spring AI | LangChain4j |
---|---|---|---|
请求控制 | 完全可控 | 封装好 | 封装好 |
提示工程 | 无 | 支持 | 强大 |
记忆管理 | 无 | 支持 | 支持 |
工具调用 | 无 | 有限支持 | 支持 |
模型抽象 | 无 | 支持多模型 | 支持多模型 |
开发难度 | 低 | 中 | 高 |
可维护性 | 低 | 高 | 高 |
推荐场景 | 快速调试、轻量级应用 | Spring Boot 项目 | 复杂 AI Agent、LLM 编排 |
四、结论建议
- 原始 HTTP 客户端:适合快速验证或轻量级项目,但不推荐用于生产级 AI 应用。
- Spring AI:适合已有 Spring Boot 项目,希望快速接入 AI 模型并具备基本编排能力。
- LangChain4j:适合需要复杂编排、记忆、工具调用的 AI 应用,如智能客服、Agent、RAG 系统等。
如果你正在开发一个长期维护的 AI 应用,推荐使用 LangChain4j 或 Spring AI 来提升开发效率和系统可维护性。