4. チャットボット(バックエンド 1)

プロジェクト作成前に

VSCodeプラグイン

React & Next.jsでプロジェクト作成する前に、VSCodeのプラグインをインストールしておきましょう。

ES7 React/Redux/GraphQL/React-Native snippets

「ES7 React snippets」は、Reactに関連するVSCodeのプラグインでスニペットが強力です。React 開発ではとても役立つプラグインなのでインストールしておきましょう。

Gemini Code Assist + Google Cloud Code

「Tailwind CSS IntelliSense」はTailwind CSSのコーディングをサポートします。

Auto Import

「Auto Import」はコーディングで、JavaScript モジュールを自動インポートするのに便利です。

プロジェクト作成

ファイル構成

next-bot/
├── app/
│   ├── api/
│   │   └── test/
│   │           └── route.ts
│   └── page.tsx
├── styles/
│   └── globals.css
├── .env.local
├── tailwind.config.js
├── tsconfig.json
└── package.json

Next.jsプロジェクト

Next.jsでGemini AIのAPIアプリ作成します。

プロジェクトフォルダを開く

VSCodeでプロジェクトフォルダを開きます。

ターミナルを開く

VSCodeでターミナルを開きます。

ターミナルコマンド実行

つぎのコマンドで、現在のフォルダに Next.jsプロジェクトを作成します。

ターミナル
npx create-next-app .
  • 現在のフォルダは . (ピリオド)で指定

設問に回答

設問はすべて【Enter】キーで回答し、プロジェクト作成がはじまります。

ターミナル
Need to install the following packages:
[email protected]
Ok to proceed? (y) 
✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like to use `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to customize the default import alias (@/*)? … No / Yes
  • プロジェクト作成は、たくさんのファイルをダウンロードするため時間がかかります。

プロジェクト作成確認

Next.jsプロジェクトが作成されました。

.envファイルの設定

プロジェクトに .env.local ファイルを作成します。

APIキー設定

Google AI Studioで生成した、APIキーを設定します。

.env.local
GEMINI_API_KEY=Google Studioで作成したAPIキー
  • APIキーは漏洩すると悪用されるため、絶対にインターネット上に公開しないように注意しましょう。

APIルーティング

ルーティングファイル作成

APIルーティングファイル「app/test/route.ts」ファイルを作成します。

GETリクエスト追加

「route.ts」に、GETリクエストを非同期で追加します。

app/api/test/route.ts
import { NextRequest } from "next/server";

// GETリクエスト
export async function GET(req: NextRequest) {

}

レスポンス

テストデータを作成し、NextResponseでレスポンスします。

api/test/route.ts
import { NextRequest, NextResponse } from "next/server";

export async function GET(req: NextRequest) {
    const data = { message: "test" };
    return NextResponse.json(data);
}
  • NextRequestNextResponseなどのモジュールは、スニペットで入力すると便利です。
NextRequest
NextResponse

動作確認

サーバ起動

Next.jsサーバを起動します。

ターミナル
npm run dev

GETリクエスト確認

APIにアクセスして、JSONがレスポンスされるか確認します。

http://localhost:3000/api/test/

Gemini APIを利用する

.envファイルの作成

プロジェクトフォルダに .env.local を作成します。

APIキー設定

Google AI Studioで生成した、APIキーを設定します。

.env.local
GEMINI_API_KEY=your_google_api_key

Gemini API

APIキーの読み込み

.env.localファイルで設定した、APIキーを読み込みます。

app/api/test/route.ts
import { NextRequest, NextResponse } from "next/server";

export async function GET(req: NextRequest) {
    // Gemini APIキーを読み込み
    const API_KEY = process.env.GEMINI_API_KEY;
    // API_KEYがなければ終了
    if (!API_KEY) return NextResponse.json({ message: "Not found API KEY" });
    
    const data = { message: "test" };
    return NextResponse.json(data);
}

GoogleGenerativeAI

インストール

ターミナルから GoogleGenerativeAIをインストールします。

ターミナル
npm i @google/generative-ai

GoogleGenerativeAIの利用

APIキーを利用して GoogleGenerativeAIインスタンスを生成し、モデルを「gemini-1.5-flash」で設定します。

app/api/test/route.ts
import { GoogleGenerativeAI } from "@google/generative-ai";
import { NextRequest, NextResponse } from "next/server";

export async function GET(req: NextRequest) {
    const API_KEY = process.env.GEMINI_API_KEY;
    if (!API_KEY) return;

    // GoogleGenerativeAIインスタンス
    const genAI = new GoogleGenerativeAI(API_KEY);
    // gemini-1.5-flash モデルを利用
    const model = genAI.getGenerativeModel({ model: 'gemini-1.5-flash' });

    const data = { message: "test" };
    return NextResponse.json(data);
}
入力のコツ

スニペットを利用すると、自動でimportできます。

LLMのパフォーマンスチューニング

Gemini APIのパフォーマンスをGenerationConfigで設定します。

app/api/test/route.ts
import { NextRequest, NextResponse } from "next/server";
// GenerationConfigをインポート
import { GoogleGenerativeAI, GenerationConfig } from "@google/generative-ai";

// GenerationConfigの設定
const generationConfig:GenerationConfig = {
    temperature: 1,  //ランダム性
    topP: 0.95,      //累積確率
    topK: 64,        //トップkトークン
    maxOutputTokens: 2048,  //最大出力トークン数
    responseMimeType: "application/json",
};

...

Temperature

temperatureは、モデルの出力のランダム性を制御するパラメータです。精度が求められる場合は、パラメーターを低く、クリエイティブを重視する場合は高めに設定します。

パラメータ 範囲 内容
範囲 0 から 1
低い値 0.1 最も確率の高い単語が選ばれやすくなる
高い値 0.9 ランダムでクリエイティブな応答を生み出す

topP

topP(核サンプリング)は、確率の合計が p となる上位の単語候補から選択する手法です。1に近いほど、ほぼ全ての単語候補が選択対象となります。

パラメータ 内容
範囲 0 から 1
低い値 0.1 上位の非常に高い確率の単語だけを選択(決定論的)
高い値 0.9 確率の高い(90%)の候補の中から単語が多様に選択

topK

topKは、上位K個の単語から次の単語を選択するパラメータで、生成時に確率の高い候補からランダムに選ばれます。

パラメータ 内容
範囲 1以上の整数
低い値 1 最も確率の高い1つの単語を選択(完全決定論的)
高い値 50 上位50個の単語から選択し、多様な文章を生成

maxOutputTokens

maxOutputTokens は、生成される応答の最大トークン数を指定します。トークンは単語や文字の一部に対応し、モデル出力の長さを制限します。

パラメータ 内容
範囲 任意の正の整数
低い値 512 短い文章が生成
高い値 長い文章を生成

Config設定

モデルにConfigを設定します。今回はレスポンスタイプはJSONとします。

app/api/test/route.ts
import { NextRequest, NextResponse } from "next/server";
import { GoogleGenerativeAI, GenerationConfig } from "@google/generative-ai";

// GenerationConfigの設定
const generationConfig:GenerationConfig = {
    temperature: 1,  //ランダム性
    topP: 0.95,      //累積確率
    topK: 64,        //トップkトークン
    maxOutputTokens: 2048,  //最大出力トークン数
    responseMimeType: "application/json", //JSONでレスポンス
};

export async function GET(req: NextRequest) {
    const API_KEY = process.env.GEMINI_API_KEY;
    if (!API_KEY) return;
    
    const genAI = new GoogleGenerativeAI(API_KEY);
    const model = genAI.getGenerativeModel({ model: 'gemini-1.5-flash' });
    // モデルにGenerationConfig設定
    model.generationConfig = generationConfig;

    const data = { message: "test" };
    return NextResponse.json(data);
}

Gemini APIリクエスト

任意のプロンプトを作成し、Gemini APIにリクエストします。

app/api/test/route.ts
export async function GET(req: NextRequest) {
    const API_KEY = process.env.GEMINI_API_KEY;
    if (!API_KEY) return;
    
    const genAI = new GoogleGenerativeAI(API_KEY);
    const model = genAI.getGenerativeModel({ model: 'gemini-1.5-flash' });
    model.generationConfig = generationConfig;

    // プロンプト作成
    const prompt = "日本で一番高い山は?";
    // Gemini APIにリクエスト
    const result = await model.generateContent(prompt);

    const data = { message: "test" };
    return NextResponse.json(data);
}

レスポンス

Gemini APIからのレスポンスされたJSONJavaScriptオブジェクトに変換します。

app/api/test/route.ts
export async function GET(req: NextRequest) {
    const API_KEY = process.env.GEMINI_API_KEY;
    if (!API_KEY) return;
    
    const genAI = new GoogleGenerativeAI(API_KEY);
    const model = genAI.getGenerativeModel({ model: 'gemini-1.5-flash' });
    model.generationConfig = generationConfig;

    // プロンプト
    const prompt = "日本で一番高い山は?";
    // Gemini APIにリクエスト
    const result = await model.generateContent(prompt);
    // JSONをJavaScriptのオブジェクトに変換
    const text = JSON.parse(result.response.text());
    // レスポンス
    return NextResponse.json(text);
}

動作確認

Gemini APIのレスポンスが表示さました。