主题
Next.js AI 项目实践
Next.js AI 知识库如何实现上传、解析和异步索引?
知识库项目的难点在于文件资源、异步任务、权限、版本和检索可见性必须保持一致。
面试官想考什么
- 文件是否直接通过 Next.js 上传? 考察大文件架构。
- 解析失败如何重试和展示? 考察任务状态。
- 如何保证租户只能检索自己的文档? 考察 ACL 贯穿。
- 删除文档后向量索引怎么办? 考察版本和一致性。
一句话回答
text
Next.js 负责鉴权和创建上传会话,浏览器直传对象存储,上传完成后创建带 tenantId、fileVersion 和 idempotencyKey 的索引 job;解析、切分、embedding 和向量写入由 Worker 执行,检索时再次做权限过滤。面试回答详解
1. 两阶段上传
text
create upload session -> direct multipart upload
-> complete file -> scan/parse job
-> chunk/embed/index -> ready大文件不应经过页面 Server Action 或一次性 Route Handler body。Next.js 返回短期上传凭证和 fileId,服务端保留对象归属。
2. 索引状态
text
created -> uploading -> scanning -> parsing
-> chunking -> embedding -> indexed
|-> failed/cancelled页面通过 job 状态显示进度、错误和重试。任务按阶段 checkpoint,避免 embedding 阶段失败后从头解析。
3. 权限和版本
文件、chunk、向量 metadata 都带 tenantId、owner、ACL 和 fileVersion。检索先过滤授权范围,再把允许的 chunk 提交给模型。删除或替换文件时用版本标记和异步清理,避免旧向量继续命中。
4. 安全与成本
服务端检查真实文件类型、大小、病毒和解析资源限制;文档内容是数据,不是系统指令。按页数、字符数、embedding 次数和存储设置配额,防止恶意大文件耗尽资源。
5. Next.js UI 边界
Server Component 读取知识库列表,Client Component 管理拖拽、进度和重试,Route Handler 管理 upload/job API。索引完成后用 tag/revalidation 更新列表,但不要把 job 状态只放 Router Cache。
可直接背诵的 30 秒回答
text
我会让 Next.js 创建上传会话并做鉴权,浏览器分片直传对象存储,完成后由队列处理扫描、解析、切分、embedding 和向量写入。每个 job 带租户、文件版本和幂等键,阶段性保存 checkpoint。检索时对文档和 chunk 再做 ACL,删除或替换通过版本和异步清理保证旧索引不会继续泄露。扩展知识
文档状态和可检索性
上传成功不等于可检索。只有扫描通过、解析完成、向量写入并发布索引版本后,才应把文档标成 ready。
面试官追问链
追问一:为什么不在 Server Action 里解析 PDF?
- 考察点:任务边界。
- 回答方向:解析可能超时、占内存、需要原生依赖且不可恢复,应创建 job 交给 Worker。
追问二:索引任务重复执行怎么办?
- 考察点:幂等。
- 回答方向:文件版本和阶段幂等,向量写入使用稳定 chunk id/upsert,任务重试前查询 checkpoint。
追问三:用户删除文件后马上搜索会怎样?
- 考察点:一致性。
- 回答方向:先撤销 active version 和检索权限,再异步删除对象/向量;查询以 active metadata 过滤,不能等待异步清理才生效。