目录
介绍
我们提出了另一种为 Java 量身定制的解决方案,称为 AI 服务。 其思想是将与 LLM 和其他组件交互的复杂性隐藏在简单的 API 后面。
AiService有两种使用方式,一种是注解型,一种装配型
AiService的作用
AI 服务处理最常见的操作:
-
为 LLM 格式化输入
-
解析 LLM 的输出
它们还支持更高级的功能:
-
聊天记忆
-
工具
-
RAG
这里我们先介绍如何使用@AiService
,接下来的博客将逐一介绍相应的功能
AiService使用方法
项目结构如下
这里主要是需要使用config和service这两个包进行使用
一、注解型
自动装配模式
1.在Assistant
接口下(接口名称可以修改)
/**
* 整体增强接口
*/
@AiService
public interface Assistant {
//普通聊天接口
String chat(String question);
//流式聊天接口
Flux<String> steam(String message);
}
2.在AssistantConfiguartion
配置类下(配置类名称可以修改)
@Configuration
public class AssistantConfiguration {
@Bean
ChatLanguageModel qwen() {
return QwenChatModel.builder()
.apiKey("YOUR_KEY")//这里修改为自己的api-key
.modelName("qwen-max")
.build();
}
}
注:使用@AiService后最好不要使用配置文件的方式进行注入,而使用@Bean的方式进行模型的选择,可以更好的定制化系统
3.最后编写AiController
的请求
@RestController
public class AiController {
//注入assistant
@Autowired
Assistant assistant;
/**
* 普通返回接口
*/
@GetMapping("/chat")
public String getAi(@RequestParam String question){
String answer= assistant.chat(question);
return answer;
}
}
这样这个接口就可以对外使用了
自动组件装配的列表
这里补充一下可以自动装配的组件(在后面发布的博客将一一介绍)
如果以下组件在应用程序上下文中可用,它们将自动装配到 AI 服务中:
-
ChatLanguageModel
:普通聊天LLM模型 -
StreamingChatLanguageModel
:流式返回聊天模型 -
ChatMemory
:聊天记忆 -
ChatMemoryProvider
:聊天记忆隔离 -
ContentRetriever
:内容检索器 -
RetrievalAugmentor
:检索增强器 -
任何
@Component
或@Service
类中带有@Tool
注解的所有方法
手动装配模式
自动装配模式会将所有可装配的组件全部注入,那么就会有两个问题
-
多个相同类别的组件导致冲突,例如:我系统中想要使用两个模型,注入两个
ChatLanguageModel
会导致冲突问题 -
该接口不希望使用这个组件,但是由于自动注入的原因注入进去了
因此@AiService
推出了手动装配功能
使用方式如下,还是以上面的项目结构为例子进行编写demo
1.编写AssistantConfiguration
配置类
@Configuration
public class AssistantConfiguration {
//@Bean中设置组件名称
@Bean("qwen-max")
ChatLanguageModel qwen() {
return QwenChatModel.builder()
.apiKey("YOUR_KEY")//这里修改为自己的api-key
.modelName("qwen-max")
.build();
}
}
注:使@AiSerivce手动装配后不建议使用自动装配,可能会发生冲突
2.编写Assistant
接口
//先设置装配类型为EXPLICIT根据对应的组件名称("qwen-max")和类型(chatModel)进行注入
@AiService(wiringMode = EXPLICIT,chatModel = "qwen-max")
public interface Assistant {
String chat(String message);
}
3.最后编写AiController
的请求
@RestController
public class AiController {
//注入assistant
@Autowired
Assistant assistant;
/**
* 普通返回接口
*/
@GetMapping("/chat")
public String getAi(@RequestParam String question){
String answer= assistant.chat(question);
return answer;
}
}
@AiService源码
@Service//这里有service注释所以可以自动装配
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AiService {
//@AiService装配类型,默认是AUTOMATIC(自动装配),另一种就是EXPLICIT(手动装配)
AiServiceWiringMode wiringMode() default AiServiceWiringMode.AUTOMATIC;
/**
*这下面就和装配列表一样
*/
String chatModel() default "";
String streamingChatModel() default "";
String chatMemory() default "";
String chatMemoryProvider() default "";
String contentRetriever() default "";
String retrievalAugmentor() default "";
String moderationModel() default "";
String[] tools() default {};
}
二、装配型
1.编写Assistant
接口
public interface Assistant {
String chat(String message);
}
2.编写AssistantConfiguration
配置类
@Configuration
public class AssistantConfiguration {
/**
* 增强方法的方式-->一个接口只能增强一次,多次增强会报错
* @param chatLanguageModel
* @param questionAnsweringModel
* @return
*/
@Bean
Assistant Memorization(ChatLanguageModel chatLanguageModel, StreamingChatLanguageModel questionAnsweringModel){
ChatMemory chatMemory= MessageWindowChatMemory.withMaxMessages(10);
Assistant assistant= AiServices.builder(Assistant.class)
.chatLanguageModel(chatLanguageModel)
.streamingChatLanguageModel(questionAnsweringModel)
.chatMemory(chatMemory)
.build();
return assistant;
}
}
这里chatLanguageModel, questionAnsweringModel两个变量是使用了application.yml的配置,正常来说需要自行编写(编写方式和注解型一致)
例如:将chatLanguageModel替换为
QwenChatModel.builder()
.apiKey("YOUR_KEY")//这里修改为自己的api-key
.modelName("qwen-max")
.build();
即可
3.最后编写AiController
的请求(和注解型一样)
结语
这些博客均为博主学习过程中的一些学习心得,欢迎大家进行纠错,接下来会继续带来一些有关LangChain4j的相关内容,也在学习这方面的内容,如有希望交流可以添加QQ:2720289676