Google Generative AI プラグイン

Google Generative AI プラグインは、Gemini API を介して Google の Gemini モデルへのインターフェースを提供します。

インストール

npm i --save @genkit-ai/googleai

構成

このプラグインを使用するには、Genkit の初期化時に指定します。

import { genkit } from 'genkit';
import { googleAI } from '@genkit-ai/googleai';

const ai = genkit({
  plugins: [googleAI()],
});

このプラグインには Gemini API の API キーが必要です。このキーは Google AI Studio から取得できます。

次のいずれかの方法で、API キーを使用するようにプラグインを設定します。

  • GOOGLE_GENAI_API_KEY 環境変数を API キーに設定します。
  • プラグインを初期化するときに API キーを指定します。

    googleAI({ apiKey: yourKey });
    

    ただし、API キーをコードに直接埋め込まないでください。この機能は、Cloud Secret Manager などのサービスと組み合わせてのみ使用してください。

用途

このプラグインは、サポートされているモデルへの参照を静的にエクスポートします。

import {
  gemini15Flash,
  gemini15Pro,
  textEmbedding004,
} from '@genkit-ai/googleai';

これらの参照を使用して、generate() が使用するモデルを指定できます。

const ai = genkit({
  plugins: [googleAI()],
  model: gemini15Flash,
});

const llmResponse = await ai.generate('Tell me a joke.');

または埋め込みツール(textEmbedding004)を embed または Retriever に置き換えます。

const ai = genkit({
  plugins: [googleAI()],
});

const embedding = await ai.embed({
  embedder: textEmbedding004,
  content: input,
});

Gemini Files API

Gemini Files API にアップロードしたファイルを Genkit で使用できます。

import { GoogleAIFileManager } from '@google/generative-ai/server';
import { genkit } from 'genkit';
import { googleAI } from '@genkit-ai/googleai';

const ai = genkit({
  plugins: [googleAI()],
});

const fileManager = new GoogleAIFileManager(process.env.GOOGLE_GENAI_API_KEY);
const uploadResult = await fileManager.uploadFile(
  'path/to/file.jpg',
  {
    mimeType: 'image/jpeg',
    displayName: 'Your Image',
  }
);

const response = await ai.generate({
  model: gemini15Flash,
  prompt: [
    {text: 'Describe this image:'},
    {media: {contentType: uploadResult.file.mimeType, url: uploadResult.file.uri}}
  ]
});

ファイン チューニングされたモデル

Google Gemini API でファインチューニングされたモデルを使用できます。Gemini API の手順に沿って、または AI Studio を使用してモデルをファインチューニングします。

チューニング プロセスでは、ベースモデル(Gemini 1.5 Flash など)と指定されたサンプルを使用して、新しいチューニング済みモデルが作成されます。使用したベースモデルをメモし、新しいモデルの ID をコピーします。

Genkit でチューニング済みモデルを呼び出す場合は、ベースモデルを model パラメータとして使用し、チューニング済みモデルの ID を config ブロックの一部として渡します。たとえば、ベースモデルとして Gemini 1.5 Flash を使用し、モデル ID tunedModels/my-example-model-apbm8oqbvuv2 を取得した場合は、次のように呼び出すことができます。

const ai = genkit({
  plugins: [googleAI()],
});

const llmResponse = await ai.generate({
  prompt: `Suggest an item for the menu of fish themed restruant`,
  model: gemini15Flash.withConfig({
    version: "tunedModels/my-example-model-apbm8oqbvuv2",
  }),
});

コンテキスト キャッシュ保存

Google Generative AI プラグインはコンテキスト キャッシュをサポートしています。これにより、モデルは以前にキャッシュに保存したコンテンツを再利用して、パフォーマンスを最適化し、反復タスクのレイテンシを短縮できます。この機能は、会話フローで、またはモデルが複数のリクエストで大量のテキストを一貫して参照するシナリオで特に便利です。

コンテキスト キャッシュ保存の使用方法

コンテキスト キャッシュ保存を有効にするには、モデルがコンテキスト キャッシュ保存をサポートしていることを確認します。たとえば、gemini15Flashgemini15Pro はコンテキスト キャッシュ保存をサポートするモデルです。

次のように、アプリケーションでキャッシュ メカニズムを定義できます。

const ai = genkit({
  plugins: [googleAI()],
});

const llmResponse = await ai.generate({
  messages: [
    {
      role: 'user',
      content: [{ text: 'Here is the relevant text from War and Peace.' }],
    },
    {
      role: 'model',
      content: [
        {
          text: 'Based on War and Peace, here is some analysis of Pierre Bezukhov’s character.',
        },
      ],
      metadata: {
        cache: {
          ttlSeconds: 300, // Cache this message for 5 minutes
        },
      },
    },
  ],
  model: gemini15Flash,
  config: {
    version: 'gemini-1.5-flash-001', // Only 001 currently supports context caching
  },
  prompt: 'Describe Pierre’s transformation throughout the novel.',
});

この設定では、次のようになります。 - messages: 会話履歴を渡すことができます。- metadata.cache.ttlSeconds: 特定のレスポンスをキャッシュに保存する有効期間(TTL)を指定します。

例: コンテキストで長いテキストを活用する

戦争と平和ロード オブ ザ リングなどの長いドキュメントを参照するアプリケーションの場合、キャッシュに保存されたコンテキストを再利用するようにクエリを構成できます。

const fs = require('fs/promises');

const textContent = await fs.readFile('path/to/war_and_peace.txt', 'utf-8');

const llmResponse = await ai.generate({
  messages: [
    {
      role: 'user',
      content: [{ text: textContent }], // Include the large text as context
    },
    {
      role: 'model',
      content: [
        {
          text: 'This analysis is based on the provided text from War and Peace.',
        },
      ],
      metadata: {
        cache: {
          ttlSeconds: 300, // Cache the response to avoid reloading the full text
        },
      },
    },
  ],
  model: gemini15Flash,
  config: {
    version: 'gemini-1.5-flash-001', // Only 001 currently supports context caching
  },
  prompt: 'Analyze the relationship between Pierre and Natasha.',
});

その他のコンテンツ モードのキャッシュ保存

Gemini モデルはマルチモーダルであり、他のモードのコンテンツもキャッシュに保存できます。

たとえば、長い動画コンテンツをキャッシュに保存するには、まず Google AI SDK のファイル マネージャーを使用してアップロードする必要があります。

import { GoogleAIFileManager } from '@google/generative-ai/server';

const fileManager = new GoogleAIFileManager(
  process.env.GOOGLE_GENAI_API_KEY
);

// Upload video to Google AI using the Gemini Files API
const uploadResult = await fileManager.uploadFile(videoFilePath, {
  mimeType: 'video/mp4', // Adjust according to the video format
  displayName: 'Uploaded Video for Analysis',
});

const fileUri = uploadResult.file.uri;

これで、ai.generate の呼び出しでキャッシュを構成できます。

const analyzeVideoResponse = await ai.generate({
  messages: [
    {
      role: 'user',
      content: [
        {
          media: {
            url: fileUri, // Use the uploaded file URL
            contentType: 'video/mp4',
          },
        },
      ],
    },
    {
      role: 'model',
      content: [
        {
          text: 'This video seems to contain several key moments. I will analyze it now and prepare to answer your questions.',
        },
      ],
      // Everything up to (including) this message will be cached.
      metadata: {
        cache: true,
      },
    },
  ],
  config: {
    version: 'gemini-1.5-flash-001', // Only 001 versions support context caches
  },
  model: gemini15Flash,
  prompt: query,
});

コンテキスト キャッシュ保存でサポートされているモデル

コンテキスト キャッシュ保存をサポートするのは、gemini15Flashgemini15Pro などの特定のモデルのみです。サポートされていないモデルが使用されている場合、キャッシュを適用できないことを示すエラーが発生します。

関連情報

Google AI のコンテキスト キャッシュの詳細については、ドキュメントをご覧ください。