简介
如果我们现在问我们前面的智能客服说:我现在下单一杯美式几点几分可以做好你会发现他没办法很好的回答问题。因为模型能力是有限的(比如不知道当前时间),如果想要让AI应用具备更强的功能,calling。相当于是给模型提供一些工具,当模型判断需要使用工具的时候就会进行使用Tool Calling
Tool Calling 原理

image.png
其实就是把工具的name,description,input schema等信息也放入模型的请求中。模型如果觉得需要调用工具就会返回相关的工具调用消息,这个时候SpringAI会基于这个消息去调用工具,得到一个工具调用的结果给到模型模型再综合这个调用结果返回最终的答案。
使用方法
@Tool(description="通过时区id获取当前时间")
public String getTimeByZoneId(@ToolParam(description = "时区id, 如Asia/Shanghai") String zoneId) {
ZoneId zid = ZoneId.of(zoneId);
ZonedDateTime zonedDateTime = ZonedDateTime.now(zid);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm: ss 2");
return zonedDateTime.format(formatter);
}
public ToolController(VectorStore vectorStore, ChatClient.Builder chatClientBuilder) {
this.vectorStore = vectorStore;
VectorStoreDocumentRetriever vectorStoreDocumentRetriever = VectorStoreDocumentRetriever.builder()
.vectorStore(vectorStore)
.topK(3)
.similarityThreshold(0.5)
.build();
RetrievalAugmentationAdvisor retrievalAugmentationAdvisor = RetrievalAugmentationAdvisor.builder()
.documentRetriever(vectorStoreDocumentRetriever)
.build();
this.chatClient = chatClientBuilder
.defaultAdvisors(retrievalAugmentationAdvisor)
//添加工具类
.defaultTools(new TimeTool())
.build();
}
/**
* 智能客服实现RAG智能问答
* @param query
* @return
*/
@PostMapping("/rag-ask")
public String ragAskQuestion(@RequestParam(name = "query") String query){
return chatClient.prompt()
.system("你是一个智能客服助手,回答客户问答的问题")
.user(query)
.call()
.content();
}
调用方法后,直接进入到工具类对应方法

image.png