Published: 25 Jul 2023 › Updated: 25 Jul 2023
ChatGLM流式传输 / ai #17
作为开发ChatGLM的主公司:智谱AI提供了很方便的API接口,只需在页面注册后就可得到API KEY, 然后就可以直接调用了,这些和OpenAI API的做法是一样的。
流式传输
流式传输就是每生成一段就传一段,在页面上就是那种打字机的效果:逐字生成。这种方法比较人性,生成多少就可以看到多少。ChatGLM也有类似的方法。
import zhipuai
zhipuai.api_key = 'ZHIPU_API_KEY'
def streaming(query, temperature):
response = zhipuai.model_api.sse_invoke(
model = "chatglm_lite",
prompt = query,
top_p = 0.7,
temperature = temperature,
)
for event in response.events():
if event.event == "add":
yield event.data
elif event.event == "error" or event.event == "interrupted":
return "error", 500
elif event.event == "finish":
return
else:
return
后台的代码感觉还是比较简洁,几行就全搞定啰。
前端代码
前端感觉就略显复杂了,这里采用的方法是原生地fetch, 其它的诸如 axios, useFetch方法都不好用,试了半天还是得放弃,只能采用fetch
let dataObj = {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
query: history,
temperature: 0.2
})
}
const response = await fetch(baseURL+'/zhipustreaming', dataObj)
messageDiv.innerHTML = " "
if (response.ok) {
let i = 0
let getStream = function (reader) {
return reader.read().then(function (result) {
// 如果数据已经读取完毕,直接返回
if (result.done) {
clearInterval(loadInterval)
loading.textContent = ''
return
}
// 取出本段数据(二进制格式)
let chunk = result.value
let text = utf8ArrayToStr(chunk)
if(i === 0){
text = text.replace(/\\n/g,'') //去除首段换行
} else{
text = text.replace(/\\n/g,'
')
}
// 将本段数据追加到网页之中
messageDiv.innerHTML += text
i ++
// 递归处理下一段数据
return getStream(reader)
})
}
getStream(response.body.getReader())
}
里面最关键的是getStream的方法,可以参考阮一峰的博客。试起来有点费劲,需要耐心地调试。好了,如果一切你都做好了,那么,你也可以开发个超级AI应用啰!
Leave ChatGLM流式传输 / ai #17 to:
Read more #cn posts
Best Posts From lemooljiang
We have not curated any of lemooljiang's posts yet. But you can encourage our curation team to review posts by visiting them regularly and by referring other readers. Because we give priority to frequently read content.