超實用!用FunctionCall實現快遞AI助手
昨天晚上直播,我們用 RAG(Retrieval-Augmented Generation,檢索增強生成)實現了數據庫 AI 助手,今天我們準備換一個技術使用 function call 來實現快遞 AI 助手。
執行效果
快遞 AI 助手的業務邏輯很清晰,就是我通過 LLM 大語言模型的對話來查詢我的快遞詳情,例如,我問 AI 我有幾個“運送中”的快遞,他把這些快遞查詢并展示出來,效果如下圖所示:
圖片
什么是 function call?
定義: Function Call(也稱為 Tool Call)它允許大模型與一組 API 或工具進行交互,從而增強其功能。
也就是說 Function Call 和 RAG、MCP 等類似都是用于增強 AI 能力邊界的。
function call 執行流程
執行流程如下:
圖片
“
其中,Tool 既為 Function Call。
當然如果你上圖看的不是很懂的話,也可以參考阿里云提供的 function call 的工作流程:
快遞 AI 助手實現
具體實現步驟:
- 添加大模型依賴
- 配置大模型參數
- 創建 function call
- 調用 function call 實現快遞查詢
接下來,我們一步步來看,我們以阿里云的百煉(通義千問)大模型對接為例。
1.添加大模型依賴
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
2.配置大模型參數
spring:
ai:
openai:
base-url: https://dashscope.aliyuncs.com/compatible-mode/
api-key: ${ALIYUN-AK}
chat:
options:
model: deepseek-v3
3.創建 function call
這里就不連接數據庫查詢快遞信息了,生成級別需要連接數據庫,這里演示效果,構建測試數據即可,如下代碼所示:
import org.springframework.ai.tool.annotation.Tool;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
publicclass ExpressService {
@Tool(description = "用于查詢我的快遞")
public List<Express> getExpress(String state) {
// 生成測試數據
List<Express> data = getData();
// 根據狀態過濾(如果state為null或空則返回全部)
return state == null || state.isEmpty()
? data
: data.stream()
.filter(e -> e.state().equalsIgnoreCase(state))
.collect(Collectors.toList());
}
/**
* 生成測試快遞數據
*/
private List<Express> getData() {
List<Express> data = new ArrayList<>();
LocalDateTime now = LocalDateTime.now();
data.add(new Express(1001L, "北京", "西安", now.minusDays(12), "已簽收"));
data.add(new Express(1002L, "廣州", "西安", now.minusDays(12), "已簽收"));
data.add(new Express(1003L, "杭州", "西安", now.minusDays(3), "運送中"));
data.add(new Express(1004L, "深圳", "西安", now.minusDays(3), "運送中"));
data.add(new Express(1005L, "南京", "西安", now.minusDays(1), "待發貨"));
return data;
}
/**
* 快遞類
*
* @param id
* @param from
* @param to
* @param createtime
* @param state
*/
record Express(long id, String from, String to,
LocalDateTime createtime, String state) {
}
}
4.調用 function call
調用大模型可以使用 ChatModel 和 ChatClient,這里使用 ChatClient 調用:
@RequestMapping("/tool")
public Flux<String> tool(@RequestParam("msg") String msg) {
return chatClient.prompt(msg)
.tools(new ExpressService(),
new DateTimeTools())
.stream().content();
}
最終執行效果如下:
圖片
小結
大模型應用開發是以后程序開發的主流方向,他也會巔峰以往的開發形式,早早掌握大模型的開發知識,對于后期漲薪或找工作都有巨大的幫助。程序員群體注定是一個活到老學到老的群體,因為學習的本質在于擴展自己的能力邊界,讓自己變得更值錢,所以各位動起來,讓我們一起擁抱這場 AI 盛宴吧。