前言
大模型在解决问题时,是基于历史数据进行预测的,而且答案具有一定的随机性,它没办法拿到当前最新的数据.比如你问它 "今天是几号?","今日的热点新闻是什么?",大模型大概率是回答不上来。
而LangChain4j的Tools机制就能够帮助大模型来获取到当前最新的数据。它允许大模型在必要时调用一个或多个可用的工具,这些工具通常由开发人员定义。工具可以是任何东西:Web搜索、对外部API的调用或特定代码段的执行等。LLMs实际上不能调用工具本身;相反,它们在响应中表达调用特定工具的意图(而不是以纯文本响应)。作为开发人员,我们应该使用提供的参数执行此工具,并报告工具执行的结果。
Tools执行流程
执行流程,如下图:
首先,当我们发送问题给大模型的时候,比如“今天是几号?”,大模型会响应一个结果给我们,这个结果不是问题的答案,而是大模型告诉我们需要执行哪个工具。我们执行工具后,才能得到问题的答案,但这个答案可能不太像人回复的,不太符合自然语言的样子,比如工具结果是“2024-07-13 11:23:00”,此时我们需要把问题,执行工具请求和工具执行结果一起发给大模型,得到最好的答案。
案例实践
Tools工具定义
定义工具需要3个信息
- 工具名称
- 工具的描述
- 工具的参数及其说明
工具代码实现如下:
@Tool注解,定义此方法是一个工具,注解里面的注释,是工具的描述,方法参数是工具的参数,@P是参数的说明,当有多个参数的时候,我们可以通过@P进行微调,告诉大模型,这个参数的作用,以便大模型更好的理解我们的问题。
public class UserTools {
@Data
@AllArgsConstructor
static class User {
private String username;
private Integer age;
}
@Tool("获取当前日期")
public static String getCurrentDate() {
return LocalDateTime.now().toString();
}
@Tool("获取指定日期注册的用户信息")
public static List<User> getUserInfoByDate(@P("获取当前日期")String date) {
System.out.println("接收到的date参数的值:" + date);
User gorgor = new User("gorgor", 18);
User fairy = new User("fairy", 18);
return Lists.newArrayList(gorgor, fairy);
}
}
代码测试
public class ToolsDemo {
interface UserService {
@SystemMessage("先获取具体日期,然后再解决用户问题")
String getUserInfo(String desc);
}
public static void main(String[] args) {
ChatLanguageModel chatModel = ZhipuAiChatModel.builder()
.apiKey("智普apikey")
.build();
UserService userService = AiServices.builder(UserService.class)
.chatLanguageModel(chatModel)
.tools(new UserTools())
.build();
String userString = userService.getUserInfo("今天注册的用户信息");
System.out.println(userString);
}
}
执行结果:
根据您的询问,今天(2024年7月13日)注册的用户信息如下:
- 用户名:gorgor,年龄:18岁
- 用户名:fairy,年龄:18岁