上個月,我在用Lambda函數(shù)搭一個簡歷輔導(dǎo)AI聊天機(jī)器人,前端部署在Vercel上。測試時日志里反復(fù)跳出超時錯誤,折騰了好一陣才發(fā)現(xiàn):問題出在用了response.json(),而不是流式傳輸。改成流式之后,一切正常了。
這個聊天機(jī)器人的界面是用React寫的(buildcv.makeadifference.app)。
![]()
為什么Lambda里要用流式?
流式傳輸對AI聊天機(jī)器人這類對話應(yīng)用來說是理想選擇,因?yàn)橛脩趔w驗(yàn)更好。用戶不用干等完整響應(yīng),而是能逐字逐句看到輸出,交互感明顯更順暢。
基于我自己做API的經(jīng)驗(yàn),有個簡單原則:文本類用流式,CRUD操作或業(yè)務(wù)邏輯用JSON。
后端Lambda/serverless函數(shù)的寫法:
// 向AI模型請求流式響應(yīng)
const stream = AI.generateStream(userPrompt)
res.setHeader("Content-Type", "text/plain; charset=utf-8");
res.setHeader("Cache-Control", "no-cache");
// 立即分塊返回給前端
for await (const chunk of stream) {
const text = chunk.text;
if (text) {
res.write(text);
}
}
res.end();
前端React的接收邏輯:
const response = await fetch("api/chat");
const reader = response.body.getReader();
const decoder = new TextDecoder();
let fullText = "";
while (true) {
const { value, done } = await reader.read();
if (done) break;
const chunk = decoder.decode(value);
fullText += chunk;
}
if (!response.ok) {
throw new Error(`Failed to get response: ${response.status}`);
}
Vercel的優(yōu)勢在于支持分塊推送數(shù)據(jù)到客戶端,不用等整個響應(yīng)生成完畢。
你在用AI做什么項(xiàng)目?遇到過什么坑,怎么解決的?
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.