与 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 密钥。如果您还没有 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;这样您就可以构建基于文本的界面。

    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 文件聊天了。