與 PDF 檔案對話

本程式碼實驗室將說明如何使用 Genkit 實作可與 PDF 檔案進行即時通訊的應用程式。

事前準備

本程式碼研究室假設您熟悉使用 Node.js 建構應用程式。如要完成本程式碼研究室,請確保開發環境符合下列要求:

  • Node.js 20 以上版本
  • 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 提供大量免費方案配額,不需要信用卡即可開始使用。須有 API 金鑰,才能使用 Gemini 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 檔案對話。