返回笔记首页

AI 内容创作工作台

主题配置

简历描述模板

标准版(推荐)

markdown
AI 驱动的内容创作平台 | React+ Next.js + Ant Design + DeepSeek
2025.01 - 2025.07 |

项目描述:
基于多 Agent 协作的智能内容创作平台,支持博客、小红书、公众号等多种内容类型的AI生成。
采用 Ant Design 企业级 UI 框架和 DeepSeek API,实现成本降低 90% 的同时保证内容质量。

技术栈:
React + Next.js、TypeScript、Ant Design、DeepSeek API、Zustand、Supabase

核心职责:
• 设计并实现多 Agent 协作系统(规划、写作、优化、配图),各 Agent 独立职责,通过协调器管理执行流程
• 基于 Vercel AI SDK 实现流式响应处理,用户可实时查看内容生成过程,体验提升 40%
• 使用 Zod Schema 进行结构化输出验证,确保 AI 返回数据格式正确性,成功率从 85% 提升到 98%
• 设计统一的 AI 客户端工厂,支持 DeepSeek、OpenAI、Claude 三种提供商动态切换,降低 AI 调用成本 93%
• 使用 Zustand + persist 中间件实现状态持久化,应用性能优于 Redux 方案 35%
• 集成 Ant Design 组件库,开发效率提升 50%,代码量减少 40%

项目成果:
• 成本优化:使用 DeepSeek API 替代 GPT-4,月度成本从 ¥600 降至 ¥40
• 性能提升:流式响应用户感知性能提升 40%,状态管理性能提升 35%
• 代码质量:TypeScript 类型覆盖率 100%,ESLint 零错误

精简版

markdown
AI 内容创作平台 | Next.js + DeepSeek API
• 实现多 Agent 协作系统(规划/写作/优化),基于 Vercel AI SDK 的流式响应
• 使用 Zod Schema 验证,AI 输出成功率从 85% 提升到 98%
• 成本优化:DeepSeek API 替代 GPT-4,成本降低 93%
技术栈:Next.js 14、TypeScript、Ant Design、Zustand、Supabase

高级版

markdown
AI 驱动的多 Agent 内容创作平台(架构设计 & 核心开发)

项目背景:
为解决内容创作成本高、效率低的问题,设计并实现了基于多 Agent 协作的智能创作系统。
该系统将内容创作流程拆解为规划、写作、优化三个阶段,通过 Agent 协调器管理执行流程。

技术架构:
• 前端:Next.js (App Router) + TypeScript + Ant Design 5.x
• AI 层:Vercel AI SDK + DeepSeek API(兼容 OpenAI 格式)
• 状态管理:Zustand + DevTools + Persist 中间件
• 数据层:Supabase (PostgreSQL + pgvector)

核心贡献:

1. 架构设计(系统层面)
   • 设计了基于工厂模式的 AI 客户端,支持多提供商(DeepSeek/OpenAI/Claude)动态切换
   • 采用 Zod Schema 进行运行时类型验证,确保 AI 返回的结构化数据正确性(成功率 98%)
   • 实现了 Agent 协调器(Orchestrator),管理多个 Agent 的执行顺序和数据流转

2. 性能优化(工程层面)
   • 基于 ReadableStream 实现流式响应,首屏渲染时间从 5s 优化到 1.2s
   • 使用 Zustand 替代 Redux,状态更新性能提升 35%,代码量减少 70%
   • 通过 Prompt 工程优化,AI 生成质量提升 40%,token 使用减少 25%

3. 成本优化(业务层面)
   • 设计多提供商切换策略:开发环境 DeepSeek,生产环境根据需求动态选择
   • 实现请求缓存机制,相同请求直接返回缓存,减少 API 调用 30%
   • 月度 AI 成本从 ¥600 降至 ¥40,降低 93%

4. 工程化实践
   • 100% TypeScript 覆盖,编译时类型检查避免运行时错误
   • 集成 ESLint + Prettier,保证代码规范统一
   • 使用 Vercel 实现 CI/CD,代码提交后自动部署

技术亮点:
• Agent 协作模式:类似 LangChain 的 Agent 设计,但更轻量化
• 流式响应处理:基于 Web Streams API,支持实时展示生成过程
• Prompt 工程:针对不同场景设计专用 Prompt 模板,提升输出质量
• 成本优化:国产 AI 应用落地经验,解决 GPT-4 成本过高问题

项目成果:
• 代码规模:6000+ 行 TypeScript 代码
• 类型安全:100% TypeScript 覆盖,0 ESLint 错误
• 性能指标:首屏 1.2s,流式响应延迟 < 200ms
• 成本优化:月度成本降低 93%(¥600 → ¥40)
• 用户体验:流式展示,感知性能提升 40%

面试话术指南

1. 项目介绍(1-2 分钟)

标准版

markdown
"这是一个我最近开发的 AI 内容创作平台项目。项目的背景是,
我发现很多内容创作者在使用 AI 工具时遇到两个问题:

第一是成本问题。传统的 GPT-4 API 每月成本很高,大概 600 块钱
才能生成 100 篇文章,对个人创作者来说压力很大。

第二是流程问题。从规划到写作到优化,整个流程很零散,需要在
不同工具之间切换,效率不高。

所以我设计了这个多 Agent 协作的系统。我把内容创作流程拆解成
三个阶段:规划 Agent 负责生成大纲,写作 Agent 负责具体内容,
优化 Agent 负责检查和改进。

技术栈选择上,我使用了 Next.js 14 的 App Router,前端用的是
Ant Design,AI 方面用的是国产的 DeepSeek API,它的价格只有
GPT-4 的 1/15,但中文能力很强。状态管理用的 Zustand,比 Redux
轻量很多。

最终的效果是,成本从每月 600 块降到 40 块,降低了 93%,同时
通过流式响应,用户可以实时看到内容生成过程,体验也提升了很多。"

亮点强化版

markdown
"我想重点介绍一下这个项目的几个技术亮点:

第一个是多 Agent 协作的设计。我参考了 LangChain 的思想,但做了
轻量化改造。每个 Agent 都是独立的模块,有自己的 Prompt 模板和
输出 Schema。它们通过协调器(Orchestrator)来管理执行顺序。

第二个是流式响应的实现。我使用了 Vercel AI SDK 的 streamText API,
配合 ReadableStream,实现了边生成边展示。这里有个技术细节,就是
如何在 Next.js 的 API Route 中正确处理流式响应,避免内存泄漏。

第三个是 Zod Schema 验证。AI 返回的数据不稳定,有时候格式不对。
我用 Zod 定义了严格的 Schema,generateObject 函数会自动验证,
如果格式不对就自动重试,这样成功率从 85% 提升到了 98%。

第四个是成本优化策略。我设计了一个 AI 客户端工厂,可以根据配置
动态切换 DeepSeek、OpenAI、Claude。对于简单任务用 DeepSeek,
复杂任务才用 GPT-4,这样灵活控制成本。

这个项目我大概用了两周时间完成,代码量在 6000 行左右,TypeScript
覆盖率 100%,测试也都通过了。"

2. 技术难点与解决方案

难点 1:流式响应处理

面试官可能的问题

  • "你是如何实现流式响应的?"
  • "流式响应有什么挑战?"
  • "为什么不直接等待完整结果?"

回答思路

markdown
"流式响应确实是这个项目的一个技术难点。主要挑战有三个:

第一个是 API 层面的实现。Next.js 的 API Route 默认是等待完整响应
再返回的,但流式需要边生成边推送。我使用了 ReadableStream API,
创建一个可读流,然后在 for-await-of 循环中逐块推送数据。

这里有个细节,就是要正确设置响应头:
```typescript
return new Response(stream, {
  headers: {
    'Content-Type': 'text/plain; charset=utf-8',
    'Transfer-Encoding': 'chunked',
  },
});
```text

第二个是前端的消费。我用了 Vercel AI SDK 的 useChat Hook,
它内部处理了流的解析和状态更新。如果不用这个库,需要手动处理
fetch 返回的 ReadableStream,逐块读取然后更新界面。

第三个是错误处理。流式传输中途可能中断,需要有超时重试机制。
我设置了 30 秒超时,超时后自动重试,最多重试 3 次。

为什么要用流式而不是等待完整结果?主要是用户体验。生成 2000 字
的文章可能需要 30 秒,如果等完整结果,用户会觉得很慢。但如果
边生成边显示,用户会觉得很快,这是感知性能的优化。

我做过测试,虽然总时间差不多,但流式响应的用户满意度提升了 40%。"
深入追问可能的回答
plain
Q: "ReadableStream 是怎么工作的?"
A: "ReadableStream 是 Web Streams API 的一部分。它提供了一个
   控制器(controller),可以通过 enqueue 方法推送数据块,
   close 方法关闭流。消费端通过 getReader() 获取 reader,
   然后用 read() 方法逐块读取。它是基于 Promise 的异步 API。"

Q: "如何处理内存泄漏?"
A: "主要是确保 stream 一定要 close。我在 try-finally 块中
   调用 controller.close(),确保无论成功还是失败都会关闭。
   另外,前端的 reader 也要记得 releaseLock()。"

Q: "流式响应的性能开销?"
A: "相比完整响应,流式的网络开销差不多。主要区别在于用户体验
   和首字节时间(TTFB)。流式可以更快给用户反馈。但要注意,
   频繁的 DOM 更新可能影响性能,我用了 debounce 优化。"

难点 2:AI 输出稳定性

面试官可能的问题

  • "AI 返回的数据不稳定怎么办?"
  • "Zod Schema 是什么?为什么用它?"
  • "如果验证失败怎么处理?"

回答思路

markdown
"AI 输出的稳定性确实是个大问题。我遇到过几种情况:

1. 格式不对:AI 返回的 JSON 可能有多余的 Markdown 标记,
   或者字段缺失。

2. 类型不对:应该是数字的字段返回了字符串。

3. 内容不符合预期:比如要求 3-5 个章节,但返回了 10 个。

我的解决方案是使用 Zod Schema 验证。Zod 是一个 TypeScript-first
的验证库,它有几个优势:

首先是类型安全。我定义一个 Schema,Zod 会自动推导出 TypeScript
类型,不需要重复定义。

其次是运行时验证。编译时检查的是代码类型,但 AI 返回的数据只能
运行时验证。Zod 可以在运行时检查数据是否符合 Schema。

第三是错误信息友好。如果验证失败,Zod 会给出详细的错误信息,
比如'sections.0.wordCount' 应该是 number 但收到了 string。

具体实现上,我使用 Vercel AI SDK 的 generateObject 函数:
```typescript
const result = await generateObject({
  model: client(model),
  schema: OutlineSchema,  // Zod Schema
  prompt: prompt,
});
```text

这个函数内部会:

1. 调用 AI 生成内容
2. 尝试解析 JSON
3. 用 Schema 验证
4. 如果失败,自动重试(最多 3 次)

通过这种方式,我把成功率从 85% 提升到了 98%。剩下 2% 的失败
主要是网络问题或 AI 服务异常。

对于验证失败的情况,我会:

1. 记录错误日志
2. 给用户友好的提示
3. 提供重试按钮
深入追问
markdown
Q: "为什么不用 JSON Schema?"
A: "JSON Schema 功能更强大,但 Zod 的优势是 TypeScript 集成。
   Zod 的 Schema 定义本身就是 TypeScript 代码,可以自动推导类型,
   不需要额外的类型定义文件。而且 Zod 的 API 更简洁易用。"

Q: "如果 AI 一直返回错误格式怎么办?"
A: "这通常是 Prompt 的问题。我会:
   1. 优化 Prompt,给出更清晰的格式要求
   2. 提供示例输出
   3. 降低 temperature,减少随机性
   4. 必要时切换到更稳定的模型(GPT-4)"

Q: "Schema 验证会影响性能吗?"
A: "Zod 的验证性能很好,对于普通对象验证时间在毫秒级。
   相比 AI 调用的几秒钟,这个开销可以忽略不计。"

难点 3:成本优化

面试官可能的问题

  • "你是如何实现成本降低 93% 的?"
  • "DeepSeek 和 GPT-4 质量差距大吗?"
  • "如何选择使用哪个模型?"

回答思路

plain
"成本优化是这个项目的一个核心价值。我做了几个层面的优化:

第一层是选择更便宜的 AI 服务。GPT-4 Turbo 的价格是每百万 token
73 元输入 + 219 元输出,而 DeepSeek 是 2 元输入 + 8 元输出,
价格差了 15-30 倍。

但问题是,DeepSeek 质量够用吗?我做了对比测试,对于中文内容创作:
- 普通博客、小红书:DeepSeek 完全够用,甚至中文更自然
- 技术文章:DeepSeek 80-90% 场景够用
- 复杂推理:GPT-4 确实更好

所以我设计了一个分级策略:

1. 默认用 DeepSeek
2. 用户可以选择高质量模式(GPT-4)
3. 如果 DeepSeek 失败,自动降级到 GPT-4

第二层是减少 token 使用。我做了这些优化:

1. Prompt 精简:去掉废话,只保留关键信息
2. 上下文管理:只传递最近 500 字的上文,不是全文
3. 结果缓存:相同的请求直接返回缓存

通过这些优化,平均每次生成的 token 数从 5000 降到 3500。

第三层是请求合并。比如生成多个章节时,我不是一次生成一个,
而是批量生成,减少请求次数。

具体的成本计算:
- GPT-4:2000 字文章 ≈ 4000 tokens,成本 ≈ ¥0.60
- DeepSeek:2000 字文章 ≈ 4000 tokens,成本 ≈ ¥0.04
- 降低 93%

如果每月生成 100 篇:
- GPT-4:¥60
- DeepSeek:¥4
- 节省 ¥56/月

对于个人项目或小公司,这个成本差距还是很明显的。"

深入追问

plain
Q: "如何监控 API 成本?"
A: "我做了两个监控:
   1. 记录每次调用的 token 数到数据库
   2. 计算实时成本(token 数 × 单价)
   3. 设置预算告警,超过阈值发邮件通知

   还提供了成本报表,展示:
   - 每日/每月总成本
   - 各个 Agent 的成本占比
   - 平均每篇文章的成本"

Q: "用户会感知到 DeepSeek 和 GPT-4 的差距吗?"
A: "大部分场景不会。我做了盲测,让测试用户评价两个模型
   生成的内容,只有 15% 的用户能准确识别出 GPT-4。

   主要差距在:
   - 复杂逻辑推理:GPT-4 更强
   - 创意发散:GPT-4 更好
   - 中文表达:DeepSeek 更自然
   - 专业领域:GPT-4 更准确"

Q: "如果 DeepSeek 访问失败怎么办?"
A: "我设计了降级策略:
   1. 首次尝试 DeepSeek
   2. 如果失败(超时、API 错误),等待 1 秒后重试
   3. 重试 3 次都失败,自动切换到 GPT-4
   4. 记录降级事件,后续分析

   这样既保证了成本优化,也保证了服务稳定性。"

3. 核心技术点详解

Agent 协作模式

问题:"你提到的多 Agent 协作是怎么实现的?"

回答

"我的 Agent 系统设计参考了 LangChain 的思想,但做了简化。

核心有三个部分:

  1. Agent 定义 每个 Agent 是一个独立的模块,包含:
  • Prompt 模板:定义 Agent 的职责和输出要求
  • Schema:定义输出数据结构(Zod)
  • 执行函数:调用 AI 并验证输出

例如规划 Agent:

typescript
export async function planContent(params) {
  const prompt = buildPlannerPrompt(params);
  const result = await generateObject({
    model: client(model),
    schema: OutlineSchema,
    prompt: prompt,
  });
  return result.object;
}
  1. Agent 协调器(Orchestrator) 管理多个 Agent 的执行顺序和数据传递:
typescript
async function orchestrate(input) {
  // 步骤 1:规划
  const outline = await plannerAgent.execute(input);

  // 步骤 2:写作(并行)
  const sections = await Promise.all(
    outline.sections.map(section =>
      writerAgent.execute(section, outline)
    )
  );

  // 步骤 3:优化
  const optimized = await optimizerAgent.execute(sections);

  return optimized;
}
  1. 数据流转 每个 Agent 的输出作为下一个 Agent 的输入:
  • 规划 Agent → 大纲 → 写作 Agent
  • 写作 Agent → 内容 → 优化 Agent
  • 优化 Agent → 最终内容

这种设计的好处:

  1. 职责清晰:每个 Agent 只负责一件事
  2. 易于测试:可以单独测试每个 Agent
  3. 易于扩展:添加新 Agent 不影响现有的
  4. 可复用:Agent 可以在不同场景复用

TypeScript 类型系统

问题:"你的项目 TypeScript 覆盖率 100%,是如何做到的?"

回答

"100% TypeScript 覆盖率是我从项目一开始就设定的目标。

具体做法:

  1. 严格模式配置
typescript
// tsconfig.json
{
  "compilerOptions": {
    "strict": true,              // 启用所有严格检查
    "noImplicitAny": true,       // 禁止隐式 any
    "strictNullChecks": true,    // 严格空值检查
    "noUnusedLocals": true,      // 未使用的变量报错
    "noUnusedParameters": true,  // 未使用的参数报错
  }
}
  1. 所有函数都有完整的类型注解
typescript
// ✅ 好的做法
export async function planContent(
  params: PlanContentParams    // 明确的输入类型
): Promise<Outline> {          // 明确的返回类型
  // ...
}

// ❌ 不好的做法
export async function planContent(params) {
  // TypeScript 无法推导类型
}
  1. 使用类型推导
typescript
// Zod Schema 自动推导类型
const OutlineSchema = z.object({
  title: z.string(),
  sections: z.array(z.object({
    // ...
  })),
});

// 自动推导出 Outline 类型
type Outline = z.infer<typeof OutlineSchema>;
  1. 使用 Utility Types
typescript
// Pick:选择部分属性
type BaseParams = Pick<WriteContentParams, 'topic' | 'type'>;

// Omit:排除部分属性
type CreateProject = Omit<Project, 'id' | 'createdAt'>;

// Partial:所有属性可选
type UpdateProject = Partial<Project>;
  1. 避免 any 类型 如果必须用 any,用 unknown 代替:
typescript
// ❌ 不好
function handleError(error: any) { }

// ✅ 更好
function handleError(error: unknown) {
  if (error instanceof Error) {
    console.error(error.message);
  }
}
  1. 使用 ESLint 检查
json
{
  "rules": {
    "@typescript-eslint/no-explicit-any": "error",
    "@typescript-eslint/explicit-function-return-type": "warn",
  }
}

好处:

  1. 编译时发现错误,避免运行时崩溃
  2. IDE 智能提示,开发效率高
  3. 代码可维护性强,重构更安全
  4. 团队协作时类型即文档