引言
使用Flask框架可以轻松实现一个类似chatgpt流式响应的接口,该接口通过POST请求接收prompt和history参数,分别对应为聊天系统的提示词和对话历史,server则给予server-sent event (SSE)返回聊天系统的响应。
服务端
开发前的思考
我们梳理一下,为了实现流式API接口,Server端需要完成的主要工作
1、创建一个flask app, 检查传入的POST请求是否包含JSON,提取必要的数据,并进行验证。
2、响应为SSE: 设置适当的响应头以适应服务器发送事件(text/event-stream),并保持连接活动状态。
3、生成函数: 提供了一个占位符generate()函数。这个函数应包含根据prompt和history生成响应的逻辑。在这个示例中,它简单地流回输入数据。实际开发应当采用真正的LLM大模型,此处从简。
4、流式传输数据: generate()函数设计为持续流式传输数据。在实际应用中,你需要用实际的事件生成逻辑替换循环和time.sleep()。
其中,1比较简单,因为很容易想象处理json数据是Flask的主要工作。3也比较简单,如果使用过大语言模型的产品,你多半会见过打字机式的的UI效果。实际上的大语言模型输出不见得是严格一个个字输出,大概是几个字为单位输出,这是由于其模型输出采用分词器的缘故,即所谓Tokenizer。这不是本文主题,所以我们仅采用一个循环打印来模拟这种返回效果。2和4相对要陌生一些,不过我们可以理解它们就是实现流式接口的必备技术基础,即使没有深入理解也可以实现。正所谓自顶向下的理解一个问题,我们先从最表层的行动:实现(Implementation),开始。
代码实现
严谨起见,首先安装 Flask:
pip install Flask
server部分代码如下
from flask import Flask, request, jsonify, Response
app = Flask(__name__)
@app.route('/api/stream-chat', methods=['POST'])
def stream_chat():
# Check if the request contains JSON data
if request.is_json:
# Get JSON data
data = request.get_json()
# Extract 'prompt' field; return an error if it's missing
prompt = data.get('prompt')
if prompt is None:
return jsonify(