Firebase Genkit: 프로덕션 AI 애플리케이션 구축 완전 가이드
⏱️ 예상 읽기 시간: 15분
개요
Firebase Genkit은 Google이 개발한 JavaScript, Go, Python으로 AI 기반 애플리케이션을 구축하기 위한 오픈소스 프레임워크입니다. Google의 Firebase 팀이 프로덕션에서 사용하고 있는 Genkit은 Google, OpenAI, Anthropic, Ollama 등 다양한 제공업체의 AI 모델을 통합하는 통일된 인터페이스를 제공합니다.
이 포괄적인 튜토리얼에서는 Firebase Genkit을 사용하여 프로덕션 수준의 AI 애플리케이션을 구축, 배포, 모니터링하는 방법을 살펴보겠습니다.
Firebase Genkit이란?
Firebase Genkit은 다음과 같은 기능을 제공하여 AI 애플리케이션 개발을 단순화하는 오픈소스 SDK입니다:
- 통합 모델 인터페이스: 일관된 API를 통해 수백 개의 AI 모델과 작업
- 크로스 플랫폼 지원: JavaScript/TypeScript (프로덕션 준비), Go (프로덕션 준비), Python (알파)
- 프로덕션 도구: 내장된 모니터링, 디버깅, 배포 기능
- 멀티모달 지원: 텍스트, 이미지, 구조화된 데이터 생성
- 개발자 경험: 로컬 CLI 및 시각적 디버깅 도구
주요 기능
기능 | 설명 |
---|---|
광범위한 AI 모델 지원 | Google, OpenAI, Anthropic, Ollama 모델을 위한 통합 인터페이스 |
단순화된 개발 | 구조화된 출력, 도구 호출, RAG를 위한 간소화된 API |
웹/모바일 준비 | Next.js, React, Angular, iOS, Android와의 원활한 통합 |
크로스 언어 | JavaScript, Go, Python 전반의 일관된 API |
어디든 배포 | Cloud Functions, Cloud Run 또는 모든 호스팅 플랫폼 |
개발자 도구 | 테스트, 디버깅, 평가를 위한 로컬 CLI 및 UI |
프로덕션 모니터링 | 포괄적인 관찰성 및 성능 추적 |
설치 및 설정
사전 요구사항
- Node.js 18+ (JavaScript/TypeScript용)
- Go 1.21+ (Go 개발용)
- Python 3.9+ (Python 개발용)
- 선택한 AI 모델 제공업체의 API 키
JavaScript/TypeScript 설정
# Genkit CLI 전역 설치
npm install -g genkit-cli
# 새 프로젝트 생성
mkdir my-genkit-app
cd my-genkit-app
npm init -y
# Genkit 코어 및 Google AI 플러그인 설치
npm install genkit @genkit-ai/google-genai
# 개발 의존성 설치
npm install -D typescript @types/node tsx
Go 설정
# Go 모듈 초기화
go mod init my-genkit-app
# Go용 Genkit 설치
go get github.com/firebase/genkit/go/genkit
go get github.com/firebase/genkit/go/plugins/googleai
Python 설정 (알파)
# 가상 환경 생성
python -m venv genkit-env
source genkit-env/bin/activate # Windows: genkit-env\Scripts\activate
# Python용 Genkit 설치
pip install genkit google-genai
기본 사용 예제
JavaScript/TypeScript 예제
기본 AI 애플리케이션 생성:
// index.ts
import { genkit } from 'genkit';
import { googleAI } from '@genkit-ai/google-genai';
// Google AI 플러그인으로 Genkit 초기화
const ai = genkit({
plugins: [googleAI()]
});
// 기본 텍스트 생성
async function generateText() {
const { text } = await ai.generate({
model: googleAI.model('gemini-2.0-flash-exp'),
prompt: '양자 컴퓨팅을 쉬운 말로 설명해주세요'
});
console.log(text);
}
// 구조화된 출력 생성
async function generateStructuredData() {
const response = await ai.generate({
model: googleAI.model('gemini-2.0-flash-exp'),
prompt: '스마트폰에 대한 제품 리뷰를 생성해주세요',
output: {
schema: {
type: 'object',
properties: {
product: { type: 'string' },
rating: { type: 'number', minimum: 1, maximum: 5 },
pros: { type: 'array', items: { type: 'string' } },
cons: { type: 'array', items: { type: 'string' } },
summary: { type: 'string' }
},
required: ['product', 'rating', 'summary']
}
}
});
console.log('구조화된 리뷰:', response.output);
}
// 예제 실행
generateText();
generateStructuredData();
Go 예제
// main.go
package main
import (
"context"
"fmt"
"log"
"github.com/firebase/genkit/go/genkit"
"github.com/firebase/genkit/go/plugins/googleai"
)
func main() {
ctx := context.Background()
// Google AI로 Genkit 초기화
if err := genkit.Init(ctx, &genkit.Options{
Plugins: []genkit.Plugin{googleai.Plugin()},
}); err != nil {
log.Fatal(err)
}
// 텍스트 생성
model := googleai.Model("gemini-2.0-flash-exp")
resp, err := model.Generate(ctx, &genkit.GenerateRequest{
Messages: []*genkit.Message{
{
Content: []*genkit.Part{
genkit.NewTextPart("클라우드 컴퓨팅의 장점은 무엇인가요?"),
},
Role: genkit.RoleUser,
},
},
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("응답: %s\n", resp.Candidates[0].Message.Content[0].Text)
}
Python 예제 (알파)
# main.py
import asyncio
from genkit import ai
from genkit.providers.google import google_genai
# Google AI 제공업체 구성
google_genai.configure(api_key="your-api-key")
async def generate_text():
# 기본 텍스트 생성
response = await ai.generate(
model=google_genai.models.gemini_2_0_flash_exp,
prompt="초보자에게 머신러닝을 설명해주세요"
)
print(f"생성된 텍스트: {response.text}")
async def main():
await generate_text()
if __name__ == "__main__":
asyncio.run(main())
고급 기능
도구 호출 및 함수 통합
Genkit은 외부 도구와 함수를 호출할 수 있는 AI 에이전트를 지원합니다:
import { defineTool } from 'genkit';
// 날씨 도구 정의
const weatherTool = defineTool({
name: 'getWeather',
description: '특정 위치의 현재 날씨 정보 조회',
inputSchema: {
type: 'object',
properties: {
location: { type: 'string', description: '도시 이름' }
},
required: ['location']
},
outputSchema: {
type: 'object',
properties: {
temperature: { type: 'number' },
condition: { type: 'string' },
humidity: { type: 'number' }
}
}
}, async (input) => {
// 날씨 API 호출 시뮬레이션
return {
temperature: 22,
condition: '맑음',
humidity: 65
};
});
// AI 대화에서 도구 사용
async function weatherAssistant() {
const response = await ai.generate({
model: googleAI.model('gemini-2.0-flash-exp'),
prompt: '서울의 날씨는 어떤가요?',
tools: [weatherTool]
});
console.log(response.text);
}
멀티모달 AI (텍스트 + 이미지)
AI 애플리케이션에서 텍스트와 이미지를 모두 처리:
import { readFileSync } from 'fs';
async function analyzeImage() {
const imageData = readFileSync('path/to/image.jpg');
const response = await ai.generate({
model: googleAI.model('gemini-2.0-flash-exp'),
prompt: [
{ text: '이 이미지에서 무엇을 볼 수 있는지 설명해주세요' },
{
media: {
contentType: 'image/jpeg',
data: imageData
}
}
]
});
console.log('이미지 분석:', response.text);
}
RAG (검색 증강 생성)
외부 지식을 활용한 컨텍스트 인식 AI 구현:
import { defineRetriever } from 'genkit';
// 문서 검색기 정의
const documentRetriever = defineRetriever({
name: 'companyDocs',
configSchema: {
type: 'object',
properties: {
query: { type: 'string' }
}
}
}, async (input) => {
// 문서 검색 시뮬레이션
return [
{
content: '회사 정책 문서 내용...',
metadata: { source: 'employee-handbook.pdf', page: 1 }
}
];
});
// RAG 기반 Q&A
async function answerQuestion(question: string) {
const response = await ai.generate({
model: googleAI.model('gemini-2.0-flash-exp'),
prompt: `제공된 컨텍스트를 기반으로 이 질문에 답해주세요: ${question}`,
config: {
retriever: documentRetriever,
retrieverConfig: { query: question }
}
});
return response.text;
}
개발 워크플로우
Genkit CLI 사용
Genkit CLI는 강력한 개발 도구를 제공합니다:
# UI와 함께 개발 서버 시작
genkit start -- npm run dev
# 특정 플로우 실행
genkit flow:run myFlow --input '{"query": "test"}'
# 플로우 평가
genkit eval:run --flow myFlow --dataset test-data.json
# 추적 생성
genkit trace:list
개발자 UI 기능
로컬 Genkit UI는 다음을 제공합니다:
- 플로우 플레이그라운드: 다양한 입력으로 AI 플로우 테스트
- 모델 비교: 다른 모델의 출력 비교
- 추적 검사기: 자세한 추적으로 실행 디버그
- 평가 대시보드: 성능 지표 검토
- 프롬프트 엔지니어링: 시각적으로 프롬프트 반복
genkit start
실행 시 http://localhost:4000
에서 UI에 접근할 수 있습니다.
프로덕션 배포
Firebase Functions 배포
// functions/src/index.ts
import { onFlow } from '@genkit-ai/firebase/functions';
import { genkit } from 'genkit';
import { googleAI } from '@genkit-ai/google-genai';
const ai = genkit({
plugins: [googleAI()]
});
export const chatFlow = onFlow(ai, {
name: 'chatFlow',
inputSchema: {
type: 'object',
properties: {
message: { type: 'string' }
}
},
outputSchema: {
type: 'object',
properties: {
response: { type: 'string' }
}
}
}, async (input) => {
const { text } = await ai.generate({
model: googleAI.model('gemini-2.0-flash-exp'),
prompt: input.message
});
return { response: text };
});
Firebase에 배포:
# Firebase 프로젝트 초기화
firebase init functions
# 함수 배포
firebase deploy --only functions
Google Cloud Run 배포
# Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
EXPOSE 8080
CMD ["npm", "start"]
Cloud Run에 배포:
# 컨테이너 빌드 및 푸시
gcloud builds submit --tag gcr.io/PROJECT_ID/genkit-app
# Cloud Run에 배포
gcloud run deploy genkit-app \
--image gcr.io/PROJECT_ID/genkit-app \
--platform managed \
--region us-central1 \
--allow-unauthenticated
모니터링 및 관찰성
모니터링 설정
프로덕션 배포를 위한 모니터링 구성:
import { genkit } from 'genkit';
import { googleCloudTrace } from '@genkit-ai/google-cloud';
const ai = genkit({
plugins: [
googleAI(),
googleCloudTrace({
projectId: 'your-project-id'
})
],
telemetry: {
instrumentation: 'googleCloud',
logger: 'googleCloud'
}
});
모니터링 대시보드
Firebase 콘솔은 다음을 제공합니다:
- 요청 볼륨: API 호출 빈도 추적
- 지연 시간 지표: 응답 시간 모니터링
- 오류율: 실패 식별 및 디버그
- 비용 분석: 토큰 사용량 및 비용 모니터링
- 모델 성능: 모델 효과성 비교
모범 사례
1. 오류 처리
import { GenkitError } from 'genkit';
async function robustGeneration(prompt: string) {
try {
const response = await ai.generate({
model: googleAI.model('gemini-2.0-flash-exp'),
prompt,
config: {
maxRetries: 3,
timeout: 30000
}
});
return response.text;
} catch (error) {
if (error instanceof GenkitError) {
console.error('Genkit 오류:', error.message);
// 특정 오류 유형 처리
switch (error.code) {
case 'RATE_LIMIT_EXCEEDED':
// 백오프 전략 구현
break;
case 'INVALID_REQUEST':
// 잘못된 입력 처리
break;
}
}
throw error;
}
}
2. 입력 검증
import Joi from 'joi';
const inputSchema = Joi.object({
query: Joi.string().min(1).max(1000).required(),
language: Joi.string().valid('en', 'ko', 'ar').default('ko')
});
async function validateAndProcess(input: any) {
const { error, value } = inputSchema.validate(input);
if (error) {
throw new Error(`잘못된 입력: ${error.message}`);
}
return value;
}
3. 프롬프트 엔지니어링
const SYSTEM_PROMPT = `
당신은 기술 문서 전문 AI 어시스턴트입니다.
항상 정확하고 잘 구조화된 응답을 적절한 예제와 함께 제공하세요.
확실하지 않은 것이 있다면 불확실성을 명확히 표현하세요.
`;
async function generateDocumentation(topic: string) {
const response = await ai.generate({
model: googleAI.model('gemini-2.0-flash-exp'),
prompt: `${SYSTEM_PROMPT}\n\n주제: ${topic}\n\n포괄적인 문서를 제공하세요:`,
config: {
temperature: 0.3, // 기술적 내용을 위한 낮은 온도
maxOutputTokens: 2000
}
});
return response.text;
}
4. 비용 최적화
// 다양한 작업에 적절한 모델 사용
const MODEL_CONFIG = {
simple: googleAI.model('gemini-2.0-flash-exp'), // 빠르고 비용 효율적
complex: googleAI.model('gemini-2.0-pro'), // 더 강력하지만 높은 비용
multimodal: googleAI.model('gemini-2.0-pro-vision') // 이미지 + 텍스트
};
function selectModel(taskComplexity: 'simple' | 'complex' | 'multimodal') {
return MODEL_CONFIG[taskComplexity];
}
일반적인 문제 해결
인증 문제
# Google Cloud 자격 증명 설정
export GOOGLE_APPLICATION_CREDENTIALS="path/to/service-account-key.json"
# 또는 gcloud CLI 사용
gcloud auth application-default login
모델 접근 문제
// 모델 가용성 확인
const availableModels = await googleAI.listModels();
console.log('사용 가능한 모델:', availableModels);
// 모델별 오류 처리
try {
const response = await ai.generate({
model: googleAI.model('gemini-2.0-flash-exp'),
prompt: 'test'
});
} catch (error) {
if (error.message.includes('model not found')) {
console.log('gemini-1.5-pro를 대신 사용해보세요');
}
}
성능 최적화
// 요청 캐싱 구현
const cache = new Map();
async function cachedGeneration(prompt: string) {
const cacheKey = `generation:${prompt}`;
if (cache.has(cacheKey)) {
return cache.get(cacheKey);
}
const result = await ai.generate({
model: googleAI.model('gemini-2.0-flash-exp'),
prompt
});
cache.set(cacheKey, result.text);
return result.text;
}
테스트 전략
단위 테스트
import { describe, it, expect, beforeEach } from 'vitest';
describe('AI 함수', () => {
beforeEach(() => {
// 테스트 환경 설정
});
it('유효한 응답을 생성해야 함', async () => {
const response = await generateText('테스트 프롬프트');
expect(response).toBeDefined();
expect(typeof response).toBe('string');
expect(response.length).toBeGreaterThan(0);
});
it('구조화된 출력을 처리해야 함', async () => {
const result = await generateStructuredData();
expect(result).toHaveProperty('product');
expect(result.rating).toBeGreaterThanOrEqual(1);
expect(result.rating).toBeLessThanOrEqual(5);
});
});
통합 테스트
// test/integration.test.ts
import { genkit } from 'genkit';
import { googleAI } from '@genkit-ai/google-genai';
const testAI = genkit({
plugins: [googleAI()],
environment: 'test'
});
describe('통합 테스트', () => {
it('Google AI와 성공적으로 통합되어야 함', async () => {
const response = await testAI.generate({
model: googleAI.model('gemini-2.0-flash-exp'),
prompt: '안녕하세요'
});
expect(response.text).toContain('안녕');
});
});
보안 고려사항
API 키 관리
// API 키에 환경 변수 사용
const config = {
googleAI: {
apiKey: process.env.GOOGLE_AI_API_KEY || '',
projectId: process.env.GOOGLE_CLOUD_PROJECT || ''
}
};
// 구성 검증
if (!config.googleAI.apiKey) {
throw new Error('GOOGLE_AI_API_KEY 환경 변수가 필요합니다');
}
입력 소독
import DOMPurify from 'isomorphic-dompurify';
function sanitizeInput(input: string): string {
// 잠재적으로 해로운 내용 제거
const cleaned = DOMPurify.sanitize(input);
// 추가 검증
if (cleaned.length > 10000) {
throw new Error('입력이 너무 깁니다');
}
return cleaned;
}
속도 제한
import rateLimit from 'express-rate-limit';
const aiRateLimit = rateLimit({
windowMs: 15 * 60 * 1000, // 15분
max: 100, // 각 IP를 windowMs당 100개 요청으로 제한
message: '이 IP에서 너무 많은 AI 요청이 있습니다'
});
// AI 엔드포인트에 적용
app.use('/api/ai', aiRateLimit);
결론
Firebase Genkit은 AI 애플리케이션 구축을 위한 강력하고 프로덕션 준비가 된 프레임워크를 제공합니다. 통합된 인터페이스, 크로스 언어 지원, 포괄적인 도구는 AI 기능을 애플리케이션에 통합하려는 개발자에게 탁월한 선택입니다.
주요 요점:
- 간단하게 시작: 기본 텍스트 생성으로 시작하여 점진적으로 복잡한 기능 추가
- 도구 활용: 효율적인 개발을 위해 CLI 및 개발자 UI 활용
- 프로덕션 계획: 적절한 모니터링, 오류 처리, 보안 구현
- 비용 최적화: 적절한 모델 선택 및 캐싱 전략 구현
- 철저한 테스트: 신뢰할 수 있는 AI 애플리케이션을 위한 포괄적인 테스트 전략 사용
Firebase Genkit을 사용하면 프로토타입에서 프로덕션까지 확장 가능한 정교한 AI 애플리케이션을 자신 있게 구축할 수 있습니다.
다음 단계
- 공식 Genkit 문서 탐색
- Genkit 샘플 시도
- Genkit Discord 커뮤니티 참여
- 다양한 모델 제공업체 및 기능 실험
- 이 튜토리얼에서 다룬 개념을 사용하여 자신만의 AI 기반 애플리케이션 구축