Ten projekt kodu pokazuje, jak tworzyć aplikację konwersacyjną, która umożliwia użytkownikom wyodrębnianie informacji z dokumentów PDF za pomocą języka naturalnego.
- Konfigurowanie projektu
- Importowanie wymaganych zależności
- Konfigurowanie Genkit i modelu domyślnego
- Wczytywanie i analizowanie pliku PDF
- Konfigurowanie prośby
- Implementacja interfejsu użytkownika
- Wdrażanie pętli czatu
- Uruchamianie aplikacji
Wymagania wstępne
Przed rozpoczęciem pracy musisz spełnić te wymagania wstępne:
Etapy wdrażania
Po skonfigurowaniu zależności możesz skompilować projekt.
1. Konfigurowanie projektu
Utwórz strukturę katalogów i plik, w których będziesz przechowywać kod źródłowy.
$ mkdir -p chat-with-a-pdf/src && \ cd chat-with-a-pdf && \ touch src/index.ts
Zainicjuj nowy projekt TypeScript.
$ npm init -y
Zainstaluj moduł pdf-parse.
$ npm i pdf-parse && npm i -D @types/pdf-parse
Aby używać Genkit w projekcie, zainstaluj te zależności Genkit:
$ npm i genkit @genkit-ai/googleai
genkit
zapewnia podstawowe funkcje Genkit.@genkit-ai/googleai
zapewnia dostęp do modeli Google AI Gemini.
Pobieranie i konfigurowanie klucza interfejsu API modelu
Aby korzystać z interfejsu Gemini API, którego używa ten samouczek, musisz najpierw skonfigurować klucz API. Jeśli nie masz jeszcze klucza, utwórz go w Google AI Studio.
Gemini API oferuje obszerny bezpłatny poziom dostępu i nie wymaga karty kredytowej, aby zacząć korzystać z usługi.
Po utworzeniu klucza interfejsu API ustaw zmienną środowiskową
GOOGLE_GENAI_API_KEY
na klucz, używając tego polecenia:$ export GOOGLE_GENAI_API_KEY=<your API key>
2. Importowanie wymaganych zależności
W utworzonym pliku index.ts
dodaj te wiersze, aby zaimportować zależności wymagane w tym projekcie:
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";
- Pierwszy wiersz importuje model
gemini20Flash
i wtyczkęgoogleAI
z pakietu@genkit-ai/googleai
, umożliwiając dostęp do modeli Gemini od Google. - Kolejne 2 wiersze importują bibliotekę
pdf-parse
do analizowania plików PDF oraz modułfs
do operacji na systemie plików. - Ostatni wiersz importuje funkcję
createInterface
z modułunode:readline/promises
, który służy do tworzenia interfejsu wiersza poleceń do interakcji z użytkownikiem.
3. Konfigurowanie Genkit i modelu domyślnego
Aby skonfigurować Genkit i ustawić Gemini 2.0 Flash jako domyślny model, dodaj te wiersze.
const ai = genkit({
plugins: [googleAI()],
model: gemini20Flash,
});
Następnie możesz dodać szkielet kodu i obsługi błędów.
(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. Wczytaj i przeanalizuj plik PDF
Dodaj kod, który odczytuje nazwę pliku PDF przekazaną z wiersza poleceń.
// 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); }
Dodaj kod, który wczyta zawartość pliku PDF.
// Step 2: load PDF file let dataBuffer = fs.readFileSync(filename); const { text } = await pdf(dataBuffer);
5. Konfigurowanie prompta
Dodaj kod, aby skonfigurować prompt:
// 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}
`;
- Pierwsza deklaracja
const
definiuje domyślne prompt, jeśli użytkownik nie poda własnego prompta w wierszu poleceń. - Druga deklaracja
const
interpoluje prefiks prompta i pełny tekst pliku PDF w prompt modelu.
6. Implementacja interfejsu użytkownika
Dodaj ten kod, aby rozpocząć czat i zaimplementować interfejs użytkownika:
// 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");
Pierwsza deklaracja const
uruchamia czat z modelem przez wywołanie metody chat
, przekazując prompt (który zawiera pełny tekst pliku PDF). Pozostała część kodu tworzy instancję wejścia tekstowego, a następnie wyświetla wiadomość użytkownikowi.
7. Zaimplementuj pętlę czatu
W kroku 5 dodaj kod, który będzie odbierał dane wejściowe od użytkownika i przesyłał je do modelu za pomocą funkcji chat.send
. Ta część aplikacji działa w pętli, dopóki użytkownik nie naciśnie CTRL + C.
// Step 5: chat loop
while (true) {
const userInput = await readline.question("> ");
const { text } = await chat.send(userInput);
console.log(text);
}
8. Uruchamianie aplikacji
Aby uruchomić aplikację, 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.