在 Node.js 應用程式中開始使用 Gemini API

本教學課程說明如何使用 Google AI JavaScript SDK,針對 Node.js 應用程式存取 Gemini API。

在本教學課程中,您將瞭解如何執行下列操作:

此外,本教學課程包含進階用途的相關章節 (例如嵌入計數符記),以及控制內容產生的選項。

必要條件

本教學課程假設您已熟悉如何使用 Node.js 建構應用程式。

如要完成本教學課程,請確保您的開發環境符合下列需求:

  • Node.js v18 以上版本
  • npm

設定專案

呼叫 Gemini API 之前,您需要先設定專案,包括設定 API 金鑰、安裝 SDK 套件及初始化模型。

設定 API 金鑰

如要使用 Gemini API,您必須具備 API 金鑰。如果您還沒有金鑰 請在 Google AI Studio 中建立金鑰

取得 API 金鑰

保護 API 金鑰安全

強烈建議您「不要」將 API 金鑰登錄到版本管控系統中。請改用密鑰存放區做為 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 時,您可以使用向量化格式來表示文字 (字詞、句子和文字區塊),更輕鬆地比較及對比嵌入。舉例來說,具有相同主題或情緒的兩個文字應有類似的嵌入,而您可以透過餘弦相似度等數學比較技巧加以識別。

搭配 embedContent 方法 (或 batchEmbedContent 方法) 使用 embedding-001 模型來產生嵌入。以下範例會產生單一字串的嵌入:

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 次 (RPM)。