Mit einer PDF-Datei chatten

Mit Genkit können Sie eine App erstellen, mit der Nutzer mit einer PDF-Datei chatten können. Gehen Sie hierzu folgendermaßen vor:

  1. Projekt einrichten
  2. Erforderliche Abhängigkeiten importieren
  3. Genkit und das Standardmodell konfigurieren
  4. PDF-Datei laden und parsen
  5. Aufforderung einrichten
  6. UI implementieren
  7. Chat-Loop implementieren
  8. App ausführen

In diesem Leitfaden wird beschrieben, wie Sie diese Aufgaben ausführen.

Abhängigkeiten

Bevor Sie mit der Arbeit beginnen, sollten Sie die folgenden Abhängigkeiten eingerichtet haben:

Aufgaben

Nachdem Sie die Abhängigkeiten eingerichtet haben, können Sie das Projekt selbst erstellen.

1. Projekt einrichten

  1. Erstellen Sie ein Verzeichnis und eine Datei für den Quellcode.

    $ mkdir -p chat-with-a-pdf/src && \
    cd chat-with-a-pdf/src && \
    touch index.ts
    
  2. Initiieren Sie ein neues TypeScript-Projekt.

    $ npm init -y
    
  3. Installieren Sie das Modul „pdf-parse“:

    $ npm i pdf-parse
    
  4. Installieren Sie die folgenden Genkit-Abhängigkeiten, um Genkit in Ihrem Projekt zu verwenden:

    $ npm install genkit @genkit-ai/googleai
    
  • genkit stellt die wichtigsten Funktionen von Genkit bereit.
  • @genkit-ai/googleai bietet Zugriff auf die Google AI-Gemini-Modelle.

      5. API-Schlüssel des Modells abrufen und konfigurieren

    Um die Gemini API zu verwenden, die in diesem Codelab verwendet wird, müssen Sie zuerst einen API-Schlüssel konfigurieren. Wenn Sie noch keinen haben, erstellen Sie einen Schlüssel in Google AI Studio. Die Gemini API bietet eine großzügige kostenlose Stufe, sodass Sie für den Einstieg keine Kreditkarte brauchen. Nachdem Sie den API-Schlüssel erstellt haben, legen Sie die Umgebungsvariable GOOGLE_GENAI_API_KEY` mit dem folgenden Befehl auf Ihren Schlüssel fest:
    $ export GOOGLE_GENAI_API_KEY=<your API key>


Hinweis:In dieser Anleitung wird die Gemini API von AI Studio verwendet. Genkit unterstützt jedoch eine Vielzahl von Modellanbietern, darunter:

2. Erforderliche Abhängigkeiten importieren

Fügen Sie der von Ihnen erstellten index.ts-Datei die folgenden Zeilen hinzu, um die für dieses Projekt erforderlichen Abhängigkeiten zu importieren:

   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";
  • In den ersten beiden Zeilen werden Genkit und das Google AI-Plug-in importiert.
  • Die beiden zweiten Zeilen sind für den PDF-Parser.
  • Die fünfte Zeile dient der Implementierung der Benutzeroberfläche.

3. Genkit und das Standardmodell konfigurieren

Fügen Sie die folgenden Zeilen hinzu, um Genkit zu konfigurieren und Gemini 1.5 Flash als Standardmodell festzulegen.

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

Sie können dann einen Skeleton für den Code und die Fehlerbehandlung hinzufügen.

   (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-Datei laden und parsen

  1. Fügen Sie unter Schritt 1 Code hinzu, um den PDF-Dateinamen zu lesen, der über die Befehlszeile übergeben wurde.

      const filename = process.argv[2];
      if (!filename) {
        console.error("Please provide a filename as a command line argument.");
        process.exit(1);
      }
    
  2. Fügen Sie unter Schritt 2 Code hinzu, um den Inhalt der PDF-Datei zu laden.

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

5. Prompt einrichten

Fügen Sie unter Schritt 3 Code zum Einrichten des Prompts hinzu:

   const prefix = process.argv[3] || "Sample prompt: Answer the user's questions about the contents of this PDF file.";
   const prompt = `
     ${prefix}
     Context:
     ${text}
       `
  • Die erste const-Deklaration definiert einen Standardprompt, falls der Nutzer keinen eigenen Prompt über die Befehlszeile übergeben hat.
  • In der zweiten const-Deklaration werden das Prompt-Präfix und der vollständige Text der PDF-Datei in den Prompt für das Modell interpoliert.

6. Benutzeroberfläche implementieren

Fügen Sie unter Schritt 4 den folgenden Code hinzu, um den Chat zu starten und die Benutzeroberfläche zu implementieren:

   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");

Mit der ersten const-Deklaration wird der Chat mit dem Modell gestartet, indem die Methode chat aufgerufen und der Prompt übergeben wird, der den vollständigen Text der PDF-Datei enthält. Im Rest des Codes wird eine Texteingabe instanziiert und dem Nutzer eine Nachricht angezeigt.

7. Chat-Loop implementieren

Fügen Sie unter Schritt 5 Code hinzu, um Nutzereingaben zu empfangen und diese mit chat.send an das Modell zu senden. Dieser Teil der App wird wiederholt, bis der Nutzer STRG + C drückt.

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

8. Anwendung ausführen

Führen Sie die App über Ihr Terminal aus. Öffnen Sie das Terminal im Stammverzeichnis Ihres Projekts und führen Sie den folgenden Befehl aus:

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

Sie können dann mit der PDF-Datei chatten.