이 Codelab에서는 Genkit를 사용하여 PDF 파일로 채팅할 수 있는 앱을 구현하는 방법을 보여줍니다.
기본 요건
이 Codelab에서는 개발자가 Node.js로 애플리케이션을 빌드하는 데 익숙하다고 가정합니다. 이 Codelab을 완료하려면 개발 환경이 다음 요구사항을 충족하는지 확인하세요.
- Node.js v20 이상
- npm
새 프로젝트 만들기
새 빈 폴더를 만듭니다.
mkdir chat-with-a-pdf cd chat-with-a-pdf
새 TypeScript 프로젝트를 초기화합니다.
npm init -y
Genkit 설치
프로젝트에서 Genkit를 사용하려면 다음 Genkit 종속 항목을 설치하세요.
genkit
는 Genkit 핵심 기능을 제공합니다.@genkit-ai/googleai
는 Google AI Gemini 모델에 대한 액세스 권한을 제공합니다.
npm install genkit @genkit-ai/googleai
모델 API 키 구성
이 가이드에서는 Gemini API를 사용하는 방법을 보여줍니다. 충분한 할당량이 포함된 무료 등급을 제공하므로 신용카드 없이도 시작할 수 있습니다. Gemini API를 사용하려면 API 키가 필요합니다. 아직 키가 없다면 Google AI 스튜디오에서 키를 만드세요.
API 키를 만든 후 다음 명령어를 사용하여 GOOGLE_GENAI_API_KEY
환경 변수를 키로 설정합니다.
export GOOGLE_GENAI_API_KEY=<your API key>
참고: 이 튜토리얼에서는 AI 스튜디오의 Gemini API를 사용하지만 Genkit은 다음을 비롯한 다양한 모델 제공업체를 지원합니다. * Vertex AI의 Gemini * Vertex AI Model Garden을 통한 Anthropic의 Claude 3 모델 및 Llama 3.1 * Ollama를 통한 오픈소스 모델 * OpenAI 및 Cohere와 같은 커뮤니티 지원 제공업체
Genkit 가져오기 및 초기화
새 폴더
src
를 만들고 그 안에 새 파일index.ts
을 만듭니다. 다음 줄을 추가하여 Genkit 및 Google AI 플러그인을 가져옵니다.import {gemini15Flash, googleAI} from '@genkit-ai/googleai'; import {genkit} from 'genkit';
다음 줄을 추가하여 Genkit을 구성하고 Gemini 1.5 Flash를 기본 모델로 설정합니다.
const ai = genkit({ plugins: [googleAI()], model: gemini15Flash, });
앱의 기본 본문을 추가합니다.
(async () => { try { // 1: get command line arguments // 2: load PDF file // 3: construct prompt // 4: start chat // 5: chat loop } catch (error) { console.error("Error parsing PDF or interacting with Genkit:", error); } })(); // <-- don't forget the trailing parentheses to call the function!
PDF 파일 로드 및 파싱
이 단계에서는 PDF 파일을 로드하고 파싱하는 코드를 작성합니다.
pdf-parse
를 설치합니다.npm i pdf-parse
PDF 라이브러리를 앱에 가져옵니다.
import pdf from 'pdf-parse'; import fs from 'fs';
명령줄에서 전달된 PDF 파일 이름을 읽습니다.
// 1: get command line arguments const filename = process.argv[2]; if (!filename) { console.error("Please provide a filename as a command line argument."); process.exit(1); }
PDF 파일의 콘텐츠를 로드합니다.
// 2: load PDF file let dataBuffer = fs.readFileSync(filename); const { text } = await pdf(dataBuffer);
메시지 설정
프롬프트를 설정하려면 다음 단계를 따르세요.
사용자가 명령줄을 통해 맞춤 프롬프트를 제공할 수 있습니다. 프롬프트를 제공하지 않으면 기본값을 사용하세요.
const prefix = process.argv[3] || "Answer the user's questions about the contents of this PDF file.";
프롬프트 접두사와 PDF 파일의 전체 텍스트를 모델의 프롬프트에 삽입합니다.
const prompt = ` ${prefix} Context: ${data.text} `
채팅 루프 구현
프롬프트(PDF 파일의 전체 텍스트 포함)를 전달하여
chat
메서드를 호출하여 모델과의 채팅을 시작합니다.const chat = ai.chat({ system: prompt })
createInterface
를 가져옵니다. 그러면 텍스트 기반 UI를 빌드할 수 있습니다.import {createInterface} from "node:readline/promises";
텍스트 입력을 인스턴스화한 다음 사용자에게 메시지를 표시합니다.
const readline = createInterface(process.stdin, process.stdout); console.log("You're chatting with Gemini. Ctrl-C to quit.\n");
사용자의 입력을 읽은 다음
chat.send
를 사용하여 모델에 전송합니다. 앱의 이 부분은 사용자가 CTRL + C를 누를 때까지 반복됩니다.while (true) { const userInput = await readline.question("> "); const {text} = await chat.send(userInput); console.log(text); }
앱 실행
이제 터미널에서 앱을 실행할 수 있습니다. 프로젝트의 루트 폴더에서 터미널을 연 다음 다음 명령어를 실행합니다.
npx tsx src/index.ts path/to/some.pdf
그런 다음 PDF 파일로 채팅을 시작할 수 있습니다.