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

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

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

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

  • Node.js v20+
  • НПМ

Создать новый проект

  1. Создайте новую пустую папку.

    mkdir chat-with-a-pdf
    cd chat-with-a-pdf
    
  2. Инициализируйте новый проект TypeScript.

    npm init -y
    

Установить Генкит

Установите следующие зависимости Genkit, чтобы использовать Genkit в своем проекте:

  • genkit предоставляет основные возможности Genkit.
  • @genkit-ai/googleai предоставляет доступ к моделям Google AI Gemini.
npm install genkit @genkit-ai/googleai

Настройте ключ API вашей модели

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

Получите ключ API от Google AI Studio.

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

export GOOGLE_GENAI_API_KEY=<your API key>

Примечание. Хотя в этом руководстве используется API Gemini от AI Studio, Genkit поддерживает широкий спектр поставщиков моделей, в том числе: * Gemini от Vertex AI * Модели Anthropic Claude 3 и Llama 3.1 через Vertex AI Model Garden * Модели с открытым исходным кодом через Ollama * Поставщики, поддерживаемые сообществом, такие как OpenAI и Cohere.

Импортируйте и инициализируйте Genkit.

  1. Создайте новую папку src и внутри нее новый файл index.ts . Добавьте следующие строки, чтобы импортировать Genkit и плагин Google AI.

    import {gemini15Flash, googleAI} from '@genkit-ai/googleai';
    import {genkit} from 'genkit';
    
  2. Добавьте следующие строки, чтобы настроить Genkit и установить Gemini 1.5 Flash в качестве модели по умолчанию.

    const ai = genkit({
      plugins: [googleAI()],
      model: gemini15Flash,
    });
    
  3. Добавьте основную часть вашего приложения.

    (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!
    

Загрузка и анализ PDF-файла

На этом этапе вы напишете код для загрузки и анализа PDF-файла.

  1. Установите pdf-parse .

    npm i pdf-parse
    
  2. Импортируйте библиотеку PDF в свое приложение.

    import pdf from 'pdf-parse';
    import fs from 'fs';
    
  3. Прочитайте имя PDF-файла, переданное из командной строки.

      // 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. Загрузите содержимое PDF-файла.

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

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

Выполните следующие действия, чтобы настроить подсказку.

  1. Разрешить пользователю предоставлять собственное приглашение через командную строку. Если они не предоставляют подсказку, используйте значение по умолчанию.

    const prefix = process.argv[3] || "Answer the user's questions about the contents of this PDF file.";
    
  2. Вставьте префикс приглашения и полный текст PDF-файла в приглашение для модели.

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

Реализуйте цикл чата

  1. Запустите чат с моделью, вызвав метод chat и передав приглашение (которое включает полный текст PDF-файла).

    const chat = ai.chat({ system: prompt })
    
  2. Импортировать createInterface ; это позволит вам создать текстовый пользовательский интерфейс.

    import {createInterface} from "node:readline/promises";
    
  3. Создайте экземпляр ввода текста, а затем отобразите сообщение пользователю.

        const readline = createInterface(process.stdin, process.stdout);
        console.log("You're chatting with Gemini. Ctrl-C to quit.\n");
    
  4. Прочитайте ввод пользователя, а затем отправьте его в модель с помощью chat.send . Эта часть приложения будет выполняться циклично, пока пользователь не нажмет CTRL + C.

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

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

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

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

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