开启左侧

langchain4j(上)

[复制链接]
wuwuqiwu 发表于 2025-9-7 23:37:24 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
langchain4j

1 langchain4j简介

LangChain4j 是一个 Java 版本的 LangChain 实现,旨在为 Java 开发者提供构建基于大语言模型(LLM)应用程序的工具和框架
官方文档:Introduction | LangChain4j
2 langchain框架层次说明:



用户界面层:用户与应用交互的入口层
    提供可视化操作界面,如聊天窗口、控制面板等接收用户输入(文本、语音、文件等)展示AI生成的响应结果
服务层/链层:业务流程编排与核心逻辑处理

  • FlowChain:管理复杂业务流程和工作流
      协调多个AI模型和服务的调用顺序处理条件分支和循环逻辑集成第三方服务(如图中的Zapier)

  • PromptChain:提示工程与优化
      动态构建和优化发送给AI模型的提示管理上下文和历史对话实现多步骤的提示策略

模型层:AI模型的核心运算层

  • 集成多种大语言模型(LLMs):
      通用语言模型(如GPT系列)专用领域模型多模态模型

  • 主要功能:
      自然语言理解与生成文本嵌入和向量化模型组合与协同

存储层:数据持久化与检索

  • 向量数据库
      存储文本嵌入向量支持高效相似度搜索实现长期记忆功能

  • 其他可能包含的存储:
      传统数据库(用户数据、配置等)缓存系统(Redis等)文件存储(文档、图片等)对话历史存储

3 langchain4j 两个抽象层次:

低层次:在这个层次上,您拥有最大的自由度和访问所有低级组件的权限,如 ChatLanguageModel、UserMessage、AiMessage、EmbeddingStore、Embedding 等。 这些是您的 LLM 驱动应用程序的"原语"。 您可以完全控制如何组合它们,但需要编写更多的粘合代码。
高层次:高层次。在这个层次上,您使用高级 API(如 AI 服务)与 LLM 交互, 它隐藏了所有复杂性和样板代码。 您仍然可以灵活地调整和微调行为,但是以声明式方式完成。


4 大模型调用三件套

api-key model-name base-url
本次学习使用 千文大模型
配置如下两种方式:
  1. @ConfigurationpublicclassLLMConfig{@BeanpublicChatModelchatModelQwen(){returnOpenAiChatModel.builder().apiKey(System.getenv("aliQwen-api")).modelName("qwen-plus").baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1").build();}}
复制代码
  1. langchain4j:open-ai:chat-model:api-key: ${aliQwen-api}model-name: qwen-plus
  2.       base-url: https://dashscope.aliyuncs.com/compatible-mode/v1
复制代码
注意:api-key一般不采取明文形式,可以采用环境变量专业密钥管理服务
5 创建一个父工程

5.1 引入依赖
  1. <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>17</java.version><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><!-- Spring Boot --><spring-boot.version>3.5.0</spring-boot.version><!-- langchain4j --><langchain4j.version>1.0.1</langchain4j.version><!--langchain4j-community 引入阿里云百炼平台依赖管理清单--><langchain4j-community.version>1.0.1-beta6</langchain4j-community.version><!-- maven plugin --><maven-deploy-plugin.version>3.1.1</maven-deploy-plugin.version><flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version><maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version></properties><dependencyManagement><dependencies><!-- Spring Boot --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!--langchain4j的依赖清单,加载BOM后所有langchain4j版本号可以被统一管理起来
  2.         https://docs.langchain4j.dev/get-started
  3.         --><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-bom</artifactId><version>${langchain4j.version}</version><type>pom</type><scope>import</scope></dependency><!--引入阿里云百炼平台依赖管理清单
  4.        https://docs.langchain4j.dev/integrations/language-models/dashscope
  5.        --><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-community-bom</artifactId><version>${langchain4j-community.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
复制代码
6 子模块01-调用简单千问大模型

6.1 引入依赖
  1. <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--langchain4j-open-ai 基础--><!--所有调用均基于 OpenAI 协议标准,实现一致的接口设计与规范LangChain4j 提供与许多 LLM 提供商的集成
  2.         从最简单的开始方式是从 OpenAI 集成开始https://docs.langchain4j.dev/get-started    --><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai</artifactId></dependency><!--langchain4j 高阶--><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j</artifactId></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--test--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
复制代码
6.2 配置
  1. @ConfigurationpublicclassLLMConfig{@BeanpublicChatModelchatModelQwen(){returnOpenAiChatModel.builder().apiKey(System.getenv("aliQwen-api")).modelName("qwen-plus").baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1").build();}}
复制代码
6.3 controller
  1. @RestController@Slf4jpublicclassHelloLangChain4JController{// http://localhost:9001/langchain4j/hello?question=如何学习java@ResourceprivateChatModel chatModel;@GetMapping(value ="/langchain4j/hello")publicStringhello(@RequestParam(value ="question",defaultValue ="你是谁")String question){String result = chatModel.chat(question);System.out.println("调用大模型回复: "+result);return result;}}
复制代码
7 子模块02-多模型共存

千问+deepseek
7.1 引入依赖
  1. <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai</artifactId></dependency><!--langchain4j 高阶--><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j</artifactId></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--test--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
复制代码
7.2 配置
  1. @ConfigurationpublicclassLLMConfig{@Bean(name ="qwen")publicChatModelchatModelQwen(){returnOpenAiChatModel.builder().apiKey(System.getenv("aliQwen-api")).modelName("qwen-plus").baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1").build();}/**
  2.     * @Description: 知识出处,https://api-docs.deepseek.com/zh-cn/
  3.     * @Auther: zzyybs@126.com
  4.     */@Bean(name ="deepseek")publicChatModelchatModelDeepSeek(){returnOpenAiChatModel.builder().apiKey(System.getenv("deepseek-api")).modelName("deepseek-chat")//.modelName("deepseek-reasoner").baseUrl("https://api.deepseek.com/v1").build();}}
复制代码
7.3 controller
  1. @RestController@Slf4jpublicclassMultiModelController{@Resource(name ="qwen")privateChatModel chatModelQwen;@Resource(name ="deepseek")privateChatModel chatModelDeepSeek;// http://localhost:9002/multimodel/qwen@GetMapping(value ="/multimodel/qwen")publicStringqwenCall(@RequestParam(value ="prompt", defaultValue ="你是谁")String prompt){String result = chatModelQwen.chat(prompt);System.out.println("通过langchain4j调用模型返回结果:\n"+result);return result;}// http://localhost:9002/multimodel/deepseek@GetMapping(value ="/multimodel/deepseek")publicStringdeepseekCall(@RequestParam(value ="prompt", defaultValue ="你是谁")String prompt){String result = chatModelDeepSeek.chat(prompt);System.out.println("通过langchain4j调用模型返回结果:\n"+result);return result;}}
复制代码
8 子模块03-langchain4j整合springboot

8.1 引入依赖
  1. <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--langchain4j-open-ai 基础--><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai</artifactId></dependency><!--langchain4j 高阶--><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j</artifactId></dependency><!--1 LangChain4j 整合boot底层支持--><!--   https://docs.langchain4j.dev/tutorials/spring-boot-integration  --><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai-spring-boot-starter</artifactId></dependency><!--2 LangChain4j 整合boot高阶支持--><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-spring-boot-starter</artifactId></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--test--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
复制代码
8.2 配置
  1. langchain4j:open-ai:chat-model:api-key: ${aliQwen-api}model-name: qwen-plus
  2.       base-url: https://dashscope.aliyuncs.com/compatible-mode/v1
复制代码


8.3 声明式api

框架会自动为这个接口生成实现类,负责把你的方法调用转化为对大模型(如 OpenAI、Qwen 等)的实际请求。
你只需要注入并调用接口,无需关心底层 HTTP 请求、参数拼接、响应解析等细节。
  1. @AiService//声明接口publicinterfaceChatAssistant{Stringchat(String prompt);}
复制代码
8.4 controller
  1. @RestControllerpublicclassDeclarativeAIServiceController{@ResourceprivateChatAssistant chatAssistantQwen;// http://localhost:9003/lc4j/boot/declarative@GetMapping(value ="/lc4j/boot/declarative")publicStringdeclarative(@RequestParam(value ="prompt", defaultValue ="你是谁")String prompt){return chatAssistantQwen.chat(prompt);}}
复制代码
9 子模块04-低高阶api

低阶API:
    直接操作底层对象和数据结构,如 ChatRequest、ChatResponse、UserMessage、TokenUsage 等。
    你需要自己构造请求、解析响应、管理消息类型,甚至手动处理 token 用量等底层细节。
    灵活性高,可以实现更复杂的自定义逻辑,但代码量大、开发效率低。
高阶API:
    只需调用业务接口(如 chatAssistant.chat(prompt)),无需关心底层实现和数据结构。
    框架自动帮你完成请求构造、响应解析、异常处理等。
    开发效率高,代码简洁,解耦性好,适合大多数业务场景。
9.1 引入依赖
  1. <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--langchain4j-open-ai 基础--><!--所有调用均基于 OpenAI 协议标准,实现一致的接口设计与规范LangChain4j 提供与许多 LLM 提供商的集成
  2.     从最简单的开始方式是从 OpenAI 集成开始https://docs.langchain4j.dev/get-started    --><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai</artifactId></dependency><!--langchain4j 高阶--><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j</artifactId></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--test--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
复制代码
9.2 配置
  1. @ConfigurationpublicclassLLMConfig{@Bean(name ="qwen")publicChatModelchatModelQwen(){returnOpenAiChatModel.builder().apiKey(System.getenv("aliQwen-api")).modelName("qwen-plus").baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1").build();}/**
  2.     * @Description: 知识出处,https://api-docs.deepseek.com/zh-cn/
  3.     * @Auther: zzyybs@126.com
  4.     */@Bean(name ="deepseek")publicChatModelchatModelDeepSeek(){returnOpenAiChatModel.builder().apiKey(System.getenv("deepseek-api")).modelName("deepseek-chat")//.modelName("deepseek-reasoner").baseUrl("https://api.deepseek.com/v1").build();}// High-Api https://docs.langchain4j.dev/tutorials/ai-services#simplest-ai-service@BeanpublicChatAssistantchatAssistant(@Qualifier("qwen")ChatModel chatModelQwen){returnAiServices.create(ChatAssistant.class, chatModelQwen);}}
复制代码
9.3 controller

高阶api:
  1. /*我们知道,按照Java开发一般习惯,有接口就要有实现类
  2.   比如接口ChatAssistant,就会有实现类ChatAssistantImpl
  3.   现在用高阶api-AIServics不用你自己写impl实现类,交给langchain4j给你搞定
  4.   本次配置用的是langchain4j原生整合,没有引入sprinboot,不需要接口头上配置@AiService注解标签
  5. */publicinterfaceChatAssistant{Stringchat(String prompt);}
复制代码
  1. @RestController@Slf4jpublicclassHighApiController{@ResourceprivateChatAssistant chatAssistant;@GetMapping(value ="/highapi/highapi")publicStringhighApi(@RequestParam(value ="prompt", defaultValue ="你是谁")String prompt){return chatAssistant.chat(prompt);}}
复制代码
低阶api:
  1. @RestController@Slf4jpublicclassLowApiController{@Resource(name ="qwen")privateChatModel chatModelQwen;@Resource(name ="deepseek")privateChatModel chatModelDeepSeek;@GetMapping(value ="/lowapi/api01")publicStringapi01(@RequestParam(value ="prompt", defaultValue ="你是谁")String prompt){String result = chatModelQwen.chat(prompt);System.out.println("通过langchain4j调用模型返回结果:"+result);return result;}// http://localhost:9004/lowapi/api02/**
  2.     * @Description: Token 用量计算的底层api演示验证案例
  3.     * @Auther: zzyybs@126.com
  4.     */@GetMapping(value ="/lowapi/api02")publicStringapi02(@RequestParam(value ="prompt", defaultValue ="你是谁")String prompt){ChatResponse chatResponse = chatModelDeepSeek.chat(UserMessage.from(prompt));String result = chatResponse.aiMessage().text();System.out.println("通过调用大模型返回结果:"+result);// Token 用量计算的底层apiTokenUsage tokenUsage = chatResponse.tokenUsage();System.out.println("本次调用消耗的token:"+tokenUsage);
  5.         result = result +"\t\n"+tokenUsage;return result;}}
复制代码
10 子模块05-模型参数



10.1 引入依赖
  1. <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--langchain4j-open-ai 基础--><!--所有调用均基于 OpenAI 协议标准,实现一致的接口设计与规范LangChain4j 提供与许多 LLM 提供商的集成
  2.     从最简单的开始方式是从 OpenAI 集成开始https://docs.langchain4j.dev/get-started    --><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai</artifactId></dependency><!--langchain4j 高阶--><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j</artifactId></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--hutool--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.22</version></dependency><!--test--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
复制代码
10.2 配置
  1. @ConfigurationpublicclassLLMConfig{@Bean(name ="qwen")publicChatModelchatModelQwen(){returnOpenAiChatModel.builder().apiKey(System.getenv("aliQwen-api")).modelName("qwen-plus").baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1").logRequests(true)// 日志级别设置为debug才有效.logResponses(true)// 日志级别设置为debug才有效.listeners(List.of(newTestChatModelListener())).maxRetries(2)//重试机制,重试次数.timeout(Duration.ofSeconds(2))//向大模型发送请求时,如在指定时间内没有收到响应,该请求将被中断并报request timed out.build();}//    监听器的具体作用://    审计日志//      记录所有模型调用记录到数据库,用于合规审查。//    限流与熔断//      在 onError 中统计失败率,触发熔断机制(如暂停调用)。//    缓存层//      在 onResponse 中缓存高频问题的回答,减少模型调用。//    敏感词过滤//      在 onRequest 中检测用户输入是否合规}
复制代码
10.3 监听器
  1. @Slf4jpublicclassTestChatModelListenerimplementsChatModelListener{@OverridepublicvoidonRequest(ChatModelRequestContext requestContext){// onRequest配置的k:v键值对,在onResponse阶段可以获得,上下文传递参数好用String uuidValue =IdUtil.simpleUUID();
  2.         requestContext.attributes().put("TraceID",uuidValue);
  3.         log.info("请求参数requestContext:{}", requestContext+"\t"+uuidValue);}@OverridepublicvoidonResponse(ChatModelResponseContext responseContext){Object object = responseContext.attributes().get("TraceID");
  4.         log.info("返回结果responseContext:{}", object);}@OverridepublicvoidonError(ChatModelErrorContext errorContext){
  5.         log.error("请求异常ChatModelErrorContext:{}", errorContext);}}
复制代码
10.4 controller
  1. @RestController@Slf4jpublicclassModelParameterController{@ResourceprivateChatModel chatModelQwen;// http://localhost:9005/modelparam/config@GetMapping(value ="/modelparam/config")publicStringconfig(@RequestParam(value ="prompt", defaultValue ="你是谁")String prompt){String result = chatModelQwen.chat(prompt);System.out.println("通过langchain4j调用模型返回结果:"+result);return result;}}
复制代码
学习资料:https://www.bilibili.com/video/BV1mX3NzrEu6
https://docs.langchain4j.dev/intro
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题
阅读排行更多+

Powered by Discuz! X3.4© 2001-2013 Discuz Team.( 京ICP备17022993号-3 )