99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

H5 AI聊天流式響應(yīng)實(shí)戰(zhàn):SSE解析、打字機(jī)渲染與性能優(yōu)化

H5 AI聊天流式響應(yīng)實(shí)戰(zhàn):SSE解析、打字機(jī)渲染與性能優(yōu)化 1. 別急著接SDK先搞清楚H5里的AI流式響應(yīng)到底卡在哪做AI聊天功能很多前端朋友第一次接后端流式接口時(shí)都會(huì)遇到同一個(gè)困惑明明后端數(shù)據(jù)是一段一段吐出來(lái)的自己也用了EventSource或者fetch的ReadableStream頁(yè)面上的效果卻還是像憋大招——等好幾秒才一次性蹦出一整段文字中間沒有任何逐字出現(xiàn)的過(guò)程。我早先在給某模擬項(xiàng)目X做移動(dòng)端H5客服助手時(shí)也踩過(guò)這個(gè)坑。后來(lái)把整個(gè)鏈路從網(wǎng)絡(luò)層、數(shù)據(jù)解析層到渲染層全捋了一遍才明白H5里處理AI聊天流式數(shù)據(jù)難點(diǎn)根本不在怎么拿到流而在拿到流之后怎么低成本地解析、按節(jié)奏渲染、并且在弱網(wǎng)和中途打斷時(shí)不讓體驗(yàn)崩掉。這篇文章不聊怎么調(diào)大模型API也不聊后端的SSE怎么發(fā)專注講前端H5這一側(cè)的事。內(nèi)容包括為什么response.body拿到的流不能被直接await完再處理流式數(shù)據(jù)解析時(shí)最容易做錯(cuò)的TextDecoder用法打字機(jī)效果為什么不能簡(jiǎn)單setInterval以及正確的節(jié)流方案用戶點(diǎn)擊停止生成后前端需要做哪些清理動(dòng)作長(zhǎng)文本高算量場(chǎng)景下怎么避免頁(yè)面卡頓、白屏、內(nèi)存暴漲弱網(wǎng)、異常中斷、半截JSON這些臟數(shù)據(jù)怎么兜底整體思路適合已經(jīng)會(huì)用fetch、了解Promise基礎(chǔ)的前端開發(fā)者如果你正在做AI對(duì)話類產(chǎn)品照著這篇文章可以少走不少?gòu)澛贰?. 流式方案選型SSE與WebSocket別一上來(lái)就選WebSocket先講一個(gè)容易被帶偏的選型問(wèn)題。很多人聽到流式就覺得必須上WebSocket實(shí)際上AI聊天場(chǎng)景大多數(shù)后端都提供的是SSEServer-Sent Events這是一種基于HTTP的推送協(xié)議服務(wù)端可以持續(xù)向客戶端發(fā)送數(shù)據(jù)直到主動(dòng)斷開。2.1 為什么說(shuō)SSE在AI聊天場(chǎng)景往往更合適從對(duì)話需求看AI聊天是用戶請(qǐng)求一次模型回復(fù)一次的單向長(zhǎng)連接服務(wù)端向客戶端持續(xù)輸出內(nèi)容。SSE天生就是干這個(gè)的它復(fù)用HTTP協(xié)議不需要額外的握手協(xié)議而且有自動(dòng)重連機(jī)制。實(shí)現(xiàn)起來(lái)也簡(jiǎn)單后端不需要維護(hù)狀態(tài)化的連接池。舉個(gè)例子有次我接一個(gè)快速原型后端同事臨時(shí)用Node寫了兼容OpenAI格式的流式接口返回的是text/event-stream我用fetch就能直接消費(fèi)前后端聯(lián)調(diào)一共花了不到半小時(shí)。如果這時(shí)候換成WebSocket得處理連接建立、心跳?;?、消息編解碼明顯更重。WebSocket真正適合的是雙向高頻交互場(chǎng)景比如在線協(xié)作、多人同步、實(shí)時(shí)游戲互相發(fā)指令。聊天里大多數(shù)情況都是用戶發(fā)一句、AI回一段雙方并行的概率很低用WebSocket屬于殺雞用牛刀。所以如果后端已經(jīng)提供了SSE接口H5前端直接用就好。如果后端硬要WebSocket那就需要評(píng)估是否真的有雙向低延遲通信的需求沒有的話可以堅(jiān)持一下SSE。2.2 用fetch消費(fèi)SSE流比EventSource好在哪瀏覽器原生有個(gè)EventSource只能做GET請(qǐng)求而且不能自定義請(qǐng)求頭。AI場(chǎng)景里常需要帶Token鑒權(quán)、傳用戶ID、指定模型參數(shù)這些用EventSource基本沒法玩。因此更通用的做法是用fetch配合ReadableStream處理。fetch(/api/chat/stream, { method: POST, headers: { Content-Type: application/json, Authorization: Bearer ${token}, }, body: JSON.stringify({ prompt: 你好 }), signal: AbortSignal.timeout(60000), }).then((response) { if (!response.ok) { throw new Error(HTTP ${response.status}) } // response.body 是 ReadableStream可以持續(xù)讀取 return response.body.getReader() })這樣做的好處是請(qǐng)求方式、請(qǐng)求頭、超時(shí)控制、中斷信號(hào)全部都能自己掌握。缺點(diǎn)是需要自己解析SSE格式的數(shù)據(jù)但解析邏輯并不復(fù)雜下面會(huì)講。3. SSE數(shù)據(jù)流的完整處理鏈路從原始字節(jié)到UI文字拿到ReadableStream只是第一步接下來(lái)要做的核心事情有三個(gè)解碼字節(jié)、切分事件幀、解析JSON載荷。3.1 字節(jié)解碼必須用TextDecoder且要設(shè)置stream為trueReadableStream默認(rèn)輸出的是Uint8Array字節(jié)塊。如果直接用new TextDecoder().decode(chunk)在中文內(nèi)容里會(huì)出現(xiàn)亂碼因?yàn)橐粋€(gè)漢字通常是3個(gè)字節(jié)流式傳輸時(shí)可能把一個(gè)字的字節(jié)切到兩個(gè)chunk里。正確做法是const decoder new TextDecoder(utf-8) while (true) { const { value, done } await reader.read() if (done) break const text decoder.decode(value, { stream: true }) // 注意這里的 { stream: true }避免跨chunk的字節(jié)被截?cái)?} // 最后一定要再調(diào)一次 decoder.decode()清空緩沖區(qū) const rest decoder.decode()TextDecoder加stream: true后會(huì)把沒湊完整的多字節(jié)字符緩存起來(lái)下一次decode時(shí)再拼接這樣切在任意位置的漢字都能正確還原。這是流式解析最容易踩的一個(gè)坑很多問(wèn)為什么AI回答里偶爾出現(xiàn)一個(gè)亂碼字的問(wèn)題根因就在這里。3.2 SSE事件幀的邊界切分SSE協(xié)議規(guī)定消息之間用空行\(zhòng)n\n分隔每條事件可以包含多行形如data: {choices:[{delta:{content:你}}]} data: {choices:[{delta:{content:好}}]}所以拿到字符串后需要按雙換行切塊再逐行處理。每行以data:開頭的才是有效載荷需要去掉前綴再解析。function parseSSEChunk(text) { const blocks text.split(\n\n) const events [] for (const block of blocks) { const lines block.split(\n) const dataLines lines.filter((l) l.startsWith(data:)) if (!dataLines.length) continue const data dataLines.map((l) l.slice(5).trim()).join(\n) if (data [DONE]) continue try { const json JSON.parse(data) events.push(json) } catch (e) { // 半截JSON直接丟棄等下一個(gè)塊繼續(xù) } } return events }注意兩點(diǎn)一是同一事件的數(shù)據(jù)行可能有多行需要拼起來(lái)再解析二是[DONE]這種結(jié)束標(biāo)記有些后端會(huì)發(fā)有些不發(fā)前端最好都能兼容。提示我在接入過(guò)程中發(fā)現(xiàn)不同的后端框架對(duì)SSE的格式實(shí)現(xiàn)略有差異。有的會(huì)在每條消息后發(fā)\r\n\r\n有的只發(fā)\n\n有的會(huì)把data:寫成data全角冒號(hào)這是后端bug。解析時(shí)最好統(tǒng)一做一下兼容處理比如把\r\n先替換成\n再按\n\n切分。3.3 增量?jī)?nèi)容與最終消息的區(qū)分現(xiàn)在主流的大模型流式接口比如OpenAI兼容協(xié)議返回格式通常是choices[0].delta.content。delta是增量就是說(shuō)每次事件里只有新增的幾個(gè)字。不過(guò)實(shí)際項(xiàng)目中有三種情況純?cè)隽磕J矫繋挥行略鰞?nèi)容前端直接追加渲染全量疊加模式每幀帶的是到當(dāng)前為止的完整內(nèi)容前端要整體替換兩者混合有的幀是增量有的幀是全量比如角色信息、工具調(diào)用我在處理某圖像處理Demo的對(duì)話日志時(shí)遇到過(guò)混用的情況。穩(wěn)妥做法是維護(hù)一個(gè)狀態(tài)字段判斷后端返回的是delta還是message分別走追加和替換邏輯。如果不做區(qū)分用戶會(huì)看到AI回答的同一段文字被反復(fù)重繪閃得厲害。4. 打字機(jī)渲染的正確姿勢(shì)從無(wú)腦追加到幀率控制的演進(jìn)流式數(shù)據(jù)解析出來(lái)了如果直接把每段文字appendChild或者textContent 在桌面端可能還好但H5頁(yè)面在手機(jī)上極容易卡頓。因?yàn)槊繋瑪?shù)據(jù)到達(dá)頻率可能高達(dá)每30ms一次而瀏覽器渲染一幀的時(shí)間一般是16.6ms全量重繪根本吃不消。更合理的方式是實(shí)現(xiàn)一個(gè)消息隊(duì)列 定時(shí)刷盤的渲染機(jī)制。4.1 數(shù)據(jù)到達(dá)頻率與渲染頻率解耦核心思路是把從網(wǎng)絡(luò)到達(dá)的數(shù)據(jù)推入一個(gè)緩沖區(qū)然后用requestAnimationFrame控制渲染節(jié)奏每幀只把緩沖區(qū)里攢下的內(nèi)容一次性渲染到頁(yè)面上。function createTypingStream(onContent) { let buffer let scheduled false function flush() { if (!buffer) { scheduled false return } const text buffer buffer scheduled false onContent(text) // 在這里把 content 追加到頁(yè)面節(jié)點(diǎn) } return { push(text) { buffer text if (!scheduled) { scheduled true requestAnimationFrame(flush) } }, end() { flush() } } }這樣做的好處在于即便后端一秒鐘推送了30個(gè)片段頁(yè)面也只會(huì)跟隨屏幕刷新率重繪頂多每秒60次。而且requestAnimationFrame在標(biāo)簽頁(yè)切到后臺(tái)時(shí)會(huì)自動(dòng)暫停不會(huì)空耗性能。實(shí)際測(cè)試下來(lái)長(zhǎng)對(duì)話頁(yè)面文字滾動(dòng)順滑很多幀數(shù)從掉到20幀提升到穩(wěn)定55幀以上。4.2 不做防抖會(huì)帶來(lái)什么問(wèn)題有朋友會(huì)問(wèn)我直接用setTimeout防抖不行嗎其實(shí)也行但有一些小問(wèn)題setTimeout的延遲時(shí)間如果設(shè)得太短比如50ms遇到高頻數(shù)據(jù)仍可能堆積如果設(shè)得太長(zhǎng)比如300ms用戶能看到明顯的一頓一頓效果觀感變差頁(yè)面切換到后臺(tái)時(shí)setTimeout還是會(huì)跑不必要的計(jì)算仍然發(fā)生requestAnimationFrame則剛好跟著顯示器的節(jié)奏走而且切后臺(tái)自動(dòng)暫停。唯一要注意的是它不一定每秒恰好60次有些高刷手機(jī)是90幀、120幀但這不影響使用因?yàn)榱魇轿谋咀芳颖緛?lái)不需要嚴(yán)格等間隔。4.3 快速滾動(dòng)的處理聊天過(guò)程中用戶通常希望最新的文字自動(dòng)出現(xiàn)在視口里這時(shí)需要控制滾動(dòng)容器到底部。但如果每一幀都滾動(dòng)一次連續(xù)滾動(dòng)會(huì)帶來(lái)比較大的性能開銷而且有可能打斷用戶正在往上翻看歷史記錄的操作。我的做法是記錄用戶是否在視口底部只有用戶停留在底部時(shí)才執(zhí)行滾動(dòng)。如果用戶上翻查看歷史內(nèi)容自動(dòng)滾動(dòng)立即停止。function scrollToBottomIfNeeded(container) { const distance container.scrollHeight - container.scrollTop - container.clientHeight if (distance 24) { container.scrollTop container.scrollHeight } }這個(gè)距離底部小于24px才滾動(dòng)的閾值是我試出來(lái)的個(gè)人經(jīng)驗(yàn)值不同設(shè)計(jì)可以微調(diào)。核心目的是避免不分情況強(qiáng)制滾動(dòng)造成的糟糕體驗(yàn)。5. 流式對(duì)話中停止生成按鈕從信號(hào)傳遞到資源回收的完整鏈路AI流式對(duì)話的一個(gè)剛需功能是用戶覺得AI答得太啰嗦、方向不對(duì)點(diǎn)一下停止請(qǐng)求立刻中斷后面沒吐完的內(nèi)容全部丟棄頁(yè)面停留在已有文字上。5.1 AbortController的正確用法fetch支持通過(guò)AbortController中斷請(qǐng)求。比較穩(wěn)妥的做法是將controller存到組件的實(shí)例或者一個(gè)全局管理Map里點(diǎn)擊停止時(shí)調(diào)用abortconst controller new AbortController() fetch(/api/chat/stream, { signal: controller.signal, }) // 停止生成 function stopGenerate() { controller.abort() }有個(gè)細(xì)節(jié)是abort之后reader.read()會(huì)拋出一個(gè)AbortError的DOMException需要在循環(huán)里捕獲并當(dāng)作正常結(jié)束來(lái)處理而不是把它傳到全局錯(cuò)誤處理。while (true) { try { const { value, done } await reader.read() if (done) break // 處理數(shù)據(jù) } catch (err) { if (err.name AbortError) { break // 用戶主動(dòng)中斷正常結(jié)束 } throw err } }5.2 中斷后的狀態(tài)清理中斷不能只停留在請(qǐng)求斷了界面上還有幾件事要同步處理把停止生成按鈕隱藏/禁用恢復(fù)可以輸入的狀態(tài)如果有加載動(dòng)畫、光標(biāo)閃爍動(dòng)畫要停掉當(dāng)前AI消息的正在生成標(biāo)記要置為完成如果有聲音提示、震動(dòng)反饋也要在這里處理我在模擬項(xiàng)目X里用過(guò)一個(gè)簡(jiǎn)單的狀態(tài)機(jī)idle-streaming-done/aborted。任何狀態(tài)下點(diǎn)停止都只允許從streaming流轉(zhuǎn)到aborted避免連點(diǎn)兩次造成重復(fù)的abort操作。5.3 結(jié)束標(biāo)記的處理不能依賴[DONE]前面提過(guò)不同的后端實(shí)現(xiàn)里流結(jié)束的標(biāo)記不同。有的會(huì)發(fā)一行data: [DONE]有的會(huì)在傳輸完畢后正常關(guān)閉流done為true還有的會(huì)直接斷開連接導(dǎo)致瀏覽器出現(xiàn)網(wǎng)絡(luò)錯(cuò)誤。所以不能把[DONE]當(dāng)作唯一的結(jié)束判定。我在實(shí)現(xiàn)里是同時(shí)監(jiān)聽兩個(gè)信號(hào)parser是否收到[DONE]reader是否返回done: true兩者只要有一個(gè)觸發(fā)都進(jìn)入結(jié)束流程。另外還要設(shè)置一個(gè)兜底的超時(shí)時(shí)間比如60秒無(wú)數(shù)據(jù)自動(dòng)結(jié)束或者報(bào)錯(cuò)避免后端進(jìn)程掛死、連接半開不閉導(dǎo)致的永遠(yuǎn)加載中。6. 長(zhǎng)文本渲染性能從DOM追加到虛擬滾動(dòng)與CSS處理AI聊天很容易出現(xiàn)幾千字的長(zhǎng)回復(fù)尤其在H5里連續(xù)把幾千字全部渲染進(jìn)頁(yè)面會(huì)出現(xiàn)卡頓和內(nèi)存占用暴漲。這不是React或Vue的錯(cuò)根源是瀏覽器在渲染大文本、重排長(zhǎng)列表時(shí)的天然開銷。6.1 消息節(jié)點(diǎn)不要無(wú)腦重建很多框架寫法是setState({ text: currentText })每次流式內(nèi)容更新都把整個(gè)消息組件重新渲染。高頻更新下組件Diff和DOM重建開銷巨大在低端安卓機(jī)上會(huì)非常明顯。一個(gè)比較實(shí)用的優(yōu)化是把消息拆成外殼節(jié)點(diǎn)和內(nèi)容節(jié)點(diǎn)外殼不隨內(nèi)容頻繁變更內(nèi)容節(jié)點(diǎn)只更新自己的textContent。如果用的是原生DOM操作直接對(duì)現(xiàn)有節(jié)點(diǎn)做textContent增量追加跳過(guò)內(nèi)層模板渲染。如果是Vue/React可以用v-html直接操作已存在節(jié)點(diǎn)但要非常注意XSS風(fēng)險(xiǎn)AI內(nèi)容不確定來(lái)源不建議直接v-html。我實(shí)際比較推薦的做法是要顯示的文本在進(jìn)入渲染前做一次純文本化處理把、轉(zhuǎn)義代碼塊內(nèi)容轉(zhuǎn)成受控的富文本節(jié)點(diǎn)。這樣既避免XSS也避免每次更新時(shí)全量解析HTML導(dǎo)致的性能問(wèn)題。6.2 虛擬滾動(dòng)不是第一優(yōu)先級(jí)的方案有人會(huì)說(shuō)幾千字文本為什么不直接上虛擬滾動(dòng)我的經(jīng)驗(yàn)是虛擬滾動(dòng)對(duì)很多條短消息的場(chǎng)景價(jià)值大對(duì)一條超長(zhǎng)消息的場(chǎng)景價(jià)值反而有限。因?yàn)樗獙?shí)時(shí)計(jì)算每個(gè)節(jié)點(diǎn)的高度而流式文本高度在動(dòng)態(tài)變化中虛擬列表很容易頻繁觸發(fā)重算復(fù)雜度很高。如果真遇到超長(zhǎng)文本更簡(jiǎn)單的做法是對(duì)單條消息的內(nèi)容做折疊/展開處理超過(guò)一定字?jǐn)?shù)自動(dòng)折疊把代碼塊、長(zhǎng)JSON等獨(dú)立節(jié)點(diǎn)懶渲染滾動(dòng)到可視區(qū)附近再填充內(nèi)容6.3 文本節(jié)點(diǎn)拆分與樣式隔離流式文本如果包含Markdown比較穩(wěn)妥的做法是分塊渲染先渲染純文本按照markdown規(guī)則解析的節(jié)點(diǎn)再對(duì)代碼塊等特殊部分單獨(dú)處理。流式更新時(shí)如果每次都重新解析全文在長(zhǎng)文本下代價(jià)很大。我的一個(gè)優(yōu)化技巧是解析器按一定規(guī)則將內(nèi)容切分成純文本段落和特殊塊代碼/表格/公式每次增量到達(dá)只更新最后一個(gè)未閉合的段落塊已閉合的段落塊不再重新解析。這讓長(zhǎng)文本流式解析的CPU占用下降了將近一半。7. 弱網(wǎng)、半截JSON與異常中斷的兜底策略真實(shí)線上環(huán)境比調(diào)試環(huán)境復(fù)雜得多弱網(wǎng)、代理超時(shí)、后端重啟、進(jìn)程OOM都會(huì)把好好的SSE流搞得亂七八糟。處理流式數(shù)據(jù)時(shí)以下問(wèn)題要提前想到。7.1 半截JSON的容錯(cuò)前面解析SSE時(shí)提到半截JSON要直接丟棄。但有一種情況是一個(gè)SSE事件本身沒傳完連接就斷了解析器在下一輪才收到剩余字節(jié)。這時(shí)不能讓解析狀態(tài)錯(cuò)亂。做法是引入一個(gè)pendingText變量把每次decode出來(lái)的字符串先和之前的殘留拼到一起再做分塊解析。解析不掉的尾巴繼續(xù)留給下一輪。如果連接最終中斷殘留在緩沖區(qū)里的數(shù)據(jù)直接清空不回顯給用戶。7.2 自動(dòng)重連與續(xù)傳的取舍有些場(chǎng)景希望斷網(wǎng)后自動(dòng)重連并繼續(xù)生成。這對(duì)AI對(duì)話來(lái)說(shuō)會(huì)比較麻煩因?yàn)楹蠖舜竽P偷臓顟B(tài)可能已經(jīng)丟失重連后重新發(fā)起請(qǐng)求可能會(huì)重復(fù)生成。所以在對(duì)話場(chǎng)景里我通常選擇不自動(dòng)續(xù)傳、只提示用戶可重新發(fā)送反而更簡(jiǎn)單穩(wěn)妥。如果你的產(chǎn)品確實(shí)需要斷線續(xù)傳比如長(zhǎng)文檔生成那得前后端配合前端記錄已渲染文本的字符數(shù)后端支持從指定偏移量恢復(fù)。這一個(gè)功能設(shè)計(jì)量不小前端側(cè)只能作為輔助。7.3 半程無(wú)數(shù)據(jù)時(shí)的超時(shí)與心跳SSE連接建立后如果長(zhǎng)時(shí)間沒有任何數(shù)據(jù)到達(dá)要區(qū)分是模型在思考還是連接已死。最直接的方法記錄最后一條數(shù)據(jù)到達(dá)的時(shí)間每5秒檢查一次。如果超過(guò)閾值無(wú)數(shù)據(jù)先嘗試發(fā)一個(gè)ping到后端仍無(wú)響應(yīng)則判定超時(shí)。閾值我習(xí)慣設(shè)為30秒因?yàn)槟承┐竽P退伎紩r(shí)間確實(shí)較長(zhǎng)但一般不會(huì)超過(guò)這個(gè)值。setInterval(() { if (Date.now() - lastDataTime 30000) { controller.abort() showError(響應(yīng)超時(shí)請(qǐng)稍后重試) } }, 5000)注意這個(gè)定時(shí)器在消息完成后記得清除不然頁(yè)面停留也會(huì)一直跑。7.4 后端報(bào)錯(cuò)與半程HTTP狀態(tài)碼SSE流有個(gè)特點(diǎn)HTTP狀態(tài)碼通常是在連接建立時(shí)就返回了200后續(xù)的錯(cuò)誤只能靠流內(nèi)部傳遞。但有一種情況是網(wǎng)關(guān)層在流式傳輸中途返回錯(cuò)誤比如401過(guò)期這時(shí)response.body可能正常但后續(xù)沒有數(shù)據(jù)。前端一定要監(jiān)聽兩個(gè)點(diǎn)response.ok為false時(shí)直接走錯(cuò)誤處理不要嘗試讀流流讀取過(guò)程中reader.read()拋出異常要區(qū)分是網(wǎng)絡(luò)錯(cuò)誤還是協(xié)議錯(cuò)誤分別展示不同的提示文案注意在H5弱網(wǎng)場(chǎng)景里有時(shí)read()會(huì)拋TypeError: Failed to fetch這種錯(cuò)誤通常不是后端邏輯問(wèn)題而是網(wǎng)關(guān)或?yàn)g覽器層斷連。提示用戶網(wǎng)絡(luò)連接不穩(wěn)定比服務(wù)器錯(cuò)誤更準(zhǔn)確也更友好。8. 關(guān)于狀態(tài)管理、并發(fā)對(duì)話與緩存去重聊完底層最后串一下上層設(shè)計(jì)。8.1 并發(fā)對(duì)話的管理有些AI產(chǎn)品允許同時(shí)開多個(gè)對(duì)話窗口此時(shí)如果用戶快速切換舊的流式請(qǐng)求還在跑新窗口又發(fā)起請(qǐng)求容易出現(xiàn)狀態(tài)串臺(tái)。我建議維護(hù)一個(gè)Mapkey是會(huì)話IDvalue是AbortController。切走會(huì)話時(shí)通知用戶生成仍在繼續(xù)切回時(shí)數(shù)據(jù)還在累積如果用戶關(guān)閉會(huì)話則直接abort回收。8.2 消息滾動(dòng)的去重流式追加時(shí)偶爾會(huì)出現(xiàn)重復(fù)內(nèi)容。原因可能是后端重試、網(wǎng)關(guān)重發(fā)或者前端在重連后重復(fù)處理了同一事件。前端可以在追加時(shí)做一個(gè)簡(jiǎn)單校驗(yàn)記錄已渲染的末尾字符與新內(nèi)容的前綴做比對(duì)若重復(fù)則截?cái)嘀貜?fù)部分再追加。這個(gè)邏輯成本極低卻能在一些異常場(chǎng)景里顯著減少內(nèi)容重復(fù)兩遍的體驗(yàn)問(wèn)題。8.3 響應(yīng)內(nèi)容的展示順序有些AI會(huì)先輸出思考過(guò)程再輸出正文或者穿插引用、工具調(diào)用信息。流式情況下如果后端把不同類型的數(shù)據(jù)混在同一個(gè)流里前端要做的是按類型分發(fā)到不同容器避免思考和正文混在一起顯示。我在處理某跨平臺(tái)系統(tǒng)的日志分析功能時(shí)把類型字段放到事件解析的分發(fā)層效率比在UI層反復(fù)判斷高得多。9. 實(shí)測(cè)下來(lái)的性能參考與經(jīng)驗(yàn)總結(jié)最后給一個(gè)真實(shí)的項(xiàng)目參考數(shù)據(jù)方便大家心里有底。我在某模擬項(xiàng)目X里做了兩次優(yōu)化前后的對(duì)比指標(biāo)優(yōu)化前無(wú)緩沖直接渲染優(yōu)化后RAF緩沖渲染低端安卓機(jī)渲染幀率20~30幀滾動(dòng)明顯卡頓55~60幀跟手順滑3000字長(zhǎng)回復(fù)渲染耗時(shí)約3.8秒約1.9秒頁(yè)面內(nèi)存峰值約460MB約290MBCPU持續(xù)占用60%~80%30%~45%每一項(xiàng)優(yōu)化帶來(lái)的收益都挺直觀。當(dāng)然不同機(jī)型、不同瀏覽器有差異但方向是一致的流式數(shù)據(jù)的處理核心永遠(yuǎn)是減少不必要的工作量把網(wǎng)絡(luò)到達(dá)的頻率和UI渲染的頻率解耦把解析和渲染分開把異常中斷當(dāng)成正常流程來(lái)處理。如果讓我給剛接觸AI流式聊天的新手一個(gè)最直接的行動(dòng)建議那就是先把TextDecoder和requestAnimationFrame兩個(gè)點(diǎn)吃透再談其它。前者解決字對(duì)不對(duì)的問(wèn)題后者解決卡不卡的問(wèn)題。這兩個(gè)點(diǎn)做到位H5里的AI聊天體驗(yàn)基本就合格了一大半。我自己在最初幾次調(diào)試時(shí)還踩過(guò)一個(gè)比較隱蔽的坑在React StrictMode下組件會(huì)渲染兩次如果副作用沒有清理干凈同一個(gè)流式請(qǐng)求會(huì)發(fā)出兩份頁(yè)面出現(xiàn)兩段AI回復(fù)。這個(gè)問(wèn)題排查了很久本質(zhì)是Effect cleanup里忘了調(diào)abort()。所以如果你用的是React 18記得把AbortController的清理動(dòng)作放在useEffect的返回值里這是很多線上事故的隱藏元兇。流式數(shù)據(jù)本身并不復(fù)雜復(fù)雜的是在移動(dòng)端這種資源受限的環(huán)境里把持續(xù)抵達(dá)的數(shù)據(jù)和有限的渲染能力調(diào)和好。這篇文章里講到的每一條經(jīng)驗(yàn)都是從真實(shí)項(xiàng)目中一行一行調(diào)試出來(lái)的希望可以幫你少走一些彎路。如果你在接入過(guò)程中遇到更奇怪的問(wèn)題歡迎把你的現(xiàn)象和代碼片段分享出來(lái)我們一起來(lái)拆一拆。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
激情五月天色色| 中文字幕婷婷9月天| 久热欧美| 色婷综合| 99精品偷自拍| 99日韩| 天天 青草 制服丝袜 在线 | 婷婷丁香五月激情密臀av| 日韩在线99| 九九九午夜影院成人| 能看的AV| 久久黄色免费视频| 丁香色六月婷婷| 97人妻超级碰碰碰碰碰| 99这里只有精品|v| 激情亭亭五月| xxx.色婷婷| 六月婷婷综合| 九色91视频| 青青草大香| 久久久这里有精品| 日韩欧美一级大黄网站| 超碰在线超碰| 激情五月婷婷开心网| www.狠狠狠.com| 色色色在线观看| 欧美槡BBBB槡BBB少妇| 五月丁香成人网| 色婷丨日丨天丨综合久久| 超碰免费成人| 色v综合网| Www.sesese丁香| 亚洲色网络| 婷婷丁香五月激情| 99热在线只有精品| 丁香五月激情在线| 久久丁香久久| 欧美日韩成人在线免费| 9一精品视频观看| 99热这里是精品| 综合狠狠干| 亚洲综合激情五月| 五月天俺去也| 婷婷开心激情综合五月天| 色婷婷久久综合久色| 99九精品| 9有码中文| 97超级碰| 无码人妻一区二区一牛影视| 九九色黄色| 少妇性按摩无码中文A片| 国产9色在线/日韩| 26uuu最新地址| 五月丁香六月婷婷久久肏| 17.c黄色| 狠狠操狠狠插| 五月丁香六月激情综合| 99热久| 五月婷婷九| 久久久久久人妻久久久久久久久久人妻久久久 | 天天 青草 制服丝袜 在线| 婷婷丁香五月色偷偷| 丁香五月激情啪啪啪| A片试看120分钟做受视频红杏 | 久久精彩综合视频| 久月婷婷| 亚洲色爽| 丁香 婷婷 亚洲 熟女| 高清无码中文字幕aVDV| 婷婷五月无码| 天天操夜夜操| 色五月激情网| 俺去也五月| 色婷婷av在线观看| 狠狠婷婷色| 香蕉久久国产AV一区二区| 婷婷色色五月天| 五月丁香大香蕉| 亚洲欧洲中文日韩久久AV乱码 | 级情九色| 日本不卡高字幕在线2019| 噼里啪啦完整版中文在线观看| 伊人久久婷婷| 五月婷婷性爱视频| 丁香六月啪| av九九| 99re思思热久久| 五月份婷婷| 天天肏天天插| 久久超级碰碰| 国产成人综合亚洲| 色色色热| 五月婷久草| AV成人在线播放| 中文激情网| 五月激情另类| 色欲五月婷婷| 97碰碰九九视频| 97热久久| 直接看的AV网站| 九九热精品视频在线观看| 五月激情综合网| 婷婷五月天激情四射| 99riAV成人在线视频| 日本天堂爱爱| 天天爽夜夜爽| 激情五月综合网| 99在线视频喷水| 九月婷婷久久| 亚洲人人操| 丁香五月成人| 亚洲网视屏| 丁香五月 六月婷婷首页| 五月丁香综合| 久久99网| 亚洲天堂AAA| 五月天社区| 亚洲成人无码专区| 久久老码第一| 综合欧美五月婷婷| 99在线观看精品视频| 丁香五月成人社区| 久久婷婷国产| 天天综合精品| 在线免费视频caop| 丁香五月98| 任你日视频| 美女久久婷婷| 26UUU欧美激情一区二区| 91要啪| 激情小说色五月| 综合久久9| 婷婷五月色網站| 国产99热| 五月激情丁香五月| 九九热超碰| 丁香五月婷婷少妇| 狠色色狠网| 久热这里只有| 99er日韩| 99久久这里只有精品| 奇米影视777在线_在线观看午夜_h小视频在线观看_岛国大片 | 夜夜撸日日操| 97sese婷婷| 亚洲色色爱| 五月色色网| 玖玖@三月天天丁香婷婷| 日本色婷婷综合| 亚洲激情视频在线观看| www.黄色片-久久成人国产精品在线播放-999AV| 天天日人人爽| 九九精品9| 婷婷五月天深爱| 操一区| 五月激情啪啪啪| 爱草人视频| 婷婷五月丁香综合亚洲| 九九综合久久| 丁香av网| 五月丁香成人视频| 大天天伊人| 狠狠狠夜夜夜| 九九人人看| 免费观看欧美成人AA片爱我多深| 激情图片婷婷丁香五月| 亚洲色图五月丁香| 久久婷婷色| 91碰在线| 高潮毛片遮挡费高一百度| 丁香五月天堂| 五月丁香va| 大地资源色婷婷视频在线| www.婷婷网| 91精品丝袜久久久久久| 五月婷婷成人网首页| 色色99| 成年AAAA色情| αv中文字幕在线观| 五月天色婷婷图片| 五月天激情综合网| 综合色99| 春色激情第四色| 嫩草AV久久伊人妇女超级A| 这里只有精品视频国产| 91人妻人人操| 国产色网站| 无码区婷婷五月花开| 超碰在线人人| 色播五月天天| 97sese婷婷| 五月丁香激情综合| 色五月之第四色| 成人午夜视频精品一区| 婷婷五月六月| 日本99视频| 激情五月天婷婷| 好吊丝aV| 啪啪操操| 做爰丰满少妇1313| www.激情五月| 99高级会所久久| 成人国产网站在线免费看| 欧美婷婷色五月| www色综合亚洲92| 亚洲欧洲国产精品| 婷婷五月色丁香在线看| 婷婷综合五月天| 五月丁香啪啪网| 五月丁香色五月| 成人免费黄色短视频| 婷婷五月婷婷五月天| 婷婷五月天桃花网| 天天插天天插| 五月天婷婷一起草| 91传媒无码人妻精| 激情五月婷婷网| 九九视频网| 成人无码髙潮喷水A片| 日日激情网| 9热久久在线| 亚洲婷婷91丁香| 婷婷五月天成人娱乐| 国产,欧美,学生妹,视频| 天天干天天叉| 中文字幕在线播放视频| 97日韩无套内| 97人人操人人爽| 欧美婷婷五月激情| 超级黄色片| 丁香五月AV| 伊人婷婷色激情丁香| 亚洲在线成人| 国产AV一区二区三区日韩| 97色色在线视频| 激情五月天啪啪| 丁香六月婷| 午夜婷婷五月天在线| 久久日九九| 久久婷婷视频| www,天天干| 99er这里只有精品| www.综合久久.com| AV成人在线网站| 国产亚洲精品久久一区二区三区| 亚洲人妻一区二区| 激情五月天色色| 日本操B视频| 婷婷五月天av| 伊人色欲五月天| 久久最新色| 图片区 小说区 区 亚洲五月| 婷婷五月影院| 五月天激情视频网站| 精品人人操| 天天干天天日蜜臀av| 丁香狠狠色婷婷| 九九热视频免费观看| 亚洲成人在线综合| 丁香五月成人自拍| 婷婷D区| 婷婷色情网| www,五月天激情| 久久婷婷视频| 婷婷操超碰| 狠狠干最新地址| 国产精品大香蕉| 婷婷伊人五月天| 就爱啪啪婷婷| 五月天婷综合网站| 婷婷色五月激情| 日韩成人影片在线观看| 婷婷伊人五月天| 五月天伊人网| 亚洲久热| 99精品在线| 开心五月深爱五月| 综合五月婷婷| 26uuu亚洲欧美日本| AV天堂淫乩| 综合久久综合久久| 欧美婷婷丁香五月社区| 五月综合丁香婷婷| 九久久精品视频99| 日本久久精品18| 五月做爱| 色婷婷亚洲综合av| 性爱五月婷| 91re色综合视频| 天天操夜夜操| 国产国产乱老熟女视频网站97| 色噜噜综合网| 狠狠狠狠狠狠狠狠| 天天色综网| 色偷偷色婷婷| 99精品热视频| 九九香蕉网| 亚洲成人一区| 色色色色色色色色综合网| 超碰99久久| 亚洲无码99| 五月激情婷婷在线| 狠狠干天天日| 手机旧版看人妻1025| 99热成人精品网站| 超级碰碰91| 99人妻碰碰碰久久久久禁片| 国产免费AV在线| 麻豆雪千夏| 六月丁香婷婷色狠狠久久| 亚洲人成网站999综合| 六月婷婷综合网2| 超碰在线网站9| 日本色色影片| 久久久精品人妻录| 日韩 mm 不卡| 大香蕉人人人| 久久精品婷婷| 99开心五月五月丁香激情| 操逼毛片国语对白| 中文字幕丰满乱孑伦无码专区| 伊人久久婷婷| 呦呦v线| 26uuu亚洲欧美| 五月婷综合网| 夜夜爽天天爽| 亚洲五月婷婷| 亚洲乱码日产精品BD| 成人视屏在线观看| 一本色综合色| 综合狠狠干| 9久热| 蜜臀av无码久久久久久久久| 久久婷婷内射| 天天爱天天做天天舔| 热久久精品视频网站| 开心激情综合| 大香蕉综合网| 97五月婷婷| 深爱婷婷基地| 五月天天视频| 色色亚洲| 玖玖爱资源站| 中文乱子伦视频| 狼人久草| www久久久久久久久久久| 中日韩狠狠色| 五月婷深深爱激情网| 日婷婷| 思思热在线视频精品| 久草五月丁香婷婷综合| www.狠狠操.co m| 97色色色色色| 疯狂做受XXXX高潮A片| 欧美日韩中国| 在线色五月婷婷| 五月婷婷丁香五月 | 一起肏在线视频| 久久五月视频| 五月婷婷丁香啪啪| 亚洲精级| 天天干天天日天天插| 另类小说色婷婷| 天天干,天天日| 婷婷中文字幕网| 玖玖精品视频99| 99久热| 日韩激情人伦人| 大香蕉婷婷丁香天堂AV| 激情丁香五月| 操啊操av| 国产成人精品一区二三区熟女在线 | 久婷婷| 99久久婷婷精品视频| 啪啪啪综合网| 激情综合99| 五月婷婷很很色| 国产精品久久久久久白浆色欲| 色五月丁香六月婷婷| 亭亭玉月丁香| 天天操天天爱天天日| 色婷婷丁香五月| 五月天婷婷丁香成人网| 人人色AV| 双性美人被调教到喷水A片| 九月婷婷久久| 日本三级韩三级99久久| www.henhenl| 色狠狠婷婷| 26uuu成人网| 色亚洲婷婷| 丁香六月五月天| 99色在线观看视频| 久草狼人| 棕合影院色色| 操碰99| 六月婷婷七月丁香| 亚洲人成色A777777在线观看| 色婷婷小视频| 99热99色| 涩五月丝袜婷婷| 狠狠操狠狠干综合| 东京热人妻一区二区三区在线| 狠狠狠狠狠操| 中文字幕成人日韩| 综合成人小说婷婷| 91成人看片| 色综合九九| 成人必爱视| 亚洲免费婷婷| se99高清无码| 精品国产AV色一区二区深夜久久| 色婷婷视频| 婷婷五月天AV| 婷婷成人五月天一区| 欧美S码亚洲码精品M码| 人人舔天天| 久久激丁香| 深爱激情五月天婷婷网| 久久99激情五月天| 婷婷色片| 九九热这里有精品视频| 香蕉AV777XXX色综合一区| 五月丁香成人日| 无码日本精品XXXXXXXXX | 五月婷婷播| 最近中文字幕2019视频1| 狠狠999| a性生活久久无| 中文国产五月天| 婷婷五月天丁香综合网| 久久激情天堂| 开心六月丁香五月婷婷| 伊人丁香五月天丁香在线婷| 日本五月婷婷| 五月丁香激情综合网| 天天操婷婷| 婷婷丁香午夜综合影视| 大香蕉丁香五月| www.色五月.com| 91人碰| 婷婷久热| 噜噜噜色噜噜| 爆乳熟女一区二区三区爆乳| 亚洲天堂久久| 激情六月婷| 五月婷婷六月丁香首页| 精品人妻伦一二三区久| 狠狠操性爱av| 日本久热| 激情性爱五月天网页| 色五月综合在线| 91超级碰在线| 国产乱妇乱子在线播视频播放网站| 婷婷五月天男人影院色色网| 久久婷婷五月综合色奶水99啪| 五月婷婷婷| 久久 这里只有精品1| 1024在线视频| 夜夜操狠狠操| 婷婷五月激情五月激情| 九九色色| 丁香五月婷婷久久久| 深夜男女福利刺激影院一区完整| 亚洲XX日本| 日韩一级网站| A片试看120分钟做受图片| 丁香五月激情鲁| 2015超碰| 国产成人综合网| 国内裸舞二区| 日韩视频女神99| 婷婷色在线| 五月丁香好婷婷姑娘综合网| 欧美婷婷综合网| 亚洲九区| 五月香六月婷| 亚洲小视频免费播放| 色欧美一级| 五月婷婷丁香五月婷婷丁香| 五月天激情综合网站| a性生活久久无| 五月婷婷深深爱| 这里只有精品视频国产| av第一二区| A久久| www,天天干| 开心婷婷五月天综合| 九色亚洲| 五月天成人综合| 五月宗合激情网| 色色色色色色色色五月先| 亚洲春色奇米影视| 伊人久久婷| 色色婷婷综合网| 99精品热视频| 久热AⅤ| 精品久久99| 婷婷色导航| 色另类五月天| 色丁香五月天| 日韩三级视频一区二区| 无码人妻少妇色欲AV一区二区 | 亚洲视频一区| 亚洲激情AV| 狠狠插狠狠操| 人人干AV| 日本美女天天日天天爽| 人人操人人操919999| www.91五月| 99免费在线| 中文av网站| 久久狠狠色| 色综合婷婷| 99人人操| 伊人久热91网| 热99.com婷婷| 婷婷99视频全集高清| 五月天婷婷综合网| 日韩欧美一级大黄网站| 五月久久婷婷天堂视频| 这里只有精品1| 色性日本| 色情免费视频播放| 五月婷婷六月爱| 久久综合这里只有精品1 | 欧美日韩成人在线网站| 五月丁香六月婷婷在线观看| 伊人色欲五月天| 国产日韩欧美性生活| 九九99免费理论| 天天干天天操天天射| 99热国产在线| 淫五月停停| 国产精品18久久久| 99无码精品| 99热首页| 二色av| 色99网站| www.超碰在线| 思思热在线观看| 天天干天天做| 99热思思| 少妇人妻偷人精品无码视频新浪| 专区无日本视频高清8| 久热超碰| 亚洲色热| 国产精品人成A片一区二区| 亚洲第一综合| 五月婷婷激情网| 色五月首页| www色色com| 97在线精品| 久热大香蕉| 超碰av在线| 99热啪啪| 五月婷婷色| 国产乱子轮XXX农村| 国产一级片| 超碰人人色| 色婷婷五月天| 亚洲99精品九九在线| 97日本在线播放| 国内久久婷婷| 99久精品视频| 亚洲综合在线伊人婷| 嫩草AV久久伊人妇女超级A| 性色播| 午夜青草资源| 熟女激情五月天 | 色爽九九| 91九九| 入口五月婷婷六月香| 99这里只有精品视频免费| 欧美又粗又大一区二区在线观看| 五月婷婷综合色拍| 色色色无码| 五月天丁香成人| www.激情| 亚洲视频综合网| 久久久五月天婷婷成人网| 94干大香蕉| 中文精品在| 99热热九九| 玖玖资源天天无码| 欧美五月婷婷| 少妇AB又爽又紧无码网站| 色婷婷丁香五月天| 网色99| 久久人妻精品| www色综合亚洲92| 中文字幕在线播放视频| 婷婷亚洲丁香五月| 免费视频无码| 久久精品99国产精品日本| 一起草日本| 99日本黄站| 五月天伊人日日噜影片AV| 狠狠做深爱婷婷久久综合一区| 亚洲AV中文在线| 影音先锋女人AA鲁色资源| 国产特黄色精品一区二区三区精品无广告| 91超级碰在线视频| 伊人婷婷五月| 91碰碰视频| 欧美性猛交99久久久久99按摩| 9热在线视频精品| 丁香五月网站| 综合五月婷婷| 777米奇影视第四色| 久久久九九九 99| 色婷婷丁香五月天| 激情五月丁香六月综合AVXXXX| 影音先锋一区二区三区| 99视频免费播放| 99熟女| 日韩精品一区二区亚洲AV观看| 亚洲色五月婷婷| 日本情色一区二区| 国产精品久久久60086| 久久久这里有精品| 丁香伊人网| 婷婷婷婷色| 国产真人做爰视频免费| 99在线观看视频免费| 丁香五月开心亚洲| 狠狠狠狠青草| www色中色综合| 六月丁香久久| 五月天激情小说| 婷婷五月天小说| 97在线天堂| 99er在线观看| 亚洲乱码日产精品BD| 超碰AV在线| 婷婷情色五月天| 亚洲黄色av网站| 这里只有精品视频一区| ..真实国产乱子伦毛片| 日本婷婷网| 欧美内射AA| 99啪视频在线观看| 婷婷五月天免费视频| www.ywav| 99成人精品视频| www...com黄在线观看| 天天日夜夜操五月| 亚洲偷| 丁香五月狠狠综合欧美| 成AV人片一区二区三区久久| 精品久久人妻热| 91chinese在线| 日韩色色小视频| 五月亭亭开心网| 天天玩天天摸| 国外亚洲成AV人片在线观看| 五月激情精品视频| 精品少妇人妻AV无码专区偷人| 色五月天中文字幕| 亚洲网在线观看| 丁香婷婷五月综合影院| 国产高潮白浆一区二区| 五月天色丁香| 99干日本| 日韩aaa| 久久婷婷丁香五月一二三| 日本色婷婷| 天天操夜夜夜拍拍拍| 久久人妻熟女一区二区| 丁香五月婷婷乱| 免费在线观看av网站| 午夜激情五月天| 色yeye色综合| 成人电影在线免费试看| 大香蕉啪啪啪| 无码 av电影| 五月天婷婷丁香社区| 婷婷日本色| 五月激情网站| 久久这里只有国产| 久cao香蕉影院| 狠狠干无码| 日本视频99| 久久久免费精彩视频| 色99视| 亚洲无码影音| 99在线免费视频| 啪啪色激情五月天| 天堂在线观看视频| 26.uuu丁香五月婷婷| 2015好吊操| 九月激情婷婷丁香| 婷婷色在线视频| 狠狠五月激情在线| 色婷婷在线视频观看| 成人网在线视频| 六月激情婷婷色| 久久这里只有精品视频15| 五月天综合网| 色播播之激情五月婷婷| 日本理论久久| 国产激情综合五月久久| 五月婷六月婷婷| 久激情网| 久综合九综合99| 大香蕉婷婷色| 婷婷五月天第四色| 丁香五月中文字幕| 激情性爱五月天网页| 亚洲成人网站在线播放| www.色婷婷。com| 九九久久高清| 粉嫩AV久久一区二区三区| 色色色色色色网站| 夜夜骑日日操| 五月婷婷丁香六月 | 玖玖婷婷综合| 成人中文网| 丁香五月婷婷AV| 色了色综合| 91玖玖| 岛囯综合激情网| 色情五月婷婷| 五月天色婷婷综合| 九九草热在线观看| 日本三级日本三级99| 九九九九热99超碰| 成功精品影院| 操操自拍| 一级操逼内射在线视频| 天天爽成人综合网站| 激情五月九九九| 久久在线视频免费观看| 操久久网| 国产激情婷婷| 日日做夜夜爱| 天天色综合色色色色色。| 亚洲成人网站在线播放| 99热每日| 五月激情综合网| 色婷婷综合久久久久| 五月婷婷啪啪啪啪| 色五月婷婷大| www.天天干.com| 91干视频| 亚洲AV免费国产电影| 五月婷久久久久综合| 九九热在线视频| 另类综合激情| 丁香婷婷激情| 色五月激情五月天| 婷婷五月天另类网站| mmm1717.6dbm人人爱人人操| 久久亚洲婷婷| 激情婷婷在线中文字幕| 色婷婷情片| 丁香花五月天婷婷成人社区| 乱精品一区字幕二区| 色五月婷婷基地| 91人人爽狠狠狠| 天天插天天日| 久久丁香五月| 色播五月天激情| 五月天综合激情网| 五月深爱激情网| 另类小说婷婷色| 97色五月天| 婷婷五月天激情在线观看| 婷婷激情五月吧| 日本精品在线噜噜噜| 99啪啪视频| 婷婷五月天黄色| 五月婷婷啪啪啪| 97操碰视频| 97视频久久| 色玖玖综合网| 91精品国产91久久久久青草| 久99久在线| 九九九热精品| 久色网址| 天天做天天要天天爱| 欧美日韩一a.无| 天天草人人摸| 五月色无码| 影音先锋 91工厂| 深爱激情网噜噜色| 婷婷中文字暮| 久久激情五月| 亚洲综合五月天婷婷丁香| 亚洲综合婷婷| 婷婷成人五月天| 国产99久久久国产精品免费看| 中文字幕日产A片在线看| 亚洲国产精品二二三三区| 一本色道久久88加勒比| 人人妖人人97| 婷婷综合日本| 亚洲精品成人| 五月激情丁香久久综合网| 丁香六月亚洲| 亚州精品久久久久AV无码| 日本五月天一页| 婷婷五月丁香超碰| 色综合99| 免费无码毛片一区二区A片| 婷婷五月综合性爱| 婷婷自拍| 综合色播| 这里只有精品99www| 亚洲成人va| 婷婷六月综合基地| 五月激情六月综合| 久久综合久色欧美综合狠狠| 五月激情丁香啪啪| 激情五月天福利| 99在线看视频| 9热成人在线视频| 丁香婷婷老司机久操| 久久超级碰视频| 亚洲天堂啪啪| 欧洲永久精品| 色五月婷婷丁香婷婷| 丁香六月亭亭久久综合| www.狠狠| 天天操天天操天天操天天操天天操 | 久久婷婷免费| 亚洲精品中文字幕成人片| www一起操| 九九人人操| 国产寻花在线| 欧美xx激情视频在线观看| 综合网啪| 精品人妻伦一二三区久| 97五月婷| 婷婷五月天综合AV| 91精品丝袜久久久久久| 日本va网站| 精品久久66| 久婷| 国产精产国品一二三在观看| 色婷婷另类| 噜噜噜狠狠色综| 婷婷五月天激情综合婷婷五月天激情综合| 亚洲人人操BD| 9久国产精品| 最近中文字幕在线中文视频| 欧美日韩日韩成人| 丁香五月成人| 五月婷婷久| 亚洲操操| 亚洲精品**不卡在线播he| A片一曲| 亚洲蜜桃精久久久久久久久久久久| 国产三级在线播放| 热中文字幕| 九九精品在线观看视频6| 久久久999精品| 青青草婷婷五月天| 婷婷永久在线| www.开心激情| 丁香五月六月| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 五月婷中文娱乐综合| 久久久久妻| 99精吕视频在线观看了| 久久久久人妻精品| 激情五月天婷婷色色色色色色色色色色色| 日韩九九视频| 思思热精品在线| 五月婷婷六月丁香| 99九九视频| 九九热短视频在线观看| a在线观看| 日韩成人影片在线观看| 丁香色情五月天| 中文久久婷婷| 99久99久| 99热99思午夜精品| 久操无码| AⅤ在线播放网| 久久九九免费大视频| 97干综合网| 日韩人妻在线播放| 99热欧| 在线成人网站| www.com任你艹| 亚洲、热| 欧美成人精品A片免费一区99| 97色永久免费视频| 丁香六月在线| 激情久久伊人| 激情五月天激情网| 欧美精品999| 99re青青草| 婷婷五月天色综合| 99久久国产宗和精品1上映| √天堂资源在线人妻熟女| 婷婷亚洲欧美丁香五月| 日本V在线观看不卡视频网站| 99re思思热在线视频| 色情五月天丁香社区| 久久婷婷五月综合色天| 丁香五月综合在线播放| 久大香蕉| 久久在线视频免费观看| 91猫咪国产在线播放| 思思w99| 人与禽A片啪啪| 开心婷婷五月激情网小说| 99视频久久| 综合一区二区三区| 日日色综合| 九月性爱网| 九九热这里只有精品一| 校花娇喘呻吟校长陈若雪视频| 丁香六月婷婷综情欧美| 婷婷亚洲影院| 激情久久肏屄视频| 色噜噜狠狠色综合网| 婷婷综合一二三| 五月婷激情| 热婷婷在线视频| 免费观看的婷婷五月视频在线| 99色在线观看视频者| 操丝袜视频影院导航| 欧美三级巜人妻互换| 就爱操www com| 亚洲视频在线观看| 无码天天操| 99国产精品久久久久久久久久久| 天天色一道本综合婷婷| 99自拍视频| 婷久看人爽| 亚洲蜜桃精久久久久久久久久久久| 日本天天综合| 99ree6| 日本激情五月| 99九九99九九九视频精品| 婷婷五月天激情综合深爱激情| 欧美三级视频| 久久婷婷六月综合综合色| 婷婷五月六月丁香| 婷婷五月天小说| 婷婷丁香激情综合色情| 色狠狠色| 五月丁香婷成人网| 国精产品一区一区三区免费视频| 亚洲综合色丁香五月天| 日本色啪| 久久99热在线观看| 六月久久婷婷| 26uuu最新地址| 激情五月综合视频| 日韩二区搞逼插逼毛片| 亚洲天堂aaa| 五月丁香久久呀| 综合五月婷婷| 天天艹夜夜爽| 色婷婷亚洲综合av| 九九色播五月丁香| 婷婷五月大| 被强行糟蹋的女人A片| 六月丁香激情婷婷| 色色五月天com| 91日本在线观看| caobi四区| 五月天婷婷Av| 综合久久高清| www.婷婷网| 在线综合亚洲欧美65| 26uuu成人网| 久久九九99| 日韩在线观看网址| 日日操夜夜撸| 五月天婷婷综合久久| 日韩一区二区A片免费观看| 天天做天天爱天天做| 热久国产| 香蕉AV777XXX色综合一区| 五月花综合视频| 99热人人| 丁香婷婷成年| 999激情视频| 天天草天天爱| 九九超日本| 天天搞天天爽| 久久aaaa片一区二区| 色天使色婷婷| 国产高潮A片羞羞视频涩涩| 99久热这里只有精品| 五月天激情综合在线| 五月天色色无码| 久久丝袜婷婷| 五月丁综合在线观看| 91疯狂操操操操| 最近中文字幕在线中文视频| 婷婷久久丁香| 丁香六月av| 婷婷九月丁香天堂丁香天堂| 九色婷婷| 99国产精品久久久久久久久久久| 九九热这里都是精品6| 最新AV在线观看| 中文字幕在线免费观看视频| 激情5月婷婷| 99热九九这里只有精品10| 99九九热视频免费| 亚洲妇女熟BBW| 婷婷激情在线| 亚洲 五月 婷婷 成人| 伊人99热| 色五月中文字幕| 久久在线视频免费观看| 五月色婷婷中文字幕| SS丁香五月婷婷| 五月丁香大香蕉| 婷婷性爱综合| 日本一级淫| 五月丁香婷婷色| 色色色色色色色色综合网| 插插插丁香五月婷婷| 五月天狠狠色| 任你弄在线视频免费| AV操操操| 荷兰av一级| 久久婷婷五月综合啪| 天天操夜夜啊| 免费国产视频| 狠狠干狠狠操狠狠爱| 免费视频WWW在线观看网站| 91九色国产| 夜夜撸夜夜骑| 五月丁香色婷婷综合| se色99| 中文字幕成人| 91超级碰在线| 婷婷伊人五月丁香天堂网| 国产,欧美,学生妹,视频| 996er热| 成人AV在线网站| 日日干天天| 在线可以看的av网址| 婷婷激情五月天色| 五月丁香色色综合| 色综合色综合网| 丁香狠狠色婷婷| 亚洲五月天色色| 七七久久综合| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | 久久综合丁香| 天堂久久精品| 久久婷综合| 丁香五月婷久久| 亚洲热视频在线| 久热这里| 国产看真人毛片爱做A片| 丁香六月婷婷| 免费观看全黄做爰的视频| 少妇人妻丰满做爰XXX| 97在线观视频免费观看| 亚洲免费综合一区| 中文字幕人妻一区二区| 欧美三级大片AA在线看| 丁香五月婷婷激情中文| 五月婷婷国产| 另类国产区| 色私五月婷婷| 成人看片网站| 久久五月人人摸| 婷婷之六月丁香| 99视频网| 无码99| 99热伊人| 99性爱视频| 丁香五月狠狠在线观看| 99在线免费视频播放| 色综合香蕉视频| 在线视频另类| 狠色狠色狠狠色综合网| 麻豆123区| 免费不卡狠操美女视频网 | 深爱五月天| 五月天操逼激情| 色色网91| 玖玖爱综合网| 狠狠色婷婷7| 99热这里只有精品 搜| 5月婷婷6月六月丁香| www九九| 一本大道嫩草AV无码专区| 九九精品9| 丁香五月停停基地| 99在线观看视频免费| 久久性爱网站| 精品丁香五月天在线播放| 久久久久9| 图片区 小说区 区 亚洲五月 | 97狠狠色| 天天操夜夜夜拍拍拍| 五月天婷婷影院影院观看| 二色AV| 五月天色小说| 日本操片| 婷婷五月天激情综合婷婷五月天激情综合| 日韩精品无码99| 中文字幕,综合,91| 99精品久久| 亚洲精品444久久久久久| 91婷婷丁香| 成人网丁香五月| 国产成人AV在线播放 | 五月丁香爱婷婷深深| 国产一二三四五六七八视频| 五月丁香精品| 99热网精品| 九九热10| 五月丁香色婷婷基地| 色私五月婷婷| 五月天色色无码| 色五月婷婷在线| 狠狠色无码| 影视av久久久噜噜噜噜噜三级| 五月婷婷丁香六月| 色九九九九| 中国AV性爱观看| 色伊人婷婷| 99se丁香| 天天日天天添| 亚洲另类视频| 人妻丰满精品一区二区A片| 成人在线日韩欧美| 九九久久99| AV操逼网| 亚洲一二三网| 狠狠香婷婷五月| 久久99热这里只频精品6学生| 亚洲视频在线观看| 久久婷婷综合基地| 天天天天天久久久久久| 小视频久久久aaa| 久久 中文 日本| 亚洲乱码成人| 五月丁香| 大香蕉Av在线| 99热这里只有精品无码| 激情综合婷婷| 国产1区2区3区| 婷婷丁香色情五月天| 538在线精品| 影音先锋色婷婷| 婷婷丁香五月激情| 婷婷亚洲色| 六月色日韩| 丁香五月婷婷偷拍| 人操综合| 婷婷久久免费看| 九九av| 婷婷五月丁香香蕉| 激情综合五月色丁香婷婷 | 久久五月激情| 国产精品久久久海的味道| 偷拍九九热| 色婷婷色五月丁香| 日本三级日本三级99| www,色婷婷| 久久这里有精品| 五月婷婷综合成人| 欧洲综合视频在线观看。欧洲,亚洲综合食品在线观看。 | 怡红院精品视频久久久久久久久| 色色色综合| 成人视频一区| 另类激情五月| 久久婷婷夜| 开心婷婷丁香五月| 日本偷拍九九九| 一区二区三区四区无码| 国产高潮A片羞羞视频涩涩| 思思热久久阴99| 欧美25p| 91丨九色丨东北熟女| 人人操91| 欧美久久婷婷| 另类图片色五月| 色婷婷六月天| 亚洲熟女色| 九九热自拍| 五月丁香激情四射| 婷婷月综合| 久草五月婷婷| 中文AV在线播放| 色狠狠综合| 操一区| 日日操天天操| 婷婷五月天激情网址| 五月丁香成人网| 婷婷五月黄色激情在线| 五月天色综合| 天天日综合网射| 女人高潮内射99精品| 婷婷区日本| 亚洲成人无码专区| 五月婷婷六月奇米网丁香| 99se丁香| 99热精品在线播放| 日韩情色在线观看| 2020日日干| 大香蕉婷婷丁香视频在线| 91chinese在线| 欧美五月丁香啪啪响视频| 99色在线视频| 97色伦另类图片小说视频| 亚洲六月综合激情久久下卡| 婷婷激情六月天视频| 五月丁香婷婷色播无码| 丁香五月天资源网| 色色狼人综合| 亚洲激情五月天| 丁香婷婷激情五月| 久久婷婷七月丁香| 五月亚洲| 色色色综合色| 亚洲操人| 伊人天天色| av一区二区电影免费在线观看| 噜噜吧天天爱| 婷婷五月天黄色| 91精品综合久久久久久五月丁香| 色色色.com| www网站在线观看| 色综合九九色综合88| 18av天堂| 五月久久丁香| 免费看欧美成人A片无码 | 久久婷婷成人综合色怡春院| 中文久久久人妻| 亚洲天堂色| 五月婷婷色播| 六月色日韩| 婷婷色网址| 久久婷狠狠色| 91免费在线视频6| 五月婷久久综合| 九九九色综合| 丁香婷婷五月天色播| 五月丁香婷婷色播无码| 99无码超碰| 婷婷五月激情基地| 亚洲在线成人| 丁香桃色网| 九九综合久久| 激情综合婷婷| 色色色com| 大香蕉网站,大香蕉综合| 丁香桃色综合网| 亚州色综合| 久久9视频| 色中色综合| 日韩免费乱轮网站| Av在线资源| 亚洲综合激情五月久久| 99在这里有精品| 久久99婷婷| 婷婷丁香激情五月天色色色| 五月婷婷偷拍| 色五月婷婷丁香婷婷| 六月丁香综合| 在线观看视频1区|