第40期 | 模块四复盘:AI应用开发模式总结
第40期 | 模块四复盘:AI应用开发模式总结
🎯 今天你将学会
- 整理 AI 应用的常见架构模式,形成你的「开发模式库」
- 掌握 AI 应用特有的性能优化策略
- 理解 AI 应用安全注意事项——比传统 Web 应用更多
- 回顾模块四全部知识,完成能力自检
📖 核心知识
AI 前端开发模式库
经过模块四 10 期的学习,我们把所有模式整理成一份可复用的开发模式库:
模式1:基础对话模式
适用场景:简单聊天、问答、翻译
架构:前端 → 后端代理 → LLM API → SSE流式返回
关键组件:ChatStore + ChatMessage + MarkdownRenderer + ChatInput
关键技术:SSE流式解析 + Zustand状态管理 + react-markdown渲染
常见问题:流式渲染抖动、Markdown格式不一致、长消息性能
模式2:RAG问答模式
适用场景:知识库问答、文档搜索、技术助手
架构:前端 → 后端(向量搜索+LLM) → SSE流(content+sources)
关键组件:ChatStore + SourceReference + DocumentUpload + KnowledgeStore
关键技术:向量搜索UI + 引用来源展示 + 文档分片管理
常见问题:搜索精度低、分片质量差、引用来源不可信
模式3:Agent交互模式
适用场景:AI助手、自动化任务、工具调用
架构:前端 → 后端(Agent思考+工具+LLM) → SSE流(thinking+tool+text)
关键组件:AgentStore + AgentMessage + ToolCall + ThinkingStep + DisplayModeToggle
关键技术:Agent SSE多类型解析 + 工具调用可视化 + 思考过程展示
常见问题:工具调用结果展示混乱、思考过程太长、用户不理解Agent逻辑
模式4:图片生成模式
适用场景:AI绘画、图片创作、设计辅助
架构:前端 → 后端代理 → DALL-E/Stable Diffusion → 图片URL返回
关键组件:ImageStore + PromptInput + StylePresets + GenerationProgress + ResultGallery
关键技术:模拟进度条 + 图片下载持久化 + 风格预设组合
常见问题:等待时间长(15-60s)、结果不确定、URL临时过期(2h)
模式5:语音交互模式
适用场景:语音聊天、语音助手、语音转文字
架构:Web Speech API(免费) 或 Whisper API(付费) → 文字 → LLM → SpeechSynthesis播放
关键组件:VoiceRecorder + AudioVisualizer + VoicePlayer + 降级处理
关键技术:SpeechRecognition实时转文字 + AnalyserNode波形可视化 + SpeechSynthesis播放
常见问题:浏览器支持度差异、隐私提示、降级方案
模式6:多模态交互模式
适用场景:图片理解、混合对话、结构化提取
架构:前端(文字+图片) → 后端(GPT-4o多模态) → SSE流(文字+可能图片)
关键组件:MultimodalMessage + ImageUploader + StructuredResult + ExportButton
关键技术:图片base64编码 + 多模态消息渲染 + 结构化输出Prompt
常见问题:图片压缩(20MB限制)、格式约束不稳定、结构化提取精度
六种模式的选择决策树
你的需求是什么?
│
├─ 纯文字对话 → 模式1(基础对话)
│
├─ 需要知识库支撑 → 模式2(RAG问答)
│
├─ 需要AI执行操作 → 模式3(Agent交互)
│
├─ 需要生成图片 → 模式4(图片生成)
│
├─ 需要语音输入/输出 → 模式5(语音交互)
│
├─ 需要图片理解 → 模式6(多模态交互)
│
└─ 需要多种能力组合 → 组合模式(如 RAG + Agent + 语音)
AI 应用性能优化策略
AI 应用有传统 Web 应用没有的性能瓶颈:
| 瓶颈 | 原因 | 优化方案 |
|---|---|---|
| LLM 响应慢 | 生成 1-30 秒 | 流式响应(SSE)+ 模拟进度 + 预估时间提示 |
| 长消息渲染 | Markdown 渲染重 | 虚拟列表 + 分段渲染 + 懒加载图片 |
| Token 成本高 | 每次请求 $0.01-0.30 | 缓存相似问题 + 模型降级(gpt-4o-mini) + max_tokens限制 |
| 图片URL过期 | DALL-E URL 2小时失效 | 立即下载保存 + CDN持久化 |
| 并发请求多 | 多用户同时聊天 | 限流 + 队列 + 降级到更小模型 |
| 状态管理重 | 对话历史可能很长 | Zustand persist + 对话压缩 + 只持久化关键数据 |
具体优化实现:
1. 虚拟列表(聊天消息过多时)
当对话超过 100 条消息时,渲染所有消息会变慢。用虚拟列表只渲染可见区域:
import { useVirtualizer } from '@tanstack/react-virtual';
function VirtualMessageList({ messages }: { messages: Message[] }) {
const parentRef = useRef<HTMLDivElement>(null);
const virtualizer = useVirtualizer({
count: messages.length,
getScrollElement: () => parentRef.current,
estimateSize: () => 80, // 预估每条消息高度
overscan: 5, // 多渲染5条,避免频繁重新渲染
});
return (
<div ref={parentRef} className="h-[600px] overflow-auto">
<div style={{ height: virtualizer.getTotalSize(), position: 'relative' }}>
{virtualizer.getVirtualItems().map((item) => (
<div
key={item.key}
style={{ position: 'absolute', top: item.start, height: item.size }}
>
<ChatMessage message={messages[item.index]} />
</div>
))}
</div>
</div>
);
}
2. 缓存相似问题
// lib/cache.ts
interface CacheEntry {
query: string;
response: string;
timestamp: string;
tokensUsed: number;
}
class QueryCache {
private cache: Map<string, CacheEntry> = new Map();
get(query: string): CacheEntry | null {
// 简单的相似度判断:去掉标点和空格后比较
const normalized = query.toLowerCase().replace(/[^\w]/g, '');
for (const [key, entry] of this.cache) {
const normalizedKey = key.toLowerCase().replace(/[^\w]/g, '');
if (normalized === normalizedKey || this.similarity(normalized, normalizedKey) > 0.8) {
return entry;
}
}
return null;
}
set(query: string, response: string, tokensUsed: number) {
this.cache.set(query, {
query,
response,
timestamp: new Date().toISOString(),
tokensUsed,
});
}
private similarity(a: string, b: string): number {
// 简化的相似度:公共字符数 / max(len)
const setA = new Set(a);
const setB = new Set(b);
const common = [...setA].filter(c => setB.has(c)).length;
return common / Math.max(setA.size, setB.size);
}
}
3. 模型动态降级
// lib/model-selector.ts
export function selectModel(query: string, usage: TokenUsage): string {
// 简单问题用 mini 模型
if (query.length < 100 && !query.includes('代码') && !query.includes('架构')) {
return 'gpt-4o-mini';
}
// 复杂问题用 gpt-4o
return 'gpt-4o';
}
AI 应用安全注意事项
AI 应用比传统 Web 应用多了一层安全维度——内容安全:
| 安全维度 | 传统 Web 应用 | AI 应用 | 防护措施 |
|---|---|---|---|
| API Key 安全 | 不暴露在前端 | 同样不能暴露 | 后端代理 + 环境变量 |
| 数据隐私 | 不泄露用户数据 | LLM 可能记住用户数据 | 不传敏感数据给 LLM + 数据脱敏 |
| 内容安全 | 不太多关注 | LLM 可能生成有害内容 | content moderation + 内容过滤 |
| 成本控制 | 服务器成本可控 | API 成本随使用量飙升 | 限流 + 缓存 + 模型降级 |
| Prompt 注入 | 不存在 | 用户可能通过输入操纵 AI | 输入验证 + system prompt 保护 |
| 幻觉风险 | 不存在 | LLM 编造不存在的事实 | RAG + 引用来源 + 用户验证提示 |
Prompt 注入防护:
// lib/prompt-sanitizer.ts
export function sanitizeUserInput(input: string): string {
// 移除可能用于注入的标记
const dangerousPatterns = [
/ignore previous instructions/gi,
/forget everything/gi,
/system:/gi,
/\[SYSTEM\]/gi,
/<\/?system>/gi,
];
let sanitized = input;
for (const pattern of dangerousPatterns) {
sanitized = sanitized.replace(pattern, '[FILTERED]');
}
// 限制输入长度
if (sanitized.length > 4000) {
sanitized = sanitized.slice(0, 4000) + '... (输入过长,已截断)';
}
return sanitized;
}
数据脱敏:
// lib/data-mask.ts
export function maskSensitiveData(text: string): string {
// 脱敏手机号
text = text.replace(/(\d{3})\d{4}(\d{4})/g, '$1****$2');
// 脱敏邮箱
text = text.replace(/(\w{2})\w+@(\w+\.\w+)/g, '$1***@$2');
// 脱敏身份证号
text = text.replace(/(\d{4})\d{10}(\d{4})/g, '$1**********$2');
return text;
}
模块四知识地图回顾
模块四:AI应用开发(第31-40期)
31. AI应用架构全景
├─ 四种架构模式(直接调用→代理→流式→RAG+Agent)
├─ AI应用 vs 传统Web差异
└─ 完整技术栈推荐
32. OpenAI API接入实战
├─ SDK安装 + Key管理
├─ 后端代理(非流式+流式)
├─ AI客户端封装(重试+超时+追踪)
└─ 成本控制策略
33. 聊天界面开发
├─ ChatStore + ChatMessage + ChatInput
├─ MarkdownRenderer + CodeBlock
├─ 流式打字效果
└─ 5个交互细节(滚动/中断/重试/复制/清空)
34. RAG前端实现
├─ 知识库管理界面(上传/分片/搜索)
├─ 向量搜索交互 + SourceReference
├─ RAG SSE流(content + sources)
└─ 引用来源展示
35. AI Agent前端交互
├─ Agent思考-行动循环
├─ 三种显示模式(精简/详细/实时)
├─ ToolCall + ThinkingStep组件
└─ Agent SSE多类型流解析
36. 实战4:AI助手应用
├─ TechAssist完整项目架构
├─ 三种模式(chat/rag/agent)统一设计
├─ 分模块逐步实现策略
└─ 产品级细节(持久化/标题生成/模型切换/Token追踪)
37. AI绘画前端
├─ 图片生成界面 + 风格预设
├─ 模拟进度条 + 等待体验设计
├─ ResultGallery + 下载持久化
└─ URL过期/版权提示
38. 语音AI前端
├─ Web Speech API + Whisper降级
├─ VoiceRecorder + AudioVisualizer
├─ VoicePlayer + SpeechSynthesis
└─ 语音UX原则(实时反馈/可中断/文字兜底/隐私提示)
39. 多模态AI应用
├─ 三种交互模式(图片理解/混合对话/多模态创作)
├─ MultimodalMessage + ImageUploader
├─ 结构化输出Prompt
└─ 图片压缩 + 格式约束
40. 模块四复盘
├─ 六种开发模式库
├─ 性能优化策略(虚拟列表/缓存/模型降级)
├─ 安全注意事项(Prompt注入/数据脱敏/内容安全)
└─ 能力自检清单
能力自检清单
| 能力 | 自检标准 | ✅/❌ |
|---|---|---|
| AI 应用架构 | 能根据需求选择正确的架构模式 | |
| 后端代理 | 实现了安全的 LLM API 代理(Key 不暴露) | |
| 流式响应 | 实现 SSE 流式渲染 + 逐字打字效果 | |
| 聊天界面 | 实现完整的 ChatGPT 风格聊天(消息+输入+Markdown) | |
| RAG 前端 | 实现知识库管理 + 引用来源展示 | |
| Agent 交互 | 实现思考过程 + 工具调用可视化 | |
| 图片生成 | 实现风格预设 + 进度条 + 画廊展示 | |
| 语音交互 | 实现 VoiceRecorder + VoicePlayer + 降级方案 | |
| 多模态 | 实现图片上传 + 多模态消息渲染 | |
| 成本控制 | 实现了模型降级 + 缓存 + Token 追踪 | |
| 性能优化 | 实现了虚拟列表 / 缓存 / 模型降级中的至少 2 种 | |
| 安全防护 | 实现了 Prompt 注入防护 + 数据脱敏 |
达标线: 12 项中至少 10 项 ✅。
常见误区
误区1:AI 应用不需要特殊安全防护
AI 应用有 Prompt 注入、数据隐私、内容安全、成本失控等独特风险——比传统 Web 应用需要更多防护。
误区2:性能优化不重要
LLM 响应慢 + 高成本 + 长消息渲染重——这三个性能瓶颈不解决,用户体验会很差。
误区3:只实现一种模式就够了
AI 应用通常需要多种能力组合(对话+RAG+Agent+语音)。六种模式库让你能快速组合出新的应用。
🤖 AI协作实战
实战场景:建立你的「AI 前端开发模式库」文档
把模块四学到的所有模式整理成一份可复用的参考文档:
我的 AI 前端开发模式库
├─ 模式1:基础对话(架构+组件+关键技术+常见问题)
├─ 模式2:RAG问答
├─ 模式3:Agent交互
├─ 模式4:图片生成
├─ 模式5:语音交互
├─ 模式6:多模态交互
├─ 选择决策树
├─ 性能优化策略表
└─ 安全注意事项表
我给 AI 的 prompt:
帮我整理一份「AI前端开发模式库」文档,包含六种模式的:
1. 适用场景
2. 核心架构图
3. 关键组件列表
4. 关键技术栈
5. 常见问题和解决方案
6. 成本估算
还有:
- 模式选择决策树
- 性能优化策略对比表
- 安全注意事项清单
格式:Markdown,适合放在项目 wiki 中。
学到了什么: 整理模式库的过程本身就是最好的复习——你把 10 期的零散知识变成了一份可复用的参考文档。以后做新的 AI 应用时,直接查模式库就能快速选择架构和组件。
💻 动手练习
练习1(简单):完成能力自检清单
对照 12 项能力清单逐项评估,标注 ✅/❌。❌ 的项目标注需要复习的期数。
练习2(中等):写你的「AI前端开发模式库」
根据本期的六种模式,整理一份你自己的开发模式库文档。每个模式写:适用场景、核心组件、关键技术、常见问题。保存为 ai-patterns-library.md。
练习3(挑战):组合两种模式实现一个新应用
选两种模式组合(如 RAG + 语音,或 Agent + 图片生成),实现一个原型:
- 设计组合架构
- 实现核心组件
- 测试验证功能
📌 本期要点
- 六种开发模式库: 基础对话 / RAG问答 / Agent交互 / 图片生成 / 语音交互 / 多模态交互——每种都有完整的架构、组件、技术栈
- 模式选择决策树: 根据需求快速选择正确的架构模式
- 性能优化三策略: 虚拟列表(长消息)+ 缓存(相似问题)+ 模型降级(成本控制)
- 安全六维度: API Key / 数据隐私 / 内容安全 / 成本控制 / Prompt注入 / 幻觉风险
- 模式库是可复用资产: 以后做新 AI 应用时直接查模式库,不需要从零开始设计
🔗 下期预告
从下一期开始进入模块五——项目实战与就业!第41期开始做你的第一个可展示项目:AI 知识库产品。
如果你没有苹果电脑,需要上传ios到APPStore可以访问以下网站
iPA上传工具 - IPA解析与AppStore提交
更多推荐


所有评论(0)