1. LangChain4j 框架概述
LangChain4j 是一个专为 Java 应用设计的轻量级框架,旨在简化大语言模型(LLM)的集成过程。作为 Java 开发者,我们经常面临需要将 AI 能力快速整合到业务系统中的需求,而 LangChain4j 正是为此场景量身打造的解决方案。
1.1 核心特性解析
LangChain4j 的核心价值在于其统一抽象的 API 设计。当前市场上存在众多 LLM 服务提供商,每个平台都有自己独特的 API 接口和调用方式。这种碎片化现状给开发者带来了显著的集成成本:
- 多模型支持:目前已集成 15+ 主流 LLM 服务(如 OpenAI、阿里百炼等)
- 向量存储兼容:支持 20+ 向量数据库(包括 Redis、Elasticsearch 等)
- 版本适配:
- v0.35.0 支持 JDK 1.8
- v0.36.0+ 需要 JDK 17+
实际开发中,我们经常遇到需要切换模型供应商的情况。LangChain4j 的抽象层使得这种切换只需修改配置即可完成,无需重写业务逻辑代码。
1.2 与 Spring AI 的对比分析
| 维度 | Spring AI | LangChain4j |
|---|---|---|
| 技术栈绑定 | 强依赖 Spring 生态 | 无框架依赖,可独立使用 |
| 适用场景 | SpringBoot 应用快速接入单模型 | 多模型动态切换平台 |
| 学习曲线 | 需要 Spring 知识 | 纯 Java API,入门门槛低 |
| 扩展性 | 受限于 Spring 体系 | 可灵活组合各种组件 |
对于非 Spring 项目或需要多模型管理的场景,LangChain4j 展现出明显优势。我曾在一个金融风控系统中同时使用阿里和 OpenAI 的模型进行交叉验证,LangChain4j 的统一 API 设计让这种架构变得非常易于实现。
2. 基础集成实践
2.1 环境准备与依赖配置
首先创建 Maven 项目,添加核心依赖:
xml复制<properties>
<langchain4j.version>1.11.0</langchain4j.version>
<dashscope.version>1.11.0-beta19</dashscope.version>
</properties>
<dependencies>
<!-- 核心库 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>${langchain4j.version}</version>
</dependency>
<!-- OpenAI 适配器 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
<version>${langchain4j.version}</version>
</dependency>
<!-- 阿里百炼适配器 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-community-dashscope</artifactId>
<version>${dashscope.version}</version>
</dependency>
<!-- 本地 Ollama 支持 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-ollama</artifactId>
<version>${langchain4j.version}</version>
</dependency>
</dependencies>
2.2 基础模型调用示例
2.2.1 OpenAI 接口调用
java复制public class OpenAIDemo {
@Test
public void testChat() {
OpenAiChatModel model = OpenAiChatModel.builder()
.baseUrl("http://langchain4j.dev/demo/openai/v1")
.apiKey("demo")
.modelName("gpt-4o-mini")
.build();
String response = model.generate("Java 中的 volatile 关键字有什么作用?");
System.out.println(response);
}
}
2.2.2 阿里百炼模型调用
java复制public class AliDemo {
@Test
public void testQwenModel() {
ChatModel qwenModel = QwenChatModel.builder()
.apiKey(System.getenv("API_KEY"))
.modelName("qwen-plus-latest")
.build();
String answer = qwenModel.generate("解释 Java 内存模型");
System.out.println(answer);
}
}
2.2.3 本地 Ollama 模型集成
java复制public class OllamaDemo {
@Test
public void testLocalModel() {
ChatModel model = OllamaChatModel.builder()
.baseUrl("http://localhost:11434")
.modelName("deepseek-r1:1.5b")
.build();
String answer = model.generate("用 Java 实现快速排序");
System.out.println(answer);
}
}
在实际项目中,建议将模型配置参数外置到配置文件中,避免硬编码。不同环境(开发、测试、生产)可以使用不同的模型配置。
3. Spring Boot 深度集成
3.1 基础配置
创建 Spring Boot 项目并添加 starter 依赖:
xml复制<dependencyManagement>
<dependencies>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-community-bom</artifactId>
<version>${langchain4j.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- 阿里百炼 Spring Boot Starter -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-community-dashscope-spring-boot-starter</artifactId>
</dependency>
<!-- WebFlux 用于流式响应 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
</dependencies>
3.2 阿里百炼配置
application.properties 配置:
properties复制# 阿里百炼配置
langchain4j.community.dashscope.chatModel.apiKey=${ALI_API_KEY}
langchain4j.community.dashscope.chatModel.modelName=qwen-plus
控制器实现:
java复制@RestController
@RequestMapping("/api/ai")
public class AIController {
@Autowired
@Qualifier("qwenChatModel")
private ChatLanguageModel chatModel;
@GetMapping("/chat")
public String chat(@RequestParam String message) {
return chatModel.generate(message);
}
}
3.3 流式响应实现
对于需要实时显示生成结果的场景,可以使用流式响应:
java复制@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamChat(@RequestParam String message) {
return Flux.create(sink -> {
StreamingChatLanguageModel streamingModel = ... // 获取流式模型实例
streamingModel.generate(message, new StreamingResponseHandler() {
@Override
public void onNext(String token) {
sink.next(token);
}
@Override
public void onComplete() {
sink.complete();
}
@Override
public void onError(Throwable error) {
sink.error(error);
}
});
});
}
流式响应特别适合需要实时展示生成过程的场景,如客服对话界面。在实际项目中,我们还需要考虑超时处理和背压控制。
4. 高级功能实现
4.1 对话记忆管理
4.1.1 基础记忆实现
java复制@Bean
public Assistant assistant(ChatLanguageModel model) {
ChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);
return AiServices.builder(Assistant.class)
.chatLanguageModel(model)
.chatMemory(chatMemory)
.build();
}
public interface Assistant {
String chat(String message);
}
4.1.2 多用户记忆隔离
java复制@Bean
public MultiUserAssistant multiUserAssistant(ChatLanguageModel model) {
return AiServices.builder(MultiUserAssistant.class)
.chatLanguageModel(model)
.chatMemoryProvider(memoryId ->
MessageWindowChatMemory.builder()
.id(memoryId)
.maxMessages(10)
.build())
.build();
}
public interface MultiUserAssistant {
String chat(@MemoryId String userId, @UserMessage String message);
}
4.2 工具方法调用
实现业务逻辑与 AI 的深度集成:
java复制@Service
public class BookingService {
@Tool("查询航班余票")
public String checkFlightAvailability(
@P("出发地") String from,
@P("目的地") String to,
@P("日期") String date) {
// 实现实际的航班查询逻辑
return String.format("%s 到 %s 在 %s 有 5 个航班可选", from, to, date);
}
}
@Bean
public BookingAssistant bookingAssistant(
ChatLanguageModel model,
BookingService bookingService) {
return AiServices.builder(BookingAssistant.class)
.chatLanguageModel(model)
.tools(bookingService)
.build();
}
public interface BookingAssistant {
String chat(String message);
}
4.3 RAG 增强生成
实现知识库增强的问答系统:
java复制@Bean
public EmbeddingModel embeddingModel() {
return QwenEmbeddingModel.builder()
.apiKey(System.getenv("ALI_API_KEY"))
.build();
}
@Bean
public EmbeddingStore<TextSegment> embeddingStore() {
return new InMemoryEmbeddingStore<>();
}
@Bean
public ConversationalRetriever<TextSegment> retriever(
EmbeddingModel embeddingModel,
EmbeddingStore<TextSegment> embeddingStore) {
return EmbeddingStoreRetriever.from(embeddingStore, embeddingModel);
}
@Bean
public ChatMemory chatMemory() {
return MessageWindowChatMemory.withMaxMessages(10);
}
@Bean
public KnowledgeBaseAssistant knowledgeBaseAssistant(
ChatLanguageModel chatModel,
ConversationalRetriever<TextSegment> retriever,
ChatMemory chatMemory) {
return AiServices.builder(KnowledgeBaseAssistant.class)
.chatLanguageModel(chatModel)
.retriever(retriever)
.chatMemory(chatMemory)
.build();
}
5. 性能优化与最佳实践
5.1 缓存策略
java复制@Bean
public CacheStore<Embedding> embeddingCache() {
return new ConcurrentHashMapCacheStore<>();
}
@Bean
public CachingEmbeddingModel cachingEmbeddingModel(
EmbeddingModel embeddingModel,
CacheStore<Embedding> cacheStore) {
return new CachingEmbeddingModel(embeddingModel, cacheStore);
}
5.2 超时控制
java复制@Bean
public ChatLanguageModel robustChatModel() {
return TimeoutChatModel.builder()
.chatLanguageModel(originalModel)
.timeout(Duration.ofSeconds(30))
.build();
}
5.3 监控指标
java复制@Bean
public MeterRegistry meterRegistry() {
return new SimpleMeterRegistry();
}
@Bean
public MeteredChatLanguageModel meteredModel(
ChatLanguageModel delegate,
MeterRegistry meterRegistry) {
return new MeteredChatLanguageModel(delegate, meterRegistry);
}
6. 生产环境注意事项
- 密钥管理:永远不要将 API 密钥硬编码在代码中,使用专业的密钥管理服务
- 限流控制:为模型调用添加适当的限流措施,避免意外的高额账单
- 异常处理:完善处理各种网络异常和模型返回的错误
- 日志记录:详细记录请求和响应,便于问题排查
- 性能监控:监控模型调用的延迟和成功率
在最近的一个电商客服项目中,我们通过 LangChain4j 实现了多模型自动切换机制。当主模型响应超时或返回错误时,系统会自动切换到备用模型,显著提高了系统的可用性。这种灵活的架构设计正是 LangChain4j 的优势所在。