В этой лаборатории кода показано, как создать диалоговое приложение, позволяющее пользователям извлекать информацию из документов PDF, используя естественный язык.
- Настройте свой проект
- Импортируйте необходимые зависимости
- Настройте Genkit и модель по умолчанию.
- Загрузите и проанализируйте PDF-файл
- Настройте подсказку
- Реализация пользовательского интерфейса
- Реализуйте цикл чата
- Запустите приложение
Предварительные условия
Перед началом работы необходимо настроить следующие предварительные условия:
Этапы реализации
После настройки зависимостей вы можете собрать проект.
1. Настройте свой проект
Создайте структуру каталогов и файл для хранения исходного кода.
$ mkdir -p chat-with-a-pdf/src && \ cd chat-with-a-pdf && \ touch src/index.ts
Инициализируйте новый проект TypeScript.
$ npm init -y
Установите модуль pdf-parse.
$ npm i pdf-parse && npm i -D @types/pdf-parse
Установите следующие зависимости Genkit, чтобы использовать Genkit в своем проекте:
$ npm i genkit @genkit-ai/googleai
-
genkit
предоставляет основные возможности Genkit. -
@genkit-ai/googleai
предоставляет доступ к моделям Google AI Gemini.
-
Получите и настройте ключ 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-файл.
Добавьте код для чтения имени 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); }
Добавьте код для загрузки содержимого 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-файлом.