Skip to content

Next.js AI 项目实践

Next.js AI 知识库如何实现上传、解析和异步索引?

知识库项目的难点在于文件资源、异步任务、权限、版本和检索可见性必须保持一致。

适合阶段:资深前端 / RAG 项目面核心能力:Upload · Queue · ACL

面试官想考什么

  • 文件是否直接通过 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 过滤,不能等待异步清理才生效。

推荐阅读

基于 MIT 协议开源