In diesem Codelab wird gezeigt, wie Sie eine Konversationsanwendung erstellen, mit der Nutzer Informationen aus PDF-Dokumenten in natürlicher Sprache extrahieren können.
- Projekt einrichten
- Erforderliche Abhängigkeiten importieren
- Genkit und das Standardmodell konfigurieren
- PDF-Datei laden und parsen
- Aufforderung einrichten
- UI implementieren
- Chat-Loop implementieren
- 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
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
Initiieren Sie ein neues TypeScript-Projekt.
$ npm init -y
Installieren Sie das Modul „pdf-parse“.
$ npm i pdf-parse && npm i -D @types/pdf-parse
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.
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 dasgoogleAI
-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 dasfs
-Modul für Dateisystemvorgänge importiert. - In der letzten Zeile wird die Funktion
createInterface
aus dem Modulnode: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
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); }
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.