我们都知道,由于OpenAI 服务的原理,他在做文本或代码补全时,如果内容较多,实际上是一点一点推测后续内容和补全的。这种情况下,如果你要等到所有的内容都准备好,则可能在客户端看到很长时间的空白页面。所以,OpenAI的API在设计时提供了一个stream的参数,以便实现流式传输,这也就是我们已经早就在很多地方(不管是官方的ChatGPT,还是很多第三方应用)已经看到的“打字机”效果。
Python 和 Nodejs 都默认支持了流式传输,例如下面是Python的做法。
在Javascript中则可以如下实现。
而到了IT 攻城狮或程序猿傍身的PowerShell,由于先天设计的不同,默认(Invoke-Webrequest 或 Invoke-RestMethod)并不支持这类骚操作。感谢胖老师的研究,咱们在PowerShell中也可以轻松实现类似的效果,请参考下文。
https://mp.weixin.qq.com/s/swBdYJBCQSYKO9peQ6kkNA
我做了一个简化的版本,可以快速验证效果。【请注意,替换RequestUri和 api_key】
$client = New-Object System.Net.Http.HttpClient$body = @{ prompt = "write a poem about happiness, less than 2000 words" max_tokens = 2000 stream = $true}$request = [System.Net.Http.HttpRequestMessage]::new$request.Method = "POST"$request.RequestUri = "https://chenxizhang-azure-openai.openai.azure.com/openai/deployments/text-davinci-003/completions?api-version=2022-12-01"$request.Content = [System.Net.Http.StringContent]::new(($body | ConvertTo-Json), [System.Text.Encoding]::UTF8)$request.Content.Headers.Clear$request.Content.Headers.Add("Content-Type", "application/json;charset=utf-8")$request.Headers.Add("api-key", $env:OPENAI_API_KEY)$task = $client.SendAsync($request)$result = $task.Result$streamTask = $result.Content.ReadAsStreamAsync$stream = $streamTask.Result$reader = [System.IO.StreamReader]::new($stream)while ($true) { $line = $reader.ReadLine if(($line -eq $) -or ($line -eq "data: [DONE]")) { break } Write-Host (($line -replace "data: ", "") | ConvertFrom-Json).choices.text -NoNewline}$reader.Close$reader.Dispose$stream.Close
周末手艺人卷一篇,其实不管用什么平台,都差不多的。关键是心,希望大家喜欢。
相关文章
猜你喜欢