Chatbot-Endpunkt
Wenn Sie im Frontend eine Frage eingeben, wird eine POST Anfrage an den Endpunkt /api/chat gesendet. Der Anfragetext muss die Frage des Nutzers in folgendem Format enthalten:
{
"question": "the question goes here"
}Die Antwort der Anwendung ist ein Ereignisstrom, wie in der Server-Sent Events (SSE)-Spezifikation definiert. Die Ereignisse, die der Server an den Client zurückgibt, haben die folgende Reihenfolge:
data: [SESSION_ID] session-id-assigned-to-this-chat-sessiondata: [SOURCE] json-formatted-document(Wiederholt für jede identifizierte relevante Dokumentenquelle)data: response chunk(wird für jeden vom LLM zurückgegebenen Antwortblock wiederholt)data: [DONE]
Der Client kann eine Folgefrage stellen, indem er dem Anfrage-URL ein session_id -Abfragezeichenfolgenargument hinzufügt.
Die übergeordnete Logik für den Chatbot-Endpunkt befindet sich in der Funktion api_chat() der Flask-Anwendung in der Datei 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")Die Funktion ask_question() in der Datei api/chat.py ist eine Generatorfunktion, die die oben beschriebenen Ereignisse mithilfe der Antwort-Streaming-Funktion von Flask streamt, die auf dem Schlüsselwort yield basiert:
@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"