AiServices服务提供了一种更简单、更灵活的替代链。您可以定义自己的API(带有一个或多个方法的Java接口),AiServices将为其提供实现(我们称之为“AI服务”)。底层则是使用Jdk动态代理方式增强定义的接口,让其具备和LLM交互的功能。
AiServices重要属性
- ChatLanguageModel:需要使用的LLM模型
- ModerationModel:可以用来过滤敏感词等
- ChatMemory:会话上下文聊天内存
- Tools:用户自定义的工具
- ContentRetriever:内容检索器,用于从向量中查询匹配的数据
- @SystemMessage系统提示词,@UserMessage用户信息,@V输入参数
@SystemMessage、@UserMessage使用
示例场景:扮演一名学生、写一篇作文
- @SystemMessage 指定系统提示词,给定身份并写一篇指定字数的作文
- @UserMessage 用户信息则为作文题目,用户可以根据需要变更不同的题目
- @V指定的参数,在@UserMessage用户信息中通过{{}}符号使用
public interface Student {
@SystemMessage("请扮演一名小学生,根据输入的文章题目写一篇100字以内的作文")
String write(String title);
@SystemMessage("请扮演一名高中生,根据输入的文章题目写一篇{{num}}字以内的作文")
String write1(@UserMessage String title, @V("num") int num);
static Student create() {
ChatLanguageModel model = OpenAiChatModel.builder().baseUrl(OPEN_AI_BASE_URL).apiKey(OPEN_AI_API_KEY).build();
return AiServices.create(Student.class, model);
}
}
public class Demo2 {
public static void main(String[] args) {
Student student = Student.create();
String result1 = student.write("我的梦想");
String result2 = student.write1("我的梦想", 100);
System.out.println(result1);
System.out.println("--------------------------------------------------------");
System.out.println(result2);
}
}
输出结果如下
Tools使用
看下面示例,问今天是几月几号,回答的日期不对,并且多问几次,每次结果都不一样。这是因为大模型数据都是基于过往历史数据的,对于最新的信息是无法识别。需要让他识别出最新日期,则就要用到Tools工具了。
public static void main(String[] args) {
ChatLanguageModel model = OpenAiChatModel.builder().baseUrl(OPEN_AI_BASE_URL)
.apiKey(OPEN_AI_API_KEY).build();
String result = model.generate("今天是几月几号");
System.out.println(result);
}
定义ToolUtil 工具类,通过@Tool注解指定这是一个工具方法,实现获取当前日期的逻辑。
UserService为我们定义的AI服务,用与和LLM交互。执行后看到日期为当前自然日期,
public class ToolUtil {
@Tool("获取当前日期")
public static String nowDate() {
return LocalDateTime.now().toString();
}
}
public interface UserService {
String sendMessage(String desc);
}
public class Demo2 {
public static void main(String[] args) {
ChatLanguageModel model = OpenAiChatModel.builder().baseUrl(OPEN_AI_BASE_URL)
.apiKey(OPEN_AI_API_KEY).build();
UserService userService = AiServices.builder(UserService.class)
.chatLanguageModel(model)
.chatMemory(MessageWindowChatMemory.withMaxMessages(10))
.tools(new ToolUtil())
.build();
String result = userService.sendMessage("今天是几月几号");
System.out.println(result);
}
}