本 Codelab 介绍了如何使用 Genkit 实现一款可让您与 PDF 文件聊天的应用。
前提条件
本 Codelab 假定您熟悉使用 Node.js 构建应用。如需完成此 Codelab,请确保您的开发环境满足以下要求:
- Node.js v20 及更高版本
- 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 提供宽裕的免费层级,无需信用卡即可开始使用。如需使用 Gemini API,您需要一个 API 密钥。如果您还没有 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
;这样您就可以构建基于文本的界面。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 文件聊天了。