Chat com um arquivo PDF

Este codelab mostra como usar o Genkit para implementar um app que permite conversar com um arquivo PDF.

Pré-requisitos

Este codelab pressupõe que você já sabe criar aplicativos com Node.js. Para concluir este codelab, verifique se o ambiente de desenvolvimento atende aos seguintes requisitos:

  • Node.js v20+
  • npm

Crie um novo projeto,

  1. Crie uma nova pasta vazia.

    mkdir chat-with-a-pdf
    cd chat-with-a-pdf
    
  2. Inicie um novo projeto do TypeScript.

    npm init -y
    

Instalar o Genkit

Para usar o Genkit no seu projeto, instale as seguintes dependências:

  • genkit oferece os recursos principais do Genkit.
  • @genkit-ai/googleai dá acesso aos modelos do Gemini da IA do Google.
npm install genkit @genkit-ai/googleai

Configure a chave de API do modelo

Neste guia, vamos mostrar como usar a API Gemini, que oferece um nível sem custo financeiro generoso e não exige um cartão de crédito para começar. Para usar a API Gemini, você precisa de uma chave de API. Se você ainda não tiver, crie uma no Google AI Studio.

Gerar uma chave de API do Google AI Studio

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

export GOOGLE_GENAI_API_KEY=<your API key>

Observação:embora este tutorial use a API Gemini do AI Studio, o Genkit oferece suporte a uma grande variedade de provedores de modelos, incluindo: * Gemini da Vertex AI * Modelos Claude 3 da Anthropic e Llama 3.1 pelo Model Garden da Vertex AI * Modelos de código aberto pelo Ollama * Provedores com suporte da comunidade, como OpenAI e Cohere.

Importar e inicializar o Genkit

  1. Crie uma nova pasta src e, dentro dela, um novo arquivo index.ts. Adicione as linhas a seguir para importar o Genkit e o plug-in de IA do Google.

    import {gemini15Flash, googleAI} from '@genkit-ai/googleai';
    import {genkit} from 'genkit';
    
  2. Adicione as linhas abaixo para configurar o Genkit e definir o Gemini 1.5 Flash como o modelo padrão.

    const ai = genkit({
      plugins: [googleAI()],
      model: gemini15Flash,
    });
    
  3. Adicione o corpo principal do app.

    (async () => {
      try {
        // 1: get command line arguments
        // 2: load PDF file
        // 3: construct prompt
        // 4: start chat
        // 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!
    

Carregar e analisar um arquivo PDF

Nesta etapa, você vai escrever um código para carregar e analisar um arquivo PDF.

  1. Instale pdf-parse.

    npm i pdf-parse
    
  2. Importe a biblioteca de PDF para o app.

    import pdf from 'pdf-parse';
    import fs from 'fs';
    
  3. Leia o nome do arquivo PDF transmitido pela linha de comando.

      // 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);
      }
    
  4. Carregue o conteúdo do arquivo PDF.

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

Configurar o comando

Siga estas etapas para configurar o comando.

  1. Permitir que o usuário forneça uma solicitação personalizada pela linha de comando. Se eles não oferecerem uma solicitação, use um padrão.

    const prefix = process.argv[3] || "Answer the user's questions about the contents of this PDF file.";
    
  2. Injete o prefixo do comando e o texto completo do arquivo PDF no comando do modelo.

        const prompt = `
          ${prefix}
          Context:
          ${data.text}
        `
    

Implementar o loop de chat

  1. Para iniciar o chat com o modelo, chame o método chat e transmita o comando (que inclui o texto completo do arquivo PDF).

    const chat = ai.chat({ system: prompt })
    
  2. Importe createInterface para criar uma interface baseada em texto.

    import {createInterface} from "node:readline/promises";
    
  3. Instância uma entrada de texto e mostra uma mensagem para o usuário.

        const readline = createInterface(process.stdin, process.stdout);
        console.log("You're chatting with Gemini. Ctrl-C to quit.\n");
    
  4. Leia a entrada do usuário e envie-a para o modelo usando chat.send. Essa parte do app vai ser repetida até que o usuário pressione CTRL + C.

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

Execute o aplicativo

Agora você pode executar o app no terminal. 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.