함수 호출이라고도 하는 도구 호출은 LLM은 이를 호출한 애플리케이션에 다시 요청을 하는 기능을 제공합니다. 나 모델에 사용할 수 있는 도구를 정의하면 모델이 제공하는 프롬프트를 처리하기 위해 필요에 따라 앱에 도구를 요청할 수 있습니다.
일반적으로 도구 호출의 사용 사례는 다음 몇 가지 주제로 나눌 수 있습니다.
LLM에 학습되지 않은 정보에 대한 액세스 권한 부여
- 자주 변경되는 정보(예: 식당의 일일 메뉴나 식당) 확인할 수 있습니다.
- 제품 정보와 같이 앱 도메인과 관련된 정보입니다.
검색 증강 생성 (RAG)과의 중첩은 LLM이 사실에 기반한 정보를 세대에 통합할 수 있는 방법을 개발했습니다. RAG는 더 무거운 솔루션이 필요한 경우 정보 또는 프롬프트와 가장 관련성이 높은 정보가 모호합니다. 사용 설정됨 반면 LLM에 필요한 정보를 검색하는 것이 간단한 함수라면 데이터베이스 조회가 필요한 경우 도구 호출이 더 적합합니다.
LLM 워크플로에 어느 정도의 결정성 도입
- LLM이 자체적으로 안정적으로 완료할 수 없는 계산 수행
- LLM이 다음과 같은 특정 상황에서 그대로 텍스트를 생성하도록 강제합니다. 앱의 서비스 약관에 관한 질문에 응답할 때.
LLM에서 시작할 때 작업 실행
- LLM 기반 홈 어시스턴트에서 조명 켜고 끄기
- LLM 기반 식당 에이전트에서 테이블 예약 예약
시작하기 전에
이 페이지의 코드 예시를 실행하려면 먼저 시작 가이드를 참조하세요. 모든 예시는 Genkit 종속 항목이 설치된 프로젝트를 이미 설정한 경우.
이 페이지에서는 Genkit 모델 추상화의 고급 기능 중 하나를 설명하고 generate() 함수를 사용하여 더 깊이 들어가기 전에 AI 모델로 콘텐츠 생성 페이지의 콘텐츠 해야 할 일 입력 및 출력 스키마를 정의하는 Genkit 시스템을 잘 알고 있어야 합니다. 이는 흐름 페이지에 설명되어 있습니다.
도구 호출 개요
개략적으로 말하자면, 이것은 LLM과 다음과 같습니다.
- 호출하는 애플리케이션은 LLM에 요청 메시지를 표시하고 LLM이 응답을 생성하는 데 사용할 수 있는 도구 목록을 프롬프트합니다.
- LLM은 완전한 응답을 생성하거나 도구 호출을 생성합니다. 요청을 수행합니다
- 호출자가 완전한 응답을 받으면 요청이 처리되고 상호 작용이 끝나고 호출자가 도구 호출을 받으면 적절한 로직이 있는 경우 LLM에 새 요청을 프롬프트의 원본 프롬프트 또는 그의 일부 변형 및 도구 호출
- 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;
}