Vercel AI SDK入門 Next.jsで作るLLMアプリ最速構築

Vercel AI SDK入門 Next.jsで作るLLMアプリ最速構築

目次

  1. はじめに – なぜ今、Vercel AI SDKなのか?
  2. 開発環境の準備とプロジェクトの立ち上げ
  3. Vercel AI SDKの基本 – シンプルなAIチャットボットの実装
  4. 実践的なAIアプリケーション構築へのステップアップ
  5. Vercelプラットフォームでのデプロイと運用
  6. まとめと次のステップ – BtoB領域でのAI活用を加速させるために

本記事のポイント

  • Vercel AI SDKが、BtoB企業のAIアプリ開発で直面する「PoC止まり」や「開発工数過多」といった課題をいかに解決するかを理解できます。
  • Next.jsとVercel AI SDKを組み合わせた、シンプルなAIチャットボットの構築手順をハンズオン形式で体験し、開発環境準備から初期実装までを習得できます。
  • LLMとの連携におけるストリーミング応答の実装方法や、`useChat`フックによる会話履歴の管理プロンプトエンジニアリングの基礎を具体的なコードの骨子とともに学べます。
  • AIの外部サービス連携を可能にするツール利用(Function Calling)の概念と実装を通じて、BtoBシナリオにおける実践的なAIアプリケーション構築への応用力を高められます。
  • 開発したAIアプリケーションをVercelプラットフォームへデプロイし、本番運用するまでの流れを把握し、セキュリティを考慮した環境変数設定のベストプラクティスを理解できます。

はじめに – なぜ今、Vercel AI SDKなのか?

BtoB AI開発の課題とVercel AI SDKによる解決
BtoB AI開発の課題とVercel AI SDKによる解決

AI技術の進化は目覚ましく、特に大規模言語モデル(LLM)の登場は、ビジネスのあり方を根本から変えようとしています。多くのBtoB企業がAIの導入を検討し、業務効率化や新たな顧客体験の創出を目指していますが、その道のりは決して平坦ではありません。本記事では、Vercel AI SDKという強力なツールを使い、実践的なAIアプリケーション開発の第一歩を踏み出すためのハンズオンを提供します。

AIアプリケーション開発の現状とBtoB企業の課題

BtoB企業がAIアプリケーション開発に取り組む際、いくつかの共通した課題に直面しがちです。

BtoB企業のAI開発における主な課題

  • PoC(概念実証)止まりの多さ: アイデアは豊富でも、プロトタイプから本番環境への移行が困難なケースが散見されます。技術的な複雑さ、リソース不足、ROI(投資収益率)の見極めの難しさなどが原因です。
  • 開発工数の過多: LLMの選定、API連携、UI/UXデザイン、バックエンド構築、デプロイ、運用と、多岐にわたる工程で専門知識が要求され、開発期間が長期化しやすい傾向にあります。
  • アジリティの欠如: 市場の変化やビジネス要件の変更に迅速に対応できる開発体制が整っておらず、ニーズに応じた機能追加や改善が遅れることがあります。
  • セキュリティとガバナンス: 企業データを取り扱うAIアプリケーションでは、セキュリティ対策やデータガバナンスが極めて重要であり、これらを考慮した開発は一層の専門性を要します。

これらの課題を解決し、スピーディーかつセキュアにAIアプリケーションを開発・運用するためには、適切なツールの選定が不可欠です。

Vercel AI SDKとは? – 迅速なプロトタイプから本番運用までをサポート

Vercel AI SDKは、LLMアプリケーションを構築するための包括的なライブラリセットです。Next.jsやReactといったモダンなウェブ開発フレームワークと高い親和性を持ち、開発者はUIとバックエンドの両面から効率的にLLMアプリを構築できます。

Vercel AI SDKの主な特徴

  • 主要LLMプロバイダー連携: OpenAI、Anthropic、Google Geminiなど、複数のLLMプロバイダーAPIとの連携が容易です。APIごとの差異を吸収し、統一されたインターフェースで利用できます。
  • ストリーミング対応: LLMからの応答をリアルタイムでストリーミング表示することで、ユーザー体験を大幅に向上させます。特に長文の生成や複雑なタスクにおいて、応答を待つストレスを軽減します。
  • UIコンポーネントとフック: React向けの`useChat`や`useCompletion`といったカスタムフックを提供し、チャットUIやテキスト生成UIの実装を簡素化します。これにより、フロントエンド開発の負荷を軽減し、より表現豊かなインターフェースの構築が可能です。
  • Vercelプラットフォームとの親和性: Next.jsをベースとしているため、Vercelへのデプロイが非常にスムーズです。CI/CD(継続的インテグレーション/継続的デリバリー)が自動化され、開発者はインフラ管理よりもアプリケーション開発に集中できます。

Vercel AI SDKは、プロトタイプ開発の迅速性から、スケーラブルな本番運用までを一貫してサポートするため、BtoB企業が抱える開発課題に対する強力なソリューションとなり得ます。

本ハンズオンで学ぶこと – 実務で使えるAIチャットボット構築の基礎

本ハンズオンでは、Vercel AI SDKとNext.jsを使って、実務で活用できるAIチャットボットを構築する一連のプロセスを体験します。具体的には、以下のスキルと知識を習得することを目指します。

  • 開発環境のセットアップからプロジェクトの初期化まで
  • シンプルなチャットボットのUIとバックエンドAPIの実装
  • LLMからのストリーミング応答の処理方法
  • 会話履歴を管理し、継続的な対話を実現するテクニック
  • プロンプトエンジニアリングの基礎と、AIの挙動を制御するコツ
  • 外部ツール連携(Function Calling)によるAIアプリケーションの拡張方法
  • 開発したアプリケーションのVercelプラットフォームへのデプロイ

これらの基礎を学ぶことで、社内向けナレッジベース、顧客サポート、データ分析アシスタントといったBtoB領域における多様なAIアプリケーション開発への応用が可能となるでしょう。

開発環境の準備とプロジェクトの立ち上げ

AIアプリケーション開発を始めるにあたり、まずは必要な開発環境を整え、プロジェクトを立ち上げるところからスタートしましょう。

Node.jsとパッケージマネージャー (npm/pnpm/yarn) のセットアップ

Vercel AI SDKはJavaScript/TypeScriptエコシステム上で動作するため、Node.jsのインストールが必須です。また、プロジェクトで使用するライブラリを管理するために、npm、pnpm、またはyarnといったパッケージマネージャーが必要となります。

推奨されるNode.jsのバージョンはLTS(Long Term Support)版です。現時点でのLTS版を確認し、インストールしてください。バージョン管理ツール(例: `nvm`)を使用すると、複数のNode.jsバージョンを容易に切り替えられるため便利です。

Node.jsとパッケージマネージャーのインストール手順(例:nvmとnpm)

  • nvmのインストール:

“`bash

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

# または Homebrew を利用

brew install nvm

“`

  • Node.jsのインストールと使用:

“`bash

nvm install –lts # 最新のLTS版をインストール

nvm use –lts # インストールしたLTS版を使用

node -v # インストールされたNode.jsのバージョンを確認

npm -v # インストールされたnpmのバージョンを確認

“`

  • pnpmまたはyarnを使用する場合:

“`bash

npm install -g pnpm # pnpmをグローバルインストール

npm install -g yarn # yarnをグローバルインストール

“`

Node.jsとパッケージマネージャーが正しくインストールされていることを確認したら、次のステップへ進みましょう。

Vercel AI SDKプロジェクトの初期化 – Next.jsテンプレートを活用

Vercel AI SDKは、Next.jsをベースとしたテンプレートを提供しており、コマンド一つで開発に必要な環境を効率的にセットアップできます。今回はこのテンプレートを利用してプロジェクトを初期化します。

任意のディレクトリで以下のコマンドを実行してください。


npx create-next-app --example with-ai-sdk my-ai-app

このコマンドは、`my-ai-app`という名前の新しいNext.jsプロジェクトを作成し、Vercel AI SDKの基本的な構成を自動的に組み込みます。

コマンド実行後の流れ

  1. プロジェクトディレクトリへの移動:

“`bash

cd my-ai-app

“`

  1. 依存関係のインストール:

“`bash

npm install # または pnpm install, yarn install

“`

これにより、必要なライブラリが`node_modules`ディレクトリにインストールされます。

プロジェクトが正常に初期化され、依存関係がインストールされたら、開発の準備はほぼ完了です。

環境変数の設定 (`.env`) – LLM APIキーの安全な管理

AIアプリケーションを開発する上で、LLMプロバイダーのAPIキーは非常に重要な情報です。これらのキーは公開してはならず、安全に管理する必要があります。Next.jsでは、`.env.local`ファイルを使用して環境変数を管理するのが一般的です。

プロジェクトのルートディレクトリに`.env.local`ファイルを作成し、使用するLLMプロバイダーのAPIキーを設定します。本ハンズオンではOpenAIを例に進めますが、AnthropicやGoogle Geminiなど、他のプロバイダーも同様に設定できます。


# .env.local
OPENAI_API_KEY=sk-your-openai-api-key-here

`sk-your-openai-api-key-here`の部分は、ご自身で取得したOpenAIのAPIキーに置き換えてください。APIキーは各プロバイダーのWebサイトで取得できます。

APIキー管理のベストプラクティス

  • `.env.local`のgitignoreへの追加: `.env.local`ファイルはGitリポジトリにコミットされないよう、`.gitignore`ファイルに追記されていることを確認してください。
  • テスト環境と本番環境の分離: ローカル開発環境のキーと、後述するVercelデプロイ時の本番環境のキーは分けて管理することが推奨されます。
  • キーのローテーション: 定期的にAPIキーを更新することで、セキュリティリスクを軽減できます。

これで、AIアプリケーション開発を始めるためのすべての準備が整いました。

Vercel AI SDKの基本 – シンプルなAIチャットボットの実装

AIチャットボットのシステム連携フロー
AIチャットボットのシステム連携フロー

いよいよVercel AI SDKを使用して、基本的なAIチャットボットを実装していきます。ここでは、UIとバックエンドの両面から、どのようにLLMと連携し、ストリーミング応答を実現するかを見ていきましょう。

AI SDKの主要パッケージとその役割

Vercel AI SDKはいくつかのパッケージで構成されており、それぞれが異なる役割を担っています。

  • `ai`: AI SDKのコアパッケージです。LLMプロバイダーとの連携、ストリーミング処理、プロンプトの構成など、AIロジックの基盤を提供します。
  • `ai/react`: ReactアプリケーションでAIアプリケーションを構築するためのカスタムフック(例: `useChat`, `useCompletion`)を提供します。これにより、UIの状態管理やユーザーインタラクションの実装が容易になります。
  • `ai/vercel`: Next.jsのAPIルートでAI SDKを簡単に使用するためのヘルパー関数(例: `OpenAIStream`)を提供します。サーバーサイドでのLLM連携とストリーミング応答の実装を簡素化します。

これらのパッケージを組み合わせることで、フロントエンドとバックエンドが連携し、スムーズなAIアプリケーションが実現します。

UIコンポーネントの実装 – `useChat` フックを活用した会話体験

Next.jsのアプリケーションでAIチャットボットのUIを構築するには、`ai/react`パッケージが提供する`useChat`フックが非常に便利です。このフックは、チャットの状態管理、ユーザー入力のハンドリング、メッセージの送受信といった一連のプロセスを抽象化してくれます。

`app/page.tsx`などのコンポーネントで、以下のような形で`useChat`をインポートし、利用します。


// app/page.tsx (一部抜粋)
'use client'; // クライアントコンポーネントとして指定

import { useChat } from 'ai/react';

export default function Chat() {
  const { messages, input, handleInputChange, handleSubmit } = useChat();

  return (
    <div className="flex flex-col w-full max-w-md py-24 mx-auto stretch">
      {/* メッセージ表示エリア */}
      {messages.map(m => (
        <div key={m.id} className="whitespace-pre-wrap">
          {m.role === 'user' ? 'ユーザー: ' : 'AI: '}
          {m.content}
        </div>
      ))}

      {/* 入力フォーム */}
      <form onSubmit={handleSubmit} className="fixed bottom-0 w-full max-w-md p-2 mb-8 border border-gray-300 rounded shadow-xl">
        <input
          className="w-full p-2 outline-none"
          value={input}
          placeholder="何でも質問してください..."
          onChange={handleInputChange}
        />
        <button type="submit" className="p-2 ml-2 bg-blue-500 text-white rounded">送信</button>
      </form>
    </div>
  );
}

このコードでは、`useChat`フックから以下の値と関数を取得して使用しています。

  • `messages`: 現在の会話履歴を格納する配列。
  • `input`: ユーザーの現在の入力値を格納する文字列。
  • `handleInputChange`: 入力フィールドの値が変更されたときに呼び出すイベントハンドラ。
  • `handleSubmit`: フォームが送信されたときに呼び出すイベントハンドラ。

これにより、ユーザーが入力し、送信ボタンを押すと、自動的に`handleInputChange`と`handleSubmit`が動作し、バックエンドのAPIルートへリクエストが送信される仕組みが構築されます。

バックエンドAPIルートの構築 – LLMとの連携を担うサーバーサイド

チャットボットの肝となるLLMとの連携は、Next.jsのAPIルート(サーバーサイド)で実装します。これにより、APIキーなどの機密情報をクライアントサイドに露出させることなく、安全にLLMと通信できます。

`app/api/chat/route.ts`ファイルを作成し、以下の内容を記述します。


// app/api/chat/route.ts
import { OpenAIStream, StreamingTextResponse } from 'ai';
import OpenAI from 'openai';

// OpenAI APIクライアントの初期化
const openai = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
});

export async function POST(req: Request) {
  // リクエストボディからメッセージを取得
  const { messages } = await req.json();

  // OpenAI APIにチャット完了リクエストを送信
  const response = await openai.chat.completions.create({
    model: 'gpt-3.5-turbo', // または 'gpt-4o', 'gpt-4-turbo' など
    stream: true, // ストリーミング応答を有効化
    messages: messages,
  });

  // OpenAIからのストリーム応答をVercel AI SDKのStreamingTextResponse形式に変換
  const stream = OpenAIStream(response);

  // ストリーミング応答をクライアントに返す
  return new StreamingTextResponse(stream);
}

このAPIルートでは、以下の処理が行われます。

  1. `req.json()`でクライアントから送られてきたメッセージ履歴を取得します。
  2. `OpenAI`クライアントを使用して、`chat.completions.create`メソッドでOpenAI APIにリクエストを送信します。この際、`stream: true`を設定することで、LLMからの応答をストリーミング形式で受け取ります。
  3. `OpenAIStream(response)`を呼び出すことで、OpenAIのストリーム応答をVercel AI SDKが扱う形式に変換します。
  4. `StreamingTextResponse`で、変換されたストリームをクライアント(`useChat`フック)に返します。これにより、クライアント側でメッセージがリアルタイムで表示されるようになります。

ストリーミング応答は、特に長いテキスト生成において、ユーザーが応答を待つ時間を視覚的に短縮し、より自然な会話体験を提供するために非常に重要です。

動作確認と初期デバッグ – 初めてのAIチャットボットを動かす

コードが記述できたら、実際にアプリケーションを動かして動作を確認しましょう。

  1. 開発サーバーの起動:

プロジェクトのルートディレクトリで以下のコマンドを実行します。


    npm run dev
  1. ブラウザでのアクセス:

通常、`http://localhost:3000`でアプリケーションにアクセスできます。

  1. チャットの開始:

入力フィールドに何か質問を入力し、送信ボタンを押してみてください。「こんにちは」や「Vercel AI SDKについて教えて」など、簡単な質問から始めると良いでしょう。

よくあるエラーとその解決策

  • `OPENAI_API_KEY`が設定されていません:
    • `.env.local`ファイルに`OPENAI_API_KEY`が正しく設定されているか確認してください。
    • 開発サーバーを再起動して、環境変数が読み込まれているか確認してください。
  • APIキーが不正です(401 Unauthorized):
    • 設定したAPIキーが正しいものであるか、OpenAIの管理画面で確認してください。
    • 誤ってスペースや改行が入っていないか確認してください。
  • ネットワークエラー:
    • インターネット接続を確認してください。
    • OpenAIのAPIステータスを確認し、障害が発生していないか確認してください。
  • TypeScriptのエラー:
    • 不足している型定義がないか、`npm install`が完了しているか確認してください。
    • コードのスペルミスや構文エラーがないか確認してください。

初めてのAIチャットボットが応答を返したら、開発の大きな一歩を踏み出せたことになります。

実践的なAIアプリケーション構築へのステップアップ

AIアプリケーション応用における3つの重要技術
AIアプリケーション応用における3つの重要技術

シンプルなチャットボットが動作するようになったら、さらに実用的なAIアプリケーションへと進化させるためのステップを見ていきましょう。会話履歴の管理、プロンプトエンジニアリング、そして外部ツール連携は、BtoB領域でのAI活用において特に重要な要素です。

会話履歴の管理と継続的な対話の実現

AIチャットボットが「文脈」を理解し、継続的な対話を実現するためには、これまでの会話履歴を適切に管理し、LLMに渡す必要があります。Vercel AI SDKの`useChat`フックは、この会話履歴の管理を自動的に行ってくれます。

`messages`ステートには、ユーザーとAIの過去のやり取りが全て格納されており、新しいメッセージが追加されるたびに更新されます。バックエンドのAPIルートでは、この`messages`配列をそのままLLMに送信することで、LLMは過去の会話を踏まえた応答を生成できます。


// LLMに送信される messages 配列の例
[
  { "role": "user", "content": "Vercel AI SDKとは何ですか?" },
  { "role": "assistant", "content": "Vercel AI SDKは、LLMアプリケーションを構築するためのライブラリセットです。" },
  { "role": "user", "content": "その主な特徴を教えてください。" } // この質問の文脈をLLMが理解できる
]

LLMは、この`messages`配列全体を「コンテキスト」として受け取り、最新のユーザーメッセージに対する最も適切な応答を生成しようとします。ただし、LLMには「コンテキストウィンドウ」と呼ばれる、一度に処理できるトークン数(単語や句の単位)の制限があります。長すぎる会話履歴は、この制限を超えてしまう可能性があるため、必要に応じて古いメッセージを省略したり、要約したりする戦略も検討する必要があります。

プロンプトエンジニアリングの基礎 – 期待通りの応答を引き出すコツ

プロンプトエンジニアリングとは、LLMから期待する応答を引き出すために、入力プロンプト(指示文)を設計する技術です。特にBtoBアプリケーションにおいては、正確性、一貫性、そしてビジネス要件への適合性が求められるため、プロンプトの設計は極めて重要です。

システムプロンプトによるAIの「役割」定義

LLMに対する最初の指示として「システムプロンプト」を設定することで、AIの挙動や「役割」を定義できます。これにより、AIが一貫したトーンやスタイルで応答するよう誘導できます。


// app/api/chat/route.ts (messages配列の先頭に追加)
const messages = [
  {
    role: 'system',
    content: `あなたはBtoB企業の社内ナレッジベースアシスタントです。
    ユーザーからの質問に対し、具体的で簡潔に、かつプロフェッショナルなトーンで回答してください。
    不明な点や社外秘の情報については、「その情報にはアクセスできません」と回答し、推測で答えないでください。
    `,
  },
  ...receivedMessages, // クライアントから受け取ったメッセージ
];

このようにシステムプロンプトを設定することで、AIは単なるチャットボットではなく、「社内ナレッジベースアシスタント」としての振る舞いを学習し、BtoBの文脈に合った応答を生成するようになります。

few-shotプロンプトの活用例

few-shotプロンプトとは、LLMにいくつかの入出力例(「ショット」)を提示することで、特定のタスクの実行方法を教える手法です。これにより、複雑なタスクや特定のフォーマットでの出力が必要な場合に、LLMの応答を誘導できます。

few-shotプロンプトの活用例(顧客からの問い合わせ分類)

  • 入力例1: ユーザー: 「新製品の仕様について知りたい」
    • 出力例1: `{"category": "製品情報", "priority": "medium"}`
  • 入力例2: ユーザー: 「サービスの利用料金を教えてください」
    • 出力例2: `{"category": "料金プラン", "priority": "high"}`
  • 入力例3: ユーザー: 「ログインできません」
    • 出力例3: `{"category": "技術サポート", "priority": "critical"}`

現在の入力: ユーザー: 「アカウントの解約方法を教えてください」

LLMは、これらの例を参考に「アカウント管理」カテゴリと「high」優先度を推論し、JSON形式で出力するよう学習します。

few-shotプロンプトは、LLMが理解しにくい抽象的な指示よりも、具体的な例を示すことで、より高精度な出力を期待できる強力な手法です。実務では、問い合わせの自動分類、レポートの定型文生成、特定フォーマットへのデータ変換などに活用できます。

ツール利用 (Function Calling) の導入 – AIの外部サービス連携

LLMは強力な言語理解・生成能力を持つ一方で、リアルタイムの情報検索や外部システムとの連携は苦手です。そこで、AIが外部ツール(関数)を呼び出す能力(Function Calling)を導入することで、AIアプリケーションの機能を大幅に拡張できます。

BtoBシナリオで役立つ外部連携の具体例

ツール利用は、BtoBアプリケーションにおいてAIの価値を飛躍的に高めます。

BtoB領域におけるツール利用の具体例

  • 社内ナレッジベース検索: ユーザーの質問に対し、社内のドキュメント(Confluence、SharePointなど)を検索し、その結果に基づいて回答する。
  • CRMデータ参照: 顧客名からCRMシステム(Salesforceなど)を検索し、顧客情報(契約状況、過去の問い合わせ履歴)を取得して、パーソナライズされた応答を生成する。
  • ERPシステム連携: 在庫状況の確認、発注状況の追跡、経費精算システムの操作など。
  • チケット発行: ユーザーの要望に応じて、サポートチケットやタスクを自動的に発行する。
  • リアルタイムデータ取得: 最新の市場データ、株価、ニュースなどを取得し、分析レポートに組み込む。

これらの連携により、AIは単にチャットするだけでなく、具体的な「行動」を起こせるようになり、業務の自動化や意思決定支援に貢献します。

`useTools` フックとツールの定義方法

Vercel AI SDKでは、`ai/react`パッケージの`useTools`フックや、`ai`パッケージの`experimental_stream_tool_calls`関数などを利用して、ツール呼び出しを実装できます。ツールの定義にはZodなどのスキーマ定義ライブラリを使用すると便利です。

まずはツールのスキーマを定義します。例えば、社内システムからユーザー情報を取得するツールを考えます。


// tools.ts (例)
import { z } from 'zod';

// ユーザー情報を検索するツールのスキーマ
export const getUserInfoSchema = z.object({
  userId: z.string().describe('検索対象のユーザーID'),
});

// ツール実行関数の型定義
export type ToolFunctions = {
  getUserInfo: (input: z.infer<typeof getUserInfoSchema>) => Promise<string>;
};

次に、このツールをバックエンドAPIルートで定義し、LLMに利用させます。


// app/api/chat/route.ts (一部変更)
import { OpenAIStream, StreamingTextResponse, experimental_stream_tool_calls } from 'ai';
import OpenAI from 'openai';
import { z } from 'zod'; // Zodをインポート

// ... OpenAIクライアント初期化 ...

// ツール定義
const tools = {
  // ユーザー情報を取得するツール
  getUserInfo: async ({ userId }: { userId: string }) => {
    console.log(`Searching user info for ID: ${userId}`);
    // ここで実際の社内システムやDBを呼び出す
    if (userId === 'user_123') {
      return `ユーザーID: ${userId}, 氏名: 山田太郎, 所属: 営業部, 役職: マネージャー, 連絡先: taro.yamada@example.com`;
    }
    return `ユーザーID: ${userId} の情報は見つかりませんでした。`;
  },
};

// ツールスキーマ定義 (LLMに渡すための形式)
const toolSchemas = {
  getUserInfo: z.object({
    userId: z.string().describe('検索対象のユーザーID'),
  }).describe('指定されたユーザーIDに基づいてユーザー情報を検索する。'),
};

export async function POST(req: Request) {
  const { messages } = await req.json();

  // LLMに渡すメッセージとツール定義
  const result = await experimental_stream_tool_calls({
    model: openai.chat('gpt-3.5-turbo-0125'), // ツールコール対応モデル
    messages,
    tools: {
      getUserInfo: toolSchemas.getUserInfo, // LLMにツールスキーマを渡す
    },
  });

  // ストリーム応答を処理し、ツール呼び出しがあった場合は実行
  const stream = OpenAIStream(result, {
    experimental_handleToolCalls: async (toolCalls) => {
      // ツール呼び出しがあった場合の処理
      const toolResponses = await Promise.all(
        toolCalls.map(async (toolCall) => {
          const { name, arguments: args } = toolCall;
          if (name === 'getUserInfo') {
            const parsedArgs = getUserInfoSchema.parse(args);
            const userInfo = await tools.getUserInfo(parsedArgs);
            return {
              tool_call_id: toolCall.id,
              output: userInfo,
            };
          }
          return {
            tool_call_id: toolCall.id,
            output: `Unknown tool: ${name}`,
          };
        }),
      );

      // ツール実行結果をLLMにフィードバックし、再度応答を生成させる
      return experimental_stream_tool_calls({
        model: openai.chat('gpt-3.5-turbo-0125'),
        messages: [...messages, ...toolResponses], // ツール実行結果をメッセージに追加
        tools: {
          getUserInfo: toolSchemas.getUserInfo,
        },
      });
    },
  });

  return new StreamingTextResponse(stream);
}

ツール実行とLLM応答の連携ロジックの実装

上記の例では、`experimental_stream_tool_calls`と`experimental_handleToolCalls`を使って、ツール呼び出しを処理しています。

  1. まず、LLMに対して、利用可能なツールのスキーマ(`toolSchemas.getUserInfo`)を渡してチャットを生成させます。
  2. LLMがユーザーの入力からツール呼び出しが必要だと判断した場合、`experimental_handleToolCalls`がトリガーされます。
  3. `toolCalls`配列には、LLMが呼び出すと判断したツールの情報(名前と引数)が含まれます。
  4. 開発者は、この情報に基づいて実際のツール関数(`tools.getUserInfo`)を実行します。
  5. ツール実行の結果は、再度LLMにフィードバックされます。これにより、LLMはツールの実行結果を「見て」、その結果に基づいた適切な応答を生成できるようになります。

この一連のプロセスにより、AIは単なるテキスト生成にとどまらず、外部のデータやシステムと連携して、より複雑で実用的なタスクをこなすことが可能になります。BtoBの現場では、この機能がAIアプリケーションの価値を大きく左右するでしょう。

Vercelプラットフォームでのデプロイと運用

開発したAIアプリケーションを実際にビジネスで活用するには、本番環境へのデプロイが必要です。VercelはNext.jsアプリケーションのデプロイに最適化されており、簡単な手順でアプリケーションを公開できます。

Vercelアカウントの作成とプロジェクトの連携

Vercelにデプロイするには、まずVercelアカウントが必要です。GitHub、GitLab、またはBitbucketのアカウントで簡単にサインアップできます。

  1. Vercelアカウントの作成: [Vercelのウェブサイト](https://vercel.com/)にアクセスし、サインアップしてください。
  2. Gitリポジトリとの連携: VercelはGitHubなどのGitプロバイダーとの連携を強く推奨しています。これにより、リポジトリへのプッシュをトリガーとして自動的にデプロイが行われる、いわゆるCI/CDパイプラインを構築できます。

プロジェクトをVercelに連携させる方法はいくつかありますが、最も一般的なのはVercel CLIを使用するか、VercelダッシュボードからGitリポジトリをインポートする方法です。

Vercel CLIによるデプロイ手順

  1. Vercel CLIのインストール:

“`bash

npm install -g vercel

“`

  1. Vercelにログイン:

“`bash

vercel login

“`

ブラウザが開き、認証が求められます。

  1. プロジェクトのデプロイ:

プロジェクトのルートディレクトリで以下のコマンドを実行します。

“`bash

vercel

“`

初回デプロイ時には、プロジェクト名やフレームワークの検出、Gitリポジトリとの連携などが対話形式で案内されます。指示に従って設定を進めてください。

一度プロジェクトをVercelに連携させると、以降はGitリポジトリにコードをプッシュするたびに、Vercelが自動的に新しいバージョンをビルドし、デプロイしてくれるようになります。

Vercel上での環境変数設定 – 本番環境でのAPIキー管理

開発環境で使用したAPIキー(`.env.local`)は、本番環境ではVercelのダッシュボードを通じて安全に設定する必要があります。これは、`.env.local`がGitリポジトリに含まれないため、デプロイ時にその情報がVercelのサーバーに存在しないためです。

  1. Vercelダッシュボードへのアクセス:

Vercelのウェブサイトにログインし、デプロイしたプロジェクトを選択します。

  1. Settings > Environment Variablesへ移動:

左側のメニューから「Settings」を選択し、その中の「Environment Variables」タブをクリックします。

  1. 環境変数の追加:
    • `Name`フィールドに`OPENAI_API_KEY`と入力します。
    • `Value`フィールドに、本番環境で使用するOpenAIのAPIキー(`sk-xxxxx`)を入力します。
    • `Environments`では「Production」「Preview」「Development」のいずれか、または全てを選択できます。本番環境で確実に使用するためには「Production」を、プレビューデプロイでもテストしたい場合は「Preview」も選択します。
  2. 保存:

「Add」ボタンをクリックして環境変数を保存します。

環境変数設定の注意点

  • シークレット変数として扱う: APIキーのような機密情報は、Vercel上で「Secret」として扱われます。これにより、値がダッシュボード上で直接表示されることがなく、セキュリティが保たれます。
  • デプロイごとの適用: 環境変数を変更した場合、その変更を適用するには、新しいデプロイが必要です。Vercelダッシュボードから手動で再デプロイするか、Gitにコミット&プッシュして自動デプロイをトリガーしてください。
  • 開発と本番の分離: 開発環境で使用するキーと、本番環境で使用するキーは異なるものを設定することを強く推奨します。これにより、開発中の不測の事態が本番環境に影響を与えるリスクを低減できます。

デプロイ手順と注意点 – スムーズな本番稼働のために

Vercelへのデプロイは基本的に自動化されますが、いくつかのポイントを押さえておくことで、よりスムーズな本番稼働が実現します。

  1. 自動デプロイの活用:

GitリポジトリをVercelに連携させていれば、`main`(または`master`)ブランチへのプッシュは自動的に本番デプロイをトリガーします。フィーチャーブランチへのプッシュは、プレビューデプロイとして作成され、本番環境に影響を与えずに変更をレビューできます。

  1. ログの確認:

デプロイ中にエラーが発生した場合や、デプロイ後のアプリケーションの動作に問題がある場合は、Vercelダッシュボードの「Logs」タブを確認してください。サーバーサイドのエラーメッセージやビルドログが詳細に記録されており、問題解決の糸口となります。

  1. 環境変数の確認:

デプロイ後にAPIキーが正しく読み込まれていない場合は、Vercelダッシュボードの環境変数設定を再確認し、必要であれば新しいデプロイをトリガーしてください。

  1. ドメイン設定:

カスタムドメインを使用したい場合は、Vercelダッシュボードの「Settings」>「Domains」から設定できます。

Vercelプラットフォームを活用することで、開発者はインフラ構築や運用に煩わされることなく、AIアプリケーションの機能開発に集中できます。これにより、BtoBビジネスの変化に迅速に対応し、高品質なAIソリューションを提供できるようになるでしょう。

まとめと次のステップ – BtoB領域でのAI活用を加速させるために

本ハンズオンを通じて、Vercel AI SDKとNext.jsを用いたAIチャットボットの基本的な構築プロセスを学びました。開発環境の準備から、UIとバックエンドの実装、会話履歴の管理、プロンプトエンジニアリング、そして外部ツール連携による機能拡張、さらにはVercelプラットフォームへのデプロイまで、一連の流れを実践的に体験できたことと思います。

Vercel AI SDKで実現可能なBtoBユースケースの展望

Vercel AI SDKは、BtoB領域における多様なAI活用シナリオにおいて、その真価を発揮します。

Vercel AI SDKで実現できるBtoBユースケースの例

  • 社内向けナレッジベース / FAQシステム: 社内ドキュメントやデータベースと連携し、従業員からの質問に即座に回答。新入社員のオンボーディング支援や、情報検索の効率化に貢献します。
  • 顧客サポートAI / チャットボット: 顧客からの問い合わせに24時間365日対応。CRMやFAQシステムと連携し、パーソナライズされたサポートを提供することで、顧客満足度向上とコスト削減を実現します。
  • 営業支援アシスタント: 顧客との会話履歴、製品情報、市場データを参照し、営業担当者の提案資料作成や商談準備をサポート。営業効率の向上と成約率アップに貢献します。
  • データ分析アシスタント: 自然言語で質問するだけで、社内データからインサイトを抽出し、グラフやレポートを生成。非専門家でもデータ駆動型意思決定を加速できます。
  • 採用支援ツール: 応募者からの質問応答、面接のスケジューリング、求人情報の提供など、採用プロセスの一部を自動化し、採用担当者の業務負担を軽減します。

これらのユースケースはほんの一部に過ぎません。Vercel AI SDKの柔軟性と拡張性を活用すれば、貴社独自のビジネス課題に合わせたAIソリューションを迅速に開発し、競争優位性を確立できるでしょう。

パフォーマンス最適化とコスト管理のヒント

AIアプリケーションを本番運用する上で、パフォーマンスとコストは常に考慮すべき重要な要素です。

  • トークン使用量のモニタリングとプロンプトチューニング:

LLMの利用コストは、主に処理されたトークン数に基づいて計算されます。冗長なプロンプトや不必要な会話履歴の送信はコスト増につながるため、プロンプトを簡潔に保ち、コンテキストウィンドウを効率的に使用するよう最適化してください。

  • 適切なモデルの選択:

OpenAIの`gpt-3.5-turbo`と`gpt-4o`のように、LLMには性能とコストのバランスが異なる複数のモデルが存在します。タスクの複雑性や要求される精度に応じて、最適なモデルを選択することで、コストを抑えつつ十分なパフォーマンスを確保できます。

  • キャッシング戦略の導入:

頻繁に繰り返される同じ質問に対する応答や、比較的静的なデータ検索の結果は、キャッシュすることでLLMへのリクエスト回数を減らし、応答速度とコストを改善できます。

  • レートリミットとエラーハンドリング:

APIプロバイダーにはレートリミット(一定時間内のリクエスト制限)があります。アプリケーションはこれを適切に処理し、リトライメカニズムやエラーメッセージをユーザーに提示する堅牢な設計を心がけてください。

さらなる学習リソースとコミュニティへの参加

Vercel AI SDKは活発に開発されており、最新の機能やベストプラクティスを常に追いかけることが重要です。

  • Vercel AI SDK 公式ドキュメント: 最も信頼できる情報源です。APIリファレンス、詳細なガイド、サンプルコードが豊富に用意されています。

[https://sdk.vercel.ai/docs](https://sdk.vercel.ai/docs)

  • GitHubリポジトリ: SDKのソースコードやIssueを確認できます。コントリビュートすることも可能です。

[https://github.com/vercel/ai](https://github.com/vercel/ai)

  • Vercelコミュニティ / Discord: 他の開発者と情報交換したり、質問したりできる場です。
  • 関連ブログや技術記事: Vercel AI SDKやNext.js、LLMに関する最新情報を得るために、技術ブログやニュースサイトを定期的にチェックしましょう。

Vercel AI SDKは、BtoB企業がAIアプリケーション開発の課題を乗り越え、ビジネス価値を最大化するための強力なパートナーとなり得ます。本ハンズオンで得た知識と経験を足がかりに、ぜひ貴社のビジネスに革新をもたらすAIソリューションを構築してください。