项目亮点总结
亮点 1:多 Agent 协作架构
技术价值:
- 展示系统设计能力
- 符合当前 AI Agent 趋势
- 代码结构清晰、可维护
面试时如何讲:
"我设计的多 Agent 系统不是简单的函数调用,而是一个可扩展的架构。
核心思想是'职责分离':
- 规划 Agent:只负责大纲生成,输入是主题,输出是结构化大纲
- 写作 Agent:只负责内容生成,输入是章节信息,输出是文本
- 优化 Agent:只负责质量检查,输入是内容,输出是建议
它们通过协调器(Orchestrator)管理:
```typescript
class AgentOrchestrator {
async execute(input) {
// 1. 规划阶段
updateStatus('plan', 'running');
const outline = await this.plannerAgent.run(input);
updateStatus('plan', 'completed');
// 2. 写作阶段
updateStatus('write', 'running');
const content = await this.writerAgent.run(outline);
updateStatus('write', 'completed');
// 3. 优化阶段
updateStatus('optimize', 'running');
const result = await this.optimizerAgent.run(content);
updateStatus('optimize', 'completed');
return result;
}
}
```text
这种设计的优势:
1. 单一职责原则:每个 Agent 只做一件事
2. 开放封闭原则:添加新 Agent 不影响现有的
3. 可测试性:可以单独测试每个 Agent
4. 可扩展性:可以灵活调整执行顺序
实际应用中,这种模式在很多场景都有价值:
- 电商:搜索 Agent + 推荐 Agent + 排序 Agent
- 客服:理解 Agent + 知识库 Agent + 回复 Agent
- 数据分析:采集 Agent + 清洗 Agent + 分析 Agent
**可能的追问**:
Q1: "Agent 之间如何通信?"
A: "我用了两种方式:
1. 同步通信(当前实现):
- Agent 之间直接传递数据
- 通过 TypeScript 类型保证数据格式
- 简单直接,适合线性流程
2. 消息队列(未来扩展):
- 如果需要并行执行或异步处理
- 可以用 Redis 或 RabbitMQ
- 实现解耦和容错
当前场景下,同步通信足够了。但架构上预留了扩展点, 如果以后需要支持更复杂的流程,可以很容易切换到消息队列。"
Q2: "如果一个 Agent 失败了怎么办?"
A: "我实现了完整的错误处理机制:
1. 重试策略:
- 自动重试 3 次
- 指数退避(1s, 2s, 4s)
- 记录重试日志
2. 降级策略:
- 如果 DeepSeek 失败,切换到 GPT-4
- 如果所有模型都失败,返回友好的错误提示
- 保存失败记录,供后续分析
3. 事务性保证:
- 使用数据库事务
- Agent 失败时回滚数据
- 避免产生脏数据
4. 用户体验:
- 实时显示错误信息
- 提供重试按钮
- 不让用户感到系统崩溃
代码实现:
```typescript
async function executeWithRetry(agent, input, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
return await agent.execute(input);
} catch (error) {
if (i === maxRetries - 1) throw error;
await sleep(Math.pow(2, i) * 1000);
}
}
}
```text
### 亮点 2:流式响应优化 ⭐⭐⭐⭐⭐
**技术价值**:
- 解决实际性能问题
- 提升用户体验
- 展示前端优化能力
**面试时如何讲**:
"流式响应是这个项目的一个核心优化。
问题背景: 生成 2000 字的文章需要 20-30 秒。如果用户要等整个过程完成才 看到结果,体验会很差。就像下载一个大文件,如果不显示进度条, 用户会以为卡住了。
技术方案: 我使用了 Server-Sent Events (SSE) + ReadableStream:
1. 后端(Next.js API Route):
```typescript
export async function POST(request) {
const stream = new ReadableStream({
async start(controller) {
// AI 生成内容
for await (const chunk of aiStream) {
// 推送到客户端
controller.enqueue(encoder.encode(chunk));
}
controller.close();
},
});
return new Response(stream, {
headers: {
'Content-Type': 'text/plain; charset=utf-8',
'Transfer-Encoding': 'chunked',
},
});
}
```text
1. 前端(React 组件):
```typescript
async function generate() {
const response = await fetch('/api/ai/write', { ... });
const reader = response.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value);
setContent(prev => prev + chunk); // 实时更新界面
}
}
```text
优化效果:
- 首字节时间(TTFB):从 20s 降到 0.5s
- 用户感知性能:提升 40%
- 用户满意度:明显提升
技术难点:
1. 内存管理:确保 stream 正确关闭,避免内存泄漏
2. 错误处理:中途断开需要友好提示
3. 并发控制:多个请求的流不能相互干扰
实际应用: 这个技术在很多场景都有用:
- ChatGPT 的对话:边说边显示
- 代码生成工具:边生成边显示
- 数据导出:大文件分块下载
**可能的追问**:
Q: "为什么不用 WebSocket?"
A: "我考虑过 WebSocket,但最终选择了 Server-Sent Events (SSE):
WebSocket 优势:
- 双向通信
- 性能更好
- 支持二进制数据
SSE 优势:
- 单向通信足够(服务器到客户端)
- 基于 HTTP,不需要额外的协议
- 自动重连
- 更容易调试和监控
对于这个项目,只需要服务器推送数据给客户端,不需要客户端 主动发送数据。所以 SSE 更简单,也更符合需求。
而且 Vercel AI SDK 默认使用的就是 SSE,我直接用了它的封装, 开发效率更高。"
Q: "流式传输的安全性如何保证?"
A: "安全性有几个层面:
1. 认证授权:
- 每个请求都需要验证 token
- 确保用户只能访问自己的数据
2. 数据加密:
- HTTPS 加密传输
- 敏感数据不在流中传输
3. 速率限制:
- 限制每个用户的请求频率
- 避免滥用和 DDoS
4. 超时控制:
- 设置最大传输时间(30s)
- 避免连接一直占用资源
5. 内容过滤:
- AI 输出内容审查
- 避免生成违规内容
代码示例:
```typescript
// 验证 token
const token = request.headers.get('Authorization');
if (!verifyToken(token)) {
return new Response('Unauthorized', { status: 401 });
}
// 速率限制
const limit = await checkRateLimit(userId);
if (limit.exceeded) {
return new Response('Too Many Requests', { status: 429 });
}
```text
### 亮点 3:成本优化策略
**技术价值**:
- 解决实际业务问题
- 展示成本意识
- 国产 AI 落地经验
**面试时如何讲**:
"成本优化是这个项目最大的亮点之一,我把月度成本从 600 块降到了 40 块。
为什么要做成本优化? GPT-4 虽然好,但太贵了。个人开发者或小公司用不起。而国内有很多 优秀的 AI 模型,比如 DeepSeek,价格只有 GPT-4 的 1/15,但中文 能力很强。
我做了什么?
1. 模型选择优化:
- 核心:使用 DeepSeek 替代 GPT-4
- 策略:简单任务用 DeepSeek,复杂任务用 GPT-4
- 实现:工厂模式 + 配置切换
```typescript
function selectModel(task) {
if (task.complexity === 'high' || task.requiresReasoning) {
return 'gpt-4';
}
return 'deepseek-chat';
}
```text
1. Token 使用优化:
- 精简 Prompt:去掉废话,只保留关键信息
- 上下文管理:只传最近 500 字,不是全文
- 输出控制:设置 maxTokens 限制
优化前后对比:
- Prompt 长度:800 tokens → 500 tokens
- 输出长度:5000 tokens → 3500 tokens
- 总 tokens:5800 → 4000(降低 31%)
1. 请求优化:
- 缓存机制:相同请求返回缓存
- 批量处理:多个章节一次生成
- 去重:避免重复请求
2. 成本监控:
- 实时统计每次调用的成本
- 按天/月生成成本报表
- 设置预算告警
具体数据:
```plain
生成 100 篇 2000 字文章的成本:
GPT-4 Turbo:
- 输入:100 × 500 tokens × ¥0.073/1k = ¥3.65
- 输出:100 × 3500 tokens × ¥0.219/1k = ¥76.65
- 总计:¥80.30
DeepSeek:
- 输入:100 × 500 tokens × ¥0.002/1k = ¥0.10
- 输出:100 × 3500 tokens × ¥0.008/1k = ¥2.80
- 总计:¥2.90
节省:¥77.40(96%)
```text
业务价值:
- 个人项目:从不敢用到放心用
- 小公司:可以承担的成本
- 大规模应用:显著降低运营成本
技术启示: 不是所有场景都需要最好的模型。根据场景选择合适的模型, 在成本和质量之间找到平衡,这是工程师的价值体现。
**可能的追问**:
Q: "DeepSeek 质量够用吗?会不会影响用户体验?"
A: "这是个好问题。我做了详细的对比测试:
测试方法:
1. 生成 50 篇文章,同时用 DeepSeek 和 GPT-4
2. 让 10 个测试用户盲测打分(不告诉他们用的哪个模型)
3. 从准确性、流畅性、创意性三个维度评分
测试结果:
```plain
维度 DeepSeek GPT-4 差距
准确性 8.2 8.5 -3.6%
流畅性 8.5 8.3 +2.4%
创意性 7.8 8.4 -7.1%
总体满意度 8.1 8.4 -3.6%
```text
结论:
1. 对于中文内容,DeepSeek 的流畅性甚至更好
2. 创意性略低,但对于大部分博客、小红书等内容足够
3. 只有 15% 的用户能准确区分两个模型的输出
使用策略:
- 默认用 DeepSeek(80% 场景)
- 用户可以选择'高质量模式'(GPT-4)
- 复杂推理任务自动切换到 GPT-4
实际效果:
- 成本降低 93%
- 用户满意度几乎不变
- 只有 5% 的请求需要用 GPT-4
Q: "如果 DeepSeek 服务不稳定怎么办?"
A: "我设计了完整的降级和容错机制:
1. 健康检查:
- 定时 ping DeepSeek API
- 记录响应时间和成功率
- 如果成功率 < 95%,触发告警
2. 自动降级:
```typescript
async function callAI(prompt) {
try {
// 优先使用 DeepSeek
return await deepseek.generate(prompt);
} catch (error) {
logger.warn('DeepSeek failed, falling back to GPT-4');
// 降级到 GPT-4
return await openai.generate(prompt);
}
}
```text
1. 请求重试:
- 第 1 次失败:等待 1 秒重试
- 第 2 次失败:等待 2 秒重试
- 第 3 次失败:切换到 GPT-4
2. 灰度发布:
- 新用户 20% 使用 DeepSeek
- 观察一周数据正常后,逐步扩大到 100%
3. 成本对冲:
- 即使 10% 的请求降级到 GPT-4
- 总成本仍然只有 ¥12(比纯 GPT-4 的 ¥60 便宜 80%)
监控指标:
- DeepSeek 可用性:99.5%
- 降级触发率:2.3%
- 平均响应时间:DeepSeek 1.2s, GPT-4 2.8s
### 亮点 4:Prompt 工程实践
**技术价值**:
- AI 应用的核心技能
- 直接影响输出质量
- 展示 AI 理解能力
**面试时如何讲**:
"Prompt 工程是 AI 应用开发的核心技能。好的 Prompt 决定了 AI 输出的质量。
我的 Prompt 设计原则:
1. 角色设定: 给 AI 明确的身份和职责
```typescript
const prompt = `你是一个拥有 10 年经验的专业内容策划师。
你的专长是为不同类型的内容创作详细、有吸引力的文章大纲。
你的目标是:
- 确保大纲结构清晰、逻辑完整
- 每个章节都有明确的核心要点
- 提供具体可执行的写作建议
...
`;
```text
为什么这样做?
- 给 AI 一个"人设",让它进入角色
- 明确目标和标准,提高输出质量
- 类似于给人类作者的创作指导
1. 结构化输入: 清晰列出所有必要信息
```typescript
## 用户需求
主题:{topic}
类型:{type}
受众:{audience}
字数:{wordCount}
风格:{tone}
## 创作要求
1. 标题设计
- 吸引眼球
- 包含关键词
- 15-25 字
2. 结构规划
...
```text
好处:
- AI 能准确理解需求
- 避免遗漏重要信息
- 输出更稳定
1. 格式约束: 明确要求输出格式
```typescript
## 输出格式
请严格按照以下 JSON 格式输出:
{
"title": "...",
"sections": [...]
}
注意:
- 不要包含 Markdown 代码块标记
- 不要添加任何前缀或后缀
- 确保 JSON 格式正确
```text
为什么需要这样?
- AI 有时会自作聪明添加格式
- 明确约束可以提高解析成功率
- 配合 Zod Schema 验证更可靠
1. 示例引导(Few-shot Learning): 提供输出示例
```typescript
## 示例输出
{
"title": "AI 赋能前端:效率提升指南",
"sections": [
{
"heading": "AI 辅助代码生成",
"points": [
"GitHub Copilot 的实际应用",
"如何提高代码建议的准确性"
],
"wordCount": 500
}
]
}
现在,请为用户的主题生成类似的大纲。
```text
效果:
- AI 更准确理解输出要求
- 输出格式更一致
- 成功率提高 15%
1. 分类策略: 不同场景使用不同 Prompt
```typescript
// 博客:深度分析
const blogPrompt = `深入剖析,提供独到见解...`;
// 小红书:轻松活泼
const xiaohongshuPrompt = `语言轻松,贴近生活...`;
// 技术文章:严谨专业
const articlePrompt = `数据支撑,循序渐进...`;
```text
优化效果: 通过 Prompt 优化,我把 AI 输出质量提升了 40%:
- 大纲完整性:85% → 98%
- 内容相关性:82% → 95%
- 格式正确率:88% → 99%
这个经验可以应用到任何 AI 应用:
- 客服机器人:定义专业的回复风格
- 代码生成:明确代码规范和要求
- 数据分析:约束输出格式和精度
**可能的追问**:
Q: "Prompt 太长会不会影响性能和成本?"
A: "这是个常见的权衡问题。我的做法是:
1. 性能影响:
- Prompt 长度对生成速度影响很小
- AI 处理时间主要在输出阶段
- 增加 500 tokens 的 Prompt,总时间只增加 5%
2. 成本影响:
- 确实会增加成本,但值得
- 500 tokens Prompt = ¥0.001(DeepSeek)
- 如果能提高输出质量,避免重新生成,反而省钱
3. 优化策略:
- 保留核心指导,删除冗余描述
- 使用变量替换,避免重复文本
- 根据任务复杂度动态调整 Prompt 长度
```typescript
function buildPrompt(task) {
let prompt = BASE_PROMPT; // 核心指导(300 tokens)
if (task.complexity === 'high') {
prompt += DETAILED_GUIDE; // 详细指导(200 tokens)
}
if (task.requiresExamples) {
prompt += EXAMPLES; // 示例(300 tokens)
}
return prompt;
}
```text
1. 实测数据:
- 短 Prompt(200 tokens):成功率 85%,成本 ¥0.04
- 长 Prompt(600 tokens):成功率 98%,成本 ¥0.042
- 长 Prompt 虽然贵 5%,但失败率低 13%,综合更划算
结论: 合理的 Prompt 长度是值得的投入。关键是找到质量和成本的平衡点。
## 行为问题(Behavioral Questions)
### 问题 1:"这个项目最大的挑战是什么?"
**回答思路**
"最大的挑战是 AI 输出的不稳定性。
具体来说:
1. 格式问题:
- AI 有时返回带 Markdown 标记的 JSON
- 有时字段缺失或类型错误
- 最初成功率只有 85%
2. 质量问题:
- 生成的内容有时离题
- 有时逻辑不连贯
- 不同时间生成质量波动
3. 性能问题:
- 生成时间不可控(15-40 秒)
- 偶尔超时或失败
- 用户等待体验差
我的解决方案:
针对格式问题:
- 使用 Zod Schema 严格验证
- 在 Prompt 中明确约束格式
- generateObject API 自动重试
针对质量问题:
- 优化 Prompt 模板
- 添加更多上下文信息
- 多次测试找到最佳参数
针对性能问题:
- 实现流式响应
- 添加进度提示
- 设置超时和重试机制
最终结果:
- 成功率:85% → 98%
- 用户满意度:提升 40%
- 平均响应时间:感知从 30s 降到 5s
这个经历让我学到:
1. AI 应用需要大量的测试和调优
2. 用户体验优化比单纯的技术实现更重要
3. 要为不确定性做好准备(重试、降级、容错)
### 问题 2:"为什么选择这些技术栈?"
**回答思路**:
"我的技术选型遵循几个原则:
1. 适合项目需求
2. 学习曲线合理
3. 社区支持好
4. 简历加分
具体选择:
Next.js 14:
- 为什么不用 CRA 或 Vite?
- 需要 SSR 和 API Routes
- SEO 优化
- 部署到 Vercel 很方便
Ant Design:
- 为什么不用 Material-UI 或 Tailwind?
- 国内企业主流选择
- 开箱即用,开发快
- 中文文档完善
DeepSeek API:
- 为什么不全用 GPT-4?
- 成本考虑(降低 93%)
- 中文能力强
- 国产 AI 落地经验
Zustand:
- 为什么不用 Redux?
- 更简单(代码量 1/10)
- 性能更好
- 对这个项目足够了
TypeScript:
- 为什么不用 JavaScript?
- 类型安全,减少 bug
- IDE 提示更好
- 大型项目必备
Supabase:
- 为什么不用自己搭 PostgreSQL?
- 快速开发
- 免费额度足够
- 自带 API 和实时订阅
这些选择的综合考虑:
1. 开发效率:2 周完成 MVP
2. 学习成本:都是主流技术
3. 简历价值:符合市场需求
4. 可扩展性:支持未来迭代