[ChatStream] Web API エンドポイントの実装

[ChatStream] Web API エンドポイントの実装

こんにちは! (株)Qualiteg プロダクト開発部 です!

本稿では、 ChatStream を FastAPI の Web API として実装する方法についてご説明いたします!

エンドポイントの実装

/chat_stream という URL パスに、ストリーミングチャット用のWebエンドポイントをつくるには
以下のように handle_chat_stream_request を呼び出します。

これだけで、ユーザーからのリクエストは 文章生成の同時実行数を制御したストリーミングチャットの実装は完了です

@app.post("/chat_stream")
async def stream_api(request: Request):
    # handling FastAPI/Starlette's Request
    response = await chat_stream.handle_chat_stream_request(request)
    return response

メッセージインターセプト

FastAPI/Starlette を利用している場合、エンドポイントで await request.body()await request.json() を実行すると、
リクエストストリームを消費(consume)してしまうため、 ChatStream にリクエストを委譲する前にリクエストをインターセプトをする場合は以下のように実装します

import json
from fastapi import FastAPI, Request

@app.post("/chat_stream")
async def stream_api(request: Request):

    # Request を インターセプトする場合
    request_body = await request.body()
    data = json.loads(request_body)
    
    user_input = data["user_input"]
    regenerate = data["regenerate"]

    print(f"user_input:{user_input} regenerate:{regenerate}")
    
    # インターセプトした場合は `request_body` を指定する
    response = await chat_stream.handle_chat_stream_request(request, request_body)

    return response

チャットストリームの送出完了のコールバックを受け取る

ChatStream では、ストリーミングレスポンスを行うため、エンドポイントで return reponse を行ったタイミングが文章生成処理の終了ではありません。

そこで、文章生成の完了のタイミングをキャッチしたい場合、
エンドポイントの実装で、 handle_chat_stream_request の引数 callback にコールバック関数を指定します。

文章生成が完了すると、指定したコールバック関数が呼び出されます

@app.post("/chat_stream")
async def stream_api(request: Request):

    def callback_func(request, message):
        # 文章生成が終了したとき
        
        # ここでは、セッションに格納されている ChatPrompt を取得して、これまでの会話履歴をもとにプロンプトを生成する例
        session_mgr = getattr(request.state, "session", None)
        session = session_mgr.get_session()
        chat_prompt = session.get("chat_prompt")
        print(chat_prompt.create_prompt())

    pass

    response = await chat_stream.handle_chat_stream_request(request, callback=callback_func)

    return response

文章生成終了時のコールバック関数のパラメータ message の取り得る値と意味

message の値 説明
success ストリームがクライアントに向け正常に送出された
client_disconnected_while_streaming ストリーム送出中にクライアントから切断された
client_disconnected_before_streaming ストリーム送出前にクライアントから切断されていた
unknown_error_occurred ストリーム送出中に予期せぬエラーが発生した

Read more

KVキャッシュのオフロード戦略とGQAの実践的理解

KVキャッシュのオフロード戦略とGQAの実践的理解

こんにちは! LLM推論基盤プロビジョニング講座、今回は番外編をお届けします! 第3回「使用モデルの推論時消費メモリ見積もり」では、GPUメモリ消費の二大要素としてモデルのフットプリントとKVキャッシュを紹介し、1トークンあたりのKVキャッシュサイズの計算方法を解説しました。 また第4回「推論エンジンの選定」ではvLLMやDeepSpeedなど各推論エンジンの特性を比較し、第5回では量子化や並列化による最適化戦略を解説してきました。 しかし、実はKVキャッシュにはまだまだ掘り下げるべきトピックがあります。 * KVキャッシュをGPUのVRAMからCPU RAMやディスクにオフロードしたらどうなるのか? どのくらい遅くなるのか? * HuggingFace TransformersとvLLMでは、KVキャッシュの管理方針がなぜ根本的に異なるのか? * そもそもKVキャッシュが大きくなる原因であるアテンション構造を変えてしまう GQA(Grouped-Query Attention)とは何か? 第5回で紹介した量子化とは別の軸で、KVキャッシュを劇的に小さくする技術です。

By Qualiteg プロダクト開発部, Qualiteg コンサルティング
Python と JavaScript で絵文字の文字数が違う!サロゲートペアが引き起こす位置ずれバグの話

Python と JavaScript で絵文字の文字数が違う!サロゲートペアが引き起こす位置ずれバグの話

こんにちは! Qualitegプロダクト開発部です! PII(個人情報)検出のデモアプリを開発していて、検出したエンティティの位置をハイライト表示する機能を実装していました。 バックエンドは Python(FastAPI)、フロントエンドは JavaScript という構成です。 ある日、テストデータにこんなメール文面を使ったところ、ハイライトの位置が途中から微妙にずれるバグに遭遇しました。 鈴木一郎 様 いつもお世話になっております。 サンプル商事の佐藤でございます。 先日の件、確認が取れましたのでご連絡いたします。 お忙しいところ恐縮ですが、ご確認のほど宜しくお願い致します。 💻 #オンラインでのお打ち合わせ、お気軽に声がけください! ―――――――――――――――――――――――――――――― サンプル商事株式会社 営業部 第一課 山田 太郎 (Yamada Taro) 〒100-0001 東京都千代田区千代田1-1-1 サンプルビル 3F tel: 03-1234-5678 https://example.com/contact 検出結果をハイライト表示

By Qualiteg プロダクト開発部
大企業のAIセキュリティを支える基盤技術 - 今こそ理解するActive Directory 第5回 ブラウザ設定と認証

大企業のAIセキュリティを支える基盤技術 - 今こそ理解するActive Directory 第5回 ブラウザ設定と認証

こんにちは、今回はシリーズ第5回「ブラウザ設定と認証」について解説いたします! さて、前回(第4回)では、プロキシサーバーをドメインに参加させることで、ChatGPTやClaudeへのアクセスを「誰が」行ったかを確実に特定する仕組みを解説しました。「信頼の連鎖」の概念や、Windows版Squidなら1時間で構築できる環境、Negotiate/NTLM/Basicという3段階の認証フォールバック機構について理解いただけたかと思います。 しかし、せっかくサーバー側で完璧な統合Windows認証環境を構築しても、ブラウザ側の設定が適切でなければ、ユーザーには毎回パスワード入力ダイアログが表示されてしまいます。 「Edgeだと自動でログインできるのに、Chromeだとパスワードを聞かれる」 「同じサーバーなのにURLの書き方で動作が違う」 これらはヘルプデスクに寄せられる典型的な問い合わせです。(ただ、業務に好きなブラウザ使っていいよ、という企業はそんなに多くはないとおもいます) 今回は、統合Windows認証がブラウザでどのように動作するのか、その仕組みから各ブラウザ(Edge/

By Qualiteg AIセキュリティチーム, Qualiteg コンサルティング
スライドパズルを解くAIから学ぶ、「考える」の正体

スライドパズルを解くAIから学ぶ、「考える」の正体

こんにちは! 「このパズル、AIの教科書に載ってるらしいよ」 子供の頃に遊んだスライドパズル。いや、大人が遊んでも楽しいです。 数字のタイルをカチャカチャ動かして揃えるあれです。実はこのシンプルなパズルが、AI研究の出発点のひとつだったって知ってました? 今回は、このパズルを題材に「AIがどうやって考えているのか」を解き明かしていきます。しかも、ここで使われている手法は、Google Mapsの経路探索からChatGPTまで、現代の様々な技術のベースになっているんです。 まず遊んでみよう 理屈の前に、まずは感覚を思い出してみてください。 最初に shuffle をクリックすると、配置がシャッフルされゲームを開始できます。 ちなみに必ず解くことができるようになっていますが、慣れていないとそれなりに難しいかもしれません。 どうでしょう? 何手でクリアできましたか? クリアできなくても大丈夫です。記事後半で、実際にAIが解いてくれる機能つきゲームも掲載しています^^ 以下は動画です。本ブログで紹介するアルゴリズムで実際にパズルを解く様子をご覧いただけます

By Qualiteg 研究部