Google의 Firebase 팀이 만든 오픈소스 프레임워크 Genkit은 단순한 AI 라이브러리가 아닙니다. 복잡한 AI 모델 통합을 간단하게 만들고, 디버깅을 시각적으로 처리하며, 프로덕션 배포까지 고려한 도구입니다. LangChain처럼 과도한 추상화 없이, 개발자가 코드를 완전히 제어하면서도 AI 기능을 빠르게 구축할 수 있는 환경을 제공합니다.

핵심 포인트:
- 통합 API로 모델 전환 자유롭게: Gemini, GPT, Claude를 동일한 인터페이스로 사용. 모델 제공자를 바꾸는 데 코드 몇 줄이면 충분
- Developer UI의 시각적 디버깅: 로컬에서 실행되는 웹 인터페이스로 AI 플로우를 테스트하고, 각 단계별 입출력을 추적. 블랙박스가 아닌 투명한 개발 환경
- JavaScript/TypeScript와 Go는 프로덕션 준비 완료: Python은 알파 단계지만 핵심 기능 지원. Firebase, Cloud Run 또는 원하는 플랫폼에 배포 가능
왜 Genkit인가
AI 앱 개발의 가장 큰 걸림돌은 복잡성입니다. 모델 API를 통합하고, 프롬프트를 관리하고, 디버깅하고, 프로덕션에 배포하는 전 과정이 각각 별도의 도구를 필요로 했습니다. Genkit은 이 모든 것을 하나의 프레임워크로 통합합니다.
LangChain을 써본 개발자라면 아실 겁니다. 과도한 추상화 레이어, 복잡한 체이닝 구조, 그리고 무엇보다 디버깅의 어려움. Genkit은 다른 접근을 택했습니다. 코드는 명확하게, 디버깅은 시각적으로, 배포는 유연하게. Google이 프로덕션에서 직접 사용하며 검증한 프레임워크입니다.
Genkit의 핵심 구조
Flows: 타입 안전한 AI 워크플로우
Flow는 Genkit의 기본 단위입니다. 입력과 출력 스키마를 명확히 정의하고, 그 안에서 AI 모델을 호출하거나 외부 시스템과 연동합니다. 이 구조화된 접근 덕분에 타입 안전성을 확보하고, 테스트와 디버깅이 쉬워집니다.
const recipeFlow = ai.defineFlow(
{
name: 'recipeGenerator',
inputSchema: z.object({
ingredient: z.string(),
dietary: z.string().optional()
}),
outputSchema: RecipeSchema,
},
async (input) => {
const { output } = await ai.generate({
prompt: `${input.ingredient}로 레시피 만들기`,
output: { schema: RecipeSchema }
});
return output;
}
);
함수처럼 작성하지만 Flow로 정의하면 Developer UI에서 바로 테스트할 수 있고, 실행 추적이 자동으로 기록됩니다. 디버깅이 필요할 때 각 단계의 입출력을 시각적으로 확인할 수 있다는 건 엄청난 생산성 향상입니다.
통합 모델 API
하나의 인터페이스로 여러 AI 모델을 사용합니다. Gemini를 쓰다가 Claude로 바꾸고 싶다면? 플러그인만 교체하면 됩니다.
const ai = genkit({
plugins: [googleAI()], // 또는 anthropic(), openAI()
model: googleAI.model('gemini-2.5-flash')
});
각 모델 제공자의 독특한 API를 배울 필요가 없습니다. 멀티모달 입출력, 구조화된 데이터 생성, 도구 호출 등 모든 기능이 통일된 인터페이스로 제공됩니다.
Developer UI: 디버깅의 새로운 차원

로컬에서 genkit start
명령어 하나로 웹 인터페이스가 실행됩니다. 이 UI에서 할 수 있는 것들:
플로우 테스트: 코드를 수정할 때마다 재빌드할 필요 없이 UI에서 직접 입력값을 넣고 실행. 결과를 즉시 확인하고 프롬프트를 조정할 수 있습니다.
실행 추적 분석: AI 모델 호출, 도구 실행, 각 단계의 입출력이 모두 기록됩니다. 어디서 문제가 생겼는지, 모델이 어떤 판단을 내렸는지 한눈에 파악할 수 있습니다.
평가 결과 검토: 여러 입력에 대한 테스트를 실행하고, 성능 메트릭을 확인하며, 관련 추적 기록으로 바로 이동할 수 있습니다.
콘솔 로그만 보며 디버깅하던 시대와는 차원이 다릅니다.
실전: 레시피 생성 앱 만들기
간단한 예제로 Genkit의 작동 방식을 살펴보겠습니다. 재료를 입력하면 구조화된 레시피를 생성하는 앱입니다.
프로젝트 설정
# 프로젝트 초기화
mkdir recipe-genkit && cd recipe-genkit
npm init -y
# Genkit CLI와 패키지 설치
npm install -g genkit-cli
npm install genkit @genkit-ai/google-genai
# API 키 설정
export GEMINI_API_KEY=<your-api-key>
Gemini API 키는 Google AI Studio에서 무료로 발급받을 수 있습니다. 신용카드 등록도 필요 없습니다.
스키마 정의와 Flow 작성
import { googleAI } from '@genkit-ai/google-genai';
import { genkit, z } from 'genkit';
const ai = genkit({
plugins: [googleAI()],
model: googleAI.model('gemini-2.5-flash', {
temperature: 0.8,
}),
});
// 입력 스키마
const RecipeInputSchema = z.object({
ingredient: z.string(),
dietaryRestrictions: z.string().optional(),
});
// 출력 스키마
const RecipeSchema = z.object({
title: z.string(),
prepTime: z.string(),
ingredients: z.array(z.string()),
instructions: z.array(z.string()),
});
// Flow 정의
export const recipeFlow = ai.defineFlow(
{
name: 'recipeGenerator',
inputSchema: RecipeInputSchema,
outputSchema: RecipeSchema,
},
async (input) => {
const prompt = `${input.ingredient}를 주재료로
${input.dietaryRestrictions || '제한없음'} 식단에 맞는 레시피 만들기`;
const { output } = await ai.generate({
prompt,
output: { schema: RecipeSchema }
});
return output;
}
);
Zod 스키마로 타입을 정의하면 TypeScript의 타입 체킹과 런타임 검증을 동시에 얻습니다. AI 모델은 이 스키마에 맞춰 정확히 구조화된 데이터를 반환합니다.
Developer UI에서 테스트
genkit start -- npx tsx src/index.ts
브라우저에서 http://localhost:4000
을 열면 Developer UI가 나타납니다. recipeGenerator
Flow를 선택하고 입력값을 넣어보세요:
{
"ingredient": "아보카도",
"dietaryRestrictions": "채식"
}
Run 버튼을 클릭하면 레시피가 생성되고, 실행 과정의 모든 단계가 시각적으로 표시됩니다. 프롬프트를 조정하고 싶다면 코드를 수정하고 저장하면 자동으로 반영됩니다.
고급 기능 활용
RAG: 자체 데이터 기반 답변
Genkit은 RAG(Retrieval-Augmented Generation) 구현을 위한 내장 지원을 제공합니다. Pinecone, Chroma 같은 벡터 데이터베이스와 연동하여 자체 지식 베이스에서 정보를 검색하고, 그 정보를 바탕으로 답변을 생성할 수 있습니다.
// 벡터 스토어에서 관련 문서 검색
const docs = await retriever.retrieve({
query: userQuery,
options: { k: 3 }
});
// 검색된 정보를 컨텍스트로 사용
const response = await ai.generate({
prompt: `다음 정보를 참고해서 답변: ${docs}
질문: ${userQuery}`,
});
Tool Calling: 외부 시스템과 연동
AI 모델이 필요에 따라 외부 API를 호출하게 만들 수 있습니다.
const weatherTool = ai.defineTool(
{
name: 'getWeather',
description: '특정 도시의 현재 날씨 조회',
inputSchema: z.object({
city: z.string()
}),
outputSchema: z.object({
temp: z.number(),
condition: z.string()
}),
},
async ({ city }) => {
// 실제 날씨 API 호출
return await fetchWeather(city);
}
);
// 모델이 필요시 도구 사용
const result = await ai.generate({
prompt: '서울 날씨 어때?',
tools: [weatherTool]
});
모델이 질문을 분석하고, 도구를 호출할지 직접 답변할지 판단합니다. 이 과정도 Developer UI에서 추적할 수 있습니다.
프로덕션 배포
Genkit 앱은 Node.js나 Go를 지원하는 모든 환경에 배포할 수 있습니다. Firebase Functions, Google Cloud Run, 또는 일반 서버 모두 가능합니다.
// HTTP 엔드포인트로 노출
import express from 'express';
const app = express();
app.post('/recipe', async (req, res) => {
const result = await recipeFlow(req.body);
res.json(result);
});
Firebase Console에서는 프로덕션 추적 기록을 확인할 수 있습니다. 요청량, 레이턴시, 에러율 등 주요 메트릭이 대시보드에 표시되며, 개별 요청의 상세 추적도 가능합니다.
Genkit vs 다른 프레임워크
LangChain과의 차이: LangChain은 높은 추상화 레벨의 체인과 에이전트를 제공하지만, 그만큼 복잡합니다. Genkit은 더 명확한 추상화를 선택했습니다. 코드가 무엇을 하는지 항상 이해할 수 있고, Developer UI가 그 이해를 돕습니다.
Vercel AI SDK와의 차이: Vercel AI SDK는 함수형 단순함이 강점입니다. Genkit은 약간 더 많은 구조를 요구하지만, 그 대가로 타입 안전성과 통합 개발 도구를 제공합니다.
프레임워크 선택의 핵심은 당신의 우선순위입니다. 간단한 프로토타입이라면 Vercel AI SDK, 복잡한 에이전트 시스템이라면 LangChain, 명확성과 관찰 가능성을 중시한다면 Genkit입니다.
실용적인 조언
시작은 작게: 전체 앱을 한 번에 Genkit으로 옮기려 하지 마세요. 하나의 기능부터 시작해서 점진적으로 확장하는 게 좋습니다.
스키마를 먼저: 입출력 구조를 명확히 정의하면 나머지는 자연스럽게 따라옵니다. Zod 스키마는 문서화, 검증, 타입 체킹을 한 번에 해결합니다.
Developer UI를 활용: 프롬프트를 조정할 때나 문제를 디버깅할 때 UI에서 직접 실험하세요. 코드를 수정하고 재실행하는 것보다 훨씬 빠릅니다.
보안 주의: 도구를 외부 시스템에 연결할 때는 인증과 권한을 신중하게 설정하세요. 입력값 검증도 필수입니다.
Genkit은 AI 앱 개발의 복잡성을 줄이면서도 프로덕션 준비를 갖춘 프레임워크입니다. Google이 실제로 사용하며 검증한 도구이고, 오픈소스로 활발히 개발되고 있습니다. JavaScript/TypeScript 개발자라면 한번 시도해볼 가치가 충분합니다.
참고자료:
답글 남기기