LangChain4j 入门实践:从零构建Java语言的大模型应用
一、为什么选择LangChain4j?
在Java生态中,将大模型(如LLM)集成到业务系统时,开发者常面临三个核心痛点:多模型适配复杂(需处理不同API的差异)、流程编排困难(如检索增强生成RAG的链路管理)、性能优化缺乏工具(如缓存、批处理)。LangChain4j作为专为Java设计的语言模型开发框架,通过抽象化模型接口、提供标准化组件库和内置优化机制,显著降低了开发门槛。
其核心优势包括:
- 模型无关性:支持主流大模型平台(如千帆大模型平台)的统一调用,开发者无需修改业务代码即可切换模型。
- 组件化设计:内置链(Chain)、工具(Tool)、存储(Memory)等模块,可快速组合复杂功能。
- Java生态深度集成:与Spring Boot、Hibernate等框架无缝协作,支持依赖注入和AOP等特性。
二、环境准备与基础配置
1. 依赖管理
通过Maven引入核心库(以千帆大模型平台为例):
<dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-core</artifactId><version>0.25.0</version></dependency><!-- 千帆大模型平台适配器 --><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-qianfan</artifactId><version>0.25.0</version></dependency>
2. 模型服务配置
以千帆大模型平台为例,创建QianFanModelService实例:
import dev.langchain4j.model.qianfan.QianFanChatModel;import dev.langchain4j.model.qianfan.QianFanModelSettings;public class ModelConfig {public static ChatModel createQianFanModel() {QianFanModelSettings settings = QianFanModelSettings.builder().apiKey("YOUR_API_KEY").secretKey("YOUR_SECRET_KEY").modelName("ernie-bot-40") // 指定模型版本.build();return QianFanChatModel.with(settings);}}
关键参数说明:
apiKey/secretKey:需从平台获取,建议通过环境变量或配置中心管理。modelName:根据业务场景选择模型(如文本生成选ernie-bot-40,多模态需额外配置)。
三、核心组件实践
1. 基础文本生成
import dev.langchain4j.model.ChatModel;import dev.langchain4j.model.output.ChatResponse;public class SimpleChatExample {public static void main(String[] args) {ChatModel model = ModelConfig.createQianFanModel();ChatResponse response = model.generate("用Java解释多态的概念");System.out.println(response.content());}}
输出示例:
多态是面向对象编程的核心特性,允许不同类的对象对同一消息做出响应。例如,Shape类定义draw()方法,子类Circle和Square可重写该方法实现不同绘制逻辑...
2. 检索增强生成(RAG)
构建一个基于文档检索的问答系统:
步骤1:配置向量存储
import dev.langchain4j.store.embedding.EmbeddingStore;import dev.langchain4j.store.embedding.InMemoryEmbeddingStore;EmbeddingStore<String> embeddingStore = new InMemoryEmbeddingStore<>();
步骤2:创建RAG链
import dev.langchain4j.chain.RetrievalAugmentedGenerationChain;import dev.langchain4j.service.EmbeddingService;import dev.langchain4j.service.QianFanEmbeddingService;public class RagExample {public static void main(String[] args) {// 初始化嵌入服务EmbeddingService embeddingService = QianFanEmbeddingService.with("YOUR_API_KEY", "YOUR_SECRET_KEY");// 构建RAG链RetrievalAugmentedGenerationChain ragChain = RetrievalAugmentedGenerationChain.builder().chatModel(ModelConfig.createQianFanModel()).embeddingService(embeddingService).embeddingStore(embeddingStore).similarityThreshold(0.7) // 相似度阈值.build();// 添加文档到存储String docId = "doc1";String text = "Java的集合框架包含List、Set、Map等接口...";float[] embedding = embeddingService.embed(text).vector();embeddingStore.add(List.of(docId), embedding, text);// 提问String question = "Java中如何实现去重?";String answer = ragChain.execute(question).content();System.out.println(answer);}}
3. 工具调用(Function Calling)
实现一个天气查询工具:
import dev.langchain4j.agent.tool.Tool;import dev.langchain4j.agent.tool.ToolExecutionRequest;import dev.langchain4j.agent.tool.ToolSpecification;@Tool("weather")public class WeatherTool {@ToolSpecification(name = "getWeather",description = "查询指定城市的天气",parameters = {@Parameter(name = "city", description = "城市名称", required = true)})public String getWeather(ToolExecutionRequest request) {String city = request.stringArgument("city");// 实际场景中调用天气APIreturn city + "今天晴,25℃";}}// 在Agent中使用AgentExecutor agent = AgentExecutor.builder().chatModel(model).tool(new WeatherTool()).build();String result = agent.execute("北京明天天气如何?").output();
四、性能优化策略
1. 请求批处理
对于批量文本处理,使用BatchChatModel:
import dev.langchain4j.model.batch.BatchChatModel;BatchChatModel batchModel = BatchChatModel.from(model);List<ChatMessage> messages = List.of(new ChatMessage("解释JVM"),new ChatMessage("Java 8的新特性"));List<ChatResponse> responses = batchModel.generateAll(messages);
2. 缓存机制
通过CachingChatModel避免重复计算:
import dev.langchain4j.model.cache.CachingChatModel;import dev.langchain4j.model.cache.InMemoryChatModelCache;ChatModel cachedModel = CachingChatModel.with(model,new InMemoryChatModelCache(100) // 缓存100条对话);
3. 异步调用
使用AsyncChatModel提升吞吐量:
import dev.langchain4j.model.AsyncChatModel;import java.util.concurrent.CompletableFuture;AsyncChatModel asyncModel = AsyncChatModel.from(model);CompletableFuture<ChatResponse> future = asyncModel.generate("异步调用示例");future.thenAccept(response -> System.out.println(response.content()));
五、最佳实践建议
- 模型选择:根据任务复杂度选择模型,简单问答可用轻量级模型,代码生成需高参数模型。
- 错误处理:捕获
ModelInvocationException处理超时、配额不足等问题。 - 日志监控:记录模型输入输出,便于调试和审计。
- 安全限制:通过
ContentFilter过滤敏感内容。
六、总结与展望
LangChain4j为Java开发者提供了高效、灵活的大模型开发工具链。通过本文的实践,读者可快速实现文本生成、RAG、工具调用等核心场景。未来,随着多模态模型的支持和更细粒度的性能优化,LangChain4j将在企业级应用中发挥更大价值。建议开发者持续关注框架更新,并结合具体业务场景探索创新应用。