⼀、如何训练⾃⼰的⼤模型?
⼤模型解决问题,都是以他学习过的问题为经验。互联⽹上的各种⼤模型,也就只能学习互联⽹上的各种公开资料,以此为基础解决新的⽤户问题。但是这也意味着⼤模型⽆法理解⽤户个性化的问题。例如问⼤模型"今天是⼏⽉⼏号?",⼤模型⼤概率是给不出正确答案的,因为⼤模型肯定没有去学习今天产⽣的资料。
代码执⾏的结果五花⼋⻔。甚⾄多执⾏⼏次,还会产⽣不⼀样的结果。
可以看到,既然⼤模型⽆法知道当前的时间,那么与今天相关的其他问题,例如"今天天⽓怎么样"等,⼤模型⾃然也就⽆能为⼒了。
这时,我们就可以通过Tools机制给⼤模型加⼀点"佐料",让⼤模型能够找外援获取到今天的⽇期。
LangChain4j提供的"demo"不⽀持Tools机制,需要⼤家⾃⾏获取OpenAI的ApiKey,或者找⼀些代理间接调⽤OpenAI。
⼆、ToolSpecification定制本地⼯具
Tools机制可以允许将⼀个本地⽅法封装成⼀个⼯具集,也就是ToolSpecification。把这个⼯具集⼀起发给⼤模型后,⼤模型就可以结合这个⼯具集处理⼀些和今天的⽇期相关的任务。
当前版本创建⼯具集有两种⽅式,⼀种是通过⼀个Method⽅法来定制⼯具集,另⼀种⽅式是通过⼀个Class类来定制⼯具集。 使⽤这两中⽅式都需要⽤到⼀个@Tools注解。例如,我们先定义⼀个⽅法,获取当前⽇
public class Demo1 {
public static void main(String[] args) {
ChatLanguageModel model = OpenAiChatModel.builder()
.apiKey("demo").modelName("gpt-4o-mini").build();
System.out.println(model.generate("今天是⼏⽉⼏号?"));
}
}
⼀个ToolSpecification就代表⼀个⼯具,当⽤户把问题UserMessage和⼯具ToolSpecification⼀起传递给⼤模型,⼤模型就知道要结合⼯具来解决⽤户的问题。此时⼤模型相应的AiMessage不再是⼀串⽂本,⽽是⼀个调⽤⽅ 法的请求ToolExecutionRequest。
AiMessage { text = null toolExecutionRequests = [ToolExecutionRequest { id =
"call_Li476Wjsed3hlpFWEPQdRJzV", name = "dateUtil", arguments = "{}" }] }
在得到ToolExecutionRequest后,就需要执⾏对应的⼯具⽅法。其中ToolExecutionRequest的name属性就是⽅法名,arguments就是要传递给⽅法的参数:
public class ToolsDemo2 {
@Tool("获取当前⽇期")
public static String dateUtil(){
return LocalDateTime.now().toString();
}
public static void main(String[] args) throws NoSuchMethodException {
ChatLanguageModel model = ModelUtil.getOpenAIModel();
//通过⽅法构建⼯具集
ToolSpecification toolSpecification =
ToolSpecifications.toolSpecificationFrom(ToolsDemo2.class.getMethod("dateUtil"));
UserMessage userMessage = UserMessage.from("今天是⼏⽉⼏号?");
Response<AiMessage> response =
model.generate(Collections.singletonList(userMessage), toolSpecification);
System.out.println(response.content());
}
}
AiMessage { text = null toolExecutionRequests = [ToolExecutionRequest { id =
"call_Li476Wjsed3hlpFWEPQdRJzV", name = "dateUtil", arguments = "{}" }] }
这样,我们就可以通过调⽤本地⽅法获得当前时间
2024-10-17T21:25:07.241519
因此ToolExecutionResultMessage就表示⼯具执⾏结果。接下来就可以将这个ToolExecutionResultMessage消息,像其他消息⼀样,作为⼀轮完整对话,传⼊给⼤模型。
ToolExecutionResultMessage toolExecutionResultMessage =
ToolExecutionResultMessage.from(toolExecutionRequest.id(), toolExecutionRequest.name(),
result);
AiMessage message = model.generate(Lists.newArrayList(userMessage, aiMessage,
toolExecutionResultMessage)).content();
System.out.println(message.text());
这样,⼤模型就能正确的告诉我当前的时间了。