工具呼叫也稱為「函式呼叫」,是一種結構化方法 LLM 能夠將要求傳回給呼叫 LLM 的應用程式。個人中心 定義您想提供給模型的工具,模型就會 視需要對應用程式提出工具要求,以執行您提供的提示。
工具呼叫的用途通常涵蓋幾個主題:
為 LLM 存取非用於訓練的資訊
- 經常變動的資訊,例如餐廳的每日菜單或 商店的商品目錄狀態
- 應用程式網域專屬的資訊,例如產品資訊。
請注意與檢索增強生成 (RAG) 重疊, 可讓 LLM 在生成內容中融入事實資訊RAG 是一種 更大規模的解決方案 或是與提示最相關的資訊啟用 另一方面,若擷取 LLM 需要的資訊 則更適合使用工具呼叫
在 LLM 工作流程中加入決定程度的確定性
- 執行 LLM 無法確實完成的計算。
- 在某些情況下,例如要求 LLM 生成完整文字內容,例如 回覆有關應用程式服務條款的問題時。
在 LLM 啟動動作時執行動作
- 使用 LLM 技術的居家助理,開啟及關燈
- 透過 LLM 技術提供的餐廳代理預訂資料表
事前準備
如要執行這個網頁中的程式碼範例,請先完成 入門指南。所有範例都假設您 已設定已安裝 Genkit 依附元件的專案。
本頁討論 Genkit 模型抽象化的進階功能 generate() 函式,因此在深入探索前,請先熟悉 請參閱「使用 AI 模型產生內容」一文。請 也熟悉 Genkit 系統如何定義輸入和輸出結構定義 Flows 頁面所述。
工具呼叫總覽
概括而言,這就是與大型語言模型進行工具呼叫的典型互動 如下所示:
- 呼叫應用程式會向 LLM 發出要求,並提供 列出 LLM 可用來生成回覆的工具
- 大型語言模型會產生完整的回覆,或是產生工具呼叫 特定格式的要求
- 如果呼叫端收到完整回應,則表示該要求已完成,且 互動結束;但如果呼叫端收到工具呼叫,則會執行 即可傳送新的要求給包含 原始提示或變化版本 工具呼叫
- LLM 按照步驟 2 處理新提示。
若要這麼做,必須滿足幾項需求:
- 模型必須經過訓練,才能在必須完成 提示。Gemini 等網頁 API 提供的大多數大型模型 和 Claude 都能達成這個目標,但規模較小且特殊的模型通常無法這麼做。 如果您嘗試為模型提供工具 都提供支援。
- 呼叫的應用程式必須在 格式都沒有問題
- 呼叫應用程式必須提示模型,以便生成工具呼叫 都能以應用程式預期的格式處理要求
Genkit 呼叫工具
Genkit 提供單一介面,方便你透過支援的模型呼叫工具。
每個模型外掛程式都會確保滿足上述兩個條件。
generate()
函式會自動執行工具呼叫迴圈
範例。
模型支援
工具呼叫的支援功能取決於模型、模型 API 和 Genkit 外掛程式。 請參閱相關說明文件,判斷工具呼叫是否可能 支援。此外:
- 如果您嘗試為模型提供工具 都提供支援。
- 如果外掛程式匯出模型參照,
info.supports.tools
屬性 會標明是否支援工具呼叫工具。
定義工具
使用 defineTool()
函式編寫工具定義:
const specialToolInputSchema = z.object({ meal: z.enum(["breakfast", "lunch", "dinner"]) });
const specialTool = defineTool(
{
name: "specialTool",
description: "Retrieves today's special for the given meal",
inputSchema: specialToolInputSchema,
outputSchema: z.string(),
},
async ({ meal }): Promise<string> => {
// Retrieve up-to-date information and return it. Here, we just return a
// fixed value.
return "Baked beans on toast";
}
);
這裡的語法看起來與 defineFlow()
語法相似不過,這四個
name
、description
、inputSchema
和 outputSchema
參數則是
這通常代表交易
不會十分要求關聯語意
撰寫工具定義時,請特別留意用詞和
說明這些參數,對 LLM 而言,這些參數至關重要
有效利用可用的工具
在提示中加入工具
定義工具後,請在
generate()
:
const llmResponse = await generate({
model: gemini15Flash,
prompt,
tools: [specialTool],
});
您可以提供多項工具LLM 會視需要呼叫工具 來完成提示
明確處理工具呼叫
根據預設,Genkit 會重複呼叫 LLM,直到每項工具呼叫都成功
均已解決。如果想進一步控制這個工具的呼叫迴圈,例如
套用較複雜的邏輯,請將 returnToolRequests
參數設為 true
。
現在,您有責任確保所有工具要求都能順利完成:
let generateOptions: GenerateOptions = {
model: gemini15Flash,
prompt,
tools: [specialTool],
returnToolRequests: true,
};
let llmResponse;
while (true) {
llmResponse = await generate(generateOptions);
const toolRequests = llmResponse.toolRequests();
if (toolRequests.length < 1) {
break;
}
const toolResponses: ToolResponsePart[] = await Promise.all(
toolRequests.map(async (part) => {
switch (part.toolRequest.name) {
case "specialTool":
return {
toolResponse: {
name: part.toolRequest.name,
ref: part.toolRequest.ref,
output: await specialTool(specialToolInputSchema.parse(part.toolRequest?.input)),
},
};
default:
throw Error('Tool not found');
}
}));
generateOptions.history = llmResponse.toHistory();
generateOptions.prompt = toolResponses;
}