阿里云ACP大模型考试知识点---使⽤Tools构建⾃⼰的本地工具

⼀、如何训练⾃⼰的⼤模型?

⼤模型解决问题,都是以他学习过的问题为经验。互联⽹上的各种⼤模型,也就只能学习互联⽹上的各种公开资料,以此为基础解决新的⽤户问题。但是这也意味着⼤模型⽆法理解⽤户个性化的问题。例如问⼤模型"今天是⼏⽉⼏号?",⼤模型⼤概率是给不出正确答案的,因为⼤模型肯定没有去学习今天产⽣的资料。

代码执⾏的结果五花⼋⻔。甚⾄多执⾏⼏次,还会产⽣不⼀样的结果。

可以看到,既然⼤模型⽆法知道当前的时间,那么与今天相关的其他问题,例如"今天天⽓怎么样"等,⼤模型⾃然也就⽆能为⼒了。

这时,我们就可以通过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
这就是⼤模型想要的当前时间,相当于是ToolExcutionRequest的响应结果。但是这个结果还只是我们本地⽅法的结果。接下来我们需要继续将相应结果告诉⼤模型,从⽽让⼤模型完整的回答"今天是⼏⽉⼏号"的问题。

因此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());

这样,⼤模型就能正确的告诉我当前的时间了。

今天是 2024 10 17 ⽇。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值