AI应用工程
核对日期:2026-05-13。
不稳定项:模型服务商 API、SDK、流式协议、价格、速率限制、网关能力、托管向量/文件服务和前端 AI SDK 版本变化较快;生产接入必须以官方文档、当前账单和压测结果为准。
1. 阶段目标
本阶段目标是掌握把 LLM、Prompt、RAG 接入真实应用的工程方法。AI 应用不是“前端一个输入框 + 后端调用模型”,而是包含任务建模、模型网关、流式响应、异步任务、上下文存储、缓存、成本、限流、错误处理、用户确认和可观测性的完整系统。
学完本阶段,你应该能做到:
- 设计一个 AI 功能的端到端调用链路。
- 区分同步请求、streaming、异步任务、批处理的适用场景。
- 设计模型 provider adapter 或 AI gateway,避免业务代码散落调用不同模型 API。
- 处理流式输出的中断、重试、取消、部分结果和前端状态。
- 建立 token、成本、延迟、错误、prompt version、model version 的调用日志。
- 设计缓存、限流、预算和降级策略。
- 设计用户体验:可编辑草稿、引用、确认、撤销、反馈、人工接管。
- 知道 API key、用户数据、日志和模型输出的安全边界。
本阶段的核心产出是:
- 一个 AI Web 应用工程设计文档。
- 一个模型调用封装接口。
- 一个成本账本和可观测字段清单。
- 一个 AI 功能错误处理矩阵。
2. 学习前置条件
建议已完成:
05-Transformer与大模型原理,理解 token、推理参数和模型边界。06-Prompt与上下文工程,能设计 prompt 模板和结构化输出。07-RAG与知识系统,理解检索、引用、权限和 eval。- 具备 Web 前后端或服务端开发经验。
不要求:
- 先掌握 Agent 系统。
- 自建 LLM 推理集群。
- 一开始就接入所有模型服务商。
3. 核心知识地图
4. 详细讲义
4.1 AI 应用和普通 Web 应用的差异
AI 应用仍然是软件系统,但多了几个典型不确定性:
| 维度 | 普通 Web 应用 | AI 应用 |
|---|---|---|
| 输出 | 规则或数据确定 | 概率生成,可能不稳定 |
| 延迟 | 通常可控 | 首 token 和总生成时间波动大 |
| 成本 | 多与请求和资源相关 | 与输入/输出 token 强相关 |
| 错误 | 异常码和业务错误 | 还包括幻觉、格式错、拒答、部分输出 |
| 测试 | 单测/集成测试为主 | 需要 eval、样例集和人工反馈 |
| UX | 用户提交后得到确定结果 | 需要展示生成中、可编辑和确认 |
工程目标:把概率组件包在确定性系统里,让失败可检测、可恢复、可审计。
4.2 端到端调用链路
一个基础 AI 功能调用链路:
用户操作
-> 前端校验
-> 应用 API
-> 鉴权和预算检查
-> 构造任务输入
-> 构造 Prompt / Context
-> 调用模型网关
-> 解析和校验输出
-> 保存结果和日志
-> 返回给用户
-> 收集反馈和评测样例
不要让前端直接持有模型 API key。模型调用应该由服务端或可信边缘层完成,便于鉴权、计费、限流、日志和安全治理。
4.3 模型 Provider Adapter
不同服务商 API 参数、错误码、流式格式、工具调用协议都不同。业务代码不应该直接依赖多个服务商细节。
推荐封装一个统一接口:
type ModelMessage = {
role: "system" | "user" | "assistant" | "tool";
content: string;
};
type ModelRequest = {
model: string;
messages: ModelMessage[];
temperature?: number;
maxOutputTokens?: number;
metadata?: Record<string, string>;
};
type ModelUsage = {
inputTokens: number;
outputTokens: number;
totalTokens: number;
costUsd?: number;
};
type ModelResponse = {
text: string;
usage: ModelUsage;
providerRequestId?: string;
finishReason?: string;
};
注意:这是课程中的概念接口,真实项目要根据 SDK、工具调用、结构化输出和流式事件扩展。
4.4 同步、Streaming、异步任务和批处理
| 模式 | 适用 | 优点 | 风险 |
|---|---|---|---|
| 同步请求 | 短文本分类、抽取 | 简单 | 超时风险 |
| Streaming | 聊天、长文生成 | 体感延迟低 | 中途失败复杂 |
| 异步任务 | 长文档处理、批量生成 | 可重试、可排队 | 状态设计复杂 |
| 批处理 | 大量离线任务 | 成本和吞吐更好 | 结果延迟高 |
选择标准:
- 用户是否需要实时看到进度。
- 任务是否可能超过 HTTP 超时时间。
- 是否需要取消、暂停、重试。
- 是否可以离线处理。
- 是否涉及高成本或高风险操作。
4.5 Streaming 工程细节
Streaming 常用 SSE、WebSocket 或框架封装。它不是“把文本一点点显示”这么简单。
必须处理:
- 首 token 超时。
- 中途网络断开。
- 用户取消。
- 部分输出保存。
- 输出结束标记。
- 安全检查和后处理。
- 引用、工具结果和文本 delta 的不同事件类型。
前端状态建议:
idle -> submitting -> streaming -> completed
-> cancelled
-> failed
如果流中断,界面应该明确展示“已生成部分内容”,并允许重试、继续或丢弃。
4.6 异步任务和队列
长任务不要阻塞请求线程。典型流程:
POST /ai/tasks -> 返回 task_id
worker 消费队列 -> 调用模型/工具 -> 更新状态
GET /ai/tasks/:id -> 查询状态和结果
任务状态建议:
| 状态 | 含义 |
|---|---|
| queued | 已入队 |
| running | 执行中 |
| waiting_user | 等待用户确认 |
| succeeded | 成功 |
| failed | 失败 |
| cancelled | 已取消 |
| expired | 超时或过期 |
异步任务必须考虑幂等。用户重复点击不应该创建多个昂贵任务。
4.7 会话、上下文和结果存储
AI 应用至少有三类状态:
- 用户会话:用户输入、模型输出、交互历史。
- 任务状态:异步任务进度、步骤、错误。
- 上下文状态:摘要、检索证据、工具结果、用户确认信息。
存储原则:
- 只保存必要内容。
- 敏感数据脱敏或加密。
- 记录 prompt version 和 model version。
- 保留可复现所需的输入摘要,但避免把密钥、隐私、内部日志写入公开位置。
- 对可删除数据支持删除或过期策略。
4.8 缓存策略
AI 缓存分多种:
| 缓存 | 缓存对象 | 适用 | 风险 |
|---|---|---|---|
| Prompt prefix cache | 重复系统提示或长上下文前缀 | 长上下文应用 | 依赖服务商能力 |
| Exact response cache | 相同输入的模型结果 | 稳定问答、离线任务 | 陈旧、隐私 |
| Tool result cache | 搜索、数据库、解析结果 | 工具成本高 | 数据过期 |
| RAG retrieval cache | 查询检索结果 | 热点问题 | 权限泄漏 |
| Semantic cache | 语义相似请求复用 | FAQ | 错误复用 |
缓存 key 至少应包含:
- 用户或租户权限范围。
- prompt version。
- model name/version。
- 输入 hash。
- RAG 索引版本。
- 输出 schema version。
不要跨租户共享含敏感内容的缓存。
4.9 限流、预算和成本账本
AI 成本要按 token 和功能维度记录,而不是只看总账单。
成本账本字段建议:
| 字段 | 说明 |
|---|---|
| request_id | 内部请求 ID |
| user_id / tenant_id | 用户和租户 |
| feature | 功能名称 |
| model | 模型 |
| prompt_version | Prompt 版本 |
| input_tokens | 输入 token |
| output_tokens | 输出 token |
| cached_tokens | 缓存 token |
| tool_calls | 工具调用次数 |
| latency_ms | 总延迟 |
| first_token_ms | 首 token 延迟 |
| estimated_cost | 预估成本 |
| status | 成功、失败、取消 |
预算控制:
- 用户级日/月额度。
- 租户级预算。
- 功能级预算。
- 单请求 token 上限。
- 高成本操作二次确认。
- 异常成本报警。
4.10 错误分类和恢复策略
AI 应用错误不能只显示“出错了”。
| 错误类型 | 示例 | 恢复策略 |
|---|---|---|
| 输入错误 | 文本过长、文件格式不支持 | 提示用户修改 |
| 鉴权错误 | 无权限访问文档 | 拒绝并记录 |
| 预算错误 | 超过 token 或金额上限 | 降级或提示升级 |
| 速率限制 | provider 429 | 排队、退避重试 |
| 超时 | 首 token 或总响应超时 | 重试、切模型、异步化 |
| 安全拒答 | 模型或策略拒绝 | 给出可行动解释 |
| 格式错误 | JSON 不合法 | 修复重试、降级 |
| 部分输出 | streaming 中断 | 保留部分结果,允许继续 |
| 检索失败 | 无相关证据 | 拒答或引导补充 |
重试必须有上限和退避策略。对非幂等工具调用,不能盲目重试。
4.11 前端 AI 体验设计
好 AI 体验不是聊天框本身,而是围绕任务给用户控制权。
必须考虑:
- 输入前:示例、约束、文件状态、隐私提示。
- 生成中:进度、阶段、可取消。
- 生成后:可编辑、可复制、可引用、可重新生成。
- 不确定性:置信度、引用、缺失信息、人工确认。
- 失败时:明确错误、重试建议、保留输入。
- 高风险动作:预览、确认、撤销、审批。
典型模式:
| 场景 | 推荐体验 |
|---|---|
| 客服回复 | 生成草稿,人工编辑后发送 |
| 数据抽取 | 表格预览,字段级校验 |
| 文档问答 | 答案 + 引用 + 原文跳转 |
| 代码生成 | diff 预览 + 测试结果 |
| 批量任务 | 任务列表 + 状态 + 失败重跑 |
4.12 可观测性和评测闭环
上线 AI 功能后,需要同时看系统指标和质量指标。
系统指标:
- 请求量。
- 成功率。
- P50/P95 延迟。
- 首 token 延迟。
- token 用量。
- 成本。
- 错误码。
- provider 可用性。
质量指标:
- eval 通过率。
- 用户采纳率。
- 用户编辑距离。
- 负反馈率。
- 引用点击率。
- 拒答准确率。
- 人工审核通过率。
闭环流程:
线上日志/反馈 -> 抽样标注 -> 进入 eval 集 -> 回归测试 -> 更新 Prompt/模型/检索 -> 灰度发布
没有评测闭环的 AI 应用会在 Prompt 改动、模型升级和知识库更新时逐渐失控。
5. 关键概念表
| 概念 | 含义 | 工程意义 | 常见问题 |
|---|---|---|---|
| Provider Adapter | 模型服务封装层 | 屏蔽 API 差异 | 业务代码直连模型 |
| AI Gateway | 模型网关 | 路由、限流、日志、fallback | 权限设计过粗 |
| Streaming | 流式返回 token/event | 降低体感延迟 | 中断和部分结果处理差 |
| Async Task | 后台任务 | 处理长耗时任务 | 缺状态和幂等 |
| Cost Ledger | 成本账本 | 定位成本和预算 | 只看总账单 |
| Rate Limit | 限流 | 防滥用和控成本 | 误伤高价值请求 |
| Fallback | 降级方案 | 提升可用性 | 不评测质量差异 |
| Trace | 调用链追踪 | 排查模型和检索问题 | 日志缺 token 和版本 |
| Human Confirmation | 人工确认 | 控制高风险输出 | 交互太重 |
| Eval Loop | 评测闭环 | 持续质量控制 | 只靠用户反馈 |
6. 工程案例
6.1 AI 文档总结工具
场景:用户上传长文档,系统生成摘要和行动项。
关键设计:
- 上传后异步解析。
- 长文档分块摘要再汇总。
- 生成结果支持编辑。
- 记录文档版本、prompt version、token 成本。
- 对解析失败和超长文档给出明确提示。
高风险点:直接同步处理大文件容易超时,解析噪声会污染摘要。
6.2 AI 表单填写助手
场景:用户输入自然语言,系统生成表单字段。
关键设计:
- 模型输出结构化 JSON。
- 字段级校验。
- 高风险字段需要用户确认。
- 原始输入和字段来源可追溯。
高风险点:不要让模型直接提交表单,必须先预览和确认。
6.3 AI 客服草稿生成
场景:客服输入用户问题,AI 根据知识库生成回复草稿。
关键设计:
- RAG 检索知识库。
- 输出草稿而非直接发送。
- 显示引用和相关政策。
- 记录客服是否采纳和编辑内容。
高风险点:赔付、退款、封号等动作必须走业务系统规则。
6.4 AI 代码 Review 服务
场景:对 PR diff 做风险审查。
关键设计:
- 分文件 chunk。
- 对大 diff 异步处理。
- 输出文件、行号、风险、影响、建议。
- 与 CI 测试结果结合。
- 支持开发者标记误报。
高风险点:模型可能给出泛泛建议,需要 schema 和严重程度标准约束。
6.5 企业知识库聊天
场景:员工问内部制度和技术文档。
关键设计:
- 鉴权后检索。
- 答案带引用。
- 支持继续追问。
- 记录未命中问题。
- 高敏文档不进缓存或日志脱敏。
高风险点:多租户和权限过滤不能交给模型判断。
7. 常见误区与反模式
| 反模式 | 表现 | 后果 | 修正 |
|---|---|---|---|
| 前端直连模型 | API key 放浏览器 | 密钥泄露、无法控权 | 服务端调用 |
| 只有一个输入框 | 没有任务状态和确认 | 用户不信任 | 任务化交互 |
| 不记录 token | 只看请求数 | 成本失控 | 成本账本 |
| 无取消重试 | 生成卡住只能刷新 | 体验差、重复扣费 | 状态机和取消 |
| 所有任务同步 | 长任务阻塞请求 | 超时和资源占用 | 队列异步化 |
| 盲目 fallback | 失败就换便宜模型 | 质量不可控 | fallback 也要 eval |
| 跨租户缓存 | 相似问题复用结果 | 数据泄露 | 权限入 cache key |
| 错误提示含糊 | “发生错误” | 用户无法处理 | 错误分类和建议 |
| 无反馈入口 | 用户只能复制结果 | 无法迭代 | 采纳、编辑、反馈 |
| 日志存敏感原文 | 调试方便 | 合规风险 | 脱敏和访问控制 |
8. 阶段练习
8.1 调用封装练习
设计一个模型调用接口,至少包含:
- 普通文本生成。
- 结构化输出。
- streaming。
- token usage。
- provider request id。
- 错误分类。
要求:业务层不直接依赖具体 provider SDK。
8.2 Streaming 练习
实现或设计一个流式聊天接口,说明:
- 如何返回 delta。
- 如何处理用户取消。
- 如何保存部分输出。
- 如何处理流中断。
- 前端状态机如何设计。
8.3 异步任务练习
为“长文档总结”设计任务表:
- task_id。
- status。
- progress。
- input_file_id。
- result_id。
- error_code。
- retry_count。
- created_at / updated_at。
说明如何保证幂等。
8.4 成本账本练习
为一个 AI 功能设计成本日志,并回答:
- 哪个用户成本最高?
- 哪个功能 token 最多?
- 哪个 prompt version 成本上升?
- 哪个模型延迟最高?
- 哪些请求触发了 fallback?
8.5 前端体验练习
选择一个 AI 功能,画出用户状态流:
- 输入。
- 生成中。
- 部分结果。
- 完成。
- 失败。
- 重试。
- 人工确认。
- 反馈。
说明每个状态用户能做什么。
9. 项目任务
9.1 项目要求
完成一个 AI Web 应用的设计和最小实现,可以选择:
- 文档总结工具。
- 客服回复草稿。
- 知识库问答。
- 表单填写助手。
- 代码 Review 服务。
必须包含:
- 一个真实任务流。
- 服务端模型调用封装。
- streaming 或异步任务。
- Prompt 版本记录。
- token、成本、延迟和错误日志。
- 基础 eval 样例。
- 前端状态:生成中、取消、失败、重试、完成。
- 用户确认或编辑机制。
9.2 设计文档模板
# AI 应用工程设计文档
## 1. 业务场景和目标
## 2. 用户流程
## 3. 系统架构
## 4. 模型调用封装
## 5. Prompt / RAG / 上下文
## 6. Streaming 或异步任务
## 7. 数据存储和日志
## 8. 成本、限流和预算
## 9. 错误处理和降级
## 10. 前端体验状态机
## 11. Eval 和上线验收
## 12. 安全和合规边界
9.3 评分标准
| 维度 | 分值 | 标准 |
|---|---|---|
| 架构完整性 | 20 | 前端、API、模型、存储、日志链路清晰 |
| 模型封装 | 15 | provider 差异隔离,错误和 usage 统一 |
| 交互体验 | 20 | 有状态、取消、重试、确认和编辑 |
| 成本与稳定性 | 20 | 有成本账本、限流、缓存、降级 |
| 评测与观测 | 15 | 有 eval、trace、反馈闭环 |
| 安全边界 | 10 | 密钥、权限、日志和缓存安全明确 |
10. 验收题
- AI 应用和普通 Web 应用在工程上有哪些关键差异?
- 为什么前端不能直接持有模型 API key?
- Provider adapter 应该统一哪些字段和错误?
- Streaming 和异步任务分别适合什么场景?
- 流式响应中断时应该如何处理用户体验和数据状态?
- AI 缓存 key 为什么必须包含权限和版本信息?
- 成本账本至少应该记录哪些字段?
- 模型调用失败应如何分类和恢复?
- AI 输出为什么通常需要用户确认或可编辑机制?
- 线上 AI 功能如何形成评测闭环?
11. 延伸阅读
官方与 SDK 文档
- OpenAI API docs: https://platform.openai.com/docs
- OpenAI Responses API reference: https://platform.openai.com/docs/api-reference/responses
- Anthropic API overview: https://docs.anthropic.com/en/api/overview
- Vercel AI SDK: https://ai-sdk.dev/docs/introduction
- Cloudflare AI Gateway: https://developers.cloudflare.com/ai-gateway/
工程实践资料
- OpenTelemetry Documentation: https://opentelemetry.io/docs/
- OWASP LLM Top 10: https://owasp.org/www-project-top-10-for-large-language-model-applications/
建议阅读方式
- 先读目标模型服务商 API,确认消息格式、streaming、错误码和速率限制。
- 再读 AI SDK 或 Gateway 文档,理解抽象层能解决什么。
- 最后结合 OWASP LLM Top 10 检查安全边界。
12. 本阶段总结
AI 应用工程的核心是把不确定的模型输出放进可控的软件系统里。模型负责生成,系统负责权限、状态、成本、校验、观测、用户确认和失败恢复。
你应该形成一个判断:一个 AI 功能能不能上线,不只看 demo 是否惊艳,而要看它在慢、贵、错、断、拒答、越权、输出不完整、用户误操作时是否仍然可控。
下一阶段进入 Agent 系统设计。你会学习如何让模型在受控边界内选择工具、维护状态、推进多步任务,并理解 Agent 的控制流、失败条件和人类在环机制。