PDF 파일로 채팅하기

Genkit을 사용하여 사용자가 PDF 파일로 채팅할 수 있는 앱을 빌드할 수 있습니다. 이를 위해 다음 단계를 따르세요.

  1. 프로젝트 설정하기
  2. 필요한 종속 항목 가져오기
  3. Genkit 및 기본 모델 구성
  4. PDF 파일 로드 및 파싱
  5. 프롬프트 설정하기
  6. UI 구현
  7. 채팅 루프 구현
  8. 앱 실행

이 가이드에서는 이러한 각 작업을 실행하는 방법을 설명합니다.

종속 항목

작업을 시작하기 전에 다음 종속 항목을 설정해야 합니다.

작업

종속 항목을 설정한 후 프로젝트 자체를 빌드할 수 있습니다.

1. 프로젝트 설정

  1. 소스 코드를 보관할 디렉터리 구조와 파일을 만듭니다.

    $ mkdir -p chat-with-a-pdf/src && \
    cd chat-with-a-pdf/src && \
    touch index.ts
    
  2. 새 TypeScript 프로젝트를 초기화합니다.

    $ npm init -y
    
  3. pdf-parse 모듈을 설치합니다.

    $ npm i pdf-parse
    
  4. 프로젝트에서 Genkit를 사용하려면 다음 Genkit 종속 항목을 설치하세요.

    $ npm install genkit @genkit-ai/googleai
    
  • genkit는 Genkit 핵심 기능을 제공합니다.
  • @genkit-ai/googleai는 Google AI Gemini 모델에 대한 액세스 권한을 제공합니다.

      5. 모델 API 키 가져오기 및 구성

    이 Codelab에서 사용하는 Gemini API를 사용하려면 먼저 API 키를 구성해야 합니다. 아직 키가 없다면 Google AI Studio에서 키를 만듭니다. Gemini API는 충분한 할당량이 포함된 무료 등급을 제공하므로 신용카드 없이도 시작할 수 있습니다. API 키를 만든 후 다음 명령어를 사용하여 GOOGLE_GENAI_API_KEY` 환경 변수를 키로 설정합니다.
    $ export GOOGLE_GENAI_API_KEY=<your API key>


참고: 이 튜토리얼에서는 AI 스튜디오의 Gemini API를 사용하지만 Genkit은 다음을 비롯한 다양한 모델 제공업체를 지원합니다.

2. 필요한 종속 항목 가져오기

만든 index.ts 파일에 다음 줄을 추가하여 이 프로젝트에 필요한 종속 항목을 가져옵니다.

   import { gemini15Flash, googleAI } from '@genkit-ai/googleai';
   import { genkit } from 'genkit';
   import pdf from 'pdf-parse';
   import fs from 'fs';
   import { createInterface } from "node:readline/promises";
  • 첫 두 줄은 Genkit와 Google AI 플러그인을 가져옵니다.
  • 두 번째 두 줄은 pdf 파서용입니다.
  • 다섯 번째 줄은 UI를 구현하기 위한 것입니다.

3. Genkit 및 기본 모델 구성

다음 줄을 추가하여 Genkit을 구성하고 Gemini 1.5 Flash를 기본 모델로 설정합니다.

   const ai = genkit({
     plugins: [googleAI()],
     model: gemini15Flash,
   });

그런 다음 코드 및 오류 처리의 스켈레톤을 추가할 수 있습니다.

   (async () => {
     try {
       // Step 1: get command line arguments

       // Step 2: load PDF file

       // Step 3: construct prompt

       // Step 4: start chat

       Step 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!

4. PDF 로드 및 파싱

  1. 1단계에서 명령줄에서 전달된 PDF 파일 이름을 읽는 코드를 추가합니다.

      const filename = process.argv[2];
      if (!filename) {
        console.error("Please provide a filename as a command line argument.");
        process.exit(1);
      }
    
  2. 2단계에서 PDF 파일의 콘텐츠를 로드하는 코드를 추가합니다.

      let dataBuffer = fs.readFileSync(filename);
      const { text } = await pdf(dataBuffer);
    

5. 메시지 설정

3단계에서 메시지를 설정하는 코드를 추가합니다.

   const prefix = process.argv[3] || "Sample prompt: Answer the user's questions about the contents of this PDF file.";
   const prompt = `
     ${prefix}
     Context:
     ${text}
       `
  • 첫 번째 const 선언은 사용자가 명령줄에서 자체 프롬프트를 전달하지 않는 경우 기본 프롬프트를 정의합니다.
  • 두 번째 const 선언은 프롬프트 접두사와 PDF 파일의 전체 텍스트를 모델의 프롬프트에 보간합니다.

6. UI 구현

4단계에서 다음 코드를 추가하여 채팅을 시작하고 UI를 구현합니다.

   const chat = ai.chat({ system: prompt })
   const readline = createInterface(process.stdin, process.stdout);
   console.log("You're chatting with Gemini. Ctrl-C to quit.\n");

첫 번째 const 선언은 chat 메서드를 호출하여 프롬프트 (PDF 파일의 전체 텍스트 포함)를 전달하여 모델과의 채팅을 시작합니다. 나머지 코드는 텍스트 입력을 인스턴스화한 다음 사용자에게 메시지를 표시합니다.

7. 채팅 루프 구현

5단계에서 사용자 입력을 수신하고 chat.send를 사용하여 입력을 모델에 전송하는 코드를 추가합니다. 이 부분은 사용자가 CTRL + C를 누를 때까지 반복됩니다.

       while (true) {
         const userInput = await readline.question("> ");
         const {text} = await chat.send(userInput);
         console.log(text);
       }

8. 앱 실행

터미널에서 앱을 실행합니다. 프로젝트의 루트 폴더에서 터미널을 연 다음 다음 명령어를 실행합니다.

npx tsx src/index.ts path/to/some.pdf

그런 다음 PDF 파일로 채팅을 시작할 수 있습니다.