第31期 | AI应用架构全景
第31期 | AI应用架构全景
🎯 今天你将学会
- 理解前端与 LLM 交互的四种主流架构模式
- 知道 AI 应用的技术栈怎么选、怎么搭
- 理解 AI 应用与传统 Web 应用的核心差异
- 画出你的第一个 AI 应用的架构图
📖 核心知识
AI 应用 vs 传统 Web 应用:核心差异
你可能觉得「AI 应用就是普通 Web 应用 + 一个 API 调用」。不是的——AI 应用有根本性的不同:
| 维度 | 传统 Web 应用 | AI 应用 |
|---|---|---|
| 数据流 | 请求 → 响应,一次性完成 | 请求 → 流式响应,数据逐步到达 |
| 响应时间 | < 200ms(数据库查询) | 1-30s(LLM 生成),需要 UX 处理慢响应 |
| 结果确定性 | 相同请求 = 相同响应 | 相同请求 ≈ 相似响应(LLM 有随机性) |
| 错误类型 | 网络错误、权限错误 | 内容错误(幻觉/偏离预期)、格式错误(不是期望的 JSON) |
| 交互模式 | 点击 → 刷新页面 | 对话 → 流式打字效果 → 可中断 → 可追问 |
| 成本模型 | 服务器成本固定 | API 调用按 token 计费,成本跟使用量相关 |
这些差异决定了 AI 应用需要全新的架构模式。
四种主流架构模式
模式1:直接调用(Direct API Call)
最简单的模式——前端直接调用 LLM API。
前端 → HTTPS 请求 → LLM API (OpenAI/Claude) → 返回结果 → 前端渲染
适用场景: 简单的文本生成、翻译、摘要
优点: 实现最简单,几行代码就能搞定
缺点: API Key 暴露在前端(安全风险)、CORS 跨域问题、无法做缓存和限流
// 直接调用示例(⚠️ 仅用于学习,生产环境不要这样做)
async function generateSummary(text: string) {
const response = await fetch('https://api.openai.com/v1/chat/completions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${API_KEY}`, // ❌ Key 暴露在前端!
},
body: JSON.stringify({
model: 'gpt-4',
messages: [{ role: 'user', content: `总结这段文字:${text}` }],
}),
});
return response.json();
}
⚠️ 安全警告: 直接从前端调用 LLM API 会暴露 API Key。任何用户打开 DevTools 就能看到你的 Key,然后盗用。生产环境必须用模式2或模式3。
模式2:后端代理(Backend Proxy)
前端请求你的后端,后端转发到 LLM API。
前端 → HTTPS 请求 → 你的后端 → 转发 → LLM API → 返回 → 后端 → 前端
适用场景: 大多数 AI 应用(聊天、生成、分析)
优点: API Key 安全(存在后端)、可以做限流/缓存/日志、可以加业务逻辑
缺点: 要后端服务,增加了一层延迟
// 后端代理示例(推荐方式)
async function generateSummary(text: string) {
const response = await fetch('/api/ai/summary', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ text }),
});
return response.json();
}
// 后端代理实现(Express 示例)
app.post('/api/ai/summary', async (req, res) => {
const { text } = req.body;
const result = await openai.chat.completions.create({
model: 'gpt-4',
messages: [{ role: 'user', content: `总结这段文字:${text}` }],
});
res.json({ summary: result.choices[0].message.content });
});
模式3:流式响应(Streaming)
LLM 的生成是逐 token 的——不是一口气吐出完整文本。流式模式让前端实时显示每个 token,就像 ChatGPT 的打字效果。
前端 → HTTPS 请求 → 后端 → SSE/WebSocket → 逐 token 推送 → 前端逐步渲染
适用场景: 聊天界面、长文本生成、代码生成
优点: 用户不需要等 30 秒看到完整响应——几秒内就能看到开头内容
缺点: 实现复杂,需要处理 SSE/WebSocket、连接中断、并发管理
// 前端流式接收(SSE 方式)
async function streamChat(message: string) {
const response = await fetch('/api/ai/chat', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ message }),
});
const reader = response.body!.getReader();
const decoder = new TextDecoder();
let buffer = '';
while (true) {
const { done, value } = await reader.read();
if (done) break;
buffer += decoder.decode(value, { stream: true });
// 解析 SSE 格式的数据
const lines = buffer.split('\n');
buffer = lines.pop() || '';
for (const line of lines) {
if (line.startsWith('data: ')) {
const data = JSON.parse(line.slice(6));
if (data.content) {
// 逐步追加到 UI
setMessages(prev => {
const last = prev[prev.length - 1];
if (last.role === 'assistant') {
return [...prev.slice(0, -1), { ...last, content: last.content + data.content }];
}
return [...prev, { role: 'assistant', content: data.content }];
});
}
}
}
}
}
// 后端流式转发(Express + SSE)
app.post('/api/ai/chat', async (req, res) => {
res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Cache-Control', 'no-cache');
res.setHeader('Connection', 'keep-alive');
const stream = await openai.chat.completions.create({
model: 'gpt-4',
messages: [{ role: 'user', content: req.body.message }],
stream: true, // ← 开启流式
});
for await (const chunk of stream) {
const content = chunk.choices[0]?.delta?.content || '';
if (content) {
res.write(`data: ${JSON.stringify({ content })}\n\n`);
}
}
res.write('data: [DONE]\n\n');
res.end();
});
模式4:RAG + Agent(检索增强生成 + 智能代理)
最复杂的模式——前端不只跟 LLM 对话,还跟知识库(向量搜索)和工具(Agent)交互。
前端 → 请求 → 后端 → 查询知识库(向量搜索) + 调用工具(Agent) + 调用LLM → 组合响应 → 前端渲染
适用场景: AI 知识库、AI 助手(能查数据库/调用API/执行操作)
优点: LLM 有真实数据支撑(减少幻觉)、能执行实际操作(不只是说话)
缺点: 架构最复杂、需要向量数据库、需要 Agent 工具定义
RAG 流程详解:
1. 用户提问:「如何部署 React 应用到 Vercel?」
2. 向量搜索:从知识库中找到与「部署 React Vercel」最相关的文档片段
3. 构建 Prompt:
System: 你是一个技术助手,以下参考资料可供引用:
Reference 1: [从知识库检索的部署文档片段]
Reference 2: [从知识库检索的 Vercel 配置文档片段]
User: 如何部署 React 应用到 Vercel?
4. LLM 生成:基于真实文档片段回答,而不是凭记忆编造
5. 前端展示:回答 + 引用的文档来源链接
AI 应用技术栈选择
完整技术栈全景:
| 层级 | 选项 | 推荐 | 原因 |
|---|---|---|---|
| 前端框架 | React / Vue / Svelte | React | 生态最丰富,AI UI 组件库最多 |
| 流式处理 | SSE / WebSocket / fetch stream | SSE | 最简单、兼容性好、ChatGPT 也用 SSE |
| LLM SDK | openai / anthropic / langchain | openai + anthropic | 直接用官方 SDK,langchain 太重 |
| 向量数据库 | Pinecone / Weaviate / Supabase pgvector | Supabase pgvector | 免费、SQL 兼容、够用 |
| 后端框架 | Express / Fastify / Next.js API Routes | Next.js API Routes | 前端 + 后端一体,减少运维 |
| 状态管理 | Zustand / React Query / SWR | Zustand + React Query | Zustand 管 UI 状态,React Query 管 API 状态 |
| UI 组件 | shadcn/ui / Ant Design / MUI | shadcn/ui | 轻量、可定制、跟 Tailwind 无缝配合 |
| Markdown 渲染 | react-markdown / marked / MDX | react-markdown + remark-gfm | 轻量、支持 GFM(代码块、表格) |
| 代码高亮 | Prism / Shiki / highlight.js | Shiki | VS Code 同款高亮引擎,效果好 |
核心架构图:
┌─────────────────────────────────────────────────┐
│ 前端 │
│ ┌───────┐ ┌──────────┐ ┌──────────────┐ │
│ │Chat UI│ │Stream处理 │ │Markdown渲染 │ │
│ └───────┘ └──────────┘ └──────────────┘ │
│ ┌───────┐ ┌──────────┐ ┌──────────────┐ │
│ │Zustand│ │React Query│ │shadcn/ui │ │
│ └───────┘ └──────────┘ └──────────────┘ │
└─────────────────────────────────────────────────┘
│ SSE / fetch stream
↓
┌─────────────────────────────────────────────────┐
│ 后端 │
│ ┌────────────┐ ┌──────┐ ┌────────────┐ │
│ │API Routes │ │限流 │ │缓存/日志 │ │
│ └────────────┘ ┌──────┘ ┌────────────┘ │
│ ┌────────────┐ ┌──────┐ │
│ │LLM SDK │ │RAG │ │
│ └────────────┘ └──────┘ │
└─────────────────────────────────────────────────┘
│ API calls
↓
┌─────────────────────────────────────────────────┐
│ LLM / 向量数据库 │
│ ┌──────┐ ┌──────────┐ ┌──────────────┐ │
│ │OpenAI│ │Anthropic │ │Supabase │ │
│ │ │ │ │ │pgvector │ │
│ └──────┘ └──────────┘ └──────────────┘ │
└─────────────────────────────────────────────────┘
AI 应用的错误处理:比传统应用复杂得多
传统应用的错误是明确的:404、500、权限不足。AI 应用有额外的「内容错误」:
| 错误类型 | 表现 | 处理方式 |
|---|---|---|
| 网络错误 | API 请求失败 | retry + 错误提示 |
| 内容幻觉 | LLM 编造不存在的事实 | RAG 检索真实数据 + 人工审核 |
| 格式错误 | LLM 输出不是期望的 JSON 格式 | prompt 严格约束格式 + 输出解析 + fallback |
| 内容安全 | LLM 生成有害/不当内容 | content moderation API + 内容过滤 |
| 超限错误 | token 超限或 rate limit | 降级到更小模型 + 用户提示 |
| 中断错误 | 流式连接中途断开 | 自动重连 + 已接收内容保留 |
格式约束 Prompt 示例:
你必须严格按以下 JSON 格式输出,不要有任何额外文字:
{
"summary": "一句话总结",
"keyPoints": ["要点1", "要点2", "要点3"],
"confidence": 0.8
}
如果无法确定某个字段,填 null。不要输出任何 JSON 以外的内容。
常见误区
误区1:AI 应用就是 Web 应用 + API 调用
AI 应用有根本差异:流式响应、不确定性、内容错误、成本模型。不做针对性设计就会出问题。
误区2:前端直接调用 LLM API
API Key 暴露在前端 = 任何人都能盗用。必须用后端代理。
误区3:不用流式响应,等完整结果再显示
LLM 生成可能需要 30 秒。用户等 30 秒看到空屏幕会以为系统挂了。流式响应让用户几秒内看到内容。
🤖 AI协作实战
实战场景:设计你的第一个 AI 应用架构
任务:设计一个「AI 技术文档助手」
功能:用户输入技术问题 → AI 从知识库检索相关文档 → 基于真实文档回答 → 展示回答和引用来源
我给 AI 的 prompt:
设计一个 AI 技术文档助手的完整架构。
功能需求:
- 用户输入技术问题(如「React useEffect 的 cleanup 什么时候执行」)
- AI 从知识库检索相关文档片段
- 基于真实文档回答,附带引用来源
- 流式输出,打字效果
- 支持追问(多轮对话)
请用以下方式输出:
1. 架构图(用文字描述各层和连接)
2. 技术栈选择及原因
3. 数据流描述(从用户输入到最终展示的完整路径)
4. 需要处理的关键问题(错误处理、成本控制、安全)
5. 目录结构建议
AI 输出架构图:
前端层:
- ChatInterface(对话界面)
- MessageList(消息列表,含 Markdown 渲染 + 引用标注)
- StreamingHandler(SSE 流式接收)
- ChatStore(Zustand:对话历史 + 当前状态)
后端层(Next.js API Routes):
- /api/chat(流式转发到 LLM)
- /api/search(向量搜索知识库)
- /api/embed(上传文档 → 生成 embedding → 存入向量库)
数据层:
- Supabase pgvector(向量存储 + 文档元数据)
- OpenAI embeddings API(生成 embedding)
LLM 层:
- OpenAI GPT-4(生成回答)
- OpenAI text-embedding-3-small(生成 embedding)
数据流路径:
用户输入 → ChatInterface → POST /api/chat
→ 后端并行执行:
1. POST /api/search(向量搜索相关文档)
2. 构建 RAG prompt(system + 检索到的文档 + 用户问题)
3. 调用 GPT-4(stream: true)
→ SSE 逐 token 推送 → StreamingHandler 接收
→ ChatStore 更新 → MessageList 渲染
我的审查和调整:
- ✅ 架构清晰——三层(前端/后端/数据)职责明确
- ❌ 缺少限流——加上了 rate limit middleware
- ❌ 缺少缓存——相似问题的回答应该缓存,避免重复调用 LLM
- ✅ SSE 方式正确——兼容性好,比 WebSocket 简单
学到了什么: AI 能帮你快速画出架构图和选择技术栈,但关键问题(限流、缓存、安全)需要你补充——因为这些是业务决策,不是技术选择。
💻 动手练习
练习1(简单):画出你的 AI 应用架构图
选一个你想做的 AI 应用(比如 AI 聊天助手、AI 文档搜索),用四种架构模式中的哪种?画出简化的架构图。
练习2(中等):搭建 AI 应用后端代理
用 Express 或 Next.js API Routes 实现一个简单的 LLM 代理接口:
- 接收前端的 POST 请求
- 转发到 OpenAI API
- 返回结果给前端
- API Key 存在后端环境变量中
练习3(挑战):实现一个完整的流式聊天接口
在前端 + 后端实现完整的流式聊天:
- 后端:Express SSE 流式转发
- 前端:fetch stream 接收 + 逐步渲染打字效果
- 测试:能在浏览器中看到逐字出现的效果
📌 本期要点
- 四种架构模式: 直接调用(仅学习用)→ 后端代理(推荐)→ 流式响应(聊天必备)→ RAG+Agent(高级)
- AI 应用核心差异: 流式响应、不确定性、内容错误、成本模型——必须针对性设计
- API Key 安全: 绝不暴露在前端——后端代理是生产环境的唯一正确方式
- 流式响应是必备: LLM 生成可能 30 秒,用户需要几秒内看到内容
- AI 应用错误处理更复杂: 除了网络错误,还有幻觉、格式错误、内容安全、超限
🔗 下期预告
下一期我们进入 OpenAI API 接入实战——手把手教你调用 API、处理流式响应、做错误处理。你将封装一个可复用的 API 调用层。
如果你没有苹果电脑,需要上传ios到APPStore可以访问以下网站
iPA上传工具 - IPA解析与AppStore提交
更多推荐


所有评论(0)