1. LangChain4j 是什么?
如果你是一名 Java 开发者,最近一定听说过 LLM(大语言模型)和 AI 应用开发的热潮。但当你兴致勃勃想要尝试时,可能会发现大多数教程和工具都是 Python 生态的。这就是 LangChain4j 诞生的背景 - 它为 Java 开发者提供了一个原生的、符合 Java 习惯的 LLM 应用开发框架。
LangChain4j 是一个开源的 Java 库,专门用于在 JVM 上构建基于大语言模型的应用程序。它最大的特点是提供了统一的 API 来对接不同的 LLM 提供商(如 OpenAI、Google Vertex AI 等)和向量数据库(如 Pinecone、Milvus 等)。这意味着你可以用同样的代码切换不同的后端服务,而不需要重写业务逻辑。
提示:LangChain4j 虽然名字里有 "LangChain",但它并不是 Python 版 LangChain 的简单移植,而是专门为 Java 生态设计的独立项目。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 为什么选择 LangChain4j?
2.1 统一的多厂商支持
目前 LangChain4j 已经支持 20+ 主流 LLM 提供商和 30+ 向量数据库。这种统一接口的设计带来了几个实际好处:
- 开发效率:不需要为每个服务学习不同的 API
- 灵活性:可以轻松切换服务提供商进行对比测试
- 未来兼容:当新的 LLM 服务出现时,只需更新 LangChain4j 即可使用
2.2 完整的工具链
从底层到高层,LangChain4j 提供了一整套工具:
- 基础层:提示词模板、对话记忆管理、函数调用等
- 应用层:Agent(智能体)、RAG(检索增强生成)等高级模式
- 企业集成:与 Spring Boot、Quarkus 等主流 Java 框架无缝集成
2.3 Java 原生设计
与 Python 生态的库不同,LangChain4j 完全遵循 Java 的开发习惯:
- 强类型安全
- 基于接口和抽象类的设计
- 支持依赖注入
- 流畅的 API 风格
- 与 Java 生态工具链深度集成
3. 快速上手 LangChain4j
3.1 环境准备
首先确保你的开发环境满足以下要求:
- JDK 17 或更高版本
- Maven 或 Gradle 构建工具
- 一个可用的 LLM 服务 API key(如 OpenAI)
在 pom.xml 中添加依赖:
xml复制<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-openai</artifactId>
<version>0.27.0</version>
</dependency>
3.2 第一个示例:与 LLM 对话
让我们创建一个简单的聊天应用:
java复制import dev.langchain4j.model.openai.OpenAiChatModel;
public class FirstApp {
public static void main(String[] args) {
OpenAiChatModel model = OpenAiChatModel.builder()
.apiKey("your-api-key")
.modelName("gpt-3.5-turbo")
.temperature(0.3)
.build();
String answer = model.generate("用Java写一个快速排序算法");
System.out.println(answer);
}
}
这个简单的例子展示了 LangChain4j 的核心使用模式:
- 创建模型实例(这里是 OpenAI 的聊天模型)
- 配置必要参数(API key、模型名称等)
- 调用 generate 方法获取响应
3.3 进阶功能:记忆管理
真实的聊天应用需要记忆上下文。LangChain4j 提供了方便的对话记忆管理:
java复制import dev.langchain4j.memory.ChatMemory;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;
interface Assistant {
String chat(String message);
}
public class ChatWithMemory {
public static void main(String[] args) {
ChatMemory memory = MessageWindowChatMemory.withMaxMessages(10);
Assistant assistant = AiServices.builder(Assistant.class)
.chatLanguageModel(OpenAiChatModel.withApiKey("your-api-key"))
.chatMemory(memory)
.build();
System.out.println(assistant.chat("你好,我是小明"));
System.out.println(assistant.chat("你还记得我叫什么吗?"));
}
}
这个例子展示了:
- 使用 MessageWindowChatMemory 来保存最近10条消息
- 通过 AiServices 创建代理接口
- 自动维护对话上下文
4. 核心概念深入解析
4.1 模型抽象层
LangChain4j 的核心价值在于它对不同 LLM 服务的抽象。主要接口包括:
- ChatLanguageModel:对话模型接口
- StreamingChatLanguageModel:支持流式响应的对话模型
- EmbeddingModel:文本嵌入模型
- ModerationModel:内容审核模型
这种设计让你可以这样写代码:
java复制ChatLanguageModel model;
if(useOpenAI) {
model = OpenAiChatModel.withApiKey("openai-key");
} else {
model = GoogleGeminiChatModel.withApiKey("gemini-key");
}
// 后续代码无需修改
String response = model.generate(prompt);
4.2 提示词工程
LangChain4j 提供了强大的提示词模板功能:
java复制import dev.langchain4j.model.input.Prompt;
import dev.langchain4j.model.input.PromptTemplate;
public class PromptEngineering {
public static void main(String[] args) {
PromptTemplate template = PromptTemplate.from(
"你是一位专业的{{role}}。请用{{style}}风格回答以下问题:\n{{question}}"
);
Prompt prompt = template.apply(
Map.of(
"role", "Java工程师",
"style", "简洁专业",
"question", "如何优化Java应用的启动速度?"
)
);
// 使用prompt与模型交互...
}
}
4.3 工具调用(Function Calling)
现代 LLM 的一个重要特性是能够调用外部工具。LangChain4j 让这变得简单:
java复制import dev.langchain4j.agent.tool.Tool;
class Calculator {
@Tool("用于计算两个数字的和")
public double add(double a, double b) {
return a + b;
}
}
public class FunctionCallingDemo {
public static void main(String[] args) {
Calculator calculator = new Calculator();
Assistant assistant = AiServices.builder(Assistant.class)
.chatLanguageModel(OpenAiChatModel.withApiKey("key"))
.tools(calculator)
.build();
String result = assistant.chat("123加456等于多少?");
System.out.println(result); // 会调用calculator.add(123, 456)
}
}
5. 高级应用模式
5.1 检索增强生成(RAG)
RAG 是当前最实用的 LLM 应用模式之一。LangChain4j 提供了完整的 RAG 支持:
java复制import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.FileSystemDocumentLoader;
import dev.langchain4j.data.document.splitter.DocumentSplitters;
import dev.langchain4j.data.embedding.Embedding;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.embedding.AllMiniLmL6V2EmbeddingModel;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
public class RAGExample {
public static void main(String[] args) {
// 1. 加载文档
Document document = FileSystemDocumentLoader.loadDocument(Paths.get("data/document.txt"));
// 2. 分割文档
List<TextSegment> segments = DocumentSplitters.recursive(300, 0).split(document);
// 3. 生成嵌入
EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel();
List<Embedding> embeddings = embeddingModel.embedAll(segments).content();
// 4. 存储嵌入
EmbeddingStore<TextSegment> store = new InMemoryEmbeddingStore<>();
store.addAll(embeddings, segments);
// 5. 检索增强生成
ChatLanguageModel model = OpenAiChatModel.withApiKey("key");
String question = "文档中提到了哪些关键技术?";
List<EmbeddingMatch<TextSegment>> relevant = store.findRelevant(embeddingModel.embed(question).content(), 3);
String context = relevant.stream()
.map(match -> match.embedded().text())
.collect(Collectors.joining("\n\n"));
String answer = model.generate("基于以下上下文回答问题:\n" + context + "\n\n问题:" + question);
System.out.println(answer);
}
}
5.2 智能体(Agents)
智能体是可以自主决定使用哪些工具来完成复杂任务的 AI 系统:
java复制import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.memory.ChatMemory;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
class WeatherTools {
@Tool("获取指定城市的当前天气")
public String getCurrentWeather(String city) {
// 实际应用中这里会调用天气API
return city + " 晴,25°C";
}
}
public class AgentDemo {
public static void main(String[] args) {
WeatherTools tools = new WeatherTools();
ChatMemory memory = MessageWindowChatMemory.withMaxMessages(10);
Assistant assistant = AiServices.builder(Assistant.class)
.chatLanguageModel(OpenAiChatModel.withApiKey("key"))
.tools(tools)
.chatMemory(memory)
.build();
String answer = assistant.chat("北京和上海的天气怎么样?");
System.out.println(answer);
}
}
6. 企业级集成
6.1 与 Spring Boot 集成
LangChain4j 提供了对 Spring Boot 的原生支持:
- 添加依赖:
xml复制<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-spring-boot-starter</artifactId>
<version>0.27.0</version>
</dependency>
- 配置 application.properties:
properties复制langchain4j.openai.chat-model.api-key=${OPENAI_API_KEY}
langchain4j.openai.chat-model.model-name=gpt-3.5-turbo
langchain4j.openai.chat-model.temperature=0.7
- 在服务中使用:
java复制@Service
public class MyService {
private final ChatLanguageModel chatModel;
public MyService(ChatLanguageModel chatModel) {
this.chatModel = chatModel;
}
public String generateContent(String prompt) {
return chatModel.generate(prompt);
}
}
6.2 监控与可观测性
在生产环境中,监控 LLM 调用的性能和质量非常重要:
java复制import dev.langchain4j.model.observation.HuggingFaceObservationHandler;
import io.micrometer.observation.ObservationRegistry;
public class MonitoringExample {
public static void main(String[] args) {
ObservationRegistry registry = ObservationRegistry.create();
registry.observationConfig().observationHandler(new HuggingFaceObservationHandler());
ChatLanguageModel model = OpenAiChatModel.builder()
.apiKey("key")
.observationRegistry(registry)
.build();
// 所有调用都将被监控
model.generate("测试监控");
}
}
7. 性能优化与最佳实践
7.1 批量处理
当需要处理大量文本时,使用批量接口可以提高效率:
java复制EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel();
// 单条处理(低效)
for (String text : texts) {
Embedding embedding = embeddingModel.embed(text).content();
// ...
}
// 批量处理(高效)
Embeddings embeddings = embeddingModel.embedAll(texts);
for (Embedding embedding : embeddings.content()) {
// ...
}
7.2 缓存策略
LLM API 调用通常有延迟和成本,合理的缓存策略很重要:
java复制import dev.langchain4j.store.memory.chat.ChatMemoryStore;
import dev.langchain4j.store.memory.chat.InMemoryChatMemoryStore;
// 使用持久化的ChatMemoryStore
ChatMemoryStore store = new RedisChatMemoryStore();
ChatMemory memory = MessageWindowChatMemory.builder()
.maxMessages(10)
.chatMemoryStore(store)
.build();
7.3 超时与重试
生产环境必须考虑网络不稳定性:
java复制OpenAiChatModel model = OpenAiChatModel.builder()
.apiKey("key")
.timeout(Duration.ofSeconds(30))
.maxRetries(3)
.build();
8. 常见问题与解决方案
8.1 依赖冲突
特别是当使用多个 LangChain4j 模块时,可能会遇到依赖冲突。解决方案:
- 使用 BOM(Bill of Materials)统一管理版本:
xml复制<dependencyManagement>
<dependencies>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-bom</artifactId>
<version>0.27.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 排除冲突的依赖:
xml复制<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-openai</artifactId>
<exclusions>
<exclusion>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</exclusion>
</exclusions>
</dependency>
8.2 长文本处理
当处理长文档时,需要注意:
- 合理分割文档(通常 200-500 tokens 一段)
- 使用递归分割器保持语义完整性
- 考虑使用 Map-Reduce 技术汇总长文档
java复制DocumentSplitter splitter = DocumentSplitters.recursive(
300, // 最大块大小
0 // 块间重叠
);
8.3 成本控制
LLM API 调用可能产生高昂费用,建议:
- 为 API 密钥设置使用限额
- 监控使用情况
- 对小规模测试使用本地模型
java复制// 使用本地模型进行开发测试
ChatLanguageModel model = LocalAiChatModel.builder()
.baseUrl("http://localhost:8080")
.modelName("ggml-gpt4all-j")
.build();
9. 实际应用案例
9.1 智能客服系统
使用 LangChain4j 构建客服系统的主要组件:
- 知识库:使用 RAG 技术接入产品文档
- 意图识别:分类用户问题类型
- 业务流程:对接订单查询等后端系统
- 对话管理:维护多轮对话上下文
java复制public class CustomerServiceBot {
private final EmbeddingStore<TextSegment> knowledgeBase;
private final ChatLanguageModel model;
private final OrderService orderService;
public String handleQuery(String sessionId, String query) {
// 1. 检索相关知识
List<EmbeddingMatch<TextSegment>> relevant = knowledgeBase.findRelevant(
embeddingModel.embed(query).content(), 3);
// 2. 构建提示词
String context = relevant.stream()...;
String prompt = "你是一名客服助手..." + context + "\n\n用户问:" + query;
// 3. 获取响应
return model.generate(prompt);
}
}
9.2 代码生成与辅助
为开发团队构建 AI 编程助手:
java复制public class CodeAssistant {
private final ChatLanguageModel model;
public String generateCode(String requirement) {
String prompt = """
你是一名资深Java工程师。请根据以下需求生成代码:
1. 只返回代码,不要解释
2. 包含必要的import语句
3. 添加适当的注释
需求:%s
""".formatted(requirement);
return model.generate(prompt);
}
public String explainCode(String code) {
return model.generate("解释这段代码:\n" + code);
}
}
10. 未来发展与学习资源
LangChain4j 生态系统正在快速发展,建议关注:
- 官方文档:https://docs.langchain4j.dev
- 示例仓库:https://github.com/langchain4j/langchain4j-examples
- 社区支持:
- GitHub Discussions
- Discord 社区
对于想要深入学习的开发者,可以探索:
- 自定义工具:扩展框架功能
- 模型微调:结合自有数据优化效果
- 评估框架:量化 AI 应用质量
我在实际项目中发现,LangChain4j 最适合的场景是企业内部的知识密集型应用开发。它的 Java 原生特性和对企业框架的支持,让传统 Java 团队能够快速拥抱 AI 技术而不需要完全改变技术栈。
