플로우로 AI 워크플로 정의
플로우로 AI 워크플로 정의
AI 워크플로는 단순한 모델 호출 이상의 것(컨텍스트 검색, 세션 관리, 출력 검증, 여러 모델 응답 결합)이 필요해요. Genkit의 플로우(flow) 는 AI 로직을 감싸는 특별한 함수로, 타입 안전한 입·출력, 스트리밍, 개발자 UI 통합, 쉬운 배포를 제공해요. 가볍고 최소한의 추상화로 일반 함수처럼 작성돼요.
가장 단순한 형태의 플로우는 함수 하나를 감싸는 거예요. 다음 예제는 모델 생성 요청을 하는 함수를 감싸요.
import { googleAI } from '@genkit-ai/google-genai';
import { genkit, z } from 'genkit';
const ai = genkit({ plugins: [googleAI()] });
export const menuSuggestionFlow = ai.defineFlow(
{
name: 'menuSuggestionFlow',
inputSchema: z.object({ theme: z.string() }),
outputSchema: z.object({ menuItem: z.string() }),
},
async ({ theme }) => {
const { text } = await ai.generate({
model: googleAI.model('gemini-flash-latest'),
prompt: `Invent a menu item for a ${theme} themed restaurant.`,
});
return { menuItem: text };
},
);
플로우의 핵심 장점 중 하나는 입·출력의 타입 안전성이에요. generate()처럼 출력 스키마를 정의하되, 플로우는 입력 스키마도 지정할 수 있어요. z.object()로 스키마를 감싸는 게 권장되는데, 개발자 UI에서 라벨이 붙은 입력 필드를 제공하고 미래 확장에도 유리하기 때문이에요.
스트리밍 플로우는 streamSchema로 스트리밍 값 타입을 정해요. 두 번째 파라미터 sideChannel의 sendChunk 콜백으로 데이터가 준비될 때마다 출력 스트림에 보내요.
CLI로 플로우를 실행·테스트할 수도 있어요.
genkit flow:run menuSuggestionFlow '{"theme": "French"}' -- <command to start your app>
디버깅은 genkit start로 개발자 UI를 띄워 플로우를 실행하고 trace를 검사할 수 있어요. generate(), Chat.send(), embed(), index(), retrieve()는 플로우의 개별 스텝으로 trace에 표시되고, 그 외 코드는 run()으로 감싸 trace에 포함시킬 수 있어요.
배포는 defineFlow() 후 startFlowServer()로 Express 서버를 띄우면 모든 플로우가 HTTP 엔드포인트가 돼요(기본 http://localhost:3400/menuSuggestionFlow). Cloud Functions for Firebase에서는 onCallGenkit을 써요.
더 알아보기
- https://genkit.dev/docs/js/flows/ — 플로우 정의
- https://genkit.dev/docs/js/get-started/ — Genkit 시작하기