工具呼叫

工具呼叫也稱為「函式呼叫」,是一種結構化方法 LLM 能夠將要求傳回給呼叫 LLM 的應用程式。個人中心 定義您想提供給模型的工具,模型就會 視需要對應用程式提出工具要求,以執行您提供的提示。

工具呼叫的用途通常涵蓋幾個主題:

為 LLM 存取非用於訓練的資訊

  • 經常變動的資訊,例如餐廳的每日菜單或 商店的商品目錄狀態
  • 應用程式網域專屬的資訊,例如產品資訊。

請注意與檢索增強生成 (RAG) 重疊, 可讓 LLM 在生成內容中融入事實資訊RAG 是一種 更大規模的解決方案 或是與提示最相關的資訊啟用 另一方面,若擷取 LLM 需要的資訊 則更適合使用工具呼叫

在 LLM 工作流程中加入決定程度的確定性

  • 執行 LLM 無法確實完成的計算。
  • 在某些情況下,例如要求 LLM 生成完整文字內容,例如 回覆有關應用程式服務條款的問題時。

在 LLM 啟動動作時執行動作

  • 使用 LLM 技術的居家助理,開啟及關燈
  • 透過 LLM 技術提供的餐廳代理預訂資料表

事前準備

如要執行這個網頁中的程式碼範例,請先完成 入門指南。所有範例都假設您 已設定已安裝 Genkit 依附元件的專案。

本頁討論 Genkit 模型抽象化的進階功能 generate() 函式,因此在深入探索前,請先熟悉 請參閱「使用 AI 模型產生內容」一文。請 也熟悉 Genkit 系統如何定義輸入和輸出結構定義 Flows 頁面所述。

工具呼叫總覽

概括而言,這就是與大型語言模型進行工具呼叫的典型互動 如下所示:

  1. 呼叫應用程式會向 LLM 發出要求,並提供 列出 LLM 可用來生成回覆的工具
  2. 大型語言模型會產生完整的回覆,或是產生工具呼叫 特定格式的要求
  3. 如果呼叫端收到完整回應,則表示該要求已完成,且 互動結束;但如果呼叫端收到工具呼叫,則會執行 即可傳送新的要求給包含 原始提示或變化版本 工具呼叫
  4. 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() 語法相似不過,這四個 namedescriptioninputSchemaoutputSchema 參數則是 這通常代表交易 不會十分要求關聯語意 撰寫工具定義時,請特別留意用詞和 說明這些參數,對 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;
}