1. 为什么Java开发者需要关注大模型技术?
最近两年,大模型技术席卷全球,但绝大多数教程和工具链都围绕Python生态展开。作为一名深耕Java领域多年的开发者,我深刻理解同行们的焦虑——难道为了跟上AI浪潮就必须转投Python阵营吗?答案是否定的。Spring AI和LangChain4j这两个项目的出现,彻底改变了Java开发者在大模型领域的被动局面。
Spring AI是Spring官方推出的AI集成框架,它让Java开发者能够以熟悉的Spring方式接入各类大模型服务。而LangChain4j则是Java版的LangChain实现,将Python生态中成熟的AI应用模式带到了Java世界。这两个项目的组合,为Java开发者提供了完整的AI能力栈。
提示:如果你已经熟悉Spring生态,那么使用Spring AI将会非常自然,它延续了Spring一贯的约定优于配置理念。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础配置
2.1 开发环境要求
在开始之前,确保你的开发环境满足以下要求:
- JDK 17或更高版本(大模型相关库通常需要较新的Java特性)
- Maven 3.6+或Gradle 7.x
- IDE推荐IntelliJ IDEA(对大模型相关代码有更好的支持)
- 可选的本地模型运行环境(如Ollama,用于本地测试)
2.2 项目依赖配置
对于Maven项目,需要在pom.xml中添加以下依赖:
xml复制<!-- Spring AI核心依赖 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-core</artifactId>
<version>0.8.1</version>
</dependency>
<!-- LangChain4j核心依赖 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>0.25.0</version>
</dependency>
<!-- 可选:OpenAI适配器 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai</artifactId>
<version>0.8.1</version>
</dependency>
对于Gradle项目,在build.gradle中添加:
groovy复制dependencies {
implementation 'org.springframework.ai:spring-ai-core:0.8.1'
implementation 'dev.langchain4j:langchain4j:0.25.0'
// 可选
implementation 'org.springframework.ai:spring-ai-openai:0.8.1'
}
2.3 基础配置示例
在application.properties或application.yml中配置大模型访问凭据:
properties复制# OpenAI配置示例
spring.ai.openai.api-key=your-api-key-here
spring.ai.openai.model=gpt-3.5-turbo
# 本地Ollama配置示例
spring.ai.ollama.base-url=http://localhost:11434
spring.ai.ollama.model=llama2
3. Spring AI核心功能解析
3.1 基础聊天功能实现
Spring AI提供了极简的API来实现与大模型的对话。以下是一个完整的聊天服务示例:
java复制@Service
public class ChatService {
private final ChatClient chatClient;
@Autowired
public ChatService(ChatClient chatClient) {
this.chatClient = chatClient;
}
public String chat(String message) {
return chatClient.call(message);
}
}
使用这个服务时,Spring会根据你的配置自动注入合适的ChatClient实现(如OpenAIChatClient或OllamaChatClient)。
3.2 提示词工程实践
高质量的提示词(Prompt)是获得理想输出的关键。Spring AI提供了PromptTemplate来管理复杂的提示词:
java复制PromptTemplate promptTemplate = new PromptTemplate("""
你是一位资深的{role}专家,请用{style}风格回答以下问题:
{question}
""");
Map<String, Object> variables = Map.of(
"role", "Java开发",
"style", "幽默风趣",
"question", "如何理解Spring的IoC容器?"
);
Prompt prompt = promptTemplate.create(variables);
String response = chatClient.call(prompt.getContents());
3.3 流式响应处理
对于需要长时间生成的响应,流式处理可以显著改善用户体验:
java复制@GetMapping("/stream-chat")
public SseEmitter streamChat(@RequestParam String message) {
SseEmitter emitter = new SseEmitter();
chatClient.stream(message)
.subscribe(
chunk -> {
try {
emitter.send(chunk.getContent());
} catch (IOException e) {
throw new RuntimeException(e);
}
},
emitter::completeWithError,
emitter::complete
);
return emitter;
}
4. LangChain4j高级应用
4.1 构建AI代理(Agent)
LangChain4j允许你创建复杂的AI代理,这些代理可以自主决定调用哪些工具:
java复制Agent agent = Agent.builder()
.tools(new Calculator(), new WeatherService())
.chatLanguageModel(OpenAiChatModel.withApiKey("your-key"))
.build();
String response = agent.execute("北京现在的温度是多少?如果是摄氏20度,请计算华氏温度是多少?");
4.2 实现RAG(检索增强生成)
RAG是大模型应用中的重要模式,结合了检索和生成能力:
java复制EmbeddingModel embeddingModel = new OpenAiEmbeddingModel("your-key");
EmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();
// 加载文档
TextSegment segment1 = TextSegment.from("Spring AI支持多种大模型");
TextSegment segment2 = TextSegment.from("LangChain4j提供了Java版的LangChain实现");
Embedding embedding1 = embeddingModel.embed(segment1.text()).content();
Embedding embedding2 = embeddingModel.embed(segment2.text()).content();
embeddingStore.add(embedding1, segment1);
embeddingStore.add(embedding2, segment2);
// 构建RAG链
Retriever<TextSegment> retriever = embeddingStore.asRetriever();
ChatLanguageModel chatModel = OpenAiChatModel.withApiKey("your-key");
ConversationalRetrievalChain chain = ConversationalRetrievalChain.builder()
.retriever(retriever)
.chatLanguageModel(chatModel)
.build();
String answer = chain.execute("Java生态有哪些AI框架?");
4.3 记忆管理
LangChain4j提供了多种记忆管理方式,使对话能保持上下文:
java复制ChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);
Assistant assistant = AiServices.builder(Assistant.class)
.chatLanguageModel(chatModel)
.chatMemory(chatMemory)
.build();
String answer1 = assistant.chat("你好,我是张三");
String answer2 = assistant.chat("你还记得我叫什么名字吗?"); // 能记住上下文
5. 生产环境实践指南
5.1 性能优化技巧
- 批处理请求:对于多个独立的问题,使用批处理减少API调用次数
- 缓存机制:对常见问题的回答进行缓存
- 超时设置:合理配置连接和读取超时
java复制@Bean
public OpenAiChatClient openAiChatClient(OpenAiApi openAiApi) {
return new OpenAiChatClient(openAiApi)
.withDefaultOptions(OpenAiChatOptions.builder()
.withTemperature(0.7f)
.withMaxTokens(500)
.build());
}
5.2 异常处理策略
大模型应用需要特别注意异常处理:
java复制@RestControllerAdvice
public class AiExceptionHandler {
@ExceptionHandler(AiClientException.class)
public ResponseEntity<String> handleAiClientException(AiClientException ex) {
return ResponseEntity.status(502)
.body("AI服务暂时不可用: " + ex.getMessage());
}
@ExceptionHandler(AiRateLimitException.class)
public ResponseEntity<String> handleRateLimitException(AiRateLimitException ex) {
return ResponseEntity.status(429)
.header("Retry-After", "60")
.body("请求过于频繁,请稍后再试");
}
}
5.3 监控与可观测性
Spring AI与Micrometer集成良好,可以轻松添加监控:
java复制@Bean
public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return registry -> registry.config().commonTags(
"application", "ai-demo",
"region", "china-east"
);
}
6. 常见问题解决方案
6.1 依赖冲突问题
当出现"Multiple HTTP clients have been found in the classpath"错误时,可以通过显式指定HTTP客户端解决:
java复制@Bean
public OpenAiApi openAiApi() {
return OpenAiApi.withAzureAd(
"your-api-key",
"your-resource-name",
"your-deployment-id",
"your-api-version",
WebClient.builder() // 显式指定WebClient
.clientConnector(new ReactorClientHttpConnector(
HttpClient.create().responseTimeout(Duration.ofSeconds(60))
))
.build()
);
}
6.2 本地模型调试技巧
使用Ollama运行本地模型时,可以通过以下命令查看模型列表:
bash复制curl http://localhost:11434/api/tags
6.3 输入压缩实现
对于长文本输入,可以实现自定义的输入压缩策略:
java复制public class TextCompressor implements Function<String, String> {
private final ChatLanguageModel summaryModel;
public TextCompressor(ChatLanguageModel summaryModel) {
this.summaryModel = summaryModel;
}
@Override
public String apply(String text) {
if (text.length() < 2000) return text;
String instruction = "请用不超过100字总结以下内容,保留关键信息:\n" + text;
return summaryModel.generate(instruction);
}
}
// 使用方式
TextCompressor compressor = new TextCompressor(chatModel);
String compressedInput = compressor.apply(longText);
7. 项目进阶路线
7.1 技能扩展建议
- 多模态处理:尝试集成图片生成和识别能力
- 语音交互:结合语音识别和合成技术
- 复杂代理系统:构建能自主完成复杂任务的AI代理
7.2 学习资源推荐
- 官方文档:
- Spring AI: https://spring.io/projects/spring-ai
- LangChain4j: https://github.com/langchain4j/langchain4j
- 示例项目:
- Spring AI示例库
- LangChain4j示例项目
- 社区资源:
- Spring官方论坛AI板块
- LangChain4j GitHub讨论区
7.3 企业级应用架构
对于生产环境,建议采用以下架构:
- API网关层:处理认证和限流
- 服务层:实现核心业务逻辑
- AI适配层:封装不同AI供应商的差异
- 缓存层:缓存常见响应
- 监控层:收集性能指标和业务指标
java复制@Configuration
@EnableCaching
public class AiCacheConfig {
@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager(
"ai-responses",
"embeddings"
);
}
}
在实际项目中,我发现将AI能力封装为独立的服务模块是最佳实践。这样既保持了架构清晰,又便于后续升级替换AI供应商。对于复杂的业务场景,建议采用领域驱动设计(DDD)来组织代码结构,将AI能力作为领域服务注入到业务逻辑中。
