AI 聊天助手
规则
- 使用 Vercel AI SDK(
ai 包)进行流式响应——客户端使用 useChat() 钩子,服务端使用 streamText()
- 以
text/event-stream 格式流式响应——绝不先缓冲完整响应再发送
- 消息格式:
{ role: "user" | "assistant" | "system", content: string }
- 上下文窗口管理:在接近 Token 限制时裁剪最旧的消息,始终保留系统提示词
- RAG 模式:嵌入用户查询 → 向量搜索 → 在用户消息前注入 Top-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——始终流式响应
- 仅将消息存储在客户端状态中——应在服务端持久化以便查看历史
- 硬编码模型名称——应使用环境变量或配置文件