チャットボットエンドポイント
フロントエンドで質問を入力すると、 /api/chatエンドポイントにPOSTリクエストが送信されます。リクエストの本文には、ユーザーからの質問が次の形式で含まれている必要があります。
{
"question": "the question goes here"
}アプリケーションからの応答は、 Server-Sent Events (SSE) 仕様で定義されているイベント ストリームです。サーバーがクライアントに返すイベントの順序は次のとおりです。
data: [SESSION_ID] session-id-assigned-to-this-chat-sessiondata: [SOURCE] json-formatted-document(特定された関連文書ソースごとに繰り返されます)data: response chunk(LLMによって返される応答チャンクごとに繰り返されます)data: [DONE]
クライアントは、リクエスト URL にsession_idクエリ文字列引数を追加することで、フォローアップの質問をすることができます。
チャットボット エンドポイントの高レベル ロジックは、Flask アプリケーションのapi_chat()関数のファイルapi/app.pyにあります。
@app.route("/api/chat", methods=["POST"])
def api_chat():
request_json = request.get_json()
question = request_json.get("question")
if question is None:
return jsonify({"msg": "Missing question from request JSON"}), 400
session_id = request.args.get("session_id", str(uuid4()))
return Response(ask_question(question, session_id), mimetype="text/event-stream")ファイルapi/chat.pyのask_question()関数は、 yieldキーワードに基づく Flask の応答ストリーミング機能を使用して、上記のイベントをストリーミングするジェネレーター関数です。
@stream_with_context
def ask_question(question, session_id):
yield f"data: {SESSION_ID_TAG} {session_id}\n\n"
# ...
yield f"data: {DONE_TAG}\n\n"