「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

機械学習

「大規模言語モデルの微調整方法:ステップバイステップガイド」

2023年、アルパカ、ファルコン、ラマ2、およびGPT-4のような大規模言語モデル(LLM)の台頭は、人工知能の民主化の傾向を示し...

データサイエンス

AI増強ソフトウェアエンジニアリング:知っておくべきすべてのこと

この包括的なガイドで、AIを活用したソフトウェアエンジニアリングの急速に成長する分野について学び、どのようにソフトウェ...

AI研究

イェール大学とGoogle DeepMindの研究者は、大規模な言語モデルに対する高度な微調整技術を使用して数学の問題解決の成功を解き明かしました

“`html 最も先進的な大型言語モデル(LLMs)であるGPT-4やPaLM 2でも、数学の問題を解くのは困難です。なぜなら、それ...

AI研究

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

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

機械学習

「RecMindと出会ってください:推薦タスクのための推論、行動、およびメモリを組み合わせた大規模言語モデル技術によって駆動される自律型の推薦エージェント」

人工知能とディープラーニングの人気が高まるにつれて、ほぼすべてのアプリケーションがAIの能力を利用して作業を進めていま...

データサイエンス

トランスフォーマーのA-Z:知っておくべきすべてのこと

おそらくすでに「トランスフォーマー」について聞いたことがあるでしょうし、皆が話題にしているので、なぜ新しい記事を書く...