Gọi công cụ

Lệnh gọi công cụ (còn gọi là lệnh gọi hàm) là một cách có cấu trúc để cho phép LLM đưa ra yêu cầu trả về cho ứng dụng đã gọi lệnh gọi đó. Bạn xác định các công cụ mà bạn muốn cung cấp cho mô hình và mô hình sẽ đưa ra yêu cầu về công cụ cho ứng dụng của bạn nếu cần để thực hiện các lời nhắc mà bạn đưa ra.

Các trường hợp sử dụng lệnh gọi công cụ thường thuộc một số chủ đề:

Cấp cho LLM quyền truy cập vào thông tin mà LLM không được huấn luyện

  • Thông tin thay đổi thường xuyên, chẳng hạn như giá cổ phiếu hoặc thời tiết hiện tại.
  • Thông tin dành riêng cho miền ứng dụng của bạn, chẳng hạn như thông tin sản phẩm hoặc hồ sơ người dùng.

Lưu ý sự trùng lặp với tạo dữ liệu tăng cường truy xuất (RAG). Đây cũng là một cách để cho phép LLM tích hợp thông tin thực tế vào các thế hệ của nó. RAG là một giải pháp nặng hơn, phù hợp nhất khi bạn có một lượng lớn thông tin hoặc thông tin phù hợp nhất với câu lệnh không rõ ràng. Mặt khác, nếu việc truy xuất thông tin mà LLM cần là một lệnh gọi hàm đơn giản hoặc truy vấn cơ sở dữ liệu, thì việc gọi công cụ sẽ phù hợp hơn.

Giới thiệu một mức độ xác định vào quy trình làm việc LLM

  • Thực hiện các phép tính mà LLM không thể tự hoàn tất một cách đáng tin cậy.
  • Buộc LLM tạo văn bản nguyên văn trong một số trường hợp nhất định, chẳng hạn như khi trả lời câu hỏi về điều khoản dịch vụ của ứng dụng.

Thực hiện một hành động khi được LLM khởi tạo

  • Bật và tắt đèn trong trợ lý nhà sử dụng LLM
  • Đặt chỗ bàn trong một tác nhân nhà hàng sử dụng LLM

Trước khi bắt đầu

Nếu bạn muốn chạy các ví dụ về mã trên trang này, trước tiên, hãy hoàn tất các bước trong hướng dẫn Bắt đầu. Tất cả các ví dụ đều giả định rằng bạn đã thiết lập một dự án có cài đặt các phần phụ thuộc Genkit.

Trang này thảo luận về một trong các tính năng nâng cao của tính năng trừu tượng mô hình Genkit. Vì vậy, trước khi đi sâu vào vấn đề, bạn nên làm quen với nội dung trên trang Tạo nội dung bằng mô hình AI. Bạn cũng nên làm quen với hệ thống của Genkit để xác định giản đồ đầu vào và đầu ra. Điều này được thảo luận trên trang Flows (Luồng).

Tổng quan về việc gọi công cụ

Ở cấp độ cao, đây là cách tương tác gọi công cụ thông thường với LLM:

  1. Ứng dụng gọi sẽ đưa ra yêu cầu cho LLM và cũng đưa vào lời nhắc một danh sách các công cụ mà LLM có thể sử dụng để tạo phản hồi.
  2. LLM tạo một phản hồi hoàn chỉnh hoặc tạo một yêu cầu gọi công cụ ở một định dạng cụ thể.
  3. Nếu phương thức gọi nhận được phản hồi đầy đủ, yêu cầu sẽ được thực hiện và hoạt động tương tác sẽ kết thúc; nhưng nếu phương thức gọi nhận được lệnh gọi công cụ, thì phương thức gọi đó sẽ thực hiện bất kỳ logic nào phù hợp và gửi một yêu cầu mới đến LLM chứa lời nhắc ban đầu hoặc một số biến thể của lời nhắc đó cũng như kết quả của lệnh gọi công cụ.
  4. LLM xử lý lời nhắc mới như trong Bước 2.

Để tính năng này hoạt động, bạn phải đáp ứng một số yêu cầu:

  • Mô hình phải được huấn luyện để đưa ra yêu cầu về công cụ khi cần thiết để hoàn tất một câu lệnh. Hầu hết các mô hình lớn hơn được cung cấp thông qua API web, chẳng hạn như Gemini và Claude, đều có thể thực hiện việc này, nhưng các mô hình nhỏ hơn và chuyên biệt hơn thường không thể. Genkit sẽ gửi lỗi nếu bạn cố gắng cung cấp công cụ cho một mô hình không hỗ trợ công cụ đó.
  • Ứng dụng gọi phải cung cấp định nghĩa công cụ cho mô hình ở định dạng mà ứng dụng đó mong đợi.
  • Ứng dụng gọi phải nhắc mô hình tạo các yêu cầu gọi công cụ ở định dạng mà ứng dụng mong đợi.

Gọi công cụ bằng Genkit

Genkit cung cấp một giao diện duy nhất để gọi công cụ với các mô hình hỗ trợ công cụ đó. Mỗi trình bổ trợ mô hình đảm bảo đáp ứng hai tiêu chí cuối cùng nêu trên và hàm generate() của thực thể Genkit sẽ tự động thực hiện vòng lặp gọi công cụ được mô tả trước đó.

Hỗ trợ mô hình

Tính năng hỗ trợ gọi công cụ phụ thuộc vào mô hình, API mô hình và trình bổ trợ Genkit. Tham khảo tài liệu có liên quan để xác định xem tính năng gọi công cụ có được hỗ trợ hay không. Ngoài ra:

  • Genkit sẽ báo lỗi nếu bạn cố gắng cung cấp công cụ cho một mô hình không hỗ trợ công cụ đó.
  • Nếu trình bổ trợ xuất các tệp tham chiếu mô hình, thì thuộc tính info.supports.tools sẽ cho biết liệu trình bổ trợ đó có hỗ trợ tính năng gọi công cụ hay không.

Xác định công cụ

Sử dụng hàm defineTool() của thực thể Genkit để viết định nghĩa công cụ:

import { genkit, z } from 'genkit';
import { googleAI, gemini15Flash } from '@genkit-ai/google-ai';

const ai = genkit({
  plugins: [googleAI()],
  model: gemini15Flash,
});

const getWeather = ai.defineTool(
  {
    name: 'getWeather',
    description: 'Gets the current weather in a given location',
    inputSchema: z.object({ 
      location: z.string().describe('The location to get the current weather for')
    }),
    outputSchema: z.string(),
  },
  async (input) => {
    // Here, we would typically make an API call or database query. For this
    // example, we just return a fixed value.
    return 'The current weather in ${input.location} is 63°F and sunny.';
  }
);

Cú pháp ở đây giống hệt như cú pháp defineFlow(); tuy nhiên, bạn bắt buộc phải sử dụng cả 4 tham số name, description, inputSchemaoutputSchema. Khi viết định nghĩa công cụ, hãy đặc biệt chú ý đến cách diễn đạt và tính mô tả của các tham số này, vì chúng rất quan trọng để LLM sử dụng hiệu quả các công cụ hiện có.

Sử dụng công cụ

Thêm các công cụ đã xác định vào câu lệnh để tạo nội dung.

Tạo

const response = await ai.generate({
  prompt: 'What is the weather in Baltimore?',
  tools: [getWeather],
});

definePrompt

const weatherPrompt = ai.definePrompt(
  {
    name: 'weatherPrompt',
    tools: [getWeather],
  },
  'What is the weather in {{location}}?'
);

const response = await weatherPrompt({ location: 'Baltimore' });

Tệp lời nhắc

---
system: "Answer questions using the tools you have."
tools: [getWeather]
input:
  schema:
    location: string
---

What is the weather in {{location}}?

Sau đó, bạn có thể thực thi lời nhắc trong mã của mình như sau:

// assuming prompt file is named weatherPrompt.prompt
const weatherPrompt = ai.prompt('weatherPrompt');

const response = await weatherPrompt({ location: 'Baltimore' });

Chat

const chat = ai.chat({
  system: 'Answer questions using the tools you have.',
  tools: [getWeather],
});

const response = await chat.send('What is the weather in Baltimore?');

// Or, specify tools that are message-specific 
const response = await chat.send({
  prompt: 'What is the weather in Baltimore?',
  tools: [getWeather],
});

Genkit sẽ tự động xử lý lệnh gọi công cụ nếu LLM cần sử dụng công cụ getWeather để trả lời lời nhắc.

Xử lý rõ ràng các lệnh gọi công cụ

Theo mặc định, Genkit liên tục gọi LLM cho đến khi mọi lệnh gọi công cụ được giải quyết. Nếu bạn muốn kiểm soát chặt chẽ hơn vòng lặp gọi công cụ này, chẳng hạn như để áp dụng logic phức tạp hơn, hãy đặt tham số returnToolRequests thành true. Giờ đây, bạn có trách nhiệm đảm bảo tất cả các yêu cầu về công cụ đều được thực hiện:

const getWeather = ai.defineTool(
  {
    // ... tool definition ...
  },
  async ({ location }) => {
    // ... tool implementation ...
  },
);

const generateOptions: GenerateOptions = {
  prompt: "What's the weather like in Baltimore?",
  tools: [getWeather],
  returnToolRequests: true,
};

let llmResponse;
while (true) {
  llmResponse = await ai.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 getWeather(part.toolRequest.input),
            },
          };
        default:
          throw Error('Tool not found');
      }
    })
  );
  generateOptions.messages = llmResponse.messages;
  generateOptions.prompt = toolResponses;
}