Open KissMyLady opened 1 year ago
我觉得这是一个很好的问题,我最近在给这个项目写arxiv和重构成ChatHaruhi2.0的代码,流式输出可以在2.0版本里面考虑去一同实现。
你去知乎上加一下我微信吧 https://www.zhihu.com/people/cheng-li-47
好的, 感谢大佬关注
yield f"data: {output}\n\n"
return StreamingResponse(chat_iterator(), media_type="text/event-stream")
使用postman这类测试流输出,可能需要对输出进行包装
鲁鲁我再问个相关的,如果是语音后面会考虑流式优化吗?
如果开公司可以考虑这些问题 但是llm的流式输出可以先整一个。
在后续测试中, 能够实现流式输出, 但是是调用的别人家的API实现的, 本地chatGLM模型未实现流式输出.
@app.get('/stream')
@app.post('/stream')
async def conversations(request: Request):
predictGenerator = chat_by_Characterglm_api(prompt=response_raw, dictData=dictData)
return EventSourceResponse(predictGenerator)
api接口调用
async def chat_by_Characterglm_api(prompt=None, meta=None, dictData=None):
if meta is None:
meta = getRoleMeta()
pass
logger.info("Characterglm 发起请求, meta: %s" % meta)
logger.info("Characterglm 发起请求, prompt: %s" % prompt)
"""
角色聊天 api
"""
zhipuai.api_key = get_zhipu_api()
response = zhipuai.model_api.sse_invoke(
model="characterglm",
meta=meta,
prompt=prompt,
temperature=0.95,
top_p=0.7,
incremental=True
)
t1 = time.time()
stringBuilder = ""
for event in response.events():
if event.event == "add":
# print("add: ", event.data)
stringBuilder += event.data
yield event.data
elif event.event == "error":
print("error: ", event.data)
stringBuilder += event.data
yield event.data
elif event.event == "interrupted":
print("interrupted: ", event.data)
stringBuilder += event.data
yield event.data
elif event.event == "finish":
print("finish: ", event.data)
stringBuilder += event.data
yield event.data
else:
print(event.data)
stringBuilder += event.data
yield event.data
yield stringBuilder + "--finish--"
我看有几家的API本身也支持流式输出,等我集成一下BGE,然后把RoleLLM的角色放进来试试看之后再来试一下流式。
一, 推理后一次性返回数据
当前项目下语言模型的调用(适当修改后), 可以做到推理后全量返回.
但是也有些许问题, 使用本地模型时, 会有很多轮对话导致等待时间过长.
一个问题是: 很大概率的出现多轮对话, 台词连续生成
一个请求, 在ChatGLM2-6B上会有多伦对话输出
二, 尝试使用流式输出
前端接口
效果: 只能在控制台打印, 无法返回数据到postman
三, 期望/解决问题
希望能够增加本地模型的调用
本地模型能够使用流式输出