AI 聊天機器人
規則
- 使用 Vercel AI SDK(
ai 套件)進行串流 — 客戶端使用 useChat() hook,伺服端使用 streamText()
- 以
text/event-stream 串流回應 — 絕不在傳送前緩衝完整回應
- 訊息格式:
{ role: "user" | "assistant" | "system", content: string }
- 上下文視窗管理:在接近 token 限制時裁剪最舊的訊息,務必保留系統提示
- RAG 模式:嵌入使用者查詢 → 向量搜尋 → 在使用者訊息之前注入前 k 筆結果作為上下文
- 聊天 UI:自動滾動至底部,顯示帶動畫點的載入指示器,在助理訊息中渲染 Markdown
- 伺服器端持久化對話歷史 — 使用包含
chatId、role、content、createdAt 的 messages 資料表
- 系統提示必須放在訊息陣列的第一個 — 絕不讓使用者訊息覆寫它
- YepAPI 聊天端點:
POST /v1/ai/chat,請求格式為 { messages, model?, stream? }
- 停止生成按鈕 — 使用
AbortController 取消正在進行的串流
模式
const { messages, input, handleInputChange, handleSubmit, isLoading, stop } = useChat({
api: "/api/chat",
});
import { streamText } from "ai";
export async function POST(req: Request) {
const { messages } = await req.json();
const result = streamText({ model, messages });
return result.toDataStreamResponse();
}
避免
- 傳送未經裁剪的完整對話歷史 — 將會超過上下文視窗
- 在等待完整回應時阻塞 UI — 務必進行串流
- 僅將訊息儲存在客戶端狀態中 — 伺服器端持久化以保留歷史記錄
- 硬編碼模型名稱 — 使用環境變數或設定檔