Czat z plikiem PDF

Ten warsztat programistyczny pokazuje, jak za pomocą Genkit wdrożyć aplikację, która umożliwia prowadzenie czatu z pliku PDF.

Wymagania wstępne

W tym ćwiczeniu zakładamy, że wiesz, jak tworzyć aplikacje za pomocą Node.js. Aby ukończyć to ćwiczenie, sprawdź, czy środowisko programistyczne spełnia te wymagania:

  • Node.js w wersji 20 lub nowszej
  • npm

Utwórz nowy projekt

  1. Utwórz nowy pusty folder.

    mkdir chat-with-a-pdf
    cd chat-with-a-pdf
    
  2. Zainicjuj nowy projekt TypeScript.

    npm init -y
    

Instalowanie Genkit

Aby używać Genkit w projekcie, zainstaluj te zależności Genkit:

  • genkit zapewnia podstawowe funkcje Genkit.
  • @genkit-ai/googleai zapewnia dostęp do modeli Google AI Gemini.
npm install genkit @genkit-ai/googleai

Konfigurowanie klucza interfejsu API modelu

W tym przewodniku pokażemy, jak korzystać z interfejsu Gemini API, który oferuje obszerny bezpłatny poziom i nie wymaga karty kredytowej, aby zacząć. Aby korzystać z interfejsu Gemini API, musisz mieć klucz interfejsu API. Jeśli jeszcze go nie masz, utwórz klucz w Google AI Studio.

Uzyskiwanie klucza interfejsu API z Google AI Studio

Po utworzeniu klucza interfejsu API ustaw zmienną środowiskową GOOGLE_GENAI_API_KEY na klucz za pomocą tego polecenia:

export GOOGLE_GENAI_API_KEY=<your API key>

Uwaga: ten samouczek używa interfejsu Gemini API z AI Studio, ale Genkit obsługuje też wiele innych dostawców modeli, takich jak: * Gemini z Vertex AI * modele Claude 3 firmy Anthropic i Llama 3.1 za pomocą Vertex AI Model Garden * modele open source za pomocą Ollama * dostawcy obsługiwani przez społeczność, tacy jak OpenAI i Cohere.

Importowanie i inicjowanie Genkit

  1. Utwórz nowy folder src i w nim nowy plik index.ts. Aby zaimportować Genkit i wtyczkę Google AI, dodaj te wiersze:

    import {gemini15Flash, googleAI} from '@genkit-ai/googleai';
    import {genkit} from 'genkit';
    
  2. Dodaj te wiersze, aby skonfigurować Genkit i ustawić Gemini 1.5 Flash jako domyślny model.

    const ai = genkit({
      plugins: [googleAI()],
      model: gemini15Flash,
    });
    
  3. Dodaj główną część aplikacji.

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

Ładowanie i analizowanie pliku PDF

W tym kroku napiszesz kod do wczytywania i analizowania pliku PDF.

  1. Zainstaluj aplikację pdf-parse.

    npm i pdf-parse
    
  2. Zaimportuj bibliotekę PDF do aplikacji.

    import pdf from 'pdf-parse';
    import fs from 'fs';
    
  3. odczytuje nazwę pliku PDF przekazaną z wiersza poleceń;

      // 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. Wczytaj zawartość pliku PDF.

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

Konfigurowanie prompta

Aby skonfigurować prompt, wykonaj te czynności.

  1. Zezwalanie użytkownikowi na wyświetlanie niestandardowego prompta w wierszu poleceń. Jeśli nie podadzą prompta, użyj prompta domyślnego.

    const prefix = process.argv[3] || "Answer the user's questions about the contents of this PDF file.";
    
  2. Wprowadź prefiks promptu i pełny tekst pliku PDF do promptu dla modelu.

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

Zaimplementuj pętlę czatu

  1. Rozpocznij czat z modelem, wywołując metodę chat, przekazując prompt (który zawiera pełny tekst pliku PDF).

    const chat = ai.chat({ system: prompt })
    
  2. Importuj createInterface, aby utworzyć interfejs tekstowy.

    import {createInterface} from "node:readline/promises";
    
  3. Utwórz instancję pola tekstowego, a potem wyświetl wiadomość użytkownikowi.

        const readline = createInterface(process.stdin, process.stdout);
        console.log("You're chatting with Gemini. Ctrl-C to quit.\n");
    
  4. Przeczytaj dane wejściowe użytkownika, a potem wyślij je do modelu za pomocą funkcji chat.send. Ten fragment aplikacji będzie się powtarzać, dopóki użytkownik nie naciśnie CTRL + C.

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

Uruchamianie aplikacji

Teraz możesz uruchomić aplikację w terminalu. Otwórz terminal w folderze głównym projektu, a potem uruchom to polecenie:

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

Możesz wtedy rozpocząć czat z pliku PDF.