本程式碼實驗室將說明如何使用 Genkit 實作可與 PDF 檔案進行即時通訊的應用程式。
事前準備
本程式碼研究室假設您熟悉使用 Node.js 建構應用程式。如要完成本程式碼研究室,請確保開發環境符合下列要求:
- Node.js 20 以上版本
- npm
建立新的專案、
建立新的空資料夾。
mkdir chat-with-a-pdf cd chat-with-a-pdf
初始化新的 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 建立。
建立 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
建立新資料夾
src
,並在其中建立新檔案index.ts
。加入以下幾行程式碼,匯入 Genkit 和 Google AI 外掛程式。import {gemini15Flash, googleAI} from '@genkit-ai/googleai'; import {genkit} from 'genkit';
加入以下程式碼行來設定 Genkit,並將 Gemini 1.5 Flash 設為預設模型。
const ai = genkit({ plugins: [googleAI()], model: gemini15Flash, });
新增應用程式的主體。
(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 檔案。
安裝
pdf-parse
。npm i pdf-parse
將 PDF 程式庫匯入應用程式。
import pdf from 'pdf-parse'; import fs from 'fs';
讀取從指令列傳入的 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); }
載入 PDF 檔案的內容。
// 2: load PDF file let dataBuffer = fs.readFileSync(filename); const { text } = await pdf(dataBuffer);
設定提示
請按照下列步驟設定提示。
允許使用者透過指令列提供自訂提示。如果他們沒有提供提示,請使用預設值。
const prefix = process.argv[3] || "Answer the user's questions about the contents of this PDF file.";
將提示前置字串和 PDF 檔案的完整文字插入模型的提示中。
const prompt = ` ${prefix} Context: ${data.text} `
實作即時通訊迴圈
呼叫
chat
方法,傳遞提示 (包含 PDF 檔案的完整文字),即可開始與模型進行即時通訊。const chat = ai.chat({ system: prompt })
匯入
createInterface
,這樣您就能建立以文字為主的 UI。import {createInterface} from "node:readline/promises";
例項化文字輸入內容,然後向使用者顯示訊息。
const readline = createInterface(process.stdin, process.stdout); console.log("You're chatting with Gemini. Ctrl-C to quit.\n");
讀取使用者的輸入內容,然後使用
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 檔案對話。