LangChain4j 入门实践:从零构建Java语言的大模型应用

LangChain4j 入门实践:从零构建Java语言的大模型应用

一、为什么选择LangChain4j?

在Java生态中,将大模型(如LLM)集成到业务系统时,开发者常面临三个核心痛点:多模型适配复杂(需处理不同API的差异)、流程编排困难(如检索增强生成RAG的链路管理)、性能优化缺乏工具(如缓存、批处理)。LangChain4j作为专为Java设计的语言模型开发框架,通过抽象化模型接口、提供标准化组件库和内置优化机制,显著降低了开发门槛。

其核心优势包括:

  1. 模型无关性:支持主流大模型平台(如千帆大模型平台)的统一调用,开发者无需修改业务代码即可切换模型。
  2. 组件化设计:内置链(Chain)、工具(Tool)、存储(Memory)等模块,可快速组合复杂功能。
  3. Java生态深度集成:与Spring Boot、Hibernate等框架无缝协作,支持依赖注入和AOP等特性。

二、环境准备与基础配置

1. 依赖管理

通过Maven引入核心库(以千帆大模型平台为例):

  1. <dependency>
  2. <groupId>dev.langchain4j</groupId>
  3. <artifactId>langchain4j-core</artifactId>
  4. <version>0.25.0</version>
  5. </dependency>
  6. <!-- 千帆大模型平台适配器 -->
  7. <dependency>
  8. <groupId>dev.langchain4j</groupId>
  9. <artifactId>langchain4j-qianfan</artifactId>
  10. <version>0.25.0</version>
  11. </dependency>

2. 模型服务配置

以千帆大模型平台为例,创建QianFanModelService实例:

  1. import dev.langchain4j.model.qianfan.QianFanChatModel;
  2. import dev.langchain4j.model.qianfan.QianFanModelSettings;
  3. public class ModelConfig {
  4. public static ChatModel createQianFanModel() {
  5. QianFanModelSettings settings = QianFanModelSettings.builder()
  6. .apiKey("YOUR_API_KEY")
  7. .secretKey("YOUR_SECRET_KEY")
  8. .modelName("ernie-bot-40") // 指定模型版本
  9. .build();
  10. return QianFanChatModel.with(settings);
  11. }
  12. }

关键参数说明

  • apiKey/secretKey:需从平台获取,建议通过环境变量或配置中心管理。
  • modelName:根据业务场景选择模型(如文本生成选ernie-bot-40,多模态需额外配置)。

三、核心组件实践

1. 基础文本生成

  1. import dev.langchain4j.model.ChatModel;
  2. import dev.langchain4j.model.output.ChatResponse;
  3. public class SimpleChatExample {
  4. public static void main(String[] args) {
  5. ChatModel model = ModelConfig.createQianFanModel();
  6. ChatResponse response = model.generate("用Java解释多态的概念");
  7. System.out.println(response.content());
  8. }
  9. }

输出示例

  1. 多态是面向对象编程的核心特性,允许不同类的对象对同一消息做出响应。例如,Shape类定义draw()方法,子类CircleSquare可重写该方法实现不同绘制逻辑...

2. 检索增强生成(RAG)

构建一个基于文档检索的问答系统:

步骤1:配置向量存储

  1. import dev.langchain4j.store.embedding.EmbeddingStore;
  2. import dev.langchain4j.store.embedding.InMemoryEmbeddingStore;
  3. EmbeddingStore<String> embeddingStore = new InMemoryEmbeddingStore<>();

步骤2:创建RAG链

  1. import dev.langchain4j.chain.RetrievalAugmentedGenerationChain;
  2. import dev.langchain4j.service.EmbeddingService;
  3. import dev.langchain4j.service.QianFanEmbeddingService;
  4. public class RagExample {
  5. public static void main(String[] args) {
  6. // 初始化嵌入服务
  7. EmbeddingService embeddingService = QianFanEmbeddingService.with(
  8. "YOUR_API_KEY", "YOUR_SECRET_KEY");
  9. // 构建RAG链
  10. RetrievalAugmentedGenerationChain ragChain = RetrievalAugmentedGenerationChain.builder()
  11. .chatModel(ModelConfig.createQianFanModel())
  12. .embeddingService(embeddingService)
  13. .embeddingStore(embeddingStore)
  14. .similarityThreshold(0.7) // 相似度阈值
  15. .build();
  16. // 添加文档到存储
  17. String docId = "doc1";
  18. String text = "Java的集合框架包含List、Set、Map等接口...";
  19. float[] embedding = embeddingService.embed(text).vector();
  20. embeddingStore.add(List.of(docId), embedding, text);
  21. // 提问
  22. String question = "Java中如何实现去重?";
  23. String answer = ragChain.execute(question).content();
  24. System.out.println(answer);
  25. }
  26. }

3. 工具调用(Function Calling)

实现一个天气查询工具:

  1. import dev.langchain4j.agent.tool.Tool;
  2. import dev.langchain4j.agent.tool.ToolExecutionRequest;
  3. import dev.langchain4j.agent.tool.ToolSpecification;
  4. @Tool("weather")
  5. public class WeatherTool {
  6. @ToolSpecification(
  7. name = "getWeather",
  8. description = "查询指定城市的天气",
  9. parameters = {
  10. @Parameter(name = "city", description = "城市名称", required = true)
  11. }
  12. )
  13. public String getWeather(ToolExecutionRequest request) {
  14. String city = request.stringArgument("city");
  15. // 实际场景中调用天气API
  16. return city + "今天晴,25℃";
  17. }
  18. }
  19. // 在Agent中使用
  20. AgentExecutor agent = AgentExecutor.builder()
  21. .chatModel(model)
  22. .tool(new WeatherTool())
  23. .build();
  24. String result = agent.execute("北京明天天气如何?").output();

四、性能优化策略

1. 请求批处理

对于批量文本处理,使用BatchChatModel

  1. import dev.langchain4j.model.batch.BatchChatModel;
  2. BatchChatModel batchModel = BatchChatModel.from(model);
  3. List<ChatMessage> messages = List.of(
  4. new ChatMessage("解释JVM"),
  5. new ChatMessage("Java 8的新特性")
  6. );
  7. List<ChatResponse> responses = batchModel.generateAll(messages);

2. 缓存机制

通过CachingChatModel避免重复计算:

  1. import dev.langchain4j.model.cache.CachingChatModel;
  2. import dev.langchain4j.model.cache.InMemoryChatModelCache;
  3. ChatModel cachedModel = CachingChatModel.with(
  4. model,
  5. new InMemoryChatModelCache(100) // 缓存100条对话
  6. );

3. 异步调用

使用AsyncChatModel提升吞吐量:

  1. import dev.langchain4j.model.AsyncChatModel;
  2. import java.util.concurrent.CompletableFuture;
  3. AsyncChatModel asyncModel = AsyncChatModel.from(model);
  4. CompletableFuture<ChatResponse> future = asyncModel.generate("异步调用示例");
  5. future.thenAccept(response -> System.out.println(response.content()));

五、最佳实践建议

  1. 模型选择:根据任务复杂度选择模型,简单问答可用轻量级模型,代码生成需高参数模型。
  2. 错误处理:捕获ModelInvocationException处理超时、配额不足等问题。
  3. 日志监控:记录模型输入输出,便于调试和审计。
  4. 安全限制:通过ContentFilter过滤敏感内容。

六、总结与展望

LangChain4j为Java开发者提供了高效、灵活的大模型开发工具链。通过本文的实践,读者可快速实现文本生成、RAG、工具调用等核心场景。未来,随着多模态模型的支持和更细粒度的性能优化,LangChain4j将在企业级应用中发挥更大价值。建议开发者持续关注框架更新,并结合具体业务场景探索创新应用。