当您在前端输入问题时,会向/api/chat端点发送一个POST
请求。请求主体必须包含来自用户的疑问,格式如下
{
"question": "the question goes here"
}
应用程序的响应是一个事件流,如服务器发送事件 (SSE) 规范中所定义。服务器返回给客户端的事件具有以下顺序
data: [SESSION_ID] 分配给此聊天会话的会话 ID
data: [SOURCE] json 格式的文档
(针对识别到的每个相关文档源重复)data: 响应块
(针对 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()
函数是一个生成器函数,它使用 Flask 的响应流功能(基于yield
关键字)来流式传输上述事件
@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"