PDF ファイルとチャットする

この Codelab では、Genkit を使用して PDF ファイルとチャットできるアプリを実装する方法について説明します。

前提条件

この Codelab は、Node.js でのアプリケーションの構築に精通していることを前提としています。この Codelab を完了するには、開発環境が次の要件を満たしていることを確認してください。

  • Node.js v20 以降
  • npm

新しいプロジェクトを作成

  1. 新しい空のフォルダを作成する。

    mkdir chat-with-a-pdf
    cd chat-with-a-pdf
    
  2. 新しい TypeScript プロジェクトを初期化します。

    npm init -y
    

Genkit をインストールする

プロジェクトで Genkit を使用するには、次の Genkit 依存関係をインストールします。

  • genkit は、Genkit のコア機能を提供します。
  • @genkit-ai/googleai は、Google AI Gemini モデルへのアクセス権を提供します。
npm install genkit @genkit-ai/googleai

モデル API キーの構成

このガイドでは、Gemini API の使用方法を説明します。この API は無料枠が充実しており、利用を開始する際にクレジット カードは必要ありません。Gemini API を使用するには、API キーが必要です。キーがない場合は、Google AI Studio でキーを作成します。

Google AI Studio から API キーを取得する

API キーを作成したら、次のコマンドを使用して GOOGLE_GENAI_API_KEY 環境変数をキーに設定します。

export GOOGLE_GENAI_API_KEY=<your API key>

注: このチュートリアルでは AI Studio の Gemini API を使用しますが、Genkit はさまざまなモデル プロバイダをサポートしています。たとえば、* Vertex AI の Gemini、* Vertex AI Model Garden を介した Anthropic の Claude 3 モデルと Llama 3.1、* 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 をインポートします。これにより、テキストベースの UI を構築できます。

    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 ファイルとのチャットを開始できます。