Questo codelab mostra come creare un'applicazione di conversazione che consenta agli utenti di estrarre informazioni dai documenti PDF utilizzando il linguaggio naturale.
- Configurare il progetto
- Importa le dipendenze richieste
- Configurare Genkit e il modello predefinito
- Carica e analizza il file PDF
- Configurare il prompt
- Implementare l'interfaccia utente
- Implementare il loop di chat
- Eseguire l'app
Prerequisiti
Prima di iniziare a lavorare, devi configurare i seguenti prerequisiti:
Procedura di implementazione
Dopo aver configurato le dipendenze, puoi compilare il progetto.
1. Configura il progetto
Crea una struttura di directory e un file per contenere il codice sorgente.
$ mkdir -p chat-with-a-pdf/src && \ cd chat-with-a-pdf && \ touch src/index.ts
Inizializza un nuovo progetto TypeScript.
$ npm init -y
Installa il modulo pdf-parse.
$ npm i pdf-parse && npm i -D @types/pdf-parse
Installa le seguenti dipendenze Genkit per utilizzare Genkit nel tuo progetto:
$ npm i genkit @genkit-ai/googleai
genkit
fornisce le funzionalità di base di Genkit.@genkit-ai/googleai
consente di accedere ai modelli Gemini di Google AI.
Ottieni e configura la chiave API del modello
Per utilizzare l'API Gemini, utilizzata da questo codelab, devi prima configurare una chiave API. Se non ne hai già una, crea una chiave in Google AI Studio.
L'API Gemini offre un generoso livello senza costi e non richiede una carta di credito per iniziare.
Dopo aver creato la chiave API, imposta la variabile di ambiente
GOOGLE_GENAI_API_KEY
sulla chiave con il comando seguente:$ export GOOGLE_GENAI_API_KEY=<your API key>
2. Importa le dipendenze richieste
Nel file index.ts
che hai creato, aggiungi le seguenti righe per importare le dipendenze richieste per questo progetto:
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";
- La prima riga importa il modello
gemini20Flash
e il plug-ingoogleAI
dal pacchetto@genkit-ai/googleai
, consentendo l'accesso ai modelli Gemini di Google. - Le due righe successive importano la libreria
pdf-parse
per l'analisi dei file PDF e il modulofs
per le operazioni sul file system. - L'ultima riga importa la funzione
createInterface
dal modulonode:readline/promises
, che viene utilizzata per creare un'interfaccia a riga di comando per l'interazione con l'utente.
3. Configura Genkit e il modello predefinito
Aggiungi le seguenti righe per configurare Genkit e impostare Gemini 2.0 Flash come modello predefinito.
const ai = genkit({
plugins: [googleAI()],
model: gemini20Flash,
});
Puoi quindi aggiungere uno scheletro per il codice e la gestione degli errori.
(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. Carica e analizza il PDF
Aggiungi il codice per leggere il nome del file PDF passato dalla riga di comando.
// 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); }
Aggiungi il codice per caricare i contenuti del file PDF.
// Step 2: load PDF file let dataBuffer = fs.readFileSync(filename); const { text } = await pdf(dataBuffer);
5. Configurare il prompt
Aggiungi il codice per configurare il 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}
`;
- La prima dichiarazione
const
definisce un prompt predefinito se l'utente non ne specifica uno dalla riga di comando. - La seconda dichiarazione
const
interpola il prefisso del prompt e il testo completo del file PDF nel prompt per il modello.
6. Implementa l'interfaccia utente
Aggiungi il codice seguente per avviare la chat e implementare l'interfaccia utente:
// 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");
La prima dichiarazione const
avvia la chat con il modello chiamando il metodo chat
, passando il prompt (che include il testo completo del file PDF). Il resto del codice crea un input di testo, quindi mostra un messaggio all'utente.
7. Implementare il loop di chat
Nel passaggio 5, aggiungi il codice per ricevere l'input dell'utente e inviarlo al modello utilizzando chat.send
. Questa parte
dell'app esegue un loop finché l'utente non preme CTRL + C.
// Step 5: chat loop
while (true) {
const userInput = await readline.question("> ");
const { text } = await chat.send(userInput);
console.log(text);
}
8. Esegui l'app
Per eseguire l'app, apri il terminale nella directory principale del progetto ed esegui il seguente comando:
npx tsx src/index.ts path/to/some.pdf
A questo punto puoi iniziare a chattare con il file PDF.