【LangChain4j】大模型实战-SpringBoot(阿里云百炼控制台)
一、介绍
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/v1api-key: ${API-KEY}model-name: qwen-plus
创建Controller类
@RestController
@RequestMapping("/api")
public class ChatController {@Autowiredprivate 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/v1api-key: ${API-KEY}model-name: qwen-pluslog-requests: truelog-responses: truelogging: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 {@Autowiredprivate OpenAiChatModel model;@Beanpublic 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 {@Autowiredprivate 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/v1api-key: ${API-KEY}model-name: qwen-pluslog-requests: truelog-responses: truestreaming-chat-model:base-url: https://dashscope.aliyuncs.com/compatible-mode/v1api-key: ${API-KEY}model-name: qwen-pluslog-requests: truelog-responses: truelogging: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 {@Autowiredprivate 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 即将出炉,期待下一篇文章!