一、介绍
LangChain4j 是一个专为 Java 和 Kotlin 开发者设计的开源 AI 框架,旨在简化和加速基于大语言模型(LLM)的应用程序开发。它是广受欢迎的 Python 库 LangChain 的官方 Java 实现,致力于将 LangChain 的强大功能与设计理念完整地带入 JVM 生态系统。它是一个模块化的 AI 开发工具包,提供了一套完整的组件和 API,帮助开发者快速构建智能应用。
通过 LangChain4j,Java 开发者可以轻松地将大语言模型集成到企业级应用中,无需从零构建复杂的底层逻辑。
二、简单对话调用实现步骤
1. 引入LangChain4j依赖
<!-- https://mvnrepository.com/artifact/dev.langchain4j/langchain4j-open-ai -->
<!--LangChain4j依赖 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
<version>1.1.0</version>
</dependency>
2. 获取Api Key 和 Base url
阿里云百炼平台访问地址:https://bailian.console.aliyun.com

配置环境变量:

到模型广场找想使用的大模型的base url:

3. 构建OpenAiChatModel对象,调用chat方法
@SpringBootTest
class Langchain4jDemoApplicationTests {
public static void main(String[] args) {
// 创建OpenAiChatModel模型对象
OpenAiChatModel model = OpenAiChatModel.builder()
.baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1") // 模型地址
.apiKey(System.getenv("API-KEY")) // 获取系统环境变量的API-KEY
.modelName("qwen-plus") // 模型名称
.build(); // 构建模型对象
// 调用模型对象chat方法,获取模型结果
System.out.println(model.chat("你好"));
}
}
注意:设置完环境变量后要重启编辑器
运行获取输出结果:

添加请求和响应信息打印:
.logRequests(true) // 打印请求信息
.logResponses(true) // 打印响应信息

三、完整会话功能实现步骤
1. 会话功能
Springboot项目勾选spring web起步依赖,添加下方LangChain4j起步依赖
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
<version>1.0.1-beta6</version>
</dependency>
配置application.yaml文件
langchain4j:
open-ai:
chat-model:
base-url: https://dashscope.aliyuncs.com/compatible-mode/v1
api-key: ${API-KEY}
model-name: qwen-plus
创建Controller类
@RestController
@RequestMapping("/api")
public class ChatController {
@Autowired
private OpenAiChatModel model;
@GetMapping("/chat")
public String chat(String message) {
return model.chat(message);
}
}
@RestController=@Controller + @ResponseBody
标明控制器,并表示所有方法的返回值都为HTTP响应体,通常为Json或文本格式
使用@Autowired注解,自动从容器中获取OpenAiChatModel类型的实例并注入到该变量中(OpenAiChatModel起步依赖已由springboot接管并自动配置)
@GetMapping("/chat"):表示该方法处理 HTTP GET 请求,完整访问路径为/api/chat
方法参数String message:Spring 会自动从请求参数中获取名为message的参数值并传入
调用OpenAiChatModel的chat方法,将接收的message作为输入发送给 OpenAI 模型,然后将模型返回的结果直接作为 HTTP 响应返回
测试效果:

2. 日志功能
修改application.yaml配置文件
langchain4j:
open-ai:
chat-model:
base-url: https://dashscope.aliyuncs.com/compatible-mode/v1
api-key: ${API-KEY}
model-name: qwen-plus
log-requests: true
log-responses: true
logging:
level:
dev.langchain4j: DEBUG
重新启动,进行测试:

日志输出如下:

四、AiServices工具类使用
(1)继续引入AiServices依赖
<!--AiServices依赖-->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-spring-boot-starter</artifactId>
<version>1.0.1-beta6</version>
</dependency>
(2)声明接口
package com.breeze.langchain4jdemo.service;
public interface ConsultantService {
// 用于聊天的方法
public String chat(String message);
}
(3)使用AiServices为接口创建代理对象
@Configuration
public class CommonConfig {
@Autowired
private OpenAiChatModel model;
@Bean
public ConsultantService consultantService(){
ConsultantService consultantService = AiServices.builder(ConsultantService.class)
.chatModel( model)
.build();
return consultantService;
}
}
@Configuration:标识该类是一个 Spring 配置类,用于定义 Bean(组件)并交给 Spring 容器管理。Spring 会扫描并加载该类中的配置,将其中定义的 Bean 注册到容器中。
@Autowired:自动从 Spring 容器中注入OpenAiChatModel类型的实例。OpenAiChatModel是 LangChain4J 提供的 OpenAI 聊天模型封装类,负责与 OpenAI API 交互。
@Bean:标识该方法会创建一个 Bean,并将其注册到 Spring 容器中。其他组件可以通过@Autowired自动注入ConsultantService实例使用。AiServices.builder(...):LangChain4J 提供的工具类,用于创建 “AI 增强的服务”。它可以将一个普通的接口(ConsultantService)与 AI 模型(如 OpenAI)绑定,让接口方法具备调用 AI 的能力。ConsultantService.class:传入一个接口类,LangChain4J 会为该接口生成实现类,实现类的方法会自动调用 AI 模型处理逻辑。.chatModel(model):指定使用注入的OpenAiChatModel作为底层 AI 模型,即接口方法的逻辑会通过该模型与 OpenAI 交互。.build():构建并返回ConsultantService的实例。
(4)控制器部分
@RestController
@RequestMapping("/api")
public class ChatController {
@Autowired
private ConsultantService consultantService;
@GetMapping("/chat")
public String chat(String message) {
return consultantService.chat(message);
}
}
@Autowired:从 Spring 容器中自动获取ConsultantService类型的实例并注入到该变量中。ConsultantService:一个自定义的服务接口(由AiServices生成实现类,结合了 AI 模型能力),用于处理聊天逻辑并与 AI 模型交互。
仍然正常响应:

方法二:使用声明式注解
去掉config配置类,直接使用@AiServices注解即可
@AiService
public interface ConsultantService {
// 用于聊天的方法
public String chat(String message);
}
其他部分不变,成功运行
五、流式调用
(1)引入依赖
<!--流式调用依赖·-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-reactor</artifactId>
<version>1.0.1-beta6</version>
</dependency>
(2)配置流式模型对象
langchain4j:
open-ai:
chat-model:
base-url: https://dashscope.aliyuncs.com/compatible-mode/v1
api-key: ${API-KEY}
model-name: qwen-plus
log-requests: true
log-responses: true
streaming-chat-model:
base-url: https://dashscope.aliyuncs.com/compatible-mode/v1
api-key: ${API-KEY}
model-name: qwen-plus
log-requests: true
log-responses: true
logging:
level:
dev.langchain4j: DEBUG
(3)切换接口中方法的返回值类型
@AiService(
wiringMode = AiServiceWiringMode.EXPLICIT,
chatModel = "openAiChatModel",
streamingChatModel = "openAiStreamingChatModel"
)
public interface ConsultantService {
// 用于聊天的方法
public Flux<String> chat(String message);
}
(4)修改Controller
返回值修改为Flux<String> ,produces = "text/html;charset=utf-8"防止乱码
@RestController
@RequestMapping("/api")
public class ChatController {
@Autowired
private ConsultantService consultantService;
@GetMapping(value = "/chat",produces = "text/html;charset=utf-8")
public Flux<String> chat(String message) {
return consultantService.chat(message);
}
流式输出实现效果:

六、消息注解
@SystemMessage
在业务层方法上添加@SystemMessage注解实现系统角色设定:
public interface ConsultantService {
// 用于聊天的方法
@SystemMessage("你是一个吉他手,很擅长弹吉他")
public Flux<String> chat(String message);
}
测试效果:

--------配置文件形式--------
在resources下创建配置文件 .txt 文件内容按照实际需求写

业务类方法注解给出文件路径
public interface ConsultantService {
// 用于聊天的方法
@SystemMessage(fromResource = "system.txt")
public Flux<String> chat(String message);
}
测试效果:


由此可见,大模型已经完全按照预设的格式输出内容,对于不相关的问题拒绝回答。
@UserMessage
在业务层方法上添加@UserMessage注解实现用户角色设定:
public interface ConsultantService {
// @SystemMessage(fromResource = "system.txt")
@UserMessage("你是一位厨师,{{it}}")
public Flux<String> chat(String message);
}
实现效果:

使用@V注解修改占位词

后续--> 会话记忆+RAG+Tools 即将出炉,期待下一篇文章!

1万+

被折叠的 条评论
为什么被折叠?



