首页 > 其他分享 >打造自己的ChatGPT:逐字打印的流式处理

打造自己的ChatGPT:逐字打印的流式处理

时间:2023-02-18 22:25:50浏览次数:53  
标签:const 逐字 text await 流式 OpenAI ChatGPT ResponseWrite

接口的延迟

在调用OpenAI的接口时,不免会有很慢的感觉,抛去地理位置上的网络延迟,大量的延迟往往发生在响应生成的过程中。

OpenAI 对于延迟的解释

因此,如果使用同步接口的话,需要等待响应完全生成之后才能最终显示输出结果,虽然在对接微信或者其他需要通过接口请求的应用服务时没什么特别好的处理方案,但是如果是Web应用的话,就可以通过流式处理实现实时的数据返回,从而提升响应的优先级。

后端的流式处理

绝大部分的SDK都已经对OpenAI API的流式响应做了封装,这里以.NET 的Betalgo.OpenAI.GPT3为例,详细的配置部分不再赘述,可参考其说明文档。

//使用CreateCompletionAsStream获取 completions
var completions = openAIService.Completions.CreateCompletionAsStream(new OpenAI.GPT3.ObjectModels.RequestModels.CompletionCreateRequest
		    {
		        Prompt = BuildPrompt(input.Prompt),
		        MaxTokens = 100,
		        Temperature = 0.5f,
		        TopP = 1,
		        FrequencyPenalty = 0,
		        PresencePenalty = 0,
		        StopAsList = new List<string> { "Q:", "A:" }
		    }, Models.TextDavinciV3);
//将返回内容直接经过UTF编码写入Response
async Task ResponseWrite(string? text) {
    if (text == null) return;
    await Response.Body.WriteAsync(Encoding.UTF8.GetBytes(text));
    await Response.Body.FlushAsync();
}
//逐个获取 completion的返回,并写入到Response中
await foreach (var completionResponse in completions)
{
    if (completionResponse.Successful)
    {
        await ResponseWrite(completionResponse.Choices[0].Text);
    }else {
        await ResponseWrite("<ERR>");
        if(completionResponse.Error != null){
            await ResponseWrite(completionResponse.Error.Code);
            await ResponseWrite(completionResponse.Error.Message);
        }else {
            await ResponseWrite("<unknow>");
        }
    }
}

其中最核心的一点就是 ResponseWrite 部分,提前将内容写入到Response的Body中,并进行Flush。

另外需要注意的就是,Action 不能再有返回值(如果是.NET 7 的话,可以返回 Empty),因为已经在Action结束之前向Response写入了内容,再有返回值的话,就会报错。

前端的流式处理

同样的,后端作为流式发送,前端就需要以流式形式接收。

这里不需要使用到EventSource、WebSocket或是其他的实时通讯框架,仅需要使用普通的fetch即可。

async function send() {
    const input = document.getElementById("input").value;
    const output = document.getElementById("output");
    output.innerText = "";
    const url = "/api/stream";
    const data = { "Prompt": input };
//直接获取 Fetch 的response, 无法使用 await的话, Promise的方式也是可以的。
    const response = await fetch(url, {
        method: "POST",
        body: JSON.stringify(data),
        headers: {
            "Content-Type": "application/json"
        }
    })
	//获取UTF8的解码
    const encode = new TextDecoder("utf-8");
	//获取body的reader
	  const reader = response.body.getReader();
	// 循环读取reponse中的内容
    while (true) {
        const { done, value } = await reader.read();
        if (done) {
            break;
        }
	// 解码内容
        const text = encode.decode(value);
	// 当获取错误token时,输出错误信息
        if (text === "<ERR>") {
            output.innerText = "Error";
            break;
        } else {
	// 获取正常信息时,逐字追加输出
            output.innerText += text;
        }
    }
}

fetch获取的response可以,可以通过 response.body.getReader() 获取reader,然后循环获取reader中的响应,根据情况,将响应内容追加到界面上,就实现了逐字打印的效果了。

相关链接

  1. 以上示例代码,可参见 GPT3_demo
  2. 想要了解如何理解OpenAI的API,可参考打造自己的ChatGPT:OpenAI 的API接入技巧
  3. OpenAI 官方对于延迟处理的一些意见improving-latencies
  4. Dotnet SDK for OpenAI GPT-3 and DALL·E

标签:const,逐字,text,await,流式,OpenAI,ChatGPT,ResponseWrite
From: https://www.cnblogs.com/xbotter/p/how_to_use_openai_stream_api.html

相关文章

  • ChatGPT未来会拥有自我情感和思维吗?
    目前人工智能领域的专家和学者普遍认为,即使在未来,也很难确切地预测人工智能是否会产生真正的自我情感和思维。虽然人工智能系统可以在某些任务上表现出人类智能的某些方面,......
  • ChatGpt 能成为恋爱大师吗?
    虽然以ChatGPT为代表的人工智能,在很多方面都能够表现出令人惊讶的能力,但是要成为真正的恋爱大师仍然存在许多困难。人工智能难以理解人类的情感和文化差异一方面,恋爱是......
  • ChatGPT踩坑(We've detected suspicious behavior from phone numbers similar to you
    现象We'vedetectedsuspiciousbehaviorfromphonenumberssimilartoyours.Pleasetryagainlaterorcontactusthroughourhelpcenterathelp.openai.com.......
  • WEB版双色球号码随机生成代码(chatgpt)
    <!doctypehtml><html><head><title>双色球号码随机生成</title><scripttype="text/javascript">functiongenerateBall(){......
  • ChatGPT让沟通更智能、更便捷
     ChatGPT让沟通更智能、更便捷ChatGpt是最近引起强烈关注的一种技术,它可以实现聊天机器人,为使用者解决复杂的信息获取和学习任务。但他也不仅仅是一个聊天机器人,它是......
  • ChatGPT让沟通更智能、更便捷
    ChatGPT让沟通更智能、更便捷ChatGpt是最近引起强烈关注的一种技术,它可以实现聊天机器人,为使用者解决复杂的信息获取和学习任务。但他也不仅仅是一个聊天机器人,它是一种基于......
  • 如何清理电脑版微信的硬盘空间?(本文章完全由chatGPT命题生成,一个字都没改)
    现在,很多人已经将日常工作中使用的即时通讯工具从QQ转换为微信,但微信的个人数据文件夹占用的空间也越来越大。这是因为微信的图片文件被加密处理,难以清理掉不必要的文件。因......
  • 一文让你彻底了解ChatGPT
    这段时间最热莫过于ChatGPT,说到人工智能ai这个话题已经好多年了,各种各样的问答机器人不计其数,为什么唯独ChatGPT这么受欢迎,下面就ChatGPT是什么、ChatGPT的使用方式、Chat......
  • 冰河指南AI技术社区基于ChatGPT正式启动运营
    大家好,我是冰河~~最近ChatGPT真的太火了,科技圈几乎都在争相报导这个黑科技,它能够通过学习和理解人们的语言来和人类进行对话,能够与人们进行交流,甚至可以对你提出的问题进......
  • 一文读懂:有关ChatGPT的十个问题
    随着人工智能大模型、量子计算、类脑智能、云原生、数字引擎、音视频等技术的深入发展,新技术、新模式和新业态持续涌现。针对上述领域,我们策划了一个科普系列栏目《T-chat......