找回密码
 立即注册
首页 业界区 业界 1. LangChain4j 初识,想使用Java开发AI应用? ...

1. LangChain4j 初识,想使用Java开发AI应用?

稼布欤 前天 21:57
1. 简介

LangChain4j 是一个基于 Java 的开源框架,用于开发 人工智能驱动的应用程序,尤其是涉及 大语言模型(LLM)交互 的场景。它的设计目标是简化开发者与大语言模型的集成过程,提供一套工具和组件来处理复杂的 LLM 应用逻辑,例如对话管理、提示工程、工具调用等。
核心功能与特点


  • 大语言模型集成

    • 支持多种 LLM 接入方式,包括:

      • 本地运行的开源模型(如 Llama 2、ChatGLM 等)。
      • 第三方 API 模型(如 OpenAI 的 GPT 系列、Anthropic 的 Claude 等)。

    • 通过统一的接口抽象,降低模型切换的成本。

  • 提示工程工具

    • 提供模板化的提示构建器,帮助开发者结构化输入(如填充变量、管理上下文历史)。
    • 支持动态组合提示链(Prompt Chain),例如根据用户问题逐步调用不同的提示模板。

  • 对话状态管理

    • 维护多轮对话的上下文,支持记忆管理(如设置上下文窗口大小、选择性遗忘旧信息)。
    • 可集成外部知识库(如向量数据库)实现长期记忆。

  • 工具调用能力

    • 支持调用外部工具(如计算器、数据库查询、API 接口等),并将工具返回结果整合到 LLM 的回答中。
    • 提供工具调用的决策逻辑(如判断何时需要调用工具、如何解析工具返回结果)。

  • 链式流程编排

    • 通过 Chain 机制编排多个组件(如提示生成、工具调用、结果处理),形成复杂的工作流。
    • 典型场景:问答系统中先调用搜索引擎获取实时数据,再用 LLM 生成回答。

  • 扩展性与生态

    • 基于 Java 生态,可轻松与 Spring框架集成。
    • 支持自定义组件(如自定义提示策略、工具适配器),灵活适配业务需求。

2. 话不多说,直接展示

本章主要通过单元测试的方式展示LangChain4j的各项功能,后续会出通过LangChain4j Starter的方式快速集成SpringBoot。
使用SDK版本信息如下:
​        Java: 21
​        SpringBoot: 3.4.5
​        LangChain4j: 1.0.1
AI 模型主要使用的是阿里的百炼平台免费的token,需要ApiKey的可以自行去申请, 平台地址如下:
https://bailian.console.aliyun.com/?tab=model#/model-market
3. Maven
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4.     <modelVersion>4.0.0</modelVersion>
  5.     <parent>
  6.         <groupId>org.springframework.boot</groupId>
  7.         spring-boot-starter-parent</artifactId>
  8.         <version>3.4.5</version>
  9.         <relativePath/>
  10.     </parent>
  11.     <groupId>com.ldx</groupId>
  12.     langchain-test</artifactId>
  13.     <version>0.0.1-SNAPSHOT</version>
  14.     <name>langchain-test</name>
  15.     <description>langchain-test</description>
  16.     <properties>
  17.         <java.version>21</java.version>
  18.         <langchain4j.version>1.0.1</langchain4j.version>
  19.         <guava.version>33.0.0-jre</guava.version>
  20.     </properties>
  21.     <dependencyManagement>
  22.         <dependencies>
  23.             <dependency>
  24.                 <groupId>dev.langchain4j</groupId>
  25.                 langchain4j-bom</artifactId>
  26.                 <version>${langchain4j.version}</version>
  27.                 <type>pom</type>
  28.                 <scope>import</scope>
  29.             </dependency>
  30.         </dependencies>
  31.     </dependencyManagement>
  32.     <dependencies>
  33.         <dependency>
  34.             <groupId>org.springframework.boot</groupId>
  35.             spring-boot-starter-web</artifactId>
  36.         </dependency>
  37.         <dependency>
  38.             <groupId>dev.langchain4j</groupId>
  39.             langchain4j</artifactId>
  40.         </dependency>
  41.         <dependency>
  42.             <groupId>com.google.guava</groupId>
  43.             guava</artifactId>
  44.             <version>${guava.version}</version>
  45.         </dependency>
  46.         <dependency>
  47.             <groupId>dev.langchain4j</groupId>
  48.             langchain4j-open-ai</artifactId>
  49.         </dependency>
  50.         <dependency>
  51.             <groupId>dev.langchain4j</groupId>
  52.             langchain4j-reactor</artifactId>
  53.         </dependency>
  54.         <dependency>
  55.             <groupId>org.projectlombok</groupId>
  56.             lombok</artifactId>
  57.             <optional>true</optional>
  58.         </dependency>
  59.         <dependency>
  60.             <groupId>org.springframework.boot</groupId>
  61.             spring-boot-starter-test</artifactId>
  62.             <scope>test</scope>
  63.         </dependency>
  64.     </dependencies>
  65.     <build>
  66.         <plugins>
  67.             <plugin>
  68.                 <groupId>org.apache.maven.plugins</groupId>
  69.                 maven-compiler-plugin</artifactId>
  70.             </plugin>
  71.             <plugin>
  72.                 <groupId>org.springframework.boot</groupId>
  73.                 spring-boot-maven-plugin</artifactId>
  74.                 <configuration>
  75.                     <excludes>
  76.                         <exclude>
  77.                             <groupId>org.projectlombok</groupId>
  78.                             lombok</artifactId>
  79.                         </exclude>
  80.                     </excludes>
  81.                 </configuration>
  82.             </plugin>
  83.         </plugins>
  84.     </build>
  85. </project>
复制代码
4. 构建模型对象
  1. // 普通的对话模型
  2. private static ChatModel chatModel;
  3. // 流式对话的模型(可以模拟gpt的打字机效果)
  4. private static StreamingChatModel streamingChatModel;
  5. @BeforeAll
  6. public static void init_chat_model() {
  7.     chatModel = OpenAiChatModel
  8.             .builder()
  9.             // apikey 通过环境变量的方式注入,大家可以使用自己的apikey
  10.             .apiKey(System.getenv("LLM_API_KEY"))
  11.             .modelName("qwen-plus")
  12.             .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
  13.             .build();
  14.     streamingChatModel = OpenAiStreamingChatModel
  15.             .builder()
  16.             .apiKey(System.getenv("LLM_API_KEY"))
  17.             .modelName("qwen-plus")
  18.             .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
  19.             .build();
  20. }
复制代码
5. 返回字符串
  1. @Test
  2. public void should_return_str_when_use_normal_chat() {
  3.     String q = "你是谁";
  4.     String content = chatModel.chat(q);
  5.     log.info("call ai q: {}\na: {}", q, content);
  6. }
复制代码
测试结果如下:
  1. 22:12:37.807 [main] INFO com.ldx.langchaintest.lowapi.AiChatTest -- call ai q: 你是谁
  2. a: 我是通义千问,阿里巴巴集团旗下的超大规模语言模型。我能够回答问题、创作文字,比如写故事、公文、邮件、剧本等,还能进行逻辑推理、编程,甚至表达观点和玩游戏。我在多国语言上都有很好的掌握,能为你提供多样化的帮助。有什么我可以帮到你的吗?
复制代码
6. 返回流

这里使用flux对象接收流式返回的结果
如果想流式的返回给前端,也可以使用SSE的方式返回(代码注释的部分)
  1. @Test
  2. public void should_return_stream_when_use_stream_model() {
  3.     Sinks.Many<String> sinks = Sinks
  4.         .many()
  5.         .multicast()
  6.         .onBackpressureBuffer();
  7.     Flux<String> flux = sinks.asFlux();
  8.     StreamingChatResponseHandler streamingChatResponseHandler = new StreamingChatResponseHandler() {
  9.         @Override
  10.         public void onPartialResponse(String s) {
  11.             sinks.tryEmitNext(s);
  12.         }
  13.         @Override
  14.         public void onCompleteResponse(ChatResponse chatResponse) {
  15.             sinks.tryEmitComplete();
  16.         }
  17.         @Override
  18.         public void onError(Throwable throwable) {
  19.             sinks.tryEmitError(throwable);
  20.         }
  21.     };
  22. //        SseEmitter sse = new SseEmitter();
  23. //        final StreamingChatResponseHandler streamingChatResponseHandler = LambdaStreamingResponseHandler.onPartialResponseAndError(s -> {
  24. //            try {
  25. //                log.info("ai response stream data: {}", s);
  26. //                sse.send(s);
  27. //            } catch (IOException e) {
  28. //                throw new RuntimeException(e);
  29. //            }
  30. //        }, e -> sse.complete());
  31.     streamingChatModel.chat("你是谁", streamingChatResponseHandler);
  32.     flux
  33.         .toStream()
  34.         .forEach(partial -> log.info("ai response stream data: {}", partial));
  35. }
复制代码
测试结果如下:
  1. 22:45:26.442 [main] INFO com.ldx.langchaintest.lowapi.AiChatTest -- ai response stream data: 我是
  2. 22:45:26.444 [main] INFO com.ldx.langchaintest.lowapi.AiChatTest -- ai response stream data: 通
  3. 22:45:26.444 [main] INFO com.ldx.langchaintest.lowapi.AiChatTest -- ai response stream data: 义
  4. 22:45:26.541 [main] INFO com.ldx.langchaintest.lowapi.AiChatTest -- ai response stream data: 千问,阿里巴巴
  5. 22:45:26.771 [main] INFO com.ldx.langchaintest.lowapi.AiChatTest -- ai response stream data: 集团旗下的通义
  6. 22:45:26.790 [main] INFO com.ldx.langchaintest.lowapi.AiChatTest -- ai response stream data: 实验室自主研发的超
  7. 22:45:26.949 [main] INFO com.ldx.langchaintest.lowapi.AiChatTest -- ai response stream data: 大规模语言模型。
  8. 22:45:27.103 [main] INFO com.ldx.langchaintest.lowapi.AiChatTest -- ai response stream data: 我能够回答问题
  9. 22:45:27.199 [main] INFO com.ldx.langchaintest.lowapi.AiChatTest -- ai response stream data: 、创作文字,
  10. 22:45:27.320 [main] INFO com.ldx.langchaintest.lowapi.AiChatTest -- ai response stream data: 比如写故事、
  11. 22:45:27.482 [main] INFO com.ldx.langchaintest.lowapi.AiChatTest -- ai response stream data: 写公文、
  12. 22:45:27.586 [main] INFO com.ldx.langchaintest.lowapi.AiChatTest -- ai response stream data: 写邮件、写
  13. 22:45:27.789 [main] INFO com.ldx.langchaintest.lowapi.AiChatTest -- ai response stream data: 剧本、逻辑推理
  14. 22:45:27.863 [main] INFO com.ldx.langchaintest.lowapi.AiChatTest -- ai response stream data: 、编程等等,
  15. 22:45:27.982 [main] INFO com.ldx.langchaintest.lowapi.AiChatTest -- ai response stream data: 还能表达观点,
  16. 22:45:28.435 [main] INFO com.ldx.langchaintest.lowapi.AiChatTest -- ai response stream data: 玩游戏等。如果你
  17. 22:45:28.453 [main] INFO com.ldx.langchaintest.lowapi.AiChatTest -- ai response stream data: 有任何问题或需要
  18. 22:45:28.576 [main] INFO com.ldx.langchaintest.lowapi.AiChatTest -- ai response stream data: 帮助,欢迎随时
  19. 22:45:28.665 [main] INFO com.ldx.langchaintest.lowapi.AiChatTest -- ai response stream data: 告诉我!
复制代码
7. 提示词/模板

[code]@Testpublic void should_return_prompt_content_when_use_prompt() {    // 申明系统提示词    // SystemMessage systemMessage = Prompt.from("你是一名java专家,请协助用户解决相应的专业性问题").toSystemMessage();    // 申明提示词模板    final PromptTemplate promptTemplate = new PromptTemplate("""            
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册