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.
- Configurar o projeto
- Importar as dependências necessárias
- Configurar o Genkit e o modelo padrão
- Carregar e analisar o arquivo PDF
- Configurar o comando
- Implementar a interface
- Implementar o loop de chat
- 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
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
Inicie um novo projeto do TypeScript.
$ npm init -y
Instale o módulo pdf-parse.
$ npm i pdf-parse && npm i -D @types/pdf-parse
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.
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-ingoogleAI
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ódulofs
para operações do sistema de arquivos. - A linha final importa a função
createInterface
do módulonode: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
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); }
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.