LangChain4j概述与基本使用
LangChain4j概述与基本使用
LangChain4j等价于LangChain For java,即为你的java应用赋能大模型能力
LangChain4j概述
LangChain4j的目标是简化LLM集成到Java应用程序中的过程
LangChain4j简化LLM集成到java的方式
- 统一API: LLM提供商和嵌入(向量)存储使用专有API。LangChain4j提供统一的API,避免了学习和实现每个特定API的需求。
- 全面的工具箱: 社区一直在构建众多LLM驱动应用程序,识别常见的抽象、模式、技术。LangChain4j将这些提炼成一个即用依赖包。工具箱(依赖包)包含从低级提示模版、聊天记忆管理和函数调用到高级模式如代理和RAG工具。
- 丰富的示例: 官方文档中展示了如何开始创建各种LLM驱动的应用程序,提供灵感并使你快速开始构建。
LangChain4j技术引入后对java框架的影响
相较于之前java微服务框架与大模型框架是相对独立的,java调用大模型应用需要编写很多粘合代码,LangChain4j和SpringAI的出现降低了java集成大模型的开发成本,提供了统一的API
大语言模型(LLM)应用技术架构
大语言言模型应用技术架构分为4层
- 应用层(Application Layer): 直接面向用户的产品形态,将前三层的能力包装成解决实际问题的具体应用
- 框架与工具层(Framework&Tool Layer): 连接"大脑"和"手脚"的神经系统,负责编排、增强、控制模型的能力,使其能完成复杂任务。
- 模型层(Model Layer): 提供核心智能的"大脑本身",包括各种大模型及其服务形式
- 基础设施层(Infrastructure Layer): 整个技术栈的基石,提供大模型和应用所需的底层计算、存储和网络资源
自上而下是"调用"关系,自下而上是"支撑"关系,大多数应用开发者和创业者主要聚焦在最上面两层,利用下层提供的强大能力,结合垂直领域的数据和场景,构建创新的AI应用。
LangChain4j的功能
具体功能详情参见官网,这里只列出功能点
-
集成15+个LLM提供商
-
集成20+个嵌入(向量)存储
-
集成15+个嵌入模型
-
集成5个图像生成模型
-
集成2个评分(重排序)模型
-
集成一个审核模型(OpenAI)
-
支持文本和图像作为输入(多模态)
-
AI服务(高阶LLM API)
-
提示模版
-
实现持久化和内容中的聊天记忆算法: 消息窗口和令牌窗口
-
从LLM流式传输响应
-
用于常见Java类型和自定义POJO的输出解析器
-
工具(函数调用)
-
动态工具(执行动态生成的LLM代码)
-
RAG(检索增强生成)
- 提取:
- 从多个来源导入各种类型的文档
- 使用多种分割算法将文档分割成更小的段落
- 文档和短路的后处理
- 使用嵌入模型嵌入段落
- 在嵌入(向量)存储中存储嵌入
- 检索:
- 查询转换
- 查询路由
- 从向量存储或任意自定义源检索
- 重排序
- 倒数排名融合
- 自定义RAG流程中的每个步骤
- 提取:
-
文本分类
-
用于分词和估算token数的工具
-
Kotlin扩展: 使用Kotlin的协程功能异步非阻塞处理聊天交换
LangChain4j的两个抽象层次
- 低层次(基础层次): 在这个层次上,开发者拥有最大的自由度和访问所有低级(基础)组件的权限。如ChatLanguageModel、UserMessage、AIMessage、EmbeddingStore、Embedding等。这些是LLM驱动应用程序的"原语"。开发者可以完全控制如何组合,但需要编写更多的粘合代码
- 高层次: 在这个层次上,开发者使用高级API(如API服务)与LLM交互,它隐藏了所有复杂性和样板代码。开发者仍然可以灵活性地调整和微调,但是需要以声明式方式完成
LangChain4j的使用场景
- 自定义的AI驱动的聊天机器人,访问自身数据并按照预期行事。eg:客户支持聊天机器人,教育类助手
- 从非结构化数据(文件、网页)中提取结构化信息。eg:从客户评论和支持聊天历史中提取见解,从竞争对手的网址提取有趣信息,从求职者简历中提取见解
- 生成信息。eg:为每个用户定制电子邮件,为网站生成内容
- 转换信息。eg:总结、校对和重写、翻译
LangChain4j的基本使用
基本使用主要以代码示例为主,演示LangChain4j原生整合与Langchain4j与springboot集成两种整合方式,分成两个模块
使用前提
大模型选择与配置API-KEY环境变量
由于需要大模型的能力,因此需要选择模型并设置API-KEY,这里以阿里云百炼平台、DeepSeek开发平台为例
大模型平台网址
这里提供阿里云百炼平台与DeepSeek开发平台的网址,自行进行用户开通与API-KEY的构建
阿里云百炼平台:https://bailian.console.aliyun.com/
DeepSeek开发平台:https://platform.deepseek.com/
环境变量中添加API-KEY
由于API-KEY属于敏感信息不应该出现在代码中,因此配置到环境变量中
此电脑右键属性->高级系统设置->环境变量
在系统变量中新建一个API-KEY变量,用于后需java程序读环境变量进行API-KEY值获取
引入物料清单
在父项目中引入物料清单,用于子模块中引入相关依赖时的版本号识别,避免两个依赖因版本问题导致不兼容的问题
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>21</java.version>
<!--Spring Boot-->
<spring-boot.version>3.5.3</spring-boot.version>
<!--LangChain4J-->
<langchain4j.version>1.0.0-beta3</langchain4j.version>
</properties>
<!-- <dependencyManagement> 是一个声明和集中管理依赖版本和配置的机制(物料清单)。它本身并不引入实际的依赖,而是为依赖提供一个“模板”或“蓝图”-->
<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-->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-bom</artifactId>
<version>${langchain4j.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
LangChain4j原生整合的基本使用
提供两种抽象层次的API调用即高低阶调用API,高阶API调用需要声明AI服务
引用依赖
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--快速构建一个基于 Spring MVC 的 Web 应用程序而预置的一组依赖项的集合-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--LangChain4J openAI集成依赖-->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
</dependency>
<!--LangChain4J 高级AI服务API依赖-->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
</dependency>
<!--一个通过注解在编译时自动生成 Java 样板代码的库-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--对 Spring Boot 应用程序进行全面测试而预置的一组测试相关依赖项的集合-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
配置类
import com.shen.langchain4j.service.ChatAssistant;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 大模型配置类
*/
@Configuration
public class LLMConfig {
@Bean(value = "qwen")
public ChatLanguageModel chatLanguageModelQwen() {
return OpenAiChatModel.builder()
.apiKey(System.getenv("aliyunQwen-apiKey"))
.modelName("qwen-plus-2025-04-28")
.baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
.build();
}
@Bean(value = "deepseek")
public ChatLanguageModel chatLanguageModelDeepseek() {
return OpenAiChatModel.builder()
.apiKey(System.getenv("DeepSeek-apiKey"))
.modelName("deepseek-chat")
.baseUrl("https://api.deepseek.com/v1")
.build();
}
@Bean
public ChatAssistant chatAssistant(@Qualifier(value = "qwen") ChatLanguageModel chatLanguageModel) {
return AiServices.create(ChatAssistant.class, chatLanguageModel);
}
}
低阶API控制层接口
/**
* 低价API使用控制层接口
*/
@Slf4j
@RestController
@RequestMapping(value = "/lowApi")
public class LowApiController {
@Autowired
@Qualifier(value = "qwen")
private ChatLanguageModel qwenModel;
@Autowired
@Qualifier(value = "deepseek")
private ChatLanguageModel deepseekModel;
/**
* 常规提问大模型
*
* @param prompt 提示词
* @return 大模型回答
*/
@GetMapping(value = "/one")
public String lowApiOne(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt) {
return qwenModel.chat(prompt);
}
/**
* 返回token消耗量
*
* @param prompt 提示词
* @return token销毁
*/
@GetMapping(value = "/two")
public String lowApiTwo(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt) {
ChatResponse chatResponse = qwenModel.chat(UserMessage.from(prompt));
log.info("大模型输出结果为: {}", chatResponse.aiMessage().text());
return chatResponse.metadata().tokenUsage().toString();
}
}
声明式AI(高阶API)服务接口
/**
* 声明式AI服务业务接口
*/
public interface ChatAssistant {
String chat(String prompt);
}
高阶API(声明式AI)控制层接口
import com.shen.langchain4j.service.ChatAssistant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* 高阶API使用控制层接口
*/
@Slf4j
@RestController
@RequestMapping(value = "/highApi")
public class HighApiController {
@Autowired
private ChatAssistant chatAssistant;
@GetMapping("/one")
public String highApiOne(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt) {
return chatAssistant.chat(prompt);
}
}
LangChain4j与springboot集成的基本使用
springboot启动器通过属性配置帮助创建和配置语言模型、嵌入模型、嵌入存储和其他LangChain4j核心组件,相比原生整合的配置类,使用配置文件的方式更具便捷性
引用依赖
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--快速构建一个基于 Spring MVC 的 Web 应用程序而预置的一组依赖项的集合-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--一个通过注解在编译时自动生成 Java 样板代码的库-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--对 Spring Boot 应用程序进行全面测试而预置的一组测试相关依赖项的集合-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--LangChain4J 与springboot集成依赖 流行的集成(低阶依赖)-->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
</dependency>
<!--LangChain4J 与springboot集成依赖 声明式AI服务(高阶依赖)-->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-spring-boot-starter</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
配置文件
# 不必新增配置类,直接在配置文件中添加参数
langchain4j:
open-ai:
chat-model:
api-key: ${aliyunQwen-apiKey}
model-name: qwen-plus-2025-04-28
base-url: https://dashscope.aliyuncs.com/compatible-mode/v1
低阶API控制层接口
import dev.langchain4j.model.chat.ChatLanguageModel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* 与springboot集成,流行集成的控制层接口
*/
@Slf4j
@RestController
@RequestMapping(value = "/popular")
public class PopularIntegrationsController {
@Autowired
private ChatLanguageModel chatLanguageModel;
@GetMapping("/chat")
public String chatModel(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt) {
return chatLanguageModel.chat(prompt);
}
}
声明式AI(高阶API)服务接口
import dev.langchain4j.service.spring.AiService;
/**
* 声明式AI服务业务接口
*/
@AiService
public interface ChatAssistant {
String chat(String prompt);
}
高阶API(声明式AI)控制层接口
import com.shen.langchain4j.service.ChatAssistant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* 与springboot集成,声明式AI服务的控制层接口
*/
@Slf4j
@RestController
@RequestMapping("/declarative")
public class DeclarativeAIServicesController {
@Autowired
private ChatAssistant chatAssistant;
@GetMapping("/chat")
public String chatModel(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt) {
return chatAssistant.chat(prompt);
}
}