Mit einer PDF-Datei chatten

In diesem Codelab wird gezeigt, wie Sie eine Konversationsanwendung erstellen, mit der Nutzer Informationen aus PDF-Dokumenten in natürlicher Sprache extrahieren können.

  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

Vorbereitung

Bevor Sie mit der Arbeit beginnen, sollten Sie die folgenden Voraussetzungen erfüllen:

Implementierungsschritte

Nachdem Sie die Abhängigkeiten eingerichtet haben, können Sie das Projekt 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 && \
    touch src/index.ts
    
  2. Initiieren Sie ein neues TypeScript-Projekt.

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

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

    $ npm i 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

    Wenn Sie die Gemini API verwenden möchten, 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>
    

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 { gemini20Flash, googleAI } from '@genkit-ai/googleai';
import { genkit } from 'genkit/beta'; // chat is a beta feature
import pdf from 'pdf-parse';
import fs from 'fs';
import { createInterface } from "node:readline/promises";
  • In der ersten Zeile werden das gemini20Flash-Modell und das googleAI-Plug-in aus dem @genkit-ai/googleai-Paket importiert, um Zugriff auf die Gemini-Modelle von Google zu erhalten.
  • In den nächsten beiden Zeilen werden die pdf-parse-Bibliothek zum Parsen von PDF-Dateien und das fs-Modul für Dateisystemvorgänge importiert.
  • In der letzten Zeile wird die Funktion createInterface aus dem Modul node:readline/promises importiert. Damit wird eine Befehlszeilenoberfläche für die Nutzerinteraktion erstellt.

3. Genkit und das Standardmodell konfigurieren

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

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

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 Code hinzu, um den PDF-Dateinamen zu lesen, der über die Befehlszeile übergeben wurde.

        // Step 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);
        }
    
  2. Fügen Sie Code hinzu, um den Inhalt der PDF-Datei zu laden.

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

5. Prompt einrichten

Fügen Sie Code hinzu, um den Prompt einzurichten:

    // Step 3: construct prompt
    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 den folgenden Code hinzu, um den Chat zu starten und die Benutzeroberfläche zu implementieren:

    // Step 4: start chat
    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.

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

8. Anwendung ausführen

Öffnen Sie zum Ausführen der App 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.