![見出し画像](https://assets.st-note.com/production/uploads/images/173572173/rectangle_large_type_2_ae229b778abc6d0fda690b9359861701.jpeg?width=1200)
Vercel AI SDK 徹底解説ガイド
Next.jsの開発元として知られるVercel社が提供するオープンソースのAI開発キッド「Vercel AI SDK」において、インストール方法, OpenAI APIキー設定, チャットUI構築の流れ, を具体的なコード例とともに解説する資料を作成して。
上記のプロンプトでChatGPTのDeep Researchに調査して作ってもらった資料をそのまま掲載します。自分用で作りましたが、同じテーマで調べる人にとっても有益な情報になると思ったので共有です。ぜひお役立てください。
当記事では、
インストール手順(初心者向けに詳細なコマンド解説付き)
環境設定(OpenAI APIキーの設定方法)
基本的なチャットUIの構築(初心者向けのコード例を含む)
応用機能の紹介(ストリーミング処理、カスタムモデルの利用など)
これらを初心者でも理解しやすい形で解説し、可能な限り詳細に網羅します。
Vercel AI SDK 徹底解説ガイド
Vercel AI SDKは、Webアプリケーションに最先端のAI機能(チャットボットや生成AIなど)を簡単に組み込むためのオープンソースSDKです。特にストリーミング対応のチャットUIを手軽に構築できる点が特徴で、プログラミング初心者でも比較的簡単に扱えます。本ガイドでは、Vercel AI SDKの概要から導入方法、基本的なチャットボット実装、応用機能、そしてデプロイまでを丁寧に解説します。ぜひ参考にしてみてください。
目次
概要と特徴
どのような用途に使えるのか
必要な環境(Node.js、Next.jsなど)
インストール手順(詳細なコマンド解説)
OpenAI APIキーの取得方法
.envファイルへの設定
最小構成のチャットボットの作成
ユーザー入力を処理するAPI(バックエンド)の実装
フロントエンドでの表示方法(チャット画面の構築)
ストリーミング処理の実装
カスタムモデルを使用する方法
LangChainとの連携
Vercelへのデプロイ方法
運用時の注意点(APIキー管理・コストなど)
1. Vercel AI SDKとは
概要と特徴
Vercel AI SDKとは、Next.jsを開発しているVercel社が提供するAIアプリケーション開発用のソフトウェア開発キット(SDK)です。JavaScript/TypeScriptで動作し、チャットボットのような対話型ユーザーインターフェースを簡単に構築できるよう設計されています (Introducing the Vercel AI SDK: npm i ai - Vercel)。主な特徴を挙げると以下の通りです。
ストリーミング対応: 大規模言語モデルからの回答をトークン(文字列の断片)単位で逐次受け取り、ユーザーにリアルタイム表示できます (Introducing the Vercel AI SDK: npm i ai - Vercel)。これにより、ChatGPTのように文字が少しずつ表示されるインタラクティブな体験を実現できます。
マルチプラットフォーム対応: Next.js(React)をはじめ、SvelteやVue、Node.jsなど様々なフレームワークで利用可能です (AI SDK by Vercel)。フロントエンドとバックエンドの両方で使えるため、Webアプリ全体でAI機能を統合できます。
LLMプロバイダーの統一インターフェース: OpenAIのAPIだけでなく、Hugging FaceやAnthropicなど複数のAIモデル提供サービスに対応しています (Introducing the Vercel AI SDK: npm i ai - Vercel)。SDKのAPIを介してこれらを切り替えることができ、特定のサービスにロックインされません。
UI構築用の便利機能: ReactフックやUIコンポーネントが用意されており、チャットUIや入力フォームなどを簡単に実装できます。煩雑な状態管理やHTTP通信の処理が抽象化されているため、最小限のコードで対話UIを実装できます (Getting Started: Next.js App Router) (Getting Started: Next.js App Router)。
こうした特徴から、Vercel AI SDKは対話型のチャットボットや文章生成ツール、Q&Aシステムなど、ユーザーからの入力に応じてAIが応答を返すタイプのWebアプリケーションに広く利用できます。また、ストリーミング表示に対応しているため、ユーザーにストレスを与えないスムーズな応答体験を提供したい場合にも最適です。
どのような用途に使えるのか
Vercel AI SDKは主にテキスト生成を行うAIモデルとのやり取りを容易にするものです。具体的には次のような用途で役立ちます。
チャットボット・対話エージェント: カスタマーサポートや個人アシスタントのチャットボットをWeb上に実装できます。ユーザーからの質問にAIモデル(例: OpenAI GPT-4)が回答し、ストリーミングで表示するような仕組みを短時間で構築可能です。
コンテンツ生成アプリ: ブログ記事の下書き生成や、文章要約、コード自動生成ツールなど、ユーザーの入力プロンプトからテキストを生成するアプリに活用できます。
Q&A検索システム: 特定のドメインに関する質問応答システム(社内ナレッジベース検索、FAQボットなど)を構築できます。LangChainなどと組み合わせて、ベクトルデータベースから検索結果を取得しつつAIに回答させるRAG(Retrieval Augmented Generation)システムにも応用できます。
その他AI機能の組み込み: 上記以外にも、たとえば文章の感情分析結果をリアルタイム表示したり、要約ツールの結果をストリーミング表示するなど、「テキストを生成して結果をユーザーに見せる」場面全般で利用できます。
要するに、「ユーザーの入力に応じてAIがテキストで応答する」タイプの機能であれば、Vercel AI SDKが強力な助っ人となります。煩雑なAPI呼び出しやストリーム処理を意識することなく、UIとAIモデルの接続に集中できるのが利点です。
2. Vercel AI SDKのインストール
必要な環境
Vercel AI SDKを使用するには、以下の環境・ツールが必要です。
Node.js 18以上: サーバーサイド(バックエンド)で最新のJavaScript機能やFetch APIを利用するため、Node.jsのバージョンは18以上を使用してください (Getting Started: Next.js App Router)。
Next.js 13以上: Next.jsはReactベースのフレームワークで、Vercel AI SDKと相性が良いです。本ガイドではNext.jsを使った実装を説明します。Next.js 13以降のApp Router機能を使うことを前提とします(Pages Routerでも利用可能ですが、設定が多少異なります)。
Vercel AI SDKパッケージ: SDK本体であるaiというNPMパッケージと、使用するモデルプロバイダーに応じた追加パッケージ(例えばOpenAIを使う場合は@ai-sdk/openai)をインストールします。
OpenAIのAPIキー: OpenAIのモデル(GPT-3.5やGPT-4など)を利用する場合は、OpenAIのアカウントとAPIキーが必要です。APIキーの取得方法は後述します。
また、開発にはNode.jsのパッケージマネージャ(npm/Yarn/pnpm)と、コードエディタ(VSCodeなど)が必要です。ブラウザは最新のChrome/Edge/Firefox等を利用してください。
インストール手順(詳細なコマンド解説)
それでは、実際にVercel AI SDKをプロジェクトに導入する手順を説明します。ここでは例としてNext.jsの新規プロジェクトを作成するところから始めます。
Next.jsプロジェクトの作成: 下記のコマンドでNext.jsの新規アプリケーションを作成します(npmを使用する場合)。プロンプトが表示されたら、できるだけApp Router(appディレクトリ)を使用する設定にしてください (Getting Started: Next.js App Router)。
npx create-next-app@latest my-ai-app --typescript
上記コマンドにより、my-ai-appという名前のフォルダにNext.jsの雛形プロジェクトが作成されます。--typescriptオプションを付けるとTypeScriptでセットアップされます(省略すると質問プロンプトが出ます)。 ※ 解説: create-next-appはNext.js公式のプロジェクト初期化ツールです。この段階でNext.jsの必要な依存関係や初期ファイルが用意されます。
ディレクトリに移動: プロジェクト作成後、ターミナルでそのディレクトリに移動します。
cd my-ai-app
※ 解説: 今後のコマンドはすべてこのプロジェクトディレクトリ内で実行します。
Vercel AI SDKパッケージのインストール: 以下のコマンドで必要なパッケージをインストールします(npm使用の場合)。
npm install ai @ai-sdk/openai
上記ではVercel AI SDK本体であるaiと、OpenAIプロバイダーである@ai-sdk/openaiをインストールしています。 (Getting Started: Next.js App Router) (Getting Started: Next.js App Router)今後OpenAIのAPIを使ってテキスト生成を行うために必要です。 ※ 補足: 他のモデルプロバイダー(例えばAnthropicやHuggingFaceなど)を使う場合は、対応するパッケージを追加でインストールします。複数のプロバイダーを同時に使うことも可能です。
依存関係の確認: package.jsonを確認し、インストールされたパッケージが列挙されていること、またNode.jsのバージョン要件(必要ならenginesフィールド)などをチェックします。aiパッケージのバージョンは3.1以上が推奨されています (Getting Started: Next.js App Router)。
以上で、プロジェクトへのVercel AI SDKの導入は完了です。次章では、OpenAIのAPIキーを取得しプロジェクトに設定する方法を説明します。
3. OpenAI APIキーの設定
Vercel AI SDKでOpenAIのモデルを利用する際には、OpenAIのAPIキーを環境変数としてプロジェクトに設定する必要があります。ここではAPIキーの取得方法と、Next.jsプロジェクトへの設定手順を説明します。
OpenAI APIキーの取得方法
OpenAIのアカウント作成: まだOpenAIのアカウントを持っていない場合は、OpenAIの公式サイトにアクセスしてアカウント登録を行います。 (Getting Started: Next.js App Router)に記載されているように、OpenAIのウェブサイト(OpenAI Platform)でサインアップできます。
APIキーの発行: アカウントにログインしたら、OpenAIのダッシュボードからAPI Keysのセクションに移動します。そこで「新しい秘密鍵を作成(Create new secret key)」といったボタンをクリックするとAPIキーが発行されます。発行されたキーをコピーして控えておきます。
※ 注意: APIキーはアカウントごとに一意であり、秘密情報です。他人に見られないよう取り扱いに注意してください。一度画面を離れるとそのキーは再表示できないため、必ずコピーして安全な場所に保存しましょう。
.envファイルへの設定
Next.jsでは、環境変数をプロジェクト直下の.env.localファイルに記述することで、開発環境で自動的に読み込まれるようになっています (Getting Started: Next.js App Router)(プロダクション環境ではVercelの設定画面から環境変数を設定します。それについては後述のデプロイ章で触れます)。
プロジェクト直下に*.env.local*というファイルを作成します(ファイルが既に存在しない場合)。ターミナルから以下のコマンドでも作成可能です。
touch .env.local
エディタで*.env.local*を開き、次のようにOpenAIのAPIキーを設定します。
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxx
上記のsk-...の部分に先ほど取得した実際のAPIキー文字列を貼り付けます (Getting Started: Next.js App Router)。
ファイルを保存します。これで開発環境でprocess.env.OPENAI_API_KEYを参照すると、上記で設定した値が取得できるようになります。
※ 補足: Vercel AI SDKのOpenAIプロバイダーは、デフォルトで環境変数OPENAI_API_KEYを利用するよう実装されています (Getting Started: Next.js App Router)。したがって、この名前でキーを設定しておけば追加の設定なしにOpenAIと通信できます。
(オプション).gitignoreの確認: 通常、Next.js作成時に*.env.local*はGit追跡対象外になっていますが、念のためプロジェクトの.gitignoreファイルに.env.localが記載されていることを確認してください。APIキーなどの秘密情報が含まれるファイルはGitリポジトリにコミットしないようにします。
これでOpenAIのAPIキー設定は完了です。次の章から、このAPIキーを用いて実際にチャットボットの機能を実装していきましょう。
4. 基本的なチャットUIの構築
ここからは、Vercel AI SDKを使ってシンプルなチャットボットUIを構築してみます。バックエンド部分(API)とフロントエンド部分(画面)の両方を実装し、ユーザーの入力にAIが応答する一連の流れを作り上げます。最終的には、ChatGPTのようにユーザーがメッセージを送信するとAIからの返信が画面に表示されるアプリが完成します。
最小構成のチャットボット作成の流れ
チャットボットの仕組みを高レベルで説明すると、以下のような流れになります。
ユーザーがメッセージを入力・送信 – フロントエンドのチャット画面でユーザーがテキストを入力し、送信(フォーム送信やボタン押下)します。
バックエンド(API)にリクエスト送信 – フロントエンドはユーザーの入力内容を含むリクエストを、用意したAPIエンドポイント(例えば/api/chat)にPOSTで送信します。
AIモデルから応答を取得 – バックエンドのAPIルートでVercel AI SDKを使い、受け取ったユーザーのメッセージをOpenAIなどのLLMに渡して応答を生成します。応答はストリーム(逐次データ)として受け取ります。
フロントエンドへストリーミング送信 – バックエンドは生成されたAIからの応答をそのままレスポンスとしてクライアントに返します。ストリーミングを利用することで、メッセージ全文が完成する前から部分的な結果を順次送り返します。
画面にAIの返答を表示 – フロントエンドはストリーミングレスポンスを受け取りながら、チャット画面にAIからの回答メッセージを逐次表示します。ユーザーは文字がタイピングされていくような形で回答を見ることができます。
では、この流れを実現するための具体的なコードを見ていきましょう。
ユーザー入力を処理するAPIの実装(バックエンド)
まず、Next.jsのAPIルートを作成します。Next.js (App Router)では、app/api/以下にファイルを作ることでAPIエンドポイントを定義できます。ここでは例としてapp/api/chat/route.tsというファイルを作成し、ユーザーからのチャットメッセージを受け取ってAIの返答を返すAPIとします。 (Getting Started: Next.js App Router)
import { NextRequest } from 'next/server';
import { OpenAI } from '@ai-sdk/openai'; // OpenAIプロバイダーの読み込み
import { streamText } from 'ai'; // Vercel AI SDKのコア機能
export const runtime = 'edge'; // エッジ環境で実行(低レイテンシのストリーミングに有利)
// POSTリクエストハンドラの定義
export async function POST(req: NextRequest) {
// リクエストボディからユーザーのメッセージ履歴を取得
const { messages } = await req.json();
// OpenAIのモデルを指定(ここではGPT-3.5を使用)
const model = OpenAI('gpt-3.5-turbo'); // OpenAIプロバイダーでモデルを選択
// AIにメッセージ履歴を渡して応答ストリームを生成
const result = streamText({
model: model,
messages: messages // ユーザーとAIのメッセージ履歴(配列)
});
// ストリームレスポンスを返す(クライアント側で逐次受信可能)
return result.toDataStreamResponse();
}
コード解説:
OpenAI('gpt-3.5-turbo'): OpenAIプロバイダーからGPT-3.5 Turboモデルを指定しています('gpt-4'等に変更可能)。OpenAIは@ai-sdk/openaiパッケージで提供される関数で、指定したモデルを呼び出すための設定を内部に持ったオブジェクトを返します。
messages: ユーザーとAIのメッセージ履歴を表すオブジェクト配列です。OpenAIのチャットモデルは「これまでの会話履歴」をコンテキストに次の返答を生成するため、ユーザーから送られてきたmessagesをそのまま渡しています。各メッセージは一般に{ role: 'user' | 'assistant', content: 'メッセージ本文' }の形式を取ります。
streamText(...): Vercel AI SDKのコア関数です (Getting Started: Next.js App Router)。modelとmessagesを渡すことで、モデルに対するテキスト生成(会話応答)をリクエストし、その結果をストリームとして受け取ります。ここでは返り値resultにストリーム結果(内部には応答テキストが逐次追加されていくストリームオブジェクト)が格納されます。
result.toDataStreamResponse(): resultに含まれるストリームをHTTPレスポンスオブジェクトに変換しています (Getting Started: Next.js App Router)。これをreturnすることで、Next.jsはクライアントに対しストリーミング可能なレスポンスを返します。これにより、クライアント側(ブラウザ)は逐次データを受け取ることができます。
export const runtime = 'edge': この設定により、Next.jsのAPIルートがVercelのエッジサーバ上で実行されます。エッジ環境はグローバルに分散しておりレイテンシが低く、またストリーミングレスポンスの送出にも適しています。加えて、Edge Functionでは一部Node.jsモジュールが使えない代わりにFetch APIが利用可能で、openai-edgeクライアントとの相性が良いというメリットもあります。注意: エッジ関数には実行時間制限がありますが、SDK内でmaxDuration(最大持続時間)を設定することで対処できます (Getting Started: Next.js App Router) (Getting Started: Next.js App Router)。
以上で、/api/chatへのPOSTリクエストを処理するバックエンドAPIができました。このAPIは、リクエストのボディにmessages(これまでの対話履歴)を受け取り、その続きをAIが考えて返答するという動作になります。次に、このAPIと通信するフロントエンドのチャットUIを作成します。
フロントエンドでの表示方法(チャット画面の構築)
バックエンドAPIが用意できたら、次はユーザーとAIの対話を表示するチャットUIを作ります。Next.js (App Router)のトップページ(例えばapp/page.tsx)をチャット画面として実装してみましょう。
'use client'; // フロントエンドで動作するコンポーネントであることを明示
import { useChat } from 'ai/react'; // Vercel AI SDKのReactフック
export default function ChatPage() {
// useChatフックでチャット状態と操作関数を取得
const { messages, input, handleInputChange, handleSubmit } = useChat();
return (
<main className="flex flex-col items-center justify-center py-10">
{/* メッセージ一覧表示 */}
<div className="w-full max-w-md mb-4">
{messages.map((m) => (
<div key={m.id} className="whitespace-pre-wrap">
<strong>{m.role === 'user' ? 'ユーザー' : 'AI'}:</strong> {m.content}
</div>
))}
</div>
{/* ユーザー入力フォーム */}
<form onSubmit={handleSubmit} className="w-full max-w-md flex">
<input
className="flex-grow p-2 border border-gray-300 rounded"
type="text"
value={input}
onChange={handleInputChange}
placeholder="メッセージを入力..."
/>
</form>
</main>
);
}
コード解説:
'use client': このページコンポーネントがクライアントサイドで動作することを指示しています。Reactのイベントハンドリング(入力やフォーム送信)を扱うため、クライアントコンポーネントにする必要があります。
useChat: Vercel AI SDKが提供するReact用のフックです (Getting Started: Next.js App Router)。このフックを使うと、チャットアプリに必要な状態管理と関数がひとまとめに提供されます。useChat()を呼び出すと以下の値が得られます (Getting Started: Next.js App Router):
messages: 現在のチャットメッセージの配列。ユーザーから送信したメッセージやAIからの応答メッセージが順番に格納されます。それぞれ{ id, role, content }というオブジェクト形式になっています。
input: 現在ユーザーが入力中のテキスト(入力フォームの内容)を表す文字列。
handleInputChange: 入力フォームのonChangeイベントに対応するイベントハンドラ関数です。入力内容の変更を内部状態に反映してくれます。
handleSubmit: フォーム送信時に呼ぶイベントハンドラ関数です。これを要素のonSubmitにセットしておくと、エンターキー押下等でフォーム送信した際に、現在のinput内容がAIへの質問として送信されます。
メッセージ一覧部分では、messages配列をmapで回して画面に表示しています。m.roleが'user'ならユーザーの発言、それ以外(おそらく'assistant'または'system')ならAIの発言として、ラベル(ユーザー: or AI:)を付けて表示しています。whitespace-pre-wrapクラスは改行を保持して表示するためのTailwind CSSクラス(スタイル)です。スタイルはお好みで調整してください。
入力フォームでは、value={input}とすることでuseChat内部で管理される入力状態とフォームをバインドしています。onChange={handleInputChange}を指定することで、ユーザーがタイプするたびに状態が更新されます。フォームの送信イベント(onSubmit)はhandleSubmitに任せています。
<form>の周囲を <main>や <div> でラップし、簡単なレイアウト調整をしています(中央寄せなど)。デザイン部分は本質ではないのでお好みで構いません。
このuseChatフックはデフォルトで先ほど作成した/api/chatのPOSTルートを呼び出すように動作します (Getting Started: Next.js App Router)。つまり、フォーム送信でhandleSubmitが呼ばれると、内部的に/api/chatへ現在のメッセージ履歴を含むリクエストを送り、バックエンドからのストリーミング応答を受け取りつつmessagesにAIからの新しいメッセージを追加してくれます。開発者はその詳細を意識せず、状態messagesを画面に描画するだけでリアルタイムなチャットUIが完成するわけです。
アプリの起動と動作確認
バックエンドとフロントエンドの実装が揃ったら、開発サーバーを起動して動作を確認してみましょう。
npm run dev
上記コマンドでNext.jsの開発モードサーバーが立ち上がります。ブラウザでhttp://localhost:3000にアクセスすると、先ほど実装したシンプルなチャット画面が表示されるはずです (Getting Started: Next.js App Router)。入力ボックスにメッセージを入力し、エンターキーを押すと(またはフォーム送信されると)、バックエンドにリクエストが飛びAIからの返答がリアルタイムに表示されます。
ポイント: 最初のリクエスト時に多少時間がかかる場合があります(モデルの初期応答待ちなど)。しかし、ストリーミング対応のおかげで、応答全文が生成される前でも逐次結果が表示され始めます。これによりユーザーは待たされている感覚が軽減されるでしょう。
ここまでで、最小構成のAIチャットボットが完成しました。非常に短いコード量で、入力→AI回答→表示という一連の流れが実装できたことに注目してください。これはVercel AI SDKの高い抽象化と利便性によるものです。
次章では、さらに応用的な機能について触れてみます。ストリーミングの詳細な制御や、OpenAI以外のモデルの利用、LangChainとの組み合わせなど、実践で役立つトピックを解説します。
5. 応用機能
基本的なチャットボット実装ができたところで、Vercel AI SDKのもう少し高度な使い方や知っておくと便利な機能について解説します。
ストリーミング処理の実装
ストリーミングはVercel AI SDKの目玉機能ですが、ここではストリーミングの仕組みと制御についてもう少し詳しく説明します。
ストリーミングとは: 通常、AIモデルにテキスト生成をリクエストすると、完全な応答が用意できるまで待ってから一度に結果を受け取ります。しかしストリーミングでは、モデルが応答を考えている途中の段階から部分的なテキストを逐次受け取ることができます。これにより、大きな文章でも先頭の方から順にユーザーに表示でき、待ち時間を短縮する効果があります。
Vercel AI SDKでのストリーミング: SDK内部では、OpenAIなどのAPIからのチャンク(塊)データを受け取り、それをサーバーからクライアントへServer-Sent Events (SSE) 形式などで転送する仕組みを取っています。開発者はstreamTextやtoDataStreamResponse()を使うだけでこの複雑な処理が隠蔽され、結果としてuseChatフック経由で徐々にメッセージが更新されるようになります。
逐次表示の制御: 既定では1文字(または数文字)単位でリアルタイム表示されますが、もう少し大きな塊で更新したい場合などは、自前でストリームを読み取って処理することも可能です。ただし初心者のうちはSDKに任せる形で十分でしょう。
タイムアウトと制限: ストリーミングの際、バックエンド処理があまりに長引くとタイムアウトする可能性があります。VercelのEdge Functionsではデフォルトの実行時間制限が短いため、export const maxDuration = 30; のように最大実行時間を延長する設定をRoute Handler側で行うことが推奨されています (Getting Started: Next.js App Router)(上記コード例では30秒に設定)。長文の生成など時間がかかる処理では適切に値を調整してください。
開発時には、ストリーミングが正しく行われているかをブラウザの開発者ツールのネットワークタブで確認することもできます。リクエストが開いたままデータが少しずつ届いている様子や、クライアント側でメッセージが順次追加される様子を観察してみると理解が深まるでしょう。
カスタムモデルを使用する方法
Vercel AI SDKはOpenAI以外にも様々なモデルプロバイダーに対応しています。例えば、Hugging Faceの提供するモデルや、独自にホストしたローカルモデルのAPI等も統一的な方法で扱えます (Introducing the Vercel AI SDK: npm i ai - Vercel)。ここでは別のモデルを使う場合の基本的な考え方を紹介します。
他のプロバイダー用パッケージの導入: OpenAI以外のモデルを使う場合、それぞれ専用のプロバイダーSDKをインストールします。例えばHugging FaceのInference APIを使いたい場合は、@ai-sdk/huggingface(または公式の@huggingface/inference)パッケージを導入します (How to Use ML Models from Hugging Face in Vercel Functions)。Anthropic社のClaudeを使うなら@ai-sdk/anthropic、Azure OpenAIなら@ai-sdk/azure-openaiといった具合です。
利用するモデルの指定: プロバイダーごとにモデル指定の方法は多少異なりますが、基本は「プロバイダー関数にモデルIDを渡す」形です。例えばHugging Faceの場合:
import { HuggingFace } from '@ai-sdk/huggingface'; ... const model = HuggingFace('distilgpt2', { apiKey: process.env.HUGGINGFACE_API_KEY }); const result = streamText({ model, messages });
上記のように、HuggingFaceサイト上のモデル名(例ではdistilgpt2)を指定し、必要に応じてAPIキーや追加の設定オプションを渡します。あとはOpenAIの場合と同様にstreamTextに渡すだけです。
モデルの特性に注意: 別のモデルを使うと、応答の品質や形式が異なる場合があります。例えば、あるモデルは会話履歴ではなく単発のプロンプトに対する応答しか受け付けないことがあります(その場合messagesではなくpromptという単一テキストを渡す別の関数を使います)。各モデルのAPI仕様に応じてSDKの使い方も変わる場合があるので、公式ドキュメントや提供元の例を参照してください。
カスタムプロバイダーの作成: SDKが標準でサポートしていない独自モデルを使いたい場合、自分でカスタムプロバイダーを実装することも可能です (AI SDK by Vercel)。高度な内容になりますが、Providersのガイドに沿って独自のAPI呼び出しロジックを統一インターフェースでラップすることができます。
このように、Vercel AI SDKの抽象化によってモデル切り替えもシンプルになっています。OpenAIで試作した後に別のサービスに乗り換える、といったケースでも大幅な書き直しをせずに済むでしょう。
LangChainとの連携
LangChainは、大規模言語モデルを使った高度なアプリケーション(エージェント、ツール使用、対話の構造化など)を構築するためのフレームワークです。LangChain自体はバックエンドロジックに強力な機能を提供しますが、UI構築やストリーミング通信の機能は持っていません (Adapters: LangChain)。そこでVercel AI SDKと組み合わせることで、LangChainのパワフルな機能を活かしつつユーザー体験の良いインターフェースを実現できます。
具体的な連携方法の一例を紹介します。
LangChainでチェーンやエージェントを構築: まずLangChainの機能を使って、たとえば質問応答チェーンやツール使用エージェントを作成します。LangChainは複数のステップからなる処理や、外部データソースからの情報取得などを簡単に記述できます。
LangChainの結果をストリームとして取得: LangChainの一部には応答をストリーミングで取得する仕組み(Expression Languageの.stream()メソッドなど)があります (Adapters: LangChain) (Adapters: LangChain)。Vercel AI SDKはこのストリームを受け取りクライアントへ流すアダプターを提供しています。それがLangChainAdapterです。
Next.js APIでLangChainを呼び出す: Next.jsのAPIルート内で、LangChainのチェーン/エージェントを実行し、その結果のストリームをLangChainAdapter.toDataStreamResponse()に渡して返します (Adapters: LangChain) (Adapters: LangChain) (Adapters: LangChain)。以下に擬似コードの例を示します。
import { ChatOpenAI } from "@langchain/openai"; // LangChainのOpenAIラッパー import { LangChainAdapter } from "ai"; // Vercel AI SDKのアダプター export async function POST(req: Request) { const { prompt } = await req.json(); // LangChainのLLMラッパーを初期化(こちらでもOpenAIのモデルを使用) const model = new ChatOpenAI({ modelName: "gpt-3.5-turbo" }); // プロンプトに対するストリーミング応答をLangChain側で取得 const stream = await model.stream(prompt); // LangChainのストリームをVercel AI SDK経由でレスポンスとして返す return LangChainAdapter.toDataStreamResponse(stream); }
上記のようにすることで、LangChainが生成する逐次的なトークンをそのままクライアントに送り出すことができます。フロントエンド側はuseChatやuseCompletionフックで受け取るだけで、通常のチャットボットと同じように表示できるわけです。 (Adapters: LangChain) (Adapters: LangChain)
高度なシナリオへの応用: LangChainとの連携により、例えばベクトルデータベースを用いたドキュメント検索+回答生成(RAG)、ツール使用エージェントによる計算やWeb検索を含む対話、マルチステップ対話の管理など、より複雑なAIアプリケーションを構築できます。それらの結果をリアルタイムでユーザーに返せる点で、Vercel AI SDKはLangChainの結果表示部分を補完する理想的な組み合わせと言えます (Building an AI chatbot with Next.js, Langchain, and OpenAI)。
LangChainとVercel AI SDKの組み合わせは強力ですが、一方で実装難易度も上がるため、まずは基本のチャットボットが安定して動くことを確認してから段階的に取り入れると良いでしょう。公式のテンプレートやガイドも公開されていますので、必要に応じて参照してください (Building an AI chatbot with Next.js, Langchain, and OpenAI) (Adapters: LangChain)。
6. デプロイと運用
開発したアプリケーションを実際にインターネット上に公開し、ユーザーに使ってもらうにはデプロイ(本番環境への展開)が必要です。ここではVercel(ホスティングプラットフォーム)へのデプロイ方法と、運用上の注意点について解説します。
Vercelへのデプロイ方法
Next.jsのアプリケーションはVercelにデプロイすることで簡単に公開できます。基本的な手順は次の通りです。
Gitリポジトリの用意: まずプロジェクトをGit管理下に置き、GitHubやGitLabなどのGitリポジトリにプッシュします。VercelはGitフローと連携してデプロイを行うためです。
Vercelアカウントとプロジェクト作成: Vercelのアカウントを作成し、ダッシュボードから「Add New... > Project」を選択します。先ほどプッシュしたリポジトリをインポートすると、自動的にビルド設定が検出されます。フレームワークにNext.jsを選択し、プロジェクト名などを入力して進めます。
環境変数の設定: デプロイ前に、環境変数(APIキーなど)の設定を行います。Vercelのプロジェクト設定画面で、Environment Variablesの項目にOPENAI_API_KEYを追加し、取得したキーを値として設定してください。開発時に使用した.env.localの値をここに登録する形です。設定を保存すると、デプロイされた環境(PreviewやProduction)でprocess.env.OPENAI_API_KEYが利用可能になります。
デプロイの実行: 環境変数を設定したらデプロイを実行します(Gitリポジトリを連携した場合、プッシュやマージに連動して自動デプロイされます)。Vercel側でビルドが行われ、問題なければ公開URLが発行されます。そのURLにアクセスすれば、ローカルで動作確認したのと同じチャットアプリがクラウド上で利用できるようになります。
デプロイ後は、Gitにコードをプッシュするたびに自動でプレビュー環境が更新されたり、mainブランチへのマージで本番環境が更新されたりと、継続的デプロイが行われます。運用中のバグ修正や機能追加も、このワークフローに乗せてデプロイ可能です。
運用時の注意点
実際にサービスとして運用する際には、開発時には意識しなかったいくつかのポイントに注意する必要があります。
APIキーの管理: OpenAIのAPIキーは有料のAPI利用に紐づいています。不正流用を防ぐため、公開リポジトリに含めないのはもちろんのこと、フロントエンドに露出しないよう十分注意しましょう。今回はバックエンド経由で呼び出しているため鍵が直接ユーザーに見えることはありませんが、万一バックエンドのエンドポイントが外部から悪用されないようにする検討も必要です(必要なら簡易な認証を設ける、レート制限を設ける等)。
利用料金と制限: OpenAIのAPIは使用量に応じて課金されます。想定以上にユーザーが増えたり、長文のやり取りが行われたりすると料金が膨らむ可能性があります。月間の利用上限額をOpenAIの設定で指定したり、一定以上のトークン消費を避ける制限(1ユーザーあたりの回数制限など)を実装すると安心です。また、Hugging Face等他のサービスでもAPI利用料金やレートリミットが存在しますので留意しましょう。
エラーハンドリング: ネットワーク障害やAPI側のエラーで応答が返ってこない場合の処理も考慮します。Vercel AI SDKにはエラーハンドリングの仕組みも用意されています (Adapters: LangChain)が、ユーザーに「エラーが発生した」旨を伝えるUI(メッセージ表示)や、再試行の方法を提供することが望ましいです。例えば、useChatフックにはエラー状態や再送信関数があるのでそれらを使っても良いでしょう。
ストリーミングの安定性: ストリーミングは概ね快適ですが、長時間に及ぶ接続や不安定な通信環境では途切れる可能性もあります。Edge RuntimeのmaxDurationで設定した時間を超える応答は打ち切られることがありますし、モバイル回線などではSSEが途中で止まるケースも考えられます。必要に応じて部分的な応答でも有用な情報を含めるようにプロンプト工夫する、一定時間経過したら打ち切って要約させる等の対策も検討してください。
ログとモニタリング: 運用中のユーザーの利用状況やエラーを把握するため、ログ出力や分析基盤の導入も重要です。VercelはDashboard上で関数のログを確認できます。また、必要に応じて独自のトラッキング(どんな質問が多いか等)を入れておくとサービス改善に役立ちます。ただし、ユーザーの入力内容は個人情報を含む可能性があるため、ログに残す際は十分に匿名化・集計するなど配慮しましょう。
プロンプトやモデルの調整: 運用を続けていると、AIの応答の質や挙動について改善したい点が出てくるかもしれません。Vercel AI SDK経由であっても、基本的にはプロンプトエンジニアリング(システムメッセージを工夫するなど)やモデルのパラメータ調整(温度パラメータを変更する等)は可能です。たとえばstreamText呼び出し時にmessagesとは別にsettingsオブジェクトで温度(temperature)を指定することもできます (Getting Started: Next.js App Router)。これらのパラメータをチューニングしながら品質向上を図りましょう。
最後に、ドキュメントやコミュニティの活用も運用には欠かせません。Vercel AI SDKの公式ドキュメントにはより詳細な使い方やトラブルシューティングが掲載されていますし、GitHubリポジトリやDiscord/Discussionフォーラムで他の開発者の事例を見ることもできます。新機能のアップデートも精力的に行われているので、公式情報をウォッチしておくと良いでしょう。
以上、Vercel AI SDKに関する包括的な解説をご提供しました。まとめると、Vercel AI SDKは「高度なAI機能をシンプルなコードで実現し、優れたユーザー体験を提供できる」強力なツールです。開発のしやすさと実行性能(ストリーミングによる低レイテンシ表示)を兼ね備えているため、プロトタイピングから本格サービスまで幅広く活用できます。
ぜひ本ガイドの内容を参考に、実際に手を動かしてチャットボットやAIアプリケーションの開発に挑戦してみてください。最初はシンプルな例から始め、徐々に応用的な機能を組み込んでいけば、初心者の方でも無理なく理解を深められるはずです。Vercel AI SDKと創造力を駆使して、魅力的なAI搭載アプリを生み出していきましょう!
【参考資料】
Vercel AI SDK 公式ドキュメント (AI SDK by Vercel) (AI SDK by Vercel)
Vercel 公式ブログ: Introducing the Vercel AI SDK (Introducing the Vercel AI SDK: npm i ai - Vercel) (Introducing the Vercel AI SDK: npm i ai - Vercel)
Next.js + LangChain + Vercel AI SDK ガイド (Building an AI chatbot with Next.js, Langchain, and OpenAI) (Adapters: LangChain)
Vercel AI SDK公式チュートリアル(Next.js Quickstart) (Getting Started: Next.js App Router)