Chat com um arquivo PDF

Este codelab demonstra como criar um aplicativo de conversação que permite que os usuários extraiam informações de documentos PDF usando linguagem natural.

  1. Configurar o projeto
  2. Importar as dependências necessárias
  3. Configurar o Genkit e o modelo padrão
  4. Carregar e analisar o arquivo PDF
  5. Configurar o comando
  6. Implementar a interface
  7. Implementar o loop de chat
  8. Executar o aplicativo

Pré-requisitos

Antes de começar a trabalhar, você precisa configurar estes pré-requisitos:

Etapas de implementação

Depois de configurar as dependências, você pode criar o projeto.

1. Criar o projeto

  1. Crie uma estrutura de diretórios e um arquivo para armazenar seu código-fonte.

    $ mkdir -p chat-with-a-pdf/src && \
    cd chat-with-a-pdf && \
    touch src/index.ts
    
  2. Inicie um novo projeto do TypeScript.

    $ npm init -y
    
  3. Instale o módulo pdf-parse.

    $ npm i pdf-parse && npm i -D @types/pdf-parse
    
  4. Para usar o Genkit no seu projeto, instale as seguintes dependências:

    $ npm i genkit @genkit-ai/googleai
    
    • genkit oferece os recursos principais do Genkit.
    • @genkit-ai/googleai dá acesso aos modelos do Gemini da IA do Google.
  5. Receber e configurar a chave de API do modelo

    Para usar a API Gemini, que é usada neste codelab, primeiro é necessário configurar uma chave de API. Se você ainda não tiver, crie uma chave no Google AI Studio.

    A API Gemini oferece um nível sem custo financeiro generoso e não exige um cartão de crédito para começar.

    Depois de criar a chave de API, defina a variável de ambiente GOOGLE_GENAI_API_KEY para sua chave com o comando a seguir:

    $ export GOOGLE_GENAI_API_KEY=<your API key>
    

2. Importar as dependências necessárias

No arquivo index.ts que você criou, adicione as seguintes linhas para importar as dependências necessárias para este projeto:

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";
  • A primeira linha importa o modelo gemini20Flash e o plug-in googleAI do pacote @genkit-ai/googleai, permitindo o acesso aos modelos Gemini do Google.
  • As duas linhas seguintes importam a biblioteca pdf-parse para analisar arquivos PDF e o módulo fs para operações do sistema de arquivos.
  • A linha final importa a função createInterface do módulo node:readline/promises, que é usado para criar uma interface de linha de comando para interação do usuário.

3. Configurar o Genkit e o modelo padrão

Adicione as linhas abaixo para configurar o Genkit e definir o Gemini 2.0 Flash como o modelo padrão.

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

Em seguida, adicione um esqueleto para o código e o tratamento de erros.

(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. Carregar e analisar o PDF

  1. Adicione um código para ler o nome do arquivo PDF que foi transmitido pela linha de 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);
        }
    
  2. Adicione código para carregar o conteúdo do arquivo PDF.

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

5. Configurar o comando

Adicione um código para configurar o comando:

    // 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}
    `;
  • A primeira declaração const define uma solicitação padrão se o usuário não transmitir uma própria na linha de comando.
  • A segunda declaração const interpola o prefixo do comando e o texto completo do arquivo PDF no comando do modelo.

6. Implementar a interface

Adicione o código abaixo para iniciar o chat e implementar a interface:

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

A primeira declaração const inicia o chat com o modelo chamando o método chat, transmitindo o comando, que inclui o texto completo do arquivo PDF. O restante do código instancia uma entrada de texto e exibe uma mensagem para o usuário.

7. Implementar o loop de chat

Na etapa 5, adicione um código para receber a entrada do usuário e enviar essa entrada para o modelo usando chat.send. Essa parte do app é executada em ciclos até que o usuário pressione CTRL + C.

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

8. Execute o aplicativo

Para executar o app, abra o terminal na pasta raiz do projeto e execute o seguinte comando:

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

Em seguida, você pode começar a conversar com o arquivo PDF.