Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Amazon Bedrock のプロンプトキャッシュはコスト/レイテンシーにどのような効果があるか?

はじめに

こんにちは、丸山です。

LLMやナレッジベースの利用ができるサービス「Amazon Bedrock」の新機能として、2025/04/07に「プロンプトキャッシュ」が一般公開されました。
aws.amazon.com
aws.amazon.com


この機能により、LLM利用時のコスト削減とレイテンシー改善ができます。
今回は、プロンプトキャッシュを使用することで実際どの程度コスト削減やレイテンシー改善ができるのか試してみました。

プロンプトキャッシュのメリット

主なメリットとして、以下が見込めます。

  • レイテンシーの改善。最大85%短縮できる。
  • コスト削減。最大90%削減できる。

プロンプトキャッシュの仕組み

ざっと知りたい人向けの説明

プロンプトキャッシュは、主に以下の流れで機能します。
1. クライアントからモデルにプロンプトが送られる
2. 送信されたプロンプトがハッシュ化され、キャッシュシステム内で検索される
3. 一致する履歴があれば、保存された応答を返却
4. 一致する履歴がなければ、通常通りモデル推論を実行し、結果をキャッシュに保存
この仕組みにより、特定のプロンプトに対する処理を省略できるようになっています。

詳しく知りたい人向けの説明

プロンプトキャッシュは、主に以下のような効果があります(詳細は公式ドキュメントを参照してください)。
docs.aws.amazon.com

1. 入力トークンの処理を軽減できる
 キャッシュがヒットした場合、入力トークンの課金が割引対象になります。
 - 割引率は最大で90%(モデルによって異なる)
 - 例えばus-west-2でAmazon Nova Liteをオンデマンド利用した時、
  100万入力トークンあたりの料金は、0.24(プロンプトキャッシュ非利用時)から0.015USD(利用時)に減少します。
  つまり、もともとの利用料金の6%ほどの金額で利用できるとのことでした。(詳細は公式ドキュメントを参照してください)。
aws.amazon.com

2. 先頭から数えて「キャッシュチェックポイント」単位でキャッシュが作られる
 - 例えば、1024トークンごとにキャッシュポイントが設定したとき、1024, 2048, 3072, ...トークンとの位置でキャッシュが作られます。
 - モデルごとにキャッシュポイントの取りうる値は変わります。(詳細は公式ドキュメントを参照してください)。

docs.aws.amazon.com

3. キャッシュの有効期間は5分間
 - キャッシュがヒットせずに5分が経過すると、該当プレフィックスのキャッシュは失効します。

また、使用できるモデルやリージョンについては以下とのこと。
どのリージョンでも利用可能であることはうれしいですね。

モデル名 モデルID リリースタイプ キャッシュチェックポイントあたりの最小トークン数 リクエストあたりのキャッシュチェックポイントの最大数 プロンプトキャッシュチェックポイントを受け入れるフィールド
Claude Opus 4 anthropic.claude-opus-4-20250514-v1:0 一般公開 1,024 4 `system`、`messages`、`tools`
Claude Sonnet 4 anthropic.claude-sonnet-4-20250514-v1:0 一般公開 1,024 4 `system`、`messages`、`tools`
Claude 3.7 Sonnet anthropic.claude-3-7-sonnet-20250219-v1:0 一般公開 1,024 4 `system`、`messages`、`tools`
Claude 3.5 Haiku anthropic.claude-3-5-haiku-20241022-v1:0 一般公開 2,048 4 `system`、`messages`、`tools`
Claude 3.5 Sonnet v2 anthropic.claude-3-5-sonnet-20241022-v2:0 プレビュー 1,024 4 `system`、`messages`、`tools`
Amazon Nova Micro v1 amazon.nova-micro-v1:0 一般公開 1K 1 `system` と `messages`
Amazon Nova Lite v1 amazon.nova-lite-v1:0 一般公開 1K 1 `system` と `messages`
Amazon Nova Pro v1 amazon.nova-pro-v1:0 一般公開 1K 1 `system` と `messages`

プロンプトキャッシュは画像やシステムプロンプト、ツールなど多くのところで使えるのも魅力の一つですね。

どのようなときに使うとよいか

プロンプトキャッシュは、「同一のプロンプトの先頭部分(プレフィックス)」を繰り返し使うユースケースで効果を発揮します。
特に、長めのシステムプロンプト(コンテキスト情報)を繰り返し利用するアプリケーションでは、効果的なコスト削減と応答速度の向上が
期待できます。
例えば、社内のドキュメント問い合わせシステムなどに有効です。
ユースケース例

プロンプトキャッシュを使用してみる

前提

ある文書について問合せをするシステムを考えます。
今回は、著作権切れの「夏目漱石」の「吾輩は猫である」について問合せをするシステムを構築します。
※Nova Liteを利用するため、キャッシュプロンプトが有効となる最低入力トークン数を満たすことに注意。
docs.aws.amazon.com

以下の環境変数を設定しておきます。

  • AWS_PROFILE: [AWSプロファイル名]
  • AWS_DEFAULT_REGION: us-west-2
  • AWS_REGION: us-west-2

処理内容

import boto3
from botocore.exceptions import ClientError


class BedrockChat:
    """
    Amazon Bedrock の Converse API を使用してチャットを行うクラス。
    """

    def __init__(self, model_id: str, enable_prompt_cache: bool = False):
        """
        クラスの初期化。

        Args:
            model_id (str): 使用するモデルの ID(例: 'anthropic.claude-3-sonnet-20240229-v1:0')。
            enable_prompt_cache (bool): プロンプトキャッシュを有効にするかどうか。デフォルトは False。
        """
        self.model_id = model_id
        self.enable_prompt_cache = enable_prompt_cache
        self.client = boto3.client("bedrock-runtime", region_name="us-west-2")
        self.messages = self._initialize_messages()

    def _initialize_messages(self) -> list:
        """
        初期のチャット履歴を作成します。

        Returns:
            list: 初期化されたメッセージのリスト。
        """
        messages = []

        # ユーザーの初期メッセージ
        user_content = [{
            "text": "おすすめの文学作品を教えて。そしてその作品について、これから質問していきます。短く一文で回答してください。「。」を複数含む回答はしないでください。"
            }]
        if self.enable_prompt_cache:
            user_content.append({"cachePoint": {"type": "default"}})
        messages.append({
            "role": "user",
            "content": user_content
        })

        # AIの初期応答
        ai_text = (
            "夏目漱石の「吾輩は猫である」がおすすめです。冒頭を紹介します。\n"
            """
 吾輩わがはいは猫である。名前はまだ無い。
 どこで生れたかとんと見当けんとうがつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪どうあくな種族であったそうだ。この書生というのは時々我々を捕つかまえて煮にて食うという話である。しかしその当時は何という考もなかったから別段恐しいとも思わなかった。ただ彼の掌てのひらに載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始みはじめであろう。この時妙なものだと思った感じが今でも残っている。第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶やかんだ。その後ご猫にもだいぶ逢あったがこんな片輪かたわには一度も出会でくわした事がない。のみならず顔の真中があまりに突起している。そうしてその穴の中から時々ぷうぷうと煙けむりを吹く。どうも咽むせぽくて実に弱った。これが人間の飲む煙草たばこというものである事はようやくこの頃知った。
 この書生の掌の裏うちでしばらくはよい心持に坐っておったが、しばらくすると非常な速力で運転し始めた。書生が動くのか自分だけが動くのか分らないが無暗むやみに眼が廻る。胸が悪くなる。到底とうてい助からないと思っていると、どさりと音がして眼から火が出た。それまでは記憶しているがあとは何の事やらいくら考え出そうとしても分らない。
 ふと気が付いて見ると書生はいない。たくさんおった兄弟が一疋ぴきも見えぬ。肝心かんじんの母親さえ姿を隠してしまった。その上今いままでの所とは違って無暗むやみに明るい。眼を明いていられぬくらいだ。はてな何でも容子ようすがおかしいと、のそのそ這はい出して見ると非常に痛い。吾輩は藁わらの上から急に笹原の中へ棄てられたのである。
 ようやくの思いで笹原を這い出すと向うに大きな池がある。吾輩は池の前に坐ってどうしたらよかろうと考えて見た。別にこれという分別ふんべつも出ない。しばらくして泣いたら書生がまた迎に来てくれるかと考え付いた。ニャー、ニャーと試みにやって見たが誰も来ない。そのうち池の上をさらさらと風が渡って日が暮れかかる。腹が非常に減って来た。泣きたくても声が出ない。仕方がない、何でもよいから食物くいもののある所まであるこうと決心をしてそろりそろりと池を左ひだりに廻り始めた。どうも非常に苦しい。そこを我慢して無理やりに這はって行くとようやくの事で何となく人間臭い所へ出た。ここへ這入はいったら、どうにかなると思って竹垣の崩くずれた穴から、とある邸内にもぐり込んだ。縁は不思議なもので、もしこの竹垣が破れていなかったなら、吾輩はついに路傍ろぼうに餓死がししたかも知れんのである。一樹の蔭とはよく云いったものだ。この垣根の穴は今日こんにちに至るまで吾輩が隣家となりの三毛を訪問する時の通路になっている。さて邸やしきへは忍び込んだもののこれから先どうして善いいか分らない。そのうちに暗くなる、腹は減る、寒さは寒し、雨が降って来るという始末でもう一刻の猶予ゆうよが出来なくなった。仕方がないからとにかく明るくて暖かそうな方へ方へとあるいて行く。今から考えるとその時はすでに家の内に這入っておったのだ。ここで吾輩は彼かの書生以外の人間を再び見るべき機会に遭遇そうぐうしたのである。第一に逢ったのがおさんである。これは前の書生より一層乱暴な方で吾輩を見るや否やいきなり頸筋くびすじをつかんで表へ抛ほうり出した。いやこれは駄目だと思ったから眼をねぶって運を天に任せていた。しかしひもじいのと寒いのにはどうしても我慢が出来ん。吾輩は再びおさんの隙すきを見て台所へ這はい上あがった。すると間もなくまた投げ出された。吾輩は投げ出されては這い上り、這い上っては投げ出され、何でも同じ事を四五遍繰り返したのを記憶している。その時におさんと云う者はつくづくいやになった。この間おさんの三馬さんまを偸ぬすんでこの返報をしてやってから、
 吾輩が最後につまみ出されようとしたときに、この家うちの主人が騒々しい何だといいながら出て来た。下女は吾輩をぶら下げて主人の方へ向けてこの宿やどなしの小猫がいくら出しても出しても御台所おだいどころへ上あがって来て困りますという。主人は鼻の下の黒い毛を撚ひねりながら吾輩の顔をしばらく眺ながめておったが、やがてそんなら内へ置いてやれといったまま奥へ這入はいってしまった。主人はあまり口を聞かぬ人と見えた。下女は口惜くやしそうに吾輩を台所へ抛ほうり出した。かくして吾輩はついにこの家うちを自分の住家すみかと極きめる事にしたのである。
 吾輩の主人は滅多めったに吾輩と顔を合せる事がない。職業は教師だそうだ。学校から帰ると終日書斎に這入ったぎりほとんど出て来る事がない。家のものは大変な勉強家だと思っている。当人も勉強家であるかのごとく見せている。しかし実際はうちのものがいうような勤勉家ではない。吾輩は時々忍び足に彼の書斎を覗のぞいて見るが、彼はよく昼寝ひるねをしている事がある。時々読みかけてある本の上に涎よだれをたらしている。彼は胃弱で皮膚の色が淡黄色たんこうしょくを帯びて弾力のない不活溌ふかっぱつな徴候をあらわしている。その癖に大飯を食う。大飯を食った後あとでタカジヤスターゼを飲む。飲んだ後で書物をひろげる。二三ページ読むと眠くなる。涎を本の上へ垂らす。これが彼の毎夜繰り返す日課である。吾輩は猫ながら時々考える事がある。教師というものは実に楽らくなものだ。人間と生れたら教師となるに限る。こんなに寝ていて勤まるものなら猫にでも出来ぬ事はないと。それでも主人に云わせると教師ほどつらいものはないそうで彼は友達が来る度たびに何とかかんとか不平を鳴らしている。
 吾輩がこの家へ住み込んだ当時は、主人以外のものにははなはだ不人望であった。どこへ行っても跳はね付けられて相手にしてくれ手がなかった。いかに珍重されなかったかは、今日こんにちに至るまで名前さえつけてくれないのでも分る。吾輩は仕方がないから、出来得る限り吾輩を入れてくれた主人の傍そばにいる事をつとめた。朝主人が新聞を読むときは必ず彼の膝ひざの上に乗る。彼が昼寝をするときは必ずその背中せなかに乗る。これはあながち主人が好きという訳ではないが別に構い手がなかったからやむを得んのである。その後いろいろ経験の上、朝は飯櫃めしびつの上、夜は炬燵こたつの上、天気のよい昼は椽側えんがわへ寝る事とした。しかし一番心持の好いのは夜よに入いってここのうちの小供の寝床へもぐり込んでいっしょにねる事である。この小供というのは五つと三つで夜になると二人が一つ床へ入はいって一間ひとまへ寝る。吾輩はいつでも彼等の中間に己おのれを容いるべき余地を見出みいだしてどうにか、こうにか割り込むのであるが、運悪く小供の一人が眼を醒さますが最後大変な事になる。小供は――ことに小さい方が質たちがわるい――猫が来た猫が来たといって夜中でも何でも大きな声で泣き出すのである。すると例の神経胃弱性の主人は必かならず眼をさまして次の部屋から飛び出してくる。現にせんだってなどは物指ものさしで尻ぺたをひどく叩たたかれた。
 吾輩は人間と同居して彼等を観察すればするほど、彼等は我儘わがままなものだと断言せざるを得ないようになった。ことに吾輩が時々同衾どうきんする小供のごときに至っては言語同断ごんごどうだんである。自分の勝手な時は人を逆さにしたり、頭へ袋をかぶせたり、抛ほうり出したり、へっついの中へ押し込んだりする。しかも吾輩の方で少しでも手出しをしようものなら家内かない総がかりで追い廻して迫害を加える。この間もちょっと畳で爪を磨といだら細君が非常に怒おこってそれから容易に座敷へ入いれない。台所の板の間で他ひとが顫ふるえていても一向いっこう平気なものである。吾輩の尊敬する筋向すじむこうの白君などは逢あう度毎たびごとに人間ほど不人情なものはないと言っておらるる。白君は先日玉のような子猫を四疋産うまれたのである。ところがそこの家うちの書生が三日目にそいつを裏の池へ持って行って四疋ながら棄てて来たそうだ。白君は涙を流してその一部始終を話した上、どうしても我等猫族ねこぞくが親子の愛を完まったくして美しい家族的生活をするには人間と戦ってこれを剿滅そうめつせねばならぬといわれた。一々もっともの議論と思う。また隣りの三毛みけ君などは人間が所有権という事を解していないといって大おおいに憤慨している。元来我々同族間では目刺めざしの頭でも鰡ぼらの臍へそでも一番先に見付けたものがこれを食う権利があるものとなっている。もし相手がこの規約を守らなければ腕力に訴えて善よいくらいのものだ。しかるに彼等人間は毫ごうもこの観念がないと見えて我等が見付けた御馳走は必ず彼等のために掠奪りゃくだつせらるるのである。彼等はその強力を頼んで正当に吾人が食い得べきものを奪うばってすましている。白君は軍人の家におり三毛君は代言の主人を持っている。吾輩は教師の家に住んでいるだけ、こんな事に関すると両君よりもむしろ楽天である。ただその日その日がどうにかこうにか送られればよい。いくら人間だって、そういつまでも栄える事もあるまい。まあ気を永く猫の時節を待つがよかろう。
 我儘わがままで思い出したからちょっと吾輩の家の主人がこの我儘で失敗した話をしよう。元来この主人は何といって人に勝すぐれて出来る事もないが、何にでもよく手を出したがる。俳句をやってほととぎすへ投書をしたり、新体詩を明星へ出したり、間違いだらけの英文をかいたり、時によると弓に凝こったり、謡うたいを習ったり、またあるときはヴァイオリンなどをブーブー鳴らしたりするが、気の毒な事には、どれもこれも物になっておらん。その癖やり出すと胃弱の癖にいやに熱心だ。後架こうかの中で謡をうたって、近所で後架先生こうかせんせいと渾名あだなをつけられているにも関せず一向いっこう平気なもので、やはりこれは平たいらの宗盛むねもりにて候そうろうを繰返している。みんながそら宗盛だと吹き出すくらいである。この主人がどういう考になったものか吾輩の住み込んでから一月ばかり後のちのある月の月給日に、大きな包みを提さげてあわただしく帰って来た。何を買って来たのかと思うと水彩絵具と毛筆とワットマンという紙で今日から謡や俳句をやめて絵をかく決心と見えた。果して翌日から当分の間というものは毎日毎日書斎で昼寝もしないで絵ばかりかいている。しかしそのかき上げたものを見ると何をかいたものやら誰にも鑑定がつかない。当人もあまり甘うまくないと思ったものか、ある日その友人で美学とかをやっている人が来た時に下しものような話をしているのを聞いた。
「どうも甘うまくかけないものだね。人のを見ると何でもないようだが自みずから筆をとって見ると今更いまさらのようにむずかしく感ずる」これは主人の述懐じゅっかいである。なるほど詐いつわりのない処だ。彼の友は金縁の眼鏡越めがねごしに主人の顔を見ながら、「そう初めから上手にはかけないさ、第一室内の想像ばかりで画えがかける訳のものではない。昔むかし以太利イタリーの大家アンドレア・デル・サルトが言った事がある。画をかくなら何でも自然その物を写せ。天に星辰せいしんあり。地に露華ろかあり。飛ぶに禽とりあり。走るに獣けものあり。池に金魚あり。枯木こぼくに寒鴉かんああり。自然はこれ一幅の大活画だいかつがなりと。どうだ君も画らしい画をかこうと思うならちと写生をしたら」
「へえアンドレア・デル・サルトがそんな事をいった事があるかい。ちっとも知らなかった。なるほどこりゃもっともだ。実にその通りだ」と主人は無暗むやみに感心している。金縁の裏には嘲あざけるような笑わらいが見えた。
            """
        )
        ai_content = [{"text": ai_text}]
        if self.enable_prompt_cache:
            ai_content.append({"cachePoint": {"type": "default"}})
        messages.append({
            "role": "assistant",
            "content": ai_content
        })

        return messages

    def converse(self, user_input: str) -> dict:
        """
        ユーザーの入力をモデルに送信し、応答を取得する。

        Args:
            user_input (str): ユーザーからの入力メッセージ。

        Returns:
            dict: モデルからの応答。
        """
        # ユーザーのメッセージを構築
        content = [{"text": user_input}]

        # 送信するメッセージのリストを作成
        send_messages = list(self.messages)
        send_messages.append({
            "role": "user",
            "content": content
        })

        try:
            # Converse API の呼び出し
            response = self.client.converse(
                modelId=self.model_id,
                messages=send_messages
            )

            return response

        except ClientError as e:
            print(f"クライアントエラーが発生しました: {e}")
            return ""
        except Exception as e:
            print(f"予期しないエラーが発生しました: {e}")
            return ""

    def chat_loop(self):
        """
        コンソールからユーザーの入力を受け取り、チャットを継続するループ。
        """
        print("チャットを開始します。終了するには 'exit' と入力してください。")
        while True:
            user_input = input("あなた: ")
            if user_input.lower() == "exit":
                print("チャットを終了します。")
                break
            response = self.converse(user_input)

            # 応答メッセージの取得
            output_message = response.get("output", {}).get("message", {})

            # テキストの抽出と結合
            content_blocks = output_message.get("content", [])
            response_text = "\n".join(
                block.get("text", "") for block in content_blocks if "text" in block
            )
            print(f"モデル: {response_text}")
            print(f"トークン情報: {response.get('usage')}")
            print(f"レイテンシー: {response.get('metrics', {}).get('latencyMs')}")

            print("--------------------------------------------------")


def main():
    model_id = "us.amazon.nova-lite-v1:0"
    enable_cache = False  # プロンプトキャッシュを有効にする場合は True、無効にする場合は False

    chat = BedrockChat(model_id, enable_cache)
    chat.chat_loop()


if __name__ == "__main__":
    main()

プロンプトキャッシュのあり/なしでの比較

質問する内容は以下として、比較をしていきます。

  1. 吾輩 とはだれのことですか?
  2. 吾輩が唯一記憶していたことは何ですか?
  3. 書生とはどのような存在として描かれていますか?
  4. 吾輩が「名前がない」と語っているのはなぜですか?
  5. 吾輩はなぜ「教師は楽な職業だ」と感じたのですか?

プロンプトキャッシュなし

enable_cacheFalse にして実行してみます。

チャットを開始します。終了するには 'exit' と入力してください。
あなた: 吾輩 とはだれのことですか?
モデル: 吾輩は猫のことです。
トークン情報: {'inputTokens': 3680, 'outputTokens': 8, 'totalTokens': 3688}
レイテンシー: 483
--------------------------------------------------
あなた: 吾輩が唯一記憶していたことは何ですか?
モデル: 吾輩が唯一記憶していたことは、薄暗いじめじめした所でニャーニャー泣いていたことです。
トークン情報: {'inputTokens': 3683, 'outputTokens': 31, 'totalTokens': 3714}
レイテンシー: 883
--------------------------------------------------
あなた: 書生とはどのような存在として描かれていますか?
モデル: 書生は、怠惰で、乱暴で、無学な存在として描かれています。彼は、猫を投げ出したり、猫を追い出したりするなど、猫に対して非常に乱暴な態度をとります。また、彼は、勉強をしている ように見せかけながら、実際には昼寝をしたり、涎を垂らしたりするなど、怠惰な性格を示しています。さらに、彼は、教師という職業に就いていますが、その能力は低く、友人たちからも不平を言 われています。これらの描写から、書生は、怠惰で、乱暴で、無学な存在として、猫と対比される形で描かれています。
トークン情報: {'inputTokens': 3683, 'outputTokens': 172, 'totalTokens': 3855}
レイテンシー: 1705
--------------------------------------------------
あなた: 吾輩が「名前がない」と語っているのはなぜですか?
モデル: 吾輩は、名前が決まっていないことを表現しています。名前は、人間が生まれたときに与えられることが多いです。しかし、吾輩は、生まれたときには、まだ名前が決まっていなかったので す。このことは、吾輩が人間に飼われている猫であることを示しています。また、名前が決まっていないことは、吾輩が人間にとっては、単なるペットとして扱われていることを示しています。     
トークン情報: {'inputTokens': 3686, 'outputTokens': 91, 'totalTokens': 3777}
レイテンシー: 1260
--------------------------------------------------
あなた: 吾輩はなぜ「教師は楽な職業だ」と感じたのですか?
モデル: 教師は寝ていて勤まると感じたからです。
トークン情報: {'inputTokens': 3691, 'outputTokens': 15, 'totalTokens': 3706}
レイテンシー: 1174
--------------------------------------------------
あなた: exit
チャットを終了します。

プロンプトキャッシュあり

enable_cacheTrue にして実行してみます。

チャットを開始します。終了するには 'exit' と入力してください。
あなた: 吾輩 とはだれのことですか?
モデル: 吾輩は猫のことです。
トークン情報: {'inputTokens': 32, 'outputTokens': 8, 'totalTokens': 3688, 'cacheReadInputTokens': 0, 'cacheWriteInputTokens': 3648}
レイテンシー: 610
--------------------------------------------------
あなた: 吾輩が唯一記憶していたことは何ですか?
モデル: 吾輩が唯一記憶していたことは、薄暗いじめじめした所でニャーニャー泣いていたことです。
トークン情報: {'inputTokens': 16, 'outputTokens': 31, 'totalTokens': 3714, 'cacheReadInputTokens': 3667, 'cacheWriteInputTokens': 0}
レイテンシー: 730
--------------------------------------------------
あなた: 書生とはどのような存在として描かれていますか?
モデル: 書生は、怠惰で無能な人物として描かれています。彼は勉強をせず、昼寝ばかりしている。また、彼は猫を虐待し、池に捨てようとするなど、残酷な性格も描かれています。彼は、教師とい う立場にもかかわらず、勉強をせず、怠惰な生活を送っている。彼の行動は、教師という職業のイメージを損なうものとなっています。
トークン情報: {'inputTokens': 16, 'outputTokens': 115, 'totalTokens': 3798, 'cacheReadInputTokens': 3667, 'cacheWriteInputTokens': 0}
レイテンシー: 1364
--------------------------------------------------
あなた: 吾輩が「名前がない」と語っているのはなぜですか?
モデル: 吾輩は猫である。名前はまだ無い。と語っているのは、名前が決まっていないからです。
トークン情報: {'inputTokens': 48, 'outputTokens': 26, 'totalTokens': 3712, 'cacheReadInputTokens': 3638, 'cacheWriteInputTokens': 0}
レイテンシー: 740
--------------------------------------------------
あなた: 吾輩はなぜ「教師は楽な職業だ」と感じたのですか?
モデル: 教師は寝ている時間が長いからです。
トークン情報: {'inputTokens': 49, 'outputTokens': 12, 'totalTokens': 3703, 'cacheReadInputTokens': 3642, 'cacheWriteInputTokens': 0}
レイテンシー: 523
--------------------------------------------------
あなた: exit
チャットを終了します。

比較結果

入力トークン数の比較
回数 入力トークン数(キャッシュなし) 入力トークン数(キャッシュあり)
1回目36803680※1
2回目368316
3回目368316
4回目368648
5回目369149
平均(2回目以降)※2 3685.75 32.25

※1入力された3680トークンのうち3648トークンがキャッシュとして書き込まれる
※21回目のキャッシュありでは、既存のプロンプトキャッシュがないため、2回目以降で平均をとった

レイテンシー(ms)の比較
回数 レイテンシー(キャッシュなし) レイテンシー(キャッシュあり)
1回目483610
2回目883730
3回目17051364
4回目1260740
5回目1174523
平均(2回目以降)※2 1255 839

※21回目のキャッシュありでは、プロンプトキャッシュ書き込み処理が走る分レイテンシーが遅くなるため、2回目以降で平均をとった

キャッシュありの方が、入力トークン数で約99%、レイテンシーで 約33% 削減できており、効果があることが分かりました。

まとめ

プロンプトキャッシュをすることで、コスト削減とレイテンシー改善ができました。
使うに越したことはない機能ですね🙌
ランニングコストやUX改善につながるため、ぜひご活用ください。

Acroquest Technologyでは、キャリア採用を行っています。

  • Azure OpenAI/Amazon Bedrock等を使った生成AIソリューションの開発
  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • マイクロサービス、DevOps、最新のOSSクラウドサービスを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 

少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

www.wantedly.com