チュートリアル: Gemini API のスタートガイド


このチュートリアルでは、Dart または Gemini for Google Cloud の Google AI Dart SDK を使用した Flutter アプリケーション次のような場合は、この SDK を使用できます。 Gemini モデルにアクセスするために REST API を直接操作することを望んでいません。 。

このチュートリアルでは、次の方法を学習します。

また、このチュートリアルには、高度なユースケース( embeddingsトークンのカウントなど)や、 コンテンツ生成の制御を行います。

前提条件

このチュートリアルは、読者が Dart を使ったアプリケーションの作成に精通していることを前提としています。

このチュートリアルを最後まで進めるには、開発環境が次の要件を満たしていることを確認してください。 次の要件を満たす必要があります。

  • Dart 3.2.0 以降

プロジェクトを設定する

Gemini API を呼び出す前に、以下を含むプロジェクトを設定する必要があります。 API キーを設定し、SDK を Pub の依存関係に追加する 初期化します。

API キーを設定する

Gemini API を使用するには API キーが必要です。まだお持ちでない場合は 作成することもできます。

API キーを取得する

API キーを保護する

API キーを安全に保つ。必ず、個人を特定できる情報(PII)を含めないで API キーをコードに直接挿入するか、キーを含むファイルをバージョン 制御システム。代わりに、API キーにはシークレット ストアを使用する必要があります。

このチュートリアルのすべてのスニペットは、API キーに 使用します。Flutter アプリを開発している場合は、 String.fromEnvironment を実行し、--dart-define=API_KEY=$API_KEY を次に渡す flutter build または flutter run を指定して、API キーでコンパイル 環境が異なるためです。

SDK パッケージをインストールする

独自のアプリケーションで Gemini API を使用するには、addする必要があります google_generative_ai パッケージを Dart アプリまたは Flutter アプリに追加します。

Dart

dart pub add google_generative_ai

フラッター

flutter pub add google_generative_ai

生成モデルを初期化する

API 呼び出しを行うには、その前に 説明します。

import 'dart:io';
import 'package:google_generative_ai/google_generative_ai.dart';

void main() async {

  // Access your API key as an environment variable (see "Set up your API key" above)
  final apiKey = Platform.environment['API_KEY'];
  if (apiKey == null) {
    print('No \$API_KEY environment variable');
    exit(1);
  }

  // The Gemini 1.5 models are versatile and work with most use cases
  final model = GenerativeModel(model: 'gemini-1.5-flash', apiKey: apiKey);
}

モデルを指定する際は、次の点に注意してください。

  • ユースケースに固有のモデルを使用する(例: gemini-1.5-flash) マルチモーダル入力用です)。このガイドでは、それぞれの手順について説明します。 実装のリストには、各ユースケースの推奨モデルが記載されています。

一般的なユースケースの実装

プロジェクトが設定されたので、Gemini API を使用して以下を行う方法を学習します。 さまざまなユースケースを実装できます。

高度なユースケースのセクションでは、Gemini API に関する情報を確認できます embeddings

テキストのみの入力からテキストを生成する

プロンプト入力にテキストのみが含まれている場合は、Gemini 1.5 モデルまたは Gemini 1.0 Pro モデルで generateContent を使用してテキスト出力を生成します。

import 'dart:io';

import 'package:google_generative_ai/google_generative_ai.dart';

void main() async {
  // Access your API key as an environment variable (see "Set up your API key" above)
  final apiKey = Platform.environment['API_KEY'];
  if (apiKey == null) {
    print('No \$API_KEY environment variable');
    exit(1);
  }
  // The Gemini 1.5 models are versatile and work with both text-only and multimodal prompts
  final model = GenerativeModel(model: 'gemini-1.5-flash', apiKey: apiKey);
  final content = [Content.text('Write a story about a magic backpack.')];
  final response = await model.generateContent(content);
  print(response.text);
}

テキストと画像の入力からテキストを生成する(マルチモーダル)

Gemini はマルチモーダル入力を処理できるさまざまなモデルを提供 (Gemini 1.5 モデル)を使用し、両方のテキストを入力できるようにする 説明します。必ず プロンプトの画像の要件をご覧ください。

プロンプト入力にテキストと画像の両方が含まれている場合は、Gemini 1.5 モデルを使用する generateContent メソッドを使用して、テキスト出力を生成します。

import 'dart:io';

import 'package:google_generative_ai/google_generative_ai.dart';

void main() async {
  // Access your API key as an environment variable (see "Set up your API key" above)
  final apiKey = Platform.environment['API_KEY'];
  if (apiKey == null) {
    print('No \$API_KEY environment variable');
    exit(1);
  }
  // The Gemini 1.5 models are versatile and work with both text-only and multimodal prompts
  final model = GenerativeModel(model: 'gemini-1.5-flash', apiKey: apiKey);
  final (firstImage, secondImage) = await (
    File('image0.jpg').readAsBytes(),
    File('image1.jpg').readAsBytes()
  ).wait;
  final prompt = TextPart("What's different between these pictures?");
  final imageParts = [
    DataPart('image/jpeg', firstImage),
    DataPart('image/jpeg', secondImage),
  ];
  final response = await model.generateContent([
    Content.multi([prompt, ...imageParts])
  ]);
  print(response.text);
}

マルチターンの会話を構築する(チャット)

Gemini を使用すると、複数のターンで自由形式の会話を構築できます。「 SDK は会話の状態を管理することでプロセスを簡素化するため、 generateContent との会話履歴を保存する必要はありません できます。

マルチターンの会話(チャットなど)を作成するには、Gemini 1.5 モデルまたは Gemini 1.0 Pro モデルを作成し、startChat() を呼び出してチャットを初期化します。 次に、sendMessage() を使用して新しいユーザー メッセージを送信します。これにより、 返信メッセージも確認できます。

コンテンツに関連付けられた role には、次の 2 つのオプションがあります。 あります。

  • user: プロンプトを提供するロール。この値は Kubernetes の sendMessage が呼び出されると、関数から例外がスローされます。 渡されます。

  • model: レスポンスを提供するロール。このロールは、 既存の historystartChat() を呼び出す。

で確認できます。
import 'dart:io';

import 'package:google_generative_ai/google_generative_ai.dart';

Future<void> main() async {
  // Access your API key as an environment variable (see "Set up your API key" above)
  final apiKey = Platform.environment['API_KEY'];
  if (apiKey == null) {
    print('No \$API_KEY environment variable');
    exit(1);
  }
  // The Gemini 1.5 models are versatile and work with multi-turn conversations (like chat)
  final model = GenerativeModel(
      model: 'gemini-1.5-flash',
      apiKey: apiKey,
      generationConfig: GenerationConfig(maxOutputTokens: 100));
  // Initialize the chat
  final chat = model.startChat(history: [
    Content.text('Hello, I have 2 dogs in my house.'),
    Content.model([TextPart('Great to meet you. What would you like to know?')])
  ]);
  var content = Content.text('How many paws are in my house?');
  var response = await chat.sendMessage(content);
  print(response.text);
}

ストリーミングを使用してより高速にやり取りする

デフォルトでは、モデルは生成全体を完了するとレスポンスを返します。 プロセスですメッセージ全体を待つ必要がないため、 代わりにストリーミングを使用して部分的な結果を処理できます

次の例は、Dataflow を使用してストリーミングを実装する方法を示しています。 テキストと画像の入力からテキストを生成する generateContentStream メソッド 表示されます。

// ...

final response = model.generateContentStream([
  Content.multi([prompt, ...imageParts])
]);
await for (final chunk in response) {
  print(chunk.text);
}

// ...

テキストのみの入力とチャットのユースケースにも、同様のアプローチを使用できます。

// Use streaming with text-only input
final response = model.generateContentStream(content);
// Use streaming with multi-turn conversations (like chat)
final response = chat.sendMessageStream(content);

高度なユースケースの実装

このチュートリアルの前のセクションで説明した一般的なユースケースは、 Gemini API の使い方に慣れてきたはずです。このセクションでは、 より高度なとみなされる可能性のあるユースケースを学習します。

関数呼び出し

関数呼び出しを使用すると、構造化データの出力を 説明します。その後、これらの出力を使用して他の API を呼び出し、 レスポンス データをモデルに送ります。つまり関数呼び出しは 生成モデルを外部システムに接続して、生成されたコンテンツが に最新の正確な情報が含まれています。 詳しくは、 関数呼び出しのチュートリアル

エンベディングを使用する

エンベディングとは、情報を表現するために使用される手法 浮動小数点数のリストとして配列します。Gemini を使用すると、 テキスト(単語、文、テキストのブロック)をベクトル化して、 エンベディングを簡単に比較できます。たとえば、同じ名前を持つ 2 つのテキストが 類似した主題や感情には類似したエンべディングが必要です コサイン類似度などの数学的比較手法で特定できます

embedding-001 モデルと embedContent メソッド(または batchEmbedContent メソッドなど)を使用してエンベディングを生成します。次の例をご覧ください。 単一の文字列のエンベディングを生成します。

final model = GenerativeModel(model: 'embedding-001', apiKey: apiKey);
final content = Content.text('The quick brown fox jumps over the lazy dog.');
final result = await model.embedContent(content);
print(result.embedding.values);

トークンをカウントする

長いプロンプトを使用する場合は、メッセージを送信する前にトークンをカウントすると、 モデルに提供します次の例は、countTokens() の使用方法を示しています。 さまざまなユースケースに対応できます

// For text-only input
final tokenCount = await model.countTokens(Content.text(prompt));
print('Token count: ${tokenCount.totalTokens}');
// For text-and-image input (multimodal)
final tokenCount = await model.countTokens([
  Content.multi([prompt, ...imageParts])
]);
print('Token count: ${tokenCount.totalTokens}');
// For multi-turn conversations (like chat)
final prompt = Content.text(message);
final allContent = [...chat.history, prompt];
final tokenCount = await model.countTokens(allContent);
print('Token count: ${tokenCount.totalTokens}');

コンテンツの生成を管理するオプション

コンテンツの生成を制御するには、モデル パラメータを構成し、 安全性設定。

モデル リクエストに generationConfig または safetySettings を渡すと、 メソッド(generateContent など)は、設定オブジェクトを完全にオーバーライドします。 (getGenerativeModel で渡されたのと同じ名前)。

モデル パラメータを構成する

モデルに送信するすべてのプロンプトには、モデルにどのように モデルがレスポンスを生成します。このモデルは、パラメータ値によって異なる結果を生成できます。詳細: モデル パラメータ。 この構成は、モデル インスタンスの存続期間中に維持されます。

final generationConfig = GenerationConfig(
  stopSequences: ["red"],
  maxOutputTokens: 200,
  temperature: 0.9,
  topP: 0.1,
  topK: 16,
);
final model = GenerativeModel(
  // The Gemini 1.5 models are versatile and work with most use cases
  model: 'gemini-1.5-flash',
  apiKey: apiKey,
  generationConfig: generationConfig,
);

安全性設定を使用する

安全性設定を使用すると、 害を及ぼす可能性があります。デフォルトでは、安全性設定で「中」のコンテンツはブロックされます すべての要素で安全でないコンテンツである確率が高くなります。学習 詳しくは、安全性設定についての説明をご覧ください。

安全性設定を 1 つ設定する方法は次のとおりです。

final safetySettings = [
  SafetySetting(HarmCategory.harassment, HarmBlockThreshold.high)
];
final model = GenerativeModel(
  // The Gemini 1.5 models are versatile and work with most use cases
  model: 'gemini-1.5-flash',
  apiKey: apiKey,
  safetySettings: safetySettings,
);

安全性設定は複数設定できます。

final safetySettings = [
  SafetySetting(HarmCategory.harassment, HarmBlockThreshold.high),
  SafetySetting(HarmCategory.hateSpeech, HarmBlockThreshold.high),
];

次のステップ

  • プロンプト設計は、言語モデルから望ましいレスポンスを引き出すプロンプトを作成するプロセスです。適切に構造化されたプロンプトを記述することは これは、言語モデルからの正確で高品質なレスポンスを確保するための一環です。 プロンプト作成のベスト プラクティスについて確認する。

  • Gemini には、さまざまな用途のニーズに対応する複数のモデル バリエーションが用意されています。 入力の種類や複雑さ、チャットやその他のツールの実装、 タスク、サイズの制約です。 利用可能な Gemini モデルについて学習する。

で確認できます。