도구 호출

함수 호출이라고도 하는 도구 호출은 LLM은 이를 호출한 애플리케이션에 다시 요청을 하는 기능을 제공합니다. 나 모델에 사용할 수 있는 도구를 정의하면 모델이 제공하는 프롬프트를 처리하기 위해 필요에 따라 앱에 도구를 요청할 수 있습니다.

일반적으로 도구 호출의 사용 사례는 다음 몇 가지 주제로 나눌 수 있습니다.

LLM에 학습되지 않은 정보에 대한 액세스 권한 부여

  • 자주 변경되는 정보(예: 식당의 일일 메뉴나 식당) 확인할 수 있습니다.
  • 제품 정보와 같이 앱 도메인과 관련된 정보입니다.

검색 증강 생성 (RAG)과의 중첩은 LLM이 사실에 기반한 정보를 세대에 통합할 수 있는 방법을 개발했습니다. RAG는 더 무거운 솔루션이 필요한 경우 정보 또는 프롬프트와 가장 관련성이 높은 정보가 모호합니다. 사용 설정됨 반면 LLM에 필요한 정보를 검색하는 것이 간단한 함수라면 데이터베이스 조회가 필요한 경우 도구 호출이 더 적합합니다.

LLM 워크플로에 어느 정도의 결정성 도입

  • LLM이 자체적으로 안정적으로 완료할 수 없는 계산 수행
  • LLM이 다음과 같은 특정 상황에서 그대로 텍스트를 생성하도록 강제합니다. 앱의 서비스 약관에 관한 질문에 응답할 때.

LLM에서 시작할 때 작업 실행

  • LLM 기반 홈 어시스턴트에서 조명 켜고 끄기
  • LLM 기반 식당 에이전트에서 테이블 예약 예약

시작하기 전에

이 페이지의 코드 예시를 실행하려면 먼저 시작 가이드를 참조하세요. 모든 예시는 Genkit 종속 항목이 설치된 프로젝트를 이미 설정한 경우.

이 페이지에서는 Genkit 모델 추상화의 고급 기능 중 하나를 설명하고 generate() 함수를 사용하여 더 깊이 들어가기 전에 AI 모델로 콘텐츠 생성 페이지의 콘텐츠 해야 할 일 입력 및 출력 스키마를 정의하는 Genkit 시스템을 잘 알고 있어야 합니다. 이는 흐름 페이지에 설명되어 있습니다.

도구 호출 개요

개략적으로 말하자면, 이것은 LLM과 다음과 같습니다.

  1. 호출하는 애플리케이션은 LLM에 요청 메시지를 표시하고 LLM이 응답을 생성하는 데 사용할 수 있는 도구 목록을 프롬프트합니다.
  2. LLM은 완전한 응답을 생성하거나 도구 호출을 생성합니다. 요청을 수행합니다
  3. 호출자가 완전한 응답을 받으면 요청이 처리되고 상호 작용이 끝나고 호출자가 도구 호출을 받으면 적절한 로직이 있는 경우 LLM에 새 요청을 프롬프트의 원본 프롬프트 또는 그의 일부 변형 및 도구 호출
  4. LLM은 2단계와 같이 새 프롬프트를 처리합니다.

이 기능을 사용하려면 다음과 같은 몇 가지 요구사항을 충족해야 합니다.

  • 모델은 작업을 완료해야 할 때 도구를 요청하도록 학습되어야 합니다. 메시지가 표시됩니다. Gemini와 같은 웹 API를 통해 제공되는 대부분의 대규모 모델 보다 작고 전문화된 모델은 종종 불가능한 경우가 많습니다. 지원되지 않는 모델에 도구를 제공하려고 하면 Genkit에서 오류가 발생함 지원할 수 있습니다
  • 호출하는 애플리케이션은 형식을 선택합니다.
  • 호출하는 애플리케이션은 모델에 도구 호출을 생성하라는 메시지를 표시해야 합니다. 모든 요청을 처리할 수 있습니다.

Genkit를 사용한 도구 호출

Genkit는 이를 지원하는 모델에서 도구 호출을 위한 단일 인터페이스를 제공합니다. 각 모델 플러그인은 위의 기준 중 마지막 두 가지를 충족하도록 합니다. generate() 함수는 도구 호출 루프를 자동으로 실행합니다. 사용할 수 있습니다.

모델 지원

도구 호출 지원은 모델, 모델 API, Genkit 플러그인에 따라 다릅니다. 도구 호출이 지원됩니다. 또한 다음 사항도 적용됩니다.

  • 지원되지 않는 모델에 도구를 제공하려고 하면 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;
}