「Declarai、FastAPI、およびStreamlitを使用したLLMチャットアプリケーション— パート2 🚀」
LLM Chat Application with Declarai, FastAPI, and Streamlit - Part 2 🚀
前回のVoAGI記事(リンク🔗)の人気に応えて、LLMチャットアプリケーションの展開について詳しく取り上げました。今回は、より高度な機能を紹介し、特にチャットアプリケーションのストリーミングに重点を置いています。
多くの読者から、チャットのストリーミング機能への要望が寄せられました。ストリーミングは、長い応答を扱う際に重要となります。全体の応答を待たせるのではなく、ストリーミングでは応答が生成されると同時に送信されます🔄。これにより、ユーザーはウェブサーバーからの送信直後にそれにアクセスできるようになります。
Declaraiの最近の改良により、バージョン0.1.10以降で利用できるストリーミングを活用することができるようになりました🎉。
ストリーミングの実装例📹
ストリーミングビデオ | 著者による録画 | 全著作権所有
- ReAct、Reasoning and Actingは、LLMをツールで拡張します!
- コンピュータビジョンの革新:進歩、課題、そして将来の方向性
- DSPyの内部:知っておく必要のある新しい言語モデルプログラミングフレームワーク
デモンストレーションに示されているように、ストリーミングは応答性が向上し、最近の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 アプリ
フロントエンドでは、新しいレスポンスのチャンクが受信されるたびにユーザーに表示することが目標です。これには、各レスポンスのチャンク間の差分にアクセスする必要があります。
以下は、その方法です:
stream=True
を指定したHTTP POSTリクエストで開始します。- 各チャンクを繰り返し処理し、JSONをデコードします。
delta
値を抽出し、フルレスポンスに追加します。これは基本的に新しく生成された値です。- 蓄積されたレスポンスで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!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- 「WavJourney:オーディオストーリーライン生成の世界への旅」
- 「ChatGPTをより優れたソフトウェア開発者にする:SoTaNaはソフトウェア開発のためのオープンソースAIアシスタントです」
- 「第一の汎用ビジュアルと言語のAI LLaVA」
- 機械学習なしで最初の自動修正を作成する
- 効率的なディープラーニング:モデルの圧縮のパワーを解き放つ
- このAI論文では、Complexity-Impacted Reasoning Score(CIRS)を紹介していますこれは、大規模な言語モデルの推論能力を向上させるためのコードの複雑さの役割を評価するものです
- 「脳に触発された学習アルゴリズムにより、人工およびスパイキングニューラルネットワークにメタプラスティシティを可能にする」