开始在 Node.js 应用中使用 Gemini API

本教程演示了如何使用 Google AI JavaScript SDK 访问 Node.js 应用的 Gemini API。

在本教程中,您将了解如何执行以下操作:

此外,本教程还包含一些高级用例(例如嵌入令牌计数)以及控制内容生成选项的相关部分。

前提条件

本教程假定您熟悉使用 Node.js 构建应用。

如需完成本教程,请确保您的开发环境满足以下要求:

  • Node.js 18 版及更高版本
  • npm

设置项目

在调用 Gemini API 之前,您需要设置项目,包括设置 API 密钥、安装 SDK 软件包以及初始化模型。

设置您的 API 密钥

您需要 API 密钥才能使用 Gemini API。如果您还没有密钥,请在 Google AI Studio 中创建密钥。

获取 API 密钥

保护您的 API 密钥

强烈建议您不要将 API 密钥签入版本控制系统。您应改为使用 Secret 存储区来存储 API 密钥。

本教程中的所有代码段均假定您以环境变量的形式访问 API 密钥。

安装 SDK 软件包

如需在您自己的应用中使用 Gemini API,您需要安装 Node.js 版 GoogleGenerativeAI 软件包:

npm install @google/generative-ai

初始化生成模型

您需要先导入并初始化生成模型,然后才能进行任何 API 调用。

const { GoogleGenerativeAI } = require("@google/generative-ai");

// Access your API key as an environment variable (see "Set up your API key" above)
const genAI = new GoogleGenerativeAI(process.env.API_KEY);

// ...

const model = genAI.getGenerativeModel({ model: "MODEL_NAME"});

// ...

指定模型时,请注意以下事项:

  • 使用特定于您的用例的模型(例如,gemini-pro-vision 适用于多模态输入)。在本指南中,每种实现的说明都列出了针对每个应用场景推荐的模型。

实现常见用例

现在,您的项目已设置完毕,接下来,您可以探索如何使用 Gemini API 实现不同的用例:

在高级用例部分,您可以找到有关 Gemini API 和嵌入的信息。

根据纯文本输入生成文本

当提示输入仅包含文本时,请将 gemini-pro 模型与 generateContent 方法结合使用以生成文本输出:

const { GoogleGenerativeAI } = require("@google/generative-ai");

// Access your API key as an environment variable (see "Set up your API key" above)
const genAI = new GoogleGenerativeAI(process.env.API_KEY);

async function run() {
  // For text-only input, use the gemini-pro model
  const model = genAI.getGenerativeModel({ model: "gemini-pro"});

  const prompt = "Write a story about a magic backpack."

  const result = await model.generateContent(prompt);
  const response = await result.response;
  const text = response.text();
  console.log(text);
}

run();

根据文本和图片输入生成文本(多模态)

Gemini 提供了一个多模态模型 (gemini-pro-vision),因此您可以同时输入文字和图片。请务必查看提示的图片要求

当提示输入同时包含文本和图片时,请将 gemini-pro-vision 模型与 generateContent 方法结合使用以生成文本输出:

const { GoogleGenerativeAI } = require("@google/generative-ai");
const fs = require("fs");

// Access your API key as an environment variable (see "Set up your API key" above)
const genAI = new GoogleGenerativeAI(process.env.API_KEY);

// Converts local file information to a GoogleGenerativeAI.Part object.
function fileToGenerativePart(path, mimeType) {
  return {
    inlineData: {
      data: Buffer.from(fs.readFileSync(path)).toString("base64"),
      mimeType
    },
  };
}

async function run() {
  // For text-and-image input (multimodal), use the gemini-pro-vision model
  const model = genAI.getGenerativeModel({ model: "gemini-pro-vision" });

  const prompt = "What's different between these pictures?";

  const imageParts = [
    fileToGenerativePart("image1.png", "image/png"),
    fileToGenerativePart("image2.jpeg", "image/jpeg"),
  ];

  const result = await model.generateContent([prompt, ...imageParts]);
  const response = await result.response;
  const text = response.text();
  console.log(text);
}

run();

发起多轮对话(聊天)

使用 Gemini,您可以构建多轮自由对话。该 SDK 通过管理对话状态来简化流程,因此与 generateContent 不同,您不必自行存储对话记录。

如需构建多轮对话(如聊天),请使用 gemini-pro 模型,并通过调用 startChat() 来初始化聊天。然后,使用 sendMessage() 发送一条新的用户消息,同时还会将该消息和响应附加到聊天记录中。

对于与对话内容关联的 role,有两个可能的选项:

  • user:提供提示的角色。这是 sendMessage 调用的默认值。

  • model:提供响应的角色。使用现有 history 调用 startChat() 时,可以使用此角色。

const { GoogleGenerativeAI } = require("@google/generative-ai");

// Access your API key as an environment variable (see "Set up your API key" above)
const genAI = new GoogleGenerativeAI(process.env.API_KEY);

async function run() {
  // For text-only input, use the gemini-pro model
  const model = genAI.getGenerativeModel({ model: "gemini-pro"});

  const chat = model.startChat({
    history: [
      {
        role: "user",
        parts: [{ text: "Hello, I have 2 dogs in my house." }],
      },
      {
        role: "model",
        parts: [{ text: "Great to meet you. What would you like to know?" }],
      },
    ],
    generationConfig: {
      maxOutputTokens: 100,
    },
  });

  const msg = "How many paws are in my house?";

  const result = await chat.sendMessage(msg);
  const response = await result.response;
  const text = response.text();
  console.log(text);
}

run();

使用流式传输加快互动速度

默认情况下,模型会在完成整个生成过程后返回响应。您可以不等待整个结果,而是使用流式传输来处理部分结果,从而实现更快的互动。

以下示例展示了如何使用 generateContentStream 方法实现流式传输,以根据文本和图像输入提示生成文本。

//...

const result = await model.generateContentStream([prompt, ...imageParts]);

let text = '';
for await (const chunk of result.stream) {
  const chunkText = chunk.text();
  console.log(chunkText);
  text += chunkText;
}

//...

您可以在纯文本输入和聊天用例中使用类似的方法。

// Use streaming with text-only input
const result = await model.generateContentStream(prompt);

如需了解如何实例化 chat,请参阅上面的聊天示例

// Use streaming with multi-turn conversations (like chat)
const result = await chat.sendMessageStream(msg);

实现高级用例

本教程上一部分中介绍的常见用例可帮助您熟练使用 Gemini API。本部分介绍了一些可能被视为更高级的用例。

使用嵌入

嵌入是一种用于将信息表示为数组中的浮点数列表的技术。借助 Gemini,您能以矢量化形式表示文本(字词、句子和文本块),从而更轻松地比较和对比嵌入。例如,具有相同主题或情感的两个文本应该具有相似的嵌入,可以通过余弦相似度等数学比较技术来识别。

embedding-001 模型与 embedContent 方法(或 batchEmbedContent 方法)结合使用以生成嵌入。以下示例针对单个字符串生成嵌入:

const { GoogleGenerativeAI } = require("@google/generative-ai");

// Access your API key as an environment variable (see "Set up your API key" above)
const genAI = new GoogleGenerativeAI(process.env.API_KEY);

async function run() {
  // For embeddings, use the embedding-001 model
  const model = genAI.getGenerativeModel({ model: "embedding-001"});

  const text = "The quick brown fox jumps over the lazy dog."

  const result = await model.embedContent(text);
  const embedding = result.embedding;
  console.log(embedding.values);
}

run();

计算词元数

使用长提示时,在将任何内容发送到模型之前统计令牌数可能很有用。以下示例展示了如何针对各种用例使用 countTokens()

// For text-only input
const { totalTokens } = await model.countTokens(prompt);
// For text-and-image input (multimodal)
const { totalTokens } = await model.countTokens([prompt, ...imageParts]);
// For multi-turn conversations (like chat)
const history = await chat.getHistory();
const msgContent = { role: "user", parts: [{ text: msg }] };
const contents = [...history, msgContent];
const { totalTokens } = await model.countTokens({ contents });

用于控制内容生成的选项

您可以通过配置模型参数和使用安全设置来控制内容生成。

请注意,将 generationConfigsafetySettings 传递给模型请求方法(如 generateContent)将完全替换 getGenerativeModel 中传递的同名配置对象。

配置模型参数

您向模型发送的每个提示都包含控制模型如何生成回答的参数值。对于不同的参数值,模型会生成不同的结果。详细了解模型参数

const generationConfig = {
  stopSequences: ["red"],
  maxOutputTokens: 200,
  temperature: 0.9,
  topP: 0.1,
  topK: 16,
};

const model = genAI.getGenerativeModel({ model: "MODEL_NAME",  generationConfig });

使用安全设置

您可以使用安全设置来调整收到可能被视为有害的响应的可能性。默认情况下,安全设置会屏蔽在所有维度上可能是中等和/或高可能性为不安全内容的内容。详细了解安全设置

设置一项安全设置的方法如下:

import { HarmBlockThreshold, HarmCategory } from "@google/generative-ai";

// ...

const safetySettings = [
  {
    category: HarmCategory.HARM_CATEGORY_HARASSMENT,
    threshold: HarmBlockThreshold.BLOCK_ONLY_HIGH,
  },
];

const model = genAI.getGenerativeModel({ model: "MODEL_NAME", safetySettings });

您还可以设定多项安全设置:

const safetySettings = [
  {
    category: HarmCategory.HARM_CATEGORY_HARASSMENT,
    threshold: HarmBlockThreshold.BLOCK_ONLY_HIGH,
  },
  {
    category: HarmCategory.HARM_CATEGORY_HATE_SPEECH,
    threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
  },
];

后续步骤

  • 提示设计是创建提示以从语言模型引出所需回复的过程。编写结构良好的提示是确保语言模型提供准确、高质量的响应的重要部分。了解撰写提示的最佳做法

  • Gemini 提供了多个模型变体来满足不同用例的需求,例如输入类型和复杂度、聊天或其他对话框语言任务的实现,以及大小限制。了解可用的 Gemini 模型

  • Gemini 提供了用于请求提高速率限制的选项。Genmini Pro 型号的速率限制为每分钟 60 个请求。