Redis
 Computer >> コンピューター >  >> プログラミング >> Redis

パフォーマンスの向上とコストの削減:Upstash Redis を使用して OpenAI API レスポンスをキャッシュする

OpenAI API を使用したことがある方は、API が非常に遅く、場合によっては応答すらしないことに気づいたかもしれません。特に GPT-4 モデルは応答遅延が長くなる傾向があります。また、回答が得られるたびに料金が発生します。これらはすべて、応答を直接提供することを避ける理由です。

応答を Upstash Redis に保存すると、これらの問題を回避できます。多くのクライアントに同じ応答を提供している場合は、かなりのコストを節約できます。また、グローバル展開により、ユーザーができるだけ早く情報を確実に入手できるようになります。

この記事では、OpenAI API 応答を Upstash Redis データベースにキャッシュする方法について説明します。

機能

訪問者に歴史ジョークのリストを表示するウェブ アプリを構築します。

<オル>
  • OpenAI API を毎日クエリして、現在の日付に関連する歴史ジョークを取得する
  • 将来の配信のためにジョークをキャッシュする
  • すべてのジョークを表示
  • テクノロジー

    アプリの構築には次のテクノロジーを使用します。

    • HTTP サーバーとしての Node.js
    • 歴史ジョークを生成する OpenAI API
    • QStash を Upstash して、HTTP サーバーから OpenAI API への新しいジョーク リクエストをトリガーします
    • 後で使用できるようにジョークを保存するために Redis をアップロードします

    前提条件

    • AI にアクセスするための API アクセス権を持つ OpenAI アカウント
    • リクエストを OpenAI API に送信し、AI レスポンスを Upstash Redis にキャッシュするための Upstash アカウント
    • OpenAI および Upstash API を呼び出すための Node.js インストール

    実装

    まず、ジョークを取得して Upstash Redis に保存し、訪問者に表示するための HTTP サーバーを作成しましょう。

    プロジェクトのセットアップ

    まず、新しい Node.js プロジェクトを作成し、依存関係をインストールします。

     $ mkdir history-jokes & cd history-jokes
     $ npm init -y
     $ npm i dotenv express axios @upstash/redis @upstash/qstash

    サーバーの実装

    サーバーを実装するには、index.js を作成します。 ファイルを開き、次のコードをそこにコピーします。

    require("dotenv").config();
     
    const axios = require("axios");
    const express = require("express");
    const { Redis } = require("@upstash/redis");
    const { Receiver } = require("@upstash/qstash");
     
    const redisClient = new Redis({
     url: process.env.UPSTASH_REDIS_URL,
     token: process.env.UPSTASH_REDIS_TOKEN,
    });
     
    const qstashReceiver = new Receiver({
     currentSigningKey: process.env.UPSTASH_QSTASH_CURRENT_SIGNING_KEY,
     nextSigningKey: process.env.UPSTASH_QSTASH_CURRENT_NEXT_KEY,
    });
     
    const openaiApiClient = axios.create({
     baseURL: "https://api.openai.com/v1",
     headers: {
     Authorization: "Bearer " + process.env.OPENAI_TOKEN,
     "Content-Type": "application/json",
     },
    });
     
    const server = express();
     
    server.use("/generate", async (request, response, next) => {
     // return next()
     let validRequest = false;
     try {
     validRequest = await qstashReceiver.verify({
     signature: request.headers["upstash-signature"],
     body: "",
     });
     } catch (e) {}
     if (!validRequest) return response.status(403).end("Forbidden");
     
     return next();
    });
     
    server.post("/generate", async (_request, response) => {
     const today = new Date();
     const month = today.toLocaleString("default", { month: "long" });
     let day = today.toLocaleString("default", { day: "numeric" });
     day = day == 1 ? "1st" : day == 2 ? "2nd" : day == "3" ? "3rd" : day + "th";
     
     const { data } = await openaiApiClient.post("/chat/completions", {
     model: "gpt-3.5-turbo",
     messages: [
     {
     role: "system",
     content: "You are a comedian that tells short history jokes.",
     },
     {
     role: "user",
     content: `Please tell me a joke for ${month} the ${day}.`,
     },
     ],
     });
     
     const joke = JSON.stringify({
     date: month + " the " + day,
     text: data.choices[0].message.content,
     });
     
     await redisClient.lpush("jokes", joke);
     
     response.end();
    });
     
    server.get("/", async (_request, response) => {
     let html = "<h1>History Jokes for Every Day</h1>";
     
     const jokes = await redisClient.lrange("jokes", 0, -1);
     
     html +=
     "<ul>" +
     jokes
     .map(({ date, text }) => `<li><b>${date}</b><br><pre>${text}</pre></li>`)
     .join("") +
     "</ul>";
     
     response.setHeader("Content-Type", "text/html");
     response.end(html);
    });
     
    server.listen(3000);

    このコードの重要な部分を見てみましょう。

    redisClient を使用します。 回答を Upstash Redis に保存し、表示のためにロードします。

    qstashReceiver Upstash QStash からの毎日の呼び出しを検証する責任があります。このようにして、QStash のみが /generate を呼び出すようにします。 エンドポイント。

    Axios を使用して OpenAI API のクライアントを作成するため、baseUrl を渡す必要はありません。 および Authentication API を呼び出すたびにヘッダーを作成します。

    次に、qstashReceiver を使用する Express ミドルウェアを作成します。 /generate へのすべてのリクエストを検証します。 エンドポイント。 QStash はエンドポイントをトリガーするためだけに使用し、値を渡さないため、body として空の文字列を使用できます。 .

    注:「// return next()」を含む行のコメントを解除すると、ミドルウェアはすべてのリクエストを許可します。 」。これを使用して /generate をテストできます。 localhost のエンドポイント .

    /generate エンドポイントは POST をリッスンします 実際のジョークをリクエストし、作成して保存します。現在の month を計算します。 と day そしてそれを使用して AI 用の 2 つのプロンプトを作成します。 1 つは AI にコメディアンのように振る舞うよう指示し、2 つ目は現在の月日についての歴史ジョークを言うように指示します。

    プロンプトを使用して OpenAI API を呼び出し、結果を LIST に保存します。 Upstash Redis 内。

    / エンドポイントは GET をリッスンします 保存されたジョークを要求して表示します。 LIST をロードします。 Upstash Redis から取得し、HTML リスト要素としてフォーマットしてクライアントに送信します。

    展開

    サーバーのセットアップが完了したので、クラウド リソースを作成し、それらにアクセスするための API 認証情報を入力する必要があります。

    認証情報ファイルの作成

    認証情報を保存するには、.env を作成します。 次の内容のファイル:

    OPENAI_TOKEN=""
    UPSTASH_REDIS_REST_URL=""
    UPSTASH_REDIS_REST_TOKEN=""
    UPSTASH_QSTASH_CURRENT_SIGNING_KEY=""
    UPSTASH_QSTASH_NEXT_SIGNING_KEY=""

    次のステップでは、これらの空の文字列をそれぞれ埋めていきます。

    OpenAI API トークンの作成

    既存の API のキーのみが必要なので、OpenAI API から始めましょう。何もデプロイする必要はありません。

    OpenAI Web コンソールに移動し、「新しい秘密キーの作成」ボタンをクリックします。キーに名前を付け、「秘密キーの作成」をクリックし、新しいキーをコピーして、OPENAI_TOKEN の値として .env ファイルに貼り付けます。 .

    QStash を使用した定期的なリクエストのデプロイ

    QStash にリクエストを /generate に送信するように指示するには 1 日 1 回エンドポイントにアクセスするには、「Request Builder」を使用します。これは Upstash コンソールにあります。図 1 は、構成の詳細を示しています。

    パフォーマンスの向上とコストの削減:Upstash Redis を使用して OpenAI API レスポンスをキャッシュする

    図 1:QStash リクエスト ビルダー

    <HOSTNAME> を置き換えます サーバーをホストするドメインと一致します。 QStash が動作するには、パブリックにアクセスできるホスト名が必要です。

    QStash が使用する歌唱キーは、Upstash コンソールの「リクエスト ビルダー」セクションにあります。灰色の「歌うキー」ドロップダウンをクリックし、各キーをコピーして、.env の適切な場所に貼り付けます。 ファイル。

    Upstash Redis データベースのデプロイ

    Upstash Redis データベースを作成するには、Upstash コンソールに移動し、「データベースの作成」ボタンをクリックします。

    これにより、データベース構成を入力するためのダイアログが表示されます。図 2 は、使用する必要がある値を示しています。

    パフォーマンスの向上とコストの削減:Upstash Redis を使用して OpenAI API レスポンスをキャッシュする

    図 2:Upstash Redis 構成

    作成が完了したら、「REST API」セクションまで下にスクロールすると、「UPSTASH_REDIS_REST_URL」と「UPSTASH_REDIS_REST_TOKEN」という 2 つのボタンがあります。これらの各ボタンをクリックして、対応する認証情報をコピーし、.env 内の正しい場所に貼り付けます。 ファイル。

    ウェブサイトのテスト

    ローカル マシンで Web サイトをテストするには、「// return next()」のコメントを解除して QStash 検証ミドルウェアを非アクティブ化します。 index.js の「」行 ファイル。

    次のコマンドを使用してサーバーを実行します。

     $ node .

    ブラウザで / ルートを開くと、ジョークは生成されていないため、「History Jokes for Every Day」のみが表示されます。

    POST を送信する必要があります /generate へのリクエスト ジョークを生成するためのエンドポイント。次のコマンドを使用してこれを行うことができます:

     $ curl -X POST http://localhost/generate

    ブラウザ ページを更新すると、図 3 のようなジョークが表示されるはずです。

    パフォーマンスの向上とコストの削減:Upstash Redis を使用して OpenAI API レスポンスをキャッシュする

    図 3:ジョーク Web サイト

    このジョークは現在 Upstash Redis にキャッシュされているため、誰かが Web サイトにアクセスしても OpenAI API リクエストは発生しません。これにより、応答時間が 1 秒未満になり、コストも大幅に節約できます。

    概要

    AI API は、私たちが知っているインターネットを変革する多用途のツールですが、現時点では遅くて高価です。これらの API を使用する場合、キャッシュは不可欠です。Upstash Redis は、数回クリックするだけでキャッシュをスタックに追加する最も簡単な方法です。


    1. サーバーレスデータベース間のレイテンシーの比較:DynamoDBとFaunaDBとUpstash

      この記事では、一般的なWebユースケースについて、3つのサーバーレスデータベースDynamoDB、FaunaDB、Upstash(Redis)のレイテンシーを比較します。 サンプルのニュースWebサイトを作成し、Webサイトへのリクエストごとにデータベース関連のレイテンシーを記録しています。ウェブサイトとソースコードを確認してください。 7001のNYTimesの記事を各データベースに挿入しました。記事はNewYorkTimes Archive API(2021年1月のすべての記事)から収集されます。私は各記事をランダムに採点しました。各ページリクエストで、Worldの下の上位10件の記事

    2. Redisを使用したJSONドキュメントのインデックス作成、クエリ、および全文検索

      RedisJSONとRediSearchは、クラウドで最も人気のあるRedisモジュールです。 (図1を参照)RedisJSONとRediSearch(Redisにバンドルされている)のDockerイメージは、毎日2000回以上プルされています。これが、RedisのテクノロジーエバンジェリストであるItamar Haberが、4年前に最初のバージョンを書いたときの先見の明があると考える理由です。 4月に、RedisConfで、JSON、インデックス作成、全文検索機能に関連するいくつかの発表を行いました。本日、これらの機能のプライベートプレビューを発表できることをうれしく思います。 このブログ