服务器发送事件 (SSE) GPT 场景实施 - 服务器端(后端)
最编程
2024-10-16 12:35:57
...
服务端的任务通常是调用gpt的接口,然后流式读取,读到什么马上返回给前端。
这里给一个python的demo:
from sse_starlette.sse import ServerSentEvent, EventSourceResponse
def create_chat_completion(messages):
# 发起请求
response = openai.ChatCompletion.create(
engine="gpt-35-turbo",
messages=messages,
stream=True, # 该参数需要设置为true
max_tokens=1000
)
# 循环处理stream结果
for item in response:
# yield ServerSentEvent(json.dumps(item, ensure_ascii=False), event='delta')
result = json.dumps(item)
print(result)
yield ServerSentEvent(json.dumps(item))
@router.post("/summary")
async def summary(contentNeedSummary: posts.ContentNeedSummary, user = Depends(get_token_header)):
messages = [
{"role": "system", "content": "可以预置一些系统的设置"},
{"role": "user", "content": contentNeedSummary.content}
]
return EventSourceResponse(create_chat_completion(messages))
可以看到上面的方法,前端调用/summary
接口后,进入summary
函数,做一些这个方法特有的设置之后,return了EventSourceResponse(create_chat_completion(messages))。create_chat_completion再实现通用的调用gpt的方法,每得到一个响应,马上用ServerSentEvent包裹返回给前端。
也就是说,整个过程,是前端发起SSE请求服务端,服务端(可以做一些别的处理,比如鉴权和预置系统数据)再发起SSE请求GPT接口;在返回结果的过程中,GPT接口流式输出给服务端,服务端(可以做一些别的处理,比如处理好返回结果的格式,计算token成本)马上返回给前端,比如GPT接口流式输出了“你好”,服务端马上返回了“你好”给前端显示在网页上,再返回“,我是GPT”,服务端接着返回给前端显示在网页上。
这样的处理方式可以让结果尽快显示出来,也可以借由服务端的处理,保证安全和计算成本,以及处理好数据格式。