在上一篇文章中,我们介绍了如何使用langchain4j实现简单的问答功能,本篇文章我们将介绍如何在springboot中使用AIService。
1.实现原理
先看下@AiService注解所在的依赖langchain4j-spring-boot-starter中包含什么内容:
1.1 event.AiServiceRegisteredEvent
这个类实现了ApplicationEvent,它的作用是当一个AiService被注册时触发的事件。
1.2 @AiService
本篇主要需使用的注解,作用是将一个接口标记为AiService,通过这个注解可以将一个接口转换为一个AiService对象,这个对象可以用于调用langchain4j提供的各种功能。
1.3 AiServiceFactory
AiServiceFactory类实现了FactoryBean接口,表示这是一个Spring工厂Bean,包含了AiService的各种依赖组件和配置,可以通过这个方法创建AiService对象。
1.4 ClassPathAiServiceScanner
这个类的主要功能是扫描类路径中的Bean定义,并筛选出带有AiService注解的接口
1.5 AiServiceScannerProcessor
这个类实现了BeanDefinitionRegistryPostProcessor接口,主要功能是负责定义扫描当前项目的类路径,移除不需要的AiService配置。
1.6 AiServicesAutoConfig
这个类主要功能是将上下文中的所有组件用于配置和注册AiService的Bean,并在完成后发布相关注册的事件。
2.AiService的简单实现
2.1 配置文件
yml
langchain4j:
open-ai:
chat-model:
api-key: ${API_KEY}
base-url: https://api.deepseek.com/v1
model-name: deepseek-chat
log-requests: true
log-responses: true
temperature: 0.5
max-tokens: 4096
2.2 定义接口
写一个简单的接口,使用@AiService注解标注
java
@AiService
public interface Assistant {
@SystemMessage("你是一位编程专家,你的名字叫小小明")
String chat(String userMessage);
}
3. 使用AiService
java
@RestController
public class ChatController {
@Resource
ChatLanguageModel chatLanguageModel;
@Resource
Assistant assistant;
@GetMapping("/chat")
public String model(@RequestParam(value = "message") String message) {
return chatLanguageModel.chat(message);
}
@GetMapping("/chatWithService")
public String service(@RequestParam(value = "message") String message) {
return assistant.chat(message);
}
}
4. 测试一下
启动项目,用postman调用接口进行测试:
5. 在项目中使用多个模型
5.1 pom.xml
langchain4j支持使用多个模型,我们更新一下pom.xml文件,添加dashscope的依赖。
xml
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-community-dashscope-spring-boot-starter</artifactId>
<version>${langchain4j.version}</version>
</dependency>
5.2 配置文件
这里我们配置了两个模型,一个是deepseek-chat,一个是qwen-plus。
yaml
langchain4j:
open-ai:
chat-model:
api-key: ${API_KEY}
base-url: https://api.deepseek.com/v1
model-name: deepseek-chat
log-requests: true
log-responses: true
temperature: 0.5
max-tokens: 4096
community:
dashscope:
chat-model:
api-key: ${API_KEY}
model-name: qwen-plus
temperature: 0.5
max-tokens: 4096
logging.level.dev.langchain4j: DEBUG
5.3 定义接口
然后我们定义两个接口,一个是dashscope的,一个是openai的。
java
@AiService(wiringMode = EXPLICIT, chatModel = "qwenChatModel")
public interface DashscopeAssistant {
@SystemMessage("你是一位编程专家,名字是kitty")
String chat(String userMessage);
}
@AiService(wiringMode = EXPLICIT, chatModel = "openAiChatModel")
public interface DeepseekAssistant {
@SystemMessage("你是一位画家,名字是tom")
String chat(String userMessage);
}
5.4 使用
最后我们在controller中注入这两个接口,分别调用。
java
@RestController
public class ChatController {
@Resource
DashscopeAssistant dashscopeAssistant;
@Resource
DeepseekAssistant deepseekAssistant;
@GetMapping("/chatWithQwen")
public String qwen(@RequestParam(value = "message") String message) {
return dashscopeAssistant.chat(message);
}
@GetMapping("/chatWithDeepseek")
public String deepseek(@RequestParam(value = "message") String message) {
return deepseekAssistant.chat(message);
}
}
6.测试多个AIService