「Declarai、FastAPI、およびStreamlitを使用したLLMチャットアプリケーション— パート2 🚀」

LLM Chat Application with Declarai, FastAPI, and Streamlit - Part 2 🚀

チャットスクリーンショット | 著者による撮影 | 全著作権所有

前回のVoAGI記事(リンク🔗)の人気に応えて、LLMチャットアプリケーションの展開について詳しく取り上げました。今回は、より高度な機能を紹介し、特にチャットアプリケーションのストリーミングに重点を置いています。

多くの読者から、チャットのストリーミング機能への要望が寄せられました。ストリーミングは、長い応答を扱う際に重要となります。全体の応答を待たせるのではなく、ストリーミングでは応答が生成されると同時に送信されます🔄。これにより、ユーザーはウェブサーバーからの送信直後にそれにアクセスできるようになります。

Declaraiの最近の改良により、バージョン0.1.10以降で利用できるストリーミングを活用することができるようになりました🎉。

ストリーミングの実装例📹

ストリーミングビデオ | 著者による録画 | 全著作権所有

デモンストレーションに示されているように、ストリーミングは応答性が向上し、最近のAIチャットアプリケーションでは標準となっています。これを実現するための方法を見てみましょう。

Declarai 💻

ストリーミングを利用するには、チャットボットがstreaming=Trueを渡して有効化されるように宣言してください。

import declaraigpt_35 = declarai.openai(model="gpt-3.5-turbo")@gpt_35.experimental.chat(streaming=True)class StreamingSQLChat:    """    SQLアシスタントです。ユーザーにSQLクエリの作成をサポートします。    最初にユーザーが使用したいSQL構文を把握する必要があります。それはMySQL、PostgreSQL、SQLiteなどがあります。    ユーザーがSQLとはまったく関係のないことを言った場合は、「理解できません。SQLクエリの作成をサポートするためにここにいます。」と言ってください。    クエリを提供した後、ユーザーに他に何か必要か尋ねるべきです。    """    greeting = "こんにちは、SQLユーザーさん。今日もお元気ですか?SQLクエリの作成をサポートするためにここにいます。始めましょう!どのSQL構文を使用しますか?MySQL、PostgreSQL、SQLiteなどがあります。"

ストリーミングを使用してチャットボットと対話する場合:

chat = StreamingSQLChat()res = chat.send("MySQLを使用したいです")for chunk in res:    print(chunk.response)>>> 素晴らしい>>> 素晴らしい!>>> 素晴らしい! MySQL>>> 素晴らしい! MySQLは>>> 素晴らしい! MySQLは人気があります>>> 素晴らしい! MySQLは人気があります。>>> 素晴らしい! MySQLは人気があります。SQL>>> 素晴らしい! MySQLは人気があります。SQL構文>>> 素晴らしい! MySQLは人気があります。SQL構文の選択肢>>> 素晴らしい! MySQLは人気があります。SQL構文の選択肢です>>> 素晴らしい! MySQLは人気があります。SQL構文の選択肢です。どのように>>> 素晴らしい! MySQLは人気があります。SQL構文の選択肢です。どのようにお手伝い>>> 素晴らしい! MySQLは人気があります。SQL構文の選択肢です。どのようにお手伝いできますか>>> 素晴らしい! MySQLは人気があります。SQL構文の選択肢です。どのようにお手伝いできますか?>>> 素晴らしい! MySQLは人気があります。SQL構文の選択肢です。どのようにお手伝いできますか?MySQL>>> 素晴らしい! MySQLは人気があります。SQL構文の選択肢です。どのようにお手伝いできますか?MySQLのクエリ>>> 素晴らしい! MySQLは人気があります。SQL構文の選択肢です。どのようにお手伝いできますか?MySQLのクエリについて>>> 素晴らしい! MySQLは人気があります。SQL構文の選択肢です。どのようにお手伝いできますか?MySQLのクエリについてお手伝い>>> 素晴らしい! MySQLは人気があります。SQL構文の選択肢です。どのようにお手伝いできますか?MySQLのクエリについてお手伝いが必要ですか?

裏側で何が起こっているのか?ストリーミングを有効にすることで、OpenAIはジェネレータを返し、アイテムを必要な時に1つずつ生成します。したがって、OpenAIから新しいチャンクが利用可能になるとすぐに処理されます。

FastAPI 🛠️

ストリーミング機能のために、異なるRESTエンドポイントを導入しました。このエンドポイントは、StreamingResponseをディスパッチします。これは基本的にはジェネレータであり、各チャンクはチャンクの詳細を含むJSONです。レスポンスのタイプがストリームであることを示すために、media_type="text/event-stream"というメディアタイプを指定することが重要です。

@router.post("/chat/submit/{chat_id}/streaming")def submit_chat_streaming(chat_id: str, request: str):    chat = StreamingSQLChat(chat_history=FileMessageHistory(file_path=chat_id))    response = chat.send(request)    def stream():        for llm_response in response:            # LLMResponseをJSON文字列に変換する            data = json.dumps(jsonable_encoder(llm_response))            yield data + "\n"  # 改行で区切られたJSON文字列を返す    return StreamingResponse(stream(), media_type="text/event-stream")

Streamlit アプリ

フロントエンドでは、新しいレスポンスのチャンクが受信されるたびにユーザーに表示することが目標です。これには、各レスポンスのチャンク間の差分にアクセスする必要があります。

以下は、その方法です:

  1. stream=Trueを指定したHTTP POSTリクエストで開始します。
  2. 各チャンクを繰り返し処理し、JSONをデコードします。
  3. delta値を抽出し、フルレスポンスに追加します。これは基本的に新しく生成された値です。
  4. 蓄積されたレスポンスでUIを更新します。
res = requests.post(f"{BACKEND_URL}/api/v1/chat/submit/{session_name}/streaming",                  params={"request": prompt},                  stream=True)with st.chat_message("assistant"):  message_placeholder = st.empty()  full_response = ""  buffer = ""  for chunk in res:      decoded_chunk = chunk.decode('utf-8')      buffer += decoded_chunk      while "\n" in buffer:          line, buffer = buffer.split("\n", 1)          parsed_chunk = json.loads(line.strip())          try:              full_response += parsed_chunk["raw_response"]["choices"][0]["delta"]["content"]              message_placeholder.markdown(full_response + "▌")          except KeyError:              pass  message_placeholder.markdown(full_response)

ストリーミングチャットボットをデプロイする準備ができましたか 🤖?このリポジトリの完全なコードにダイブしてみてください —

GitHub – matankley/declarai-chat-fastapi-streamlit: Declaraiを使用してチャットボットを構築する方法の例…

言語モデルとの対話にdeclaraiを使用してチャットボットを構築する方法の例、バックエンドサーバーとしてFastAPIを使用して…

github.com

Declaraiの開発に関連する情報を受け取るには 💌。Linkedinページでコネクトして、ツールが有用であると考える場合はGitHubでスター⭐️を付けてください!

また、Declaraiの機能についてもっと詳しく知るには、ドキュメントを探索してください 📖

ストリーミング — Declarai

一部のLLMプロバイダはLLMのレスポンスのストリーミングをサポートしています。これは、結果をできるだけ早く取得したい場合に非常に便利です。

declarai.com

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

AI研究

「UCLA研究者がGedankenNetを紹介:物理法則や思考実験から学ぶ自己教示AIモデルが計算機画像処理を進化させる」

深層学習の最近の進展は、計算画像処理、顕微鏡、ホログラフィ関連の分野に大きな影響を与えています。これらの技術は、バイ...

AIニュース

Google Translateが同音異義語を認識する方法を教えた方法

Google Translateのニューラルモデルがベースとベースの違いを理解する方法

機械学習

ショッピファイの製品推奨アプリに生成AIを導入する

ショッピファイの製品推薦アプリケーションであるSearch and DiscoveryにジェネレーティブAIがどのように実装されたかについ...

AI研究

天候の変化:AI、高速計算がより速く、効率的な予測を提供することを約束します

2050年までに、極端な天候や気候の頻度と厳しさが増すことにより、ミュンヘン再保険会社によれば、年間100万人の命が失われ、...

人工知能

ネットワークの強化:異常検知におけるML、AI、およびDLの力を解き放つ

「機械学習、人工知能、そしてディープラーニング技術が、異常を精度良く検出することでネットワークセキュリティを向上させ...

AIニュース

「Googleのジェミニを使い始める方法はこちらです!」

GoogleのGemini AIで会話型AIの未来を体験してみましょう。このモデルは、理解、要約、推論、コーディング、計画において、他...