上个月,我在用Lambda函数搭一个简历辅导AI聊天机器人,前端部署在Vercel上。测试时日志里反复跳出超时错误,折腾了好一阵才发现:问题出在用了response.json(),而不是流式传输。改成流式之后,一切正常了。

这个聊天机器人的界面是用React写的(buildcv.makeadifference.app)。

打开网易新闻 查看精彩图片

为什么Lambda里要用流式?

流式传输对AI聊天机器人这类对话应用来说是理想选择,因为用户体验更好。用户不用干等完整响应,而是能逐字逐句看到输出,交互感明显更顺畅。

基于我自己做API的经验,有个简单原则:文本类用流式,CRUD操作或业务逻辑用JSON。

后端Lambda/serverless函数的写法:

// 向AI模型请求流式响应
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的优势在于支持分块推送数据到客户端,不用等整个响应生成完毕。

你在用AI做什么项目?遇到过什么坑,怎么解决的?