const response = await fetch('https://api.openai.com/v1/completions', {

method: 'POST',
headers: {

'Content-Type': 'application/json',
'Authorization': Bearer YOUR_API_KEY }, body: JSON.stringify({ model: 'gpt-4', prompt: prompt, stream: true // 啟用流式響應(yīng) }) }); // 檢查響應(yīng)狀態(tài) if (!response.ok) { throw new Error('Network response was not ok'); } // 獲取響應(yīng)的可讀流并處理流數(shù)據(jù) const reader = response.body.getReader(); const decoder = new TextDecoder('utf-8'); let done = false; while (!done) { // 讀取流中的下一個(gè)數(shù)據(jù)塊 const { value, done: readerDone } = await reader.read(); done = readerDone; // 將數(shù)據(jù)塊解碼為字符串 const chunk = decoder.decode(value, { stream: true }); console.log(chunk); // 處理或顯示每一塊數(shù)據(jù) // ***** 這需要注意,各個(gè)大模型的分塊數(shù)據(jù)結(jié)構(gòu)可能不一樣,甚至?xí)锌赡艹霈F(xiàn)部分?jǐn)?shù)據(jù)的情況,要單獨(dú)兼容和處理哦 // 以及有些模型內(nèi)容的路徑不一樣,一次性響應(yīng)在content,但是流式在delta字段下 } };

1. 請(qǐng)求設(shè)置:

2. 讀取流數(shù)據(jù):

3. 逐塊處理數(shù)據(jù):

三、前端如何處理流式響應(yīng)?

當(dāng)后端返回流式響應(yīng)時(shí),前端可以逐步接收并更新UI,提供更好的用戶交互體驗(yàn)。以下是前端處理流式響應(yīng)的關(guān)鍵步驟。

1.?逐步更新界面

每當(dāng)接收到一個(gè)新的數(shù)據(jù)塊,前端可以立即將其更新到UI上,而不必等待完整的響應(yīng)。這種實(shí)時(shí)更新的機(jī)制對(duì)于聊天機(jī)器人、搜索建議等場(chǎng)景尤為重要。例如:

const chatBox = document.getElementById('chat-box');

const updateChat = (text) => {

// 將新數(shù)據(jù)塊追加到界面上
chatBox.innerHTML += `<p>${
text}</p>`;
};

// 在逐塊接收時(shí)更新
while (!done) {

const {
value, done: readerDone } = await reader.read();
const chunk = decoder.decode(value, {
stream: true });
updateChat(chunk); // 實(shí)時(shí)更新聊天框
}

通過這種方式,用戶能夠看到模型生成內(nèi)容的部分結(jié)果,即使整個(gè)請(qǐng)求尚未完成,提升了用戶體驗(yàn)。

2.?處理中斷或錯(cuò)誤

在流式調(diào)用中,網(wǎng)絡(luò)連接可能會(huì)中斷,或者服務(wù)器可能會(huì)返回錯(cuò)誤。前端應(yīng)該做好錯(cuò)誤處理,例如:

if (!response.ok) {

console.error('Error with the request');
return;
}

reader.read().then(processStream).catch(error => {

console.error('Error while reading stream:', error);
});

在中斷時(shí),前端可以選擇顯示錯(cuò)誤消息,或嘗試重新發(fā)起請(qǐng)求以重新建立連接。

3.?流數(shù)據(jù)的拼接與處理

由于流傳輸?shù)臄?shù)據(jù)是分塊發(fā)送的,前端可能需要將這些分段數(shù)據(jù)拼接起來,形成完整的響應(yīng)。例如:

let fullResponse = '';

while (!done) {

const {
value, done: readerDone } = await reader.read();
const chunk = decoder.decode(value, {
stream: true });
fullResponse += chunk; // 拼接完整響應(yīng)
}

4.?自動(dòng)滾動(dòng)和用戶交互優(yōu)化

對(duì)于聊天機(jī)器人或類似應(yīng)用,前端可以設(shè)置自動(dòng)滾動(dòng),使得用戶在流式數(shù)據(jù)逐步加載時(shí)能夠始終看到最新的內(nèi)容。

const scrollToBottom = () => {

chatBox.scrollTop = chatBox.scrollHeight;
};

updateChat(chunk);
scrollToBottom(); // 更新后自動(dòng)滾動(dòng)

四、流式調(diào)用的優(yōu)勢(shì)

  1. 提升用戶體驗(yàn):通過流式傳輸,用戶能夠?qū)崟r(shí)看到部分生成的內(nèi)容,而不需要等待整個(gè)模型生成完畢,從而減少了感知延遲。
  2. 減少服務(wù)器壓力:在某些場(chǎng)景下,流式調(diào)用可以減少服務(wù)器壓力,因?yàn)榉?wù)器可以按需逐步處理和發(fā)送數(shù)據(jù),而不需要一次性生成和發(fā)送大量數(shù)據(jù)。
  3. 增強(qiáng)交互性:用戶能夠根據(jù)逐步收到的內(nèi)容進(jìn)行進(jìn)一步操作,如在對(duì)話中實(shí)時(shí)反饋等。

五、總結(jié)

HTTP API流式調(diào)用為大語言模型的響應(yīng)提供了更高效和實(shí)時(shí)的交互方式。通過流式調(diào)用,前端可以逐步接收模型生成的部分?jǐn)?shù)據(jù),并即時(shí)呈現(xiàn),從而提升用戶體驗(yàn)。前端在實(shí)現(xiàn)流式調(diào)用時(shí),需要處理數(shù)據(jù)分塊的拼接、實(shí)時(shí)更新界面和處理可能的中斷錯(cuò)誤。通過這種方式,可以在交互密集的應(yīng)用場(chǎng)景(如聊天機(jī)器人、自動(dòng)化助手等)中大幅改善用戶的使用體驗(yàn)。

文章轉(zhuǎn)自微信公眾號(hào)@阿里云開發(fā)者

上一篇:

手搓AI智能體實(shí)戰(zhàn)經(jīng)驗(yàn)

下一篇:

GraphRAG:基于PolarDB+通義千問api+LangChain的知識(shí)圖譜定制實(shí)踐
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)