UpstashとVercel AI SDKで高度なAIアプリケーションを構築する方法
本記事では、Upstash Redis、Upstash Vector、そしてVercel AI SDKを活用して実現できるAIアプリケーションについて詳しく解説します。それぞれのツールが持つ独自の機能や特徴を掘り下げながら、これらを統合することで強力かつ効率的なAIソリューションをどのように構築できるのかを見ていきます。各ツールの機能を確認しつつ、具体的なアプリケーション例についても簡単に紹介します。
Upstash Vectorとは
まず、ベクトルとベクトルデータベースの基本から理解しましょう。
ベクトルデータベースは、数値配列形式(ベクトル)でデータを保存・検索するために特化したデータストレージシステムです。大量の高次元ベクトルを効率的に扱えるため、複雑なデータ構造の管理に最適です。ベクトルデータベースを使用する主なメリットは以下の通りです。
効率性:高次元ベクトルの保存と検索を効率的に行えるため、計算負荷を軽減し、AIアプリケーションのクエリ応答速度を向上させます。
精度:最適化された検索アルゴリズムにより、最も関連性の高いデータポイントを正確に見つけ出せます。レコメンドエンジンや不正検知システムなど、データ分類が必要なシステムのパフォーマンス向上に貢献します。
リアルタイム処理:データをリアルタイムで処理できるため、チャットボットやリアルタイム分析など、即時応答が求められるアプリケーションに理想的です。
AIにおけるベクトルは通常、アプリケーションの文脈において対象物の本質的な特徴を捉えた埋め込み(embedding)ベースのモデルを表現します。たとえば、自然言語処理ベースのAIアプリケーションでは、テキスト・音声・ドキュメントの意味論的な情報をベクトルが表します。画像処理ベースのアプリケーションでは、与えられた画像の特徴をベクトルが表現します。
それでは、Upstash Vectorの詳細を見ていきましょう。
Upstash Vectorは、DiskANNというベクトル類似性検索アルゴリズムを採用したサーバーレスのベクトルデータベースです。コサイン類似度、ユークリッド距離、ドット積の3種類の類似性関数をサポートしています。サーバーレスアーキテクチャを採用しているため、従量課金制の料金体系であり、試してみたいユーザー向けの無料プランも用意されています。
アルゴリズムや類似性関数の詳細については、Upstash公式ドキュメントをご確認ください。
低コストかつ高性能な検索機能に加えて、REST APIおよびTypeScript・Python向けSDKが提供されており、既存のコードベースへの統合も容易です。
Upstash Vectorとの連携には、まずコンソールへのログインが必要です。ログイン後、「Create Index」ボタンをクリックしてベクトルインデックスを作成できます。ポップアップモーダルでインデックス名を付け、インデックスを配置するリージョンを選択します。次に、Upstash Vectorインデックスへ書き込む前にオブジェクトから埋め込みを抽出するための埋め込みモデルを選択します。Upstashには事前定義されたオープンソースの埋め込みモデルがいくつか用意されています。外部の埋め込みモデルを使用したい場合は「Custom」を選択し、そのモデルに合わせてベクトルの次元数を設定することも可能です。
最後に、ベクトル間の距離を計算する類似性関数を選択します。Upstashでは前述の3種類(コサイン類似度、ユークリッド距離、ドット積)から選べます。詳細はUpstashドキュメントを参照してください。

次の画面では、自分に適したプランを選択します。
インデックスの作成が完了したら、コードベースへの統合を行います。本記事ではTypeScriptを使用しますが、PythonやGoのSDKも利用可能です。Upstash Vectorコンソールの「Details」タブにある統合ガイドに従って進めましょう。まず@upstash/vectorパッケージをインストールします。
npm i @upstash/vector
これで、以下のメソッドを使って接続・書き込み・クエリを簡単に実行できます。
import { Index } from "@upstash/vector"
const index = new Index({
url: <UPSTASH-VECTOR-ENDPOINT>,
token: <UPSTASH-VECTOR-TOKEN>,
})
await index.upsert({
id: "id1",
vector: […],
metadata: { metadata_field: "metadata_value" },
});
await index.query({
vector: […],
topK: 1,
includeVectors: true,
includeMetadata: true,
});
Vercel AI SDKとは
Vercel AI SDKは、WebアプリケーションへのAI機能の統合を効率化するために設計されたTypeScriptツールキットです。React、Next.js、Vue、Svelte、Node.jsなど様々なフレームワークをサポートしており、開発者が効率的にAI搭載アプリケーションを構築できるようになっています。Vercel AI SDKは、以下の3つの主要な概念で構成されています。
AI SDK Core
AI SDK CoreはVercel AI SDKの中核となるコンポーネントで、大規模言語モデル(LLM)を使ったテキスト生成、構造化オブジェクトの生成、ツール呼び出しを統一されたAPIで実現します。
最も一般的な使用例はgenerateTextまたはstreamText APIです。TypeScriptで実際に使ってみましょう。
まず、ターミナルで以下のコマンドを実行してVercel AI SDKをインストールします。
`npm i ai`
次に、generateText APIの使用例を見てみましょう。Vercel AI SDKはOpenAI、Anthropic、Google、Mistralなど主要なモデルプロバイダーとの統合を提供しています。ここではOpenAIを使用しますが、他のプロバイダーも同様にシンプルに統合できます。
import { generateText } from "ai"
import { openai } from "@ai-sdk/openai"
const { text } = await generateText({
model: openai("gpt-4-turbo"),
prompt: "What is love?"
})
AI SDK UI
AI SDK UIはフレームワークに依存しないツールキットで、インタラクティブなチャット・補完・アシスタントアプリケーションの構築を支援します。チャットインターフェースの作成、生成AIコンポーネント、状態管理などの追加機能も備えています。
代表的な使用例はuseChatとuseCompletionフックです。useChatは、メッセージ・ローディング状態・エラーといった入出力の状態管理を抽象化し、チャットメッセージのストリーミングを提供します。useCompletionは、AIアプリケーション内でのテキスト補完を管理し、入力状態をハンドリングしながら、プロバイダーから新しい補完結果が届くと自動的にUIを更新します。
ここでは、AI SDK UIの例としてuseChatの使い方を簡単に見てみましょう。
const { messages, input, handleInputChange, handleSubmit} =
useChat({
api: "api/chat",
initialMessages: […],
onResponse(response) {},
streamMode: "text",
});
ご覧のとおり、メッセージ送信時に呼び出すAPIエンドポイントやレスポンス受信時のコールバック関数を受け取り、状態管理は自動的に行われます。
AI SDK RSC
この部分はサーバーサイドレンダリング向けの機能です。AI SDK RSCの目的は、React Server Components(RSC)を通じて、LLMが生成したUIをサーバーからクライアントへ直接ストリーミングできるようにすることです。
AI SDK RSCには、サーバーサイドレンダリングされたUIのストリーミング出力をサポートする複数の関数があります。詳細についてはVercel AI SDK RSCのドキュメントをご覧ください。本記事では、その仕組みを理解するために1つの関数だけ取り上げます。ここではstreamUI関数の使い方を見てみましょう。
const result = await streamUI({
model: openai('gpt-4o'),
prompt: 'Get the weather for San Francisco',
text: ({ content }) => <div>{content}</div>,
tools: {},
});
ご覧のとおり、streamUIもAI SDK Coreの関数と同様に動作します。主な違いは、レンダリング済みのUIをサーバーからストリーミングする点です。
要するに、Vercel AI SDKはバックエンドからフロントエンドまで、ソフトウェア開発のあらゆる部分でAIアプリケーション構築を支援してくれるのです。
Upstash Redisの活用
AIアプリケーションにおいて、Upstash Redisは主にAPIやLLMモデルの使用を保護するレート制限、キャッシュ用途、あるいはAIチャットボットアプリケーションでのメッセージ履歴の保存などに活用できます。
まず、UpstashコンソールでRedisデータベースを作成しましょう。

Redisデータベースを作成したら、コードベースに統合してデータの書き込みやクエリを行えます。扱うデータは、キャッシュデータ、メッセージ履歴、会話状態など様々です。そのために、まずUpstash Redis SDKをインストールします。
npm i @upstash/redis
次に、コードからRedisデータベースに接続します。
import { Redis } from '@upstash/redis'
const redis = new Redis({
url: <UPSTASH-REDIS-ENDPOINT>,
token: <UPSTASH-REDIS-TOKEN>,
})
const data = await redis.set('foo', 'bar');
レート制限にRedisを使用したい場合は、Upstashが提供するレート制限専用SDKも利用できます。インストールする依存パッケージが異なる点に注意してください。
npm install @upstash/ratelimit
レート制限の実装例は以下の通りです。
import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis";
// 10秒間に10リクエストまで許可するレートリミッターを作成
const ratelimit = new Ratelimit({
redis: Redis.fromEnv(),
limiter: Ratelimit.slidingWindow(10, "10 s"),
analytics: true,
/**
* Redisで使用されるキーのオプションのプレフィックス。
* 他のアプリケーションとRedisインスタンスを共有する際に
* キーの衝突を避けたい場合に便利です。
*/
prefix: "prefix",
});
// 定数文字列ですべてのリクエストを単一のレート制限にかけることも、
// ユーザーID、APIキー、IPアドレスで個別の制限をかけることも可能。
const identifier = "identifier";
const { success } = await ratelimit.limit(identifier);
if (!success) {
return "Unable to process at this time";
}
// 以降の処理
Upstash Redis・VectorとVercel AI SDKの組み合わせ
さて、ここまで説明してきたツールで何ができるのでしょうか?可能性は無限大です。
RAGチャットボットは、Vercel AI SDKとUpstash Vectorデータベースで構築できる最も一般的な生成AIアプリケーションです。Retrieval-Augmented Generation(RAG、検索拡張生成)は、チャットボットやその他の対話型AIシステムの能力を大幅に強化する先進的なフレームワークです。「検索」と「生成」という2つの重要な要素を融合させることで、より正確で、文脈に即した、情報豊富な応答を実現します。RAGチャットボットはベクトルデータベースをレトリーバー(検索器)として使用し、会話履歴を埋め込み形式で保存します。LLMモデルが次の応答を生成する際に、この履歴を参照できるのです。これにより、LLMモデルは会話の文脈に関連した応答を生成し、過去のやり取りから学習することができます。
この種のチャットボットアプリケーションにとって、Upstash Vectorはレトリーバーとして最適なベクトルデータベースです。Upstash Vectorとの統合に加えて、バックエンド側ではVercel AI SDK CoreのstreamTextやstreamObject APIを活用し、OpenAI、Anthropic、MistralなどのLLMモデルからの応答を生成・ストリーミングできます。フロントエンド側では、チャットUIと状態管理を強力にハンドリングするVercel AI SDK UIのuseChatフックを活用しましょう。RAGアプリケーションの具体例は、DegreeGuruのブログ記事でご覧いただけます。
Vercel AI SDKで簡単に構築できるもうひとつの代表的なAIアプリケーションが、レコメンドシステムです。レコメンドシステムはEコマースプラットフォームにとって最も重要な機能のひとつであり、ユーザーの個人的な嗜好や行動履歴をもとに興味関心を特定し、有用なおすすめを提示します。レコメンドシステムを構築する際、Vercel AI SDK Coreのembed関数を使えば、ユーザーデータの埋め込みを簡単に抽出できます。以下のサンプルコードを見てみましょう。
import { embed } from 'ai';
import { openai } from '@ai-sdk/openai';
// 'embedding'は単一の埋め込みオブジェクト(number[])
const { embedding } = await embed({
model: openai.embedding('text-embedding-3-small'),
value: 'sunny day at the beach',
});
埋め込み(数値配列形式のセマンティックデータ)を抽出したら、その出力をUpstash Vectorに保存できます。これらの埋め込みはユーザーの習慣に応じて照会・分類され、今後のレコメンドに活用されます。
Vercel AI SDK Coreの入力から埋め込みを抽出するembed関数は、セマンティック検索、画像検索、コンテンツ要約など、あらゆる種類の機械学習アプリケーションで使用できます。開発者はこの関数で抽出したベクトル埋め込みをUpstash Vectorデータベースに挿入すれば、AIアルゴリズムにとって無意味な生データを保存することなく、埋め込みに基づいて入力を分析できます。
最後のアプリケーション例は、カスタマーレビューのAI要約です。この例では、製品に対する顧客レビューというテキストから埋め込みを抽出し、ベクトルデータベースに保存します。その後、アナリストはVercel AI SDK Coreを使ってLLMモデルにプロンプトを送り、ベクトルからデータの要約を取得できます。
本記事で紹介する最後の例は、不正・異常検知システムです。非常に基本的な形の異常検知では、トランザクションやユーザー行動を分類し、通常とは異なる動きがないかを検知する必要があります。この目的のため、Upstash Vectorデータベースを使ってベクトルを作成し、n次元空間上に配置できます。ユーザーのインタラクションがベクトルとしてUpstash Vectorに保存され空間上に配置されると、分析ツールは新しく入ってくるインタラクションと空間内の既存インタラクションとの類似度を取得できます。この類似度スコアによって、そのインタラクションが正常かどうかを判断できるのです。
以上で紹介したすべてのアプリケーション例において、テキスト生成やAIモデルを呼び出しての埋め込み抽出など、負荷の高い操作にはUpstashのレート制限機能を活用できます。レート制限のおかげで、トラフィックの急増からシステムを保護できます。さらに、Upstash Redisは、メッセージ履歴やLLMモデルで使用するプロンプトのキャッシュなど、アプリケーションの生のユーザーデータを保存する場所としても最適です。
まとめ
本記事では、Upstash Redis、Upstash Vector、Vercel AI SDKの組み合わせが、高度なAIアプリケーション構築にとって価値のあるソリューションであることを確認しました。これらのツールは連携して、データ管理、情報処理、AIモデルのデプロイを効率的に実現します。紹介した例からも、この技術スタックが多様なAIソリューション創出に対応できる柔軟性を持っていることがわかります。
さらなる事例については、UpstashブログやVercelテンプレートをご覧ください。
-
AWS LambdaとサーバーレスRedisで構築するReact Nativeアプリ:リーダーボード機能の実装ガイド
この記事では、React Native、Serverless Framework、Upstashを組み合わせて、リーダーボード(ランキング)の閲覧・更新ができるモバイルアプリケーションを開発する方法を解説します。 モバイルアプリの開発にはReact Nativeを使用し、バックエンドはServerless Frameworkで構築します。バックエンドは、AWS Lambda上で動作するPython関数で構成されています。 1. Upstash Redisを活用する 一般的なリーダーボードアプリでは、ユーザー情報と各ユーザーのスコアを保存する必要があります。これらのデータはスコア順にソートされる
-
Redisでキーに文字列値を設定する方法を徹底解説 – SET / SETNX / SETEX / PSETEX コマンドの使い方
このチュートリアルでは、Redisのデータストア上で指定したキーに文字列値を設定する方法について、SET、SETNX、SETEX、PSETEX の4つのコマンドを使って詳しく解説します。それぞれのコマンドの動作の違いや使い分けのポイントもあわせて紹介するので、Redisの文字列操作をマスターしたい方はぜひ参考にしてください。 SETコマンドとは SETコマンドは、指定したキーに文字列値を設定するための最も基本的なコマンドです。キーがすでに存在する場合は、その型に関係なく値が上書きされます。また、キーに設定されていた以前の有効期限(TTL)も削除される点に注意が必要です。 SETコマンドのオプシ