AI创想
标题:
langchain4j(上)
[打印本页]
作者:
wuwuqiwu
时间:
2025-9-7 23:37
标题:
langchain4j(上)
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
本次学习使用 千文大模型
配置如下两种方式:
@ConfigurationpublicclassLLMConfig{@BeanpublicChatModelchatModelQwen(){returnOpenAiChatModel.builder().apiKey(System.getenv("aliQwen-api")).modelName("qwen-plus").baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1").build();}}
复制代码
langchain4j:open-ai:chat-model:api-key: ${aliQwen-api}model-name: qwen-plus
base-url: https://dashscope.aliyuncs.com/compatible-mode/v1
复制代码
注意:api-key一般不采取明文形式,可以采用
环境变量
或
专业密钥管理服务
5 创建一个父工程
5.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版本号可以被统一管理起来
https://docs.langchain4j.dev/get-started
--><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-bom</artifactId><version>${langchain4j.version}</version><type>pom</type><scope>import</scope></dependency><!--引入阿里云百炼平台依赖管理清单
https://docs.langchain4j.dev/integrations/language-models/dashscope
--><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 引入依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--langchain4j-open-ai 基础--><!--所有调用均基于 OpenAI 协议标准,实现一致的接口设计与规范LangChain4j 提供与许多 LLM 提供商的集成
从最简单的开始方式是从 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 配置
@ConfigurationpublicclassLLMConfig{@BeanpublicChatModelchatModelQwen(){returnOpenAiChatModel.builder().apiKey(System.getenv("aliQwen-api")).modelName("qwen-plus").baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1").build();}}
复制代码
6.3 controller
@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 引入依赖
<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 配置
@ConfigurationpublicclassLLMConfig{@Bean(name ="qwen")publicChatModelchatModelQwen(){returnOpenAiChatModel.builder().apiKey(System.getenv("aliQwen-api")).modelName("qwen-plus").baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1").build();}/**
* @Description: 知识出处,https://api-docs.deepseek.com/zh-cn/
* @Auther: zzyybs@126.com
*/@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
@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 引入依赖
<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 配置
langchain4j:open-ai:chat-model:api-key: ${aliQwen-api}model-name: qwen-plus
base-url: https://dashscope.aliyuncs.com/compatible-mode/v1
复制代码
8.3 声明式api
框架会自动为这个接口生成实现类,负责把你的方法调用转化为对大模型(如 OpenAI、Qwen 等)的实际请求。
你只需要注入并调用接口,无需关心底层 HTTP 请求、参数拼接、响应解析等细节。
@AiService//声明接口publicinterfaceChatAssistant{Stringchat(String prompt);}
复制代码
8.4 controller
@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 引入依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--langchain4j-open-ai 基础--><!--所有调用均基于 OpenAI 协议标准,实现一致的接口设计与规范LangChain4j 提供与许多 LLM 提供商的集成
从最简单的开始方式是从 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 配置
@ConfigurationpublicclassLLMConfig{@Bean(name ="qwen")publicChatModelchatModelQwen(){returnOpenAiChatModel.builder().apiKey(System.getenv("aliQwen-api")).modelName("qwen-plus").baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1").build();}/**
* @Description: 知识出处,https://api-docs.deepseek.com/zh-cn/
* @Auther: zzyybs@126.com
*/@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:
/*我们知道,按照Java开发一般习惯,有接口就要有实现类
比如接口ChatAssistant,就会有实现类ChatAssistantImpl
现在用高阶api-AIServics不用你自己写impl实现类,交给langchain4j给你搞定
本次配置用的是langchain4j原生整合,没有引入sprinboot,不需要接口头上配置@AiService注解标签
*/publicinterfaceChatAssistant{Stringchat(String prompt);}
复制代码
@RestController@Slf4jpublicclassHighApiController{@ResourceprivateChatAssistant chatAssistant;@GetMapping(value ="/highapi/highapi")publicStringhighApi(@RequestParam(value ="prompt", defaultValue ="你是谁")String prompt){return chatAssistant.chat(prompt);}}
复制代码
低阶api:
@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/**
* @Description: Token 用量计算的底层api演示验证案例
* @Auther: zzyybs@126.com
*/@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);
result = result +"\t\n"+tokenUsage;return result;}}
复制代码
10 子模块05-模型参数
10.1 引入依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--langchain4j-open-ai 基础--><!--所有调用均基于 OpenAI 协议标准,实现一致的接口设计与规范LangChain4j 提供与许多 LLM 提供商的集成
从最简单的开始方式是从 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 配置
@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 监听器
@Slf4jpublicclassTestChatModelListenerimplementsChatModelListener{@OverridepublicvoidonRequest(ChatModelRequestContext requestContext){// onRequest配置的k:v键值对,在onResponse阶段可以获得,上下文传递参数好用String uuidValue =IdUtil.simpleUUID();
requestContext.attributes().put("TraceID",uuidValue);
log.info("请求参数requestContext:{}", requestContext+"\t"+uuidValue);}@OverridepublicvoidonResponse(ChatModelResponseContext responseContext){Object object = responseContext.attributes().get("TraceID");
log.info("返回结果responseContext:{}", object);}@OverridepublicvoidonError(ChatModelErrorContext errorContext){
log.error("请求异常ChatModelErrorContext:{}", errorContext);}}
复制代码
10.4 controller
@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
欢迎光临 AI创想 (http://llms-ai.com/)
Powered by Discuz! X3.4