# 全栈实战：AI 简历优化 SaaS (AI Resume Polish)

> **作者**：落尘
> **面向人群**：完成《基础篇》全集 和 《进阶篇》Next.js 基础的开发者
> **项目周期**：约 1 周
> **最终成果**：一个能够通过 AI (Kimi K2) 帮你优化简历、提高面试邀约率的 SaaS 产品

## 这是一个什么项目？

这不仅仅是一个教你写代码的教程。

在这个项目中，我们将**综合运用**你在《基础篇》学到的**产品思维（Mindset）**和在《进阶篇》学到的**全栈技术（Technique）**，构建一个能够通过 AI 帮你优化简历、提高面试邀约率的 **SaaS (软件即服务)** 产品。

### 为什么选择这个项目？（市场验证）

在开始动手之前，我们必须先验证：**这个需求是真实存在的吗？**

根据 Verified Market Research 的报告，2024 年简历构建工具市场规模已达到 16 亿美元，预计到 2032 年将增长至 31 亿美元。在 AI 浪潮下，"AI 简历优化" 更是成为了刚需中的刚需。

让我们看几个真实的行业案例：

1. **Rezi.ai**
    * **痛点**：ATS (招聘管理系统) 会自动过滤掉 75% 的简历。
    * **解决方案**：专注于生成通过 ATS 筛选的简历。
    * **成绩**：拥有超过 330 万用户，年收入估测超过 240 万美元。

2. **Teal HQ**
    * **痛点**：求职者需要管理大量申请，且不知道简历哪里写得不好。
    * **解决方案**：提供简历评分器和关键词匹配功能。
    * **成绩**：获得了 2070 万美元的融资，帮助用户节省了 40% 的投递时间，用户数突破 200 万。

这些案例证明了一个核心事实：**用户愿意为"提高求职成功率"付费。** 我们要做的，就是在这个经过验证的赛道中，用 AI 技术打造一个更轻量、更高效的 MVP。

### 核心功能

* **简历诊断**：上传简历，AI 指出排版、内容、关键词在这个岗位上的缺失。
* **精准润色**：利用 JD (职位描述) 对简历进行针对性修改。
* **ATS 友好度检测**：确保简历能通过大公司的筛选系统。

### 界面草图 (MVP)

---

## Phase 1: 需求定义与减法思维

还记得我们在 **减法思维** 中讲到的核心理念吗？

> **"不要试图一开始就做一个完美的瑞士军刀，先做一把锋利的水果刀。"**

### 1.1 运用 JTBD (Jobs to be Done)

回顾 **思维升级**，用户雇佣我们的产品是为了完成什么任务？

* **表面任务**：把简历里的句子改通顺。
* **深层任务**：**获得面试机会**。

如果我们的目标是“通过 ATS 筛选”和“吸引 HR 注意”，那么单纯的改错字是没有意义的。我们需要的是**根据 JD 匹配关键词**。

### 1.2 确定 MVP (最小可行性产品)

很多同学一上来就想做：

* "我要支持 PDF/Word/图片 只有格式解析"
* "我要做一个可以拖拽的简历编辑器"
* "我要接入微信支付"

**停下来！** 根据 **MVP 基础**，我们需要砍掉一切非核心功能。

**我们的 MVP 只有三步：**

1. 左边框：粘贴你的简历文本（不要做文件解析！先验证价值）
2. 右边框：粘贴职位描述 (JD)
3. 中键按钮：AI 生成优化建议和修改后的文本

---

## Phase 2: Vibe Coding 原型验证

在写任何一行正式代码之前，我们要贯彻 **提示词工程** 的理念。如果 Prompt 效果不好，写再多代码也是垃圾。

### 2.1 调试 Prompt (Kimi K2)

打开你的ai官网，我们先调试核心逻辑，**强烈推荐使用 Kimi K2 模型**，它在长文本理解和中文语境下表现出色。

官方地址：kimi.com

**常见的错误 Prompt:**
> "帮我修改这份简历，让它更好。"
> (太模糊，AI 不知道什么是"好")

**优化后的 Prompt (参考 结构化框架):**

```markdown
# Role
你是一位拥有 10 年经验的资深技术招聘专家 (Tech Recruiter)，精通 ATS (Application Tracking System) 筛选规则。

# Context
候选人简历内容：
{RESUME_TEXT}

目标职位 JD：
{JOB_DESCRIPTION}

# Task
请分析候选人简历与 JD 的匹配度，并给出优化后的简历内容。

# Requirements
1. **STAR 法则**：将经历改写为 Situation, Task, Action, Result 格式。
2. **关键词植入**：从 JD 中提取高频关键词，自然融入简历。
3. **量化成果**：将"提升了性能"改为"性能提升 50%"。
4. **语气**：专业、自信、客观。

# Output Format
请返回 JSON 格式：
{
  "score": 0-100,
  "missing_keywords": ["..."],
  "analysis": "...",
  "optimized_content": "..."
}
```

**练习**：去 Kimi K2 试一下这个 Prompt。如果输出不够好，请回顾 **迭代对话** 进行调整。

### 2.2 进阶技巧：利用 Kimi 长文本优势

Kimi K2 的一大杀手锏是 **超长上下文 (Long Context)**。普通的模型可能塞两个 JD 就满了，但 Kimi 可以轻松吃下更多资料。

**试试这个高级玩法**：
不仅仅粘贴 JD，而是把目标公司的 **产品文档、官方博客、技术白皮书** 全部喂给它。

```markdown
# Context Upgrade
目标公司背景资料：
{粘贴公司 5000 字的技术白皮书内容...}

# Task Upgrade
请根据公司的技术栈偏好（如他们强调的 Serverless 架构），修改我的简历经历，
使之看起来更像是一个"为了这家公司而生"的候选人。
```

这是 Kimi K2 区别于普通 AI 的核心竞争力，一定要在产品中利用起来。

---

## Phase 3: 全栈工程化 (Next.js)

验证完核心价值后，我们不需要自己手写每一行代码。我们要用 **Vibecoding** 的方式，指挥 AI 帮我们搭建。

### 3.1 复制这段话给 Cursor/Windsurf

我们将架构设计和技术选型直接告诉 AI：

```markdown
我想做一个 AI 简历优化 SaaS。

技术栈：
- Next.js 14 (App Router)
- Shadcn UI + Tailwind CSS
- Vercel AI SDK (用于流式输出)

请帮我搭建项目基础结构：
1. 首页 (app/page.tsx)：简单的 Hero Section，有一个“开始诊断”的按钮。
2. 核心工作台 (app/dashboard/page.tsx)：
   - 左侧：Textarea 输入简历
   - 右侧：Textarea 输入 JD
   - 中间：根据页面宽度自适应的“开始优化”按钮
3. 结果展示区：支持 Markdown 渲染的流式输出区域。

请先帮我创建这些页面组件，暂时不需要连接 API。
```

### 3.2 接入 Kimi K2 API

这是最关键的一步。我们需要明确告诉 AI 如何调用 Kimi K2。
**把下面这段 API 文档信息复制给 AI：**

```markdown
请帮我实现 /api/optimize 接口。

我们要使用 Kimi K2 (Moonshot AI) 模型。
注意：虽然是 Kimi 模型，但它的 API 是**完全兼容 OpenAI 接口规范**的。这意味着我们可以直接使用成熟的 OpenAI SDK 来调用它，而不需要专门去学一套新的 API 写法。

配置信息：
- Base URL: https://api.moonshot.cn/v1
- Model Name: moonshot-v1-8k
- API Key: 从环境变量 MOONSHOT_API_KEY 读取

> **为什么一定要用 SDK？**
> 你可以用原生 `fetch` 吗？当然可以。但是简历优化通常需要 10-20 秒生成。如果用 fetch，用户需要等 20 秒白屏。
> 为了实现 **“打字机效果” (Streaming)**，我们需要处理复杂的二进制流。而 **Vercel AI SDK** 把这复杂的几十行代码封装成了一行 `streamText`。这就是我们用它的原因——**为了更少、更简单的代码。**

具体逻辑：
1. 使用 Vercel AI SDK 的 `createOpenAI` 创建实例，指向 Moonshot 的 Base URL。
2. 使用 `streamText` 方法进行流式生成。
3. System Prompt: "你是一位资深招聘专家..." (复用我们在 Phase 2 验证好的 Prompt)。
4. 前端使用 `useCompletion` 或 `useChat` 钩子来连接这个 API。

请写出完整的后端 API Route 代码和前端调用逻辑。
```

> **注意**：Kimi K2 的长文本能力非常强，非常适合处理简历这种可能包含大量文字的场景。通过 Vercel AI SDK 的 `streamText`，我们可以实现类似 ChatGPT 的打字机效果，极大缓解用户的等待焦虑。

---

## Phase 4: 更是产品的思考

代码写完了，项目就结束了吗？
不。回顾 **故事思维**，我们需要给用户一个完整的旅程。

### 4.1 增加“Aha Moment” (惊喜时刻)

用户粘贴简历后，不要直接给全文。
**先给一个评分！**
"你的简历当前评分：45分。你有 3 个致命关键词缺失..."
这会瞬间抓住用户的注意力，让他想要看下去。这是心理学在产品设计中的应用。

### 4.2 数据反馈闭环

在 **用户反馈与迭代** 中我们提到，发布不是结束。
我们需要记录：

* 用户最常复制的优化建议是哪一段？
* 用户在哪个步骤流失了？
* AI 生成的内容由于 Token 限制截断了吗？

### 4.3 商业化思考 (Advanced)

如果你想把它变成一个能赚钱的 SaaS：

1. **Freemium 模式**：免费诊断，付费查看优化建议。
2. **导出功能**：提供精美的 PDF 模板导出（这才是付费点）。

---

## 踩坑指南：提前避雷

在开发过程中，你可能会遇到这几个典型问题：

### 1. 隐私问题 (Privacy)

简历包含手机号、邮箱等敏感信息。

* **坑**：直接把用户隐私发给大模型。
* **解**：在 System Prompt 中要求 AI "在处理前先对敏感信息脱敏"，或者在前端用正则简单替换掉手机号再发送。

### 2. 幻觉问题 (Hallucination)

AI 可能会为了匹配 JD 而编造候选人没有的经历。

* **坑**：AI 把"了解 React" 改成了 "精通 React 源码"。
* **解**：在 Prompt 中加强约束："**Strictly base on the provided resume content. Do not invent experiences.**"（严禁编造经历）。

### 3. 排版乱掉

* **坑**：AI 返回的 Markdown 渲染出来格式错乱。
* **解**：使用 `react-markdown` 并配合 `tailwindcss-typography` (即 `prose` 类名)。并在 Prompt 中明确要求："Use standard Markdown headers and bullet points."

### 4. 部署上线 (Deployment)

* **坑**：本地运行好好的，部署到 Vercel 后报错 `500` 或 `API Key not found`。
* **解**：本地的 `.env` 文件不会上传到 GitHub。
  * 一定要去 Vercel 控制台 -> Settings -> **Environment Variables**。
  * 添加 `MOONSHOT_API_KEY`，把你的密钥填进去。
  * 重新 Deploy 才会生效。

---

## 总结

做一个 AI 简历优化产品，**最不重要**的是"怎么调用 Kimi K2 API"（因为这在文档里都有）。

**最重要**的是：

1. **Mindset**: 敢于做减法，只验证文本优化，不做复杂的编辑器。
2. **Prompt**: 像招聘专家一样思考，而不是像程序员一样思考。
3. **Vibe**: 让产品有即时反馈，利用流式输出缓解等待焦虑。

接下来，请按照这个大纲，创建一个新的 Next.js 项目，开始你的实战吧！
