챗봇 엔드포인트
프런트엔드에 질문을 입력하면 POST 요청이 /api/chat 엔드포인트로 전송됩니다. 요청 본문에는 다음 형식의 사용자 질문이 포함되어야 합니다:
{
"question": "the question goes here"
}애플리케이션의 응답은 서버 전송 이벤트(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"