如何配置openai的返回Stream數(shù)據(jù)并轉(zhuǎn)發(fā)到h5頁(yè)面按markdown格式流式輸出(最新推薦)
如何配置openai返回?cái)?shù)據(jù),保持流式輸出,可以分段加載
可以使用OpenAI API的stream參數(shù)來(lái)實(shí)現(xiàn)流式輸出,并且可以使用max_tokens參數(shù)控制每次返回?cái)?shù)據(jù)的長(zhǎng)度。 以下是一個(gè)示例代碼,演示如何使用OpenAI API來(lái)實(shí)現(xiàn)流式輸出并分段加載:
import openai
# 連接 OpenAI API openai.api_key = "YOUR_API_KEY"
# 設(shè)置 OpenAI API 參數(shù)
model_engine = "davinci"
# 模型引擎
prompt = "你好,我需要幫助進(jìn)行自然語(yǔ)言處理任務(wù)。" # 請(qǐng)求語(yǔ)句
temperature = 0.5 # 溫度參數(shù)
max_tokens = 100 # 每次最大輸出長(zhǎng)度 # 獲取 OpenAI 返回?cái)?shù)據(jù)
completions = openai.Completion.create( engine=model_engine, prompt=prompt, temperature=temperature, max_tokens=max_tokens, n=1, stream=True ) # 分段獲取數(shù)據(jù)
for i, text in enumerate(iter(completions.choices), start=1):
print(f"============== 第 {i} 段輸出 ==============")
print(text.text)在這個(gè)示例中,我們將stream參數(shù)設(shè)置為True,這樣OpenAI API將會(huì)實(shí)時(shí)地將數(shù)據(jù)傳輸回調(diào)用方,并且將返回一個(gè)生成器對(duì)象(iter(completions.choices)),使得我們可以逐段獲取數(shù)據(jù)并打印出來(lái)。 同時(shí),我們使用max_tokens參數(shù)來(lái)控制每次返回的數(shù)據(jù)長(zhǎng)度,這樣也可以有效的避免返回?cái)?shù)據(jù)過(guò)長(zhǎng)導(dǎo)致內(nèi)存不足的問(wèn)題。 注意,這里的YOUR_API_KEY需要替換為您在OpenAI申請(qǐng)的API密鑰?!菊?qǐng)求時(shí)間:14秒】
openai 返回stream流,是UDP還是TCP,接收stream數(shù)據(jù)代碼DEMO
OpenAI GPT-3 API 返回的是 HTTPS 流,使用的是 TCP 協(xié)議。
如果您需要處理從 OpenAI GPT-3 API 返回的數(shù)據(jù)流,您可以使用 Python 中的 requests 庫(kù)來(lái)處理它。
以下是一個(gè)可以接收并處理由 OpenAI GPT-3 API 返回的數(shù)據(jù)流的示例代碼:
import requests
def process_stream(stream):
for line in stream.iter_lines():
if line: # 處理返回的數(shù)據(jù)
print(line.decode('utf-8')) # 發(fā)起 API 請(qǐng)求并處理返回的數(shù)據(jù)流
response = requests.post(url, headers=headers, data=data, stream=True)
process_stream(response.iter_lines()) 在上面的代碼中,我們使用 requests.post 方法發(fā)起了一個(gè)帶有 stream=True 參數(shù)的 POST 請(qǐng)求,并將響應(yīng)保存到 response 變量中。接著,我們調(diào)用 process_stream 函數(shù)來(lái)處理從 API 返回的數(shù)據(jù)流。在 process_stream 函數(shù)中,我們使用 iter_lines 迭代器來(lái)逐行處理數(shù)據(jù)流,并將每行轉(zhuǎn)換為 UTF-8 編碼字符串。在這個(gè)簡(jiǎn)單的示例中,我們只是將數(shù)據(jù)打印到控制臺(tái)上,但您可以根據(jù)實(shí)際需求來(lái)編寫相應(yīng)的邏輯來(lái)處理數(shù)據(jù)。
接收stream數(shù)據(jù)的PHP代碼示例如下:
<?php $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'STREAM_URL');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($curl, $data)
{ // 處理獲得的數(shù)據(jù)
echo $data;
return strlen($data); });
curl_exec($ch);
curl_close($ch); ?> 其中,STREAM_URL 代表 OpenAI 的 stream URL 地址。這段代碼會(huì)將數(shù)據(jù)逐步地寫到屏幕上。
相應(yīng)的,接收stream數(shù)據(jù)的Java代碼示例如下:
import java.net.*;
import java.io.*;
public class StreamReceiver {
public static void main(String[] args) throws Exception
{ URL streamURL = new URL("STREAM_URL");
try (
BufferedReader reader = new BufferedReader( new InputStreamReader(streamURL.openStream())))
{ String line;
while ((line = reader.readLine()) != null)
{ // 處理獲得的數(shù)據(jù) System.out.println(line);
}
}
}
} 同樣的,STREAM_URL 代表 OpenAI 的 stream URL 地址。這段代碼會(huì)將數(shù)據(jù)逐步地輸出到命令行界面上
PHP代碼示例:
<?php // 請(qǐng)求OpenAI接口獲取stream數(shù)據(jù),并轉(zhuǎn)發(fā)到H5頁(yè)面端
$openAIUrl = 'https://api.openai.com/v1/engines/davinci-codex/completions'; $headers = array( 'Content-Type: application/json', 'Authorization: Bearer <YOUR_API_KEY>' );
$data = array( 'prompt' => 'Hello, world!', 'max_tokens' => 5, 'temperature' => 0.7 );
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $openAIUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$output = fopen('php://output', 'w');
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($ch, $chunk) use ($output) { fwrite($output, $chunk);
return strlen($chunk); });
curl_exec($ch);
fclose($output); // 將stream數(shù)據(jù)轉(zhuǎn)發(fā)給H5頁(yè)面端
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');
header('Access-Control-Allow-Origin: *');
fpassthru($output); Java代碼示例:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(asyncSupported = true, urlPatterns = {"/stream"})
public class StreamServlet extends HttpServlet
{
private static final ExecutorService executor = Executors.newCachedThreadPool();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 創(chuàng)建異步上下文
AsyncContext asyncContext = request.startAsync(); // 提交任務(wù)到線程池
executor.submit(() -> { try {
// 請(qǐng)求OpenAI接口獲取stream數(shù)據(jù)
URL url = new URL("https://api.openai.com/v1/engines/davinci-codex/completions");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("Authorization", "Bearer <YOUR_API_KEY>"); conn.setDoOutput(true);
OutputStream out = conn.getOutputStream();
out.write("{\"prompt\": \"Hello, world!\", \"max_tokens\": 5, \"temperature\": 0.7}".getBytes());
out.flush();
out.close();
InputStream in = conn.getInputStream();
response.setContentType("text/event-stream");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Connection", "keep-alive");
response.setHeader("Access-Control-Allow-Origin", "*");
byte[] buffer = new byte[1024];
int count;
while ((count = in.read(buffer)) != -1) {
// 將stream數(shù)據(jù)轉(zhuǎn)發(fā)給H5頁(yè)面端
OutputStream outputStream = asyncContext.getResponse().getOutputStream();
String data = new String(buffer, 0, count);
outputStream.write(("data: " + data + "\n\n").getBytes());
outputStream.flush(); } in.close(); }
catch (IOException e) { e.printStackTrace(); }
finally { asyncContext.complete(); } }); } } Python代碼示例:
import requests from flask
import Flask, Response app = Flask(__name__) @app.route('/stream')
def stream(): # 請(qǐng)求OpenAI接口獲取stream數(shù)據(jù)
url = 'https://api.openai.com/v1/engines/davinci-codex/completions'
headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer <YOUR_API_KEY>' }
data = { 'prompt': 'Hello, world!', 'max_tokens': 5, 'temperature': 0.7 } res = requests.post(url, headers=headers, json=data, stream=True)
# 將stream數(shù)據(jù)轉(zhuǎn)發(fā)給H5頁(yè)面端
def generate():
for chunk in res.iter_content(chunk_size=1024):
if chunk: yield 'data: ' + chunk.decode() + '\n\n'
return Response(generate(), mimetype='text/event-stream', headers={ 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'Access-Control-Allow-Origin': '*' })
if __name__ == '__main__':
app.run() 注意:以上代碼僅供參考,具體實(shí)現(xiàn)需要根據(jù)自己的業(yè)務(wù)需求進(jìn)行適當(dāng)修改。
如何讓前端Html能顯示mardown格式
要在前端HTML中顯示Markdown格式,您可以使用一個(gè)叫做Markdown解析器的庫(kù)或工具。下面是一個(gè)簡(jiǎn)單的例子:
1.首先,通過(guò)CDN或?qū)⑵湎螺d到本地文件夾中,引入一個(gè)Markdown解析器庫(kù),比如marked.js。
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
在頁(yè)面上添加一個(gè)textarea標(biāo)簽用于輸入Markdown格式的文本,添加一個(gè)div標(biāo)簽用于顯示解析后的HTML內(nèi)容。
<textarea id="mdInput"></textarea> <div id="htmlOutput"></div>
在JavaScript中獲取textarea的值,將其傳遞給Markdown解析器,并將輸出的HTML代碼插入到div中。
var markdown = document.getElementById('mdInput').value;
var html = marked(markdown);
document.getElementById('htmlOutput').innerHTML = html; 這樣就可以在瀏覽器中顯示Markdown格式的文本了。
類似于ChatGPT網(wǎng)站使用Node.js中的流(Stream)處理技術(shù)將輸出轉(zhuǎn)換成markdown格式。
流是一種在處理大量數(shù)據(jù)時(shí)很有用的技術(shù),它允許以逐塊的方式處理數(shù)據(jù)而不必等待加載整個(gè)數(shù)據(jù)集。 在ChatGPT網(wǎng)站中,可能使用了類似于以下代碼的方法來(lái)將輸出流轉(zhuǎn)換為markdown格式:
const markdown = require('markdown').markdown;
const stream = require('stream');
const outputStream = new stream.Writable({
write(chunk, encoding, callback) {
const text = chunk.toString();
const markdownText = markdown.toHTML(text);
process.stdout.write(markdownText);
callback(); },
});
// Stream output to markdown formatter
originalOutputStream.pipe(outputStream); 在這個(gè)代碼示例中,markdown庫(kù)用于將輸入的純文本轉(zhuǎn)換為Markdown格式。一個(gè)Writable可寫流用于接收輸出,并將其轉(zhuǎn)換為Markdown格式并將其發(fā)送到標(biāo)準(zhǔn)輸出流(process.stdout.write())。最后將原始輸出流(originalOutputStream)連接到新的可寫流(outputStream),并通過(guò)該管道輸出到標(biāo)準(zhǔn)輸出流。 這只是一個(gè)簡(jiǎn)單的示例,實(shí)際上,ChatGPT網(wǎng)站可能使用更復(fù)雜的技術(shù)來(lái)流式處理并轉(zhuǎn)換輸出到Markdown格式
到此這篇關(guān)于如何配置openai的返回Stream數(shù)據(jù)并轉(zhuǎn)發(fā)到h5頁(yè)面按markdown格式流式輸出的文章就介紹到這了,更多相關(guān)openai返回Stream數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ol7.7安裝部署4節(jié)點(diǎn)hadoop 3.2.1分布式集群學(xué)習(xí)環(huán)境的詳細(xì)教程
這篇文章主要介紹了ol7.7安裝部署4節(jié)點(diǎn)hadoop 3.2.1分布式集群學(xué)習(xí)環(huán)境,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
AIGC與虛擬現(xiàn)實(shí)(VR)的結(jié)合與應(yīng)用前景分析
隨著AIGC與VR技術(shù)的不斷進(jìn)步,兩者的結(jié)合為教育、娛樂(lè)、醫(yī)療等領(lǐng)域帶來(lái)了新機(jī)遇,AIGC可以自動(dòng)生成文本、圖像等內(nèi)容,結(jié)合VR技術(shù),為用戶提供更加豐富和互動(dòng)的體驗(yàn),本文探討了AIGC與VR的結(jié)合方式、應(yīng)用案例和未來(lái)發(fā)展趨勢(shì)2024-11-11
Elasticsearch在應(yīng)用中常見(jiàn)錯(cuò)誤示例解析
這篇文章主要為大家介紹了Elasticsearch在應(yīng)用中常見(jiàn)錯(cuò)誤示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
百度HI QQ和MSN 阿里旺旺貿(mào)易通MSN在線客服在線聊天代碼
有時(shí)候業(yè)務(wù)需要,需要讓客戶更方便的與我們溝通,就可以參考下面的代碼。2010-04-04
qqwry.dat的數(shù)據(jù)結(jié)構(gòu)圖文解釋
QQwry.dat可以看作是一種數(shù)據(jù)文件,通過(guò)它能完成以下任務(wù)2009-02-02
支付寶小程序向用戶發(fā)紅包的實(shí)現(xiàn)方法
這篇文章主要介紹了支付寶小程序向用戶發(fā)紅包的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11

