PDF 파일로 채팅하기

이 Codelab에서는 Genkit를 사용하여 PDF 파일로 채팅할 수 있는 앱을 구현하는 방법을 보여줍니다.

기본 요건

이 Codelab에서는 개발자가 Node.js로 애플리케이션을 빌드하는 데 익숙하다고 가정합니다. 이 Codelab을 완료하려면 개발 환경이 다음 요구사항을 충족하는지 확인하세요.

  • Node.js v20 이상
  • npm

새 프로젝트 만들기

  1. 새 빈 폴더를 만듭니다.

    mkdir chat-with-a-pdf
    cd chat-with-a-pdf
    
  2. 새 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 스튜디오에서 키를 만드세요.

Google AI Studio에서 API 키 가져오기

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 가져오기 및 초기화

  1. 새 폴더 src를 만들고 그 안에 새 파일 index.ts을 만듭니다. 다음 줄을 추가하여 Genkit 및 Google AI 플러그인을 가져옵니다.

    import {gemini15Flash, googleAI} from '@genkit-ai/googleai';
    import {genkit} from 'genkit';
    
  2. 다음 줄을 추가하여 Genkit을 구성하고 Gemini 1.5 Flash를 기본 모델로 설정합니다.

    const ai = genkit({
      plugins: [googleAI()],
      model: gemini15Flash,
    });
    
  3. 앱의 기본 본문을 추가합니다.

    (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 파일을 로드하고 파싱하는 코드를 작성합니다.

  1. pdf-parse를 설치합니다.

    npm i pdf-parse
    
  2. PDF 라이브러리를 앱에 가져옵니다.

    import pdf from 'pdf-parse';
    import fs from 'fs';
    
  3. 명령줄에서 전달된 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);
      }
    
  4. PDF 파일의 콘텐츠를 로드합니다.

      // 2: load PDF file
      let dataBuffer = fs.readFileSync(filename);
      const { text } = await pdf(dataBuffer);
    

메시지 설정

프롬프트를 설정하려면 다음 단계를 따르세요.

  1. 사용자가 명령줄을 통해 맞춤 프롬프트를 제공할 수 있습니다. 프롬프트를 제공하지 않으면 기본값을 사용하세요.

    const prefix = process.argv[3] || "Answer the user's questions about the contents of this PDF file.";
    
  2. 프롬프트 접두사와 PDF 파일의 전체 텍스트를 모델의 프롬프트에 삽입합니다.

        const prompt = `
          ${prefix}
          Context:
          ${data.text}
        `
    

채팅 루프 구현

  1. 프롬프트(PDF 파일의 전체 텍스트 포함)를 전달하여 chat 메서드를 호출하여 모델과의 채팅을 시작합니다.

    const chat = ai.chat({ system: prompt })
    
  2. createInterface를 가져옵니다. 그러면 텍스트 기반 UI를 빌드할 수 있습니다.

    import {createInterface} from "node:readline/promises";
    
  3. 텍스트 입력을 인스턴스화한 다음 사용자에게 메시지를 표시합니다.

        const readline = createInterface(process.stdin, process.stdout);
        console.log("You're chatting with Gemini. Ctrl-C to quit.\n");
    
  4. 사용자의 입력을 읽은 다음 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 파일로 채팅을 시작할 수 있습니다.