Чат с PDF-файлом

В этой лаборатории кода показано, как создать диалоговое приложение, позволяющее пользователям извлекать информацию из документов PDF, используя естественный язык.

  1. Настройте свой проект
  2. Импортируйте необходимые зависимости
  3. Настройте Genkit и модель по умолчанию.
  4. Загрузите и проанализируйте PDF-файл
  5. Настройте подсказку
  6. Реализация пользовательского интерфейса
  7. Реализуйте цикл чата
  8. Запустите приложение

Предварительные условия

Перед началом работы необходимо настроить следующие предварительные условия:

Этапы реализации

После настройки зависимостей вы можете собрать проект.

1. Настройте свой проект

  1. Создайте структуру каталогов и файл для хранения исходного кода.

    $ mkdir -p chat-with-a-pdf/src && \
    cd chat-with-a-pdf && \
    touch src/index.ts
    
  2. Инициализируйте новый проект TypeScript.

    $ npm init -y
    
  3. Установите модуль pdf-parse.

    $ npm i pdf-parse && npm i -D @types/pdf-parse
    
  4. Установите следующие зависимости Genkit, чтобы использовать Genkit в своем проекте:

    $ npm i genkit @genkit-ai/googleai
    
    • genkit предоставляет основные возможности Genkit.
    • @genkit-ai/googleai предоставляет доступ к моделям Google AI Gemini.
  5. Получите и настройте ключ API вашей модели.

    Чтобы использовать API Gemini, который используется в этой лаборатории кода, необходимо сначала настроить ключ API. Если у вас его еще нет, создайте ключ в Google AI Studio.

    Gemini API предоставляет щедрый бесплатный уровень и не требует кредитной карты для начала работы.

    После создания ключа API задайте для переменной среды GOOGLE_GENAI_API_KEY свой ключ с помощью следующей команды:

    $ export GOOGLE_GENAI_API_KEY=<your API key>
    

2. Импортируйте необходимые зависимости.

В созданный вами файл index.ts добавьте следующие строки для импорта зависимостей, необходимых для этого проекта:

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";
  • Первая строка импортирует модель gemini20Flash и плагин googleAI из пакета @genkit-ai/googleai , обеспечивая доступ к моделям Google Gemini.
  • Следующие две строки импортируют библиотеку pdf-parse для анализа PDF-файлов и модуль fs для операций с файловой системой.
  • Последняя строка импортирует функцию createInterface из модуля node:readline/promises , которая используется для создания интерфейса командной строки для взаимодействия с пользователем.

3. Настройте Genkit и модель по умолчанию.

Добавьте следующие строки, чтобы настроить Genkit и установить Gemini 2.0 Flash в качестве модели по умолчанию.

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

Затем вы можете добавить скелет для кода и обработки ошибок.

(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. Загрузите и проанализируйте PDF-файл.

  1. Добавьте код для чтения имени PDF-файла, переданного из командной строки.

        // 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. Добавьте код для загрузки содержимого PDF-файла.

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

5. Настройте подсказку

Добавьте код для настройки подсказки:

    // 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}
    `;
  • Первое объявление const определяет приглашение по умолчанию, если пользователь не передает свое собственное из командной строки.
  • Второе объявление const интерполирует префикс приглашения и полный текст PDF-файла в приглашение для модели.

6. Реализация пользовательского интерфейса

Добавьте следующий код, чтобы запустить чат и реализовать пользовательский интерфейс:

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

Первое объявление const запускает чат с моделью, вызывая метод chat и передавая приглашение (которое включает полный текст PDF-файла). Остальная часть кода создает экземпляр ввода текста, а затем отображает сообщение пользователю.

7. Внедрите цикл чата

На шаге 5 добавьте код для получения вводимых пользователем данных и отправьте эти вводимые данные в модель с помощью chat.send . Эта часть приложения выполняется до тех пор, пока пользователь не нажмет CTRL + C.

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

8. Запустите приложение

Чтобы запустить приложение, откройте терминал в корневой папке вашего проекта, затем выполните следующую команду:

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

Затем вы можете начать общение с PDF-файлом.