参考答案
核对日期:2026-05-13。
1. 阶段练习参考方向
1.1 调用封装练习
模型调用接口应让业务层不感知具体 provider:
type ModelUsage = {
inputTokens: number;
outputTokens: number;
totalTokens: number;
};
type ModelResult<T> = {
content: T;
usage: ModelUsage;
providerRequestId: string;
model: string;
finishReason: string;
};
错误分类至少包含:认证失败、限流、超时、内容安全拦截、schema 校验失败、上游不可用、预算不足和未知错误。
1.2 Streaming 练习
设计要点:
- 服务端按 delta 推送,而不是等完整答案。
- 用户取消后停止上游生成并标记状态。
- 部分输出可保存为草稿,但不能当作已完成结果。
- 流中断时允许重试或转异步任务。
- 前端状态要区分 generating、partial、cancelled、failed、completed。
1.3 异步任务练习
任务表字段应支持恢复和幂等:
| 字段 | 作用 |
|---|---|
| task_id | 幂等键和追踪 |
| status | queued/running/succeeded/failed/cancelled |
| progress | 前端展示 |
| input_file_id | 输入对象 |
| result_id | 输出对象 |
| error_code | 失败分类 |
| retry_count | 重试控制 |
| created_at / updated_at | 排查和超时处理 |
幂等策略:同一用户、同一文件、同一 prompt version 可生成 idempotency key;重复请求返回同一任务或明确创建新版本。
1.4 成本账本练习
成本日志至少包含:
- user_id / tenant_id。
- feature。
- prompt_version。
- model / provider。
- input_tokens / output_tokens。
- estimated_cost。
- latency_ms。
- cache_hit。
- fallback_reason。
- request_id / trace_id。
这些字段能回答用户、功能、版本、模型、fallback 和延迟的成本问题。
1.5 前端体验练习
参考状态流:
idle -> submitting -> generating -> partial -> completed
| |
| -> user_editing -> confirmed
-> failed -> retrying
-> cancelling -> cancelled
每个状态都要定义用户能否取消、编辑、重试、提交反馈和离开页面。
2. 项目评分样例
高分 AI Web 应用应具备:
- 服务端封装模型调用,不暴露 API key。
- 前端有生成中、取消、失败、重试、完成和编辑确认。
- 有 prompt version、usage、trace、成本和错误日志。
- 有基础 eval 样例和线上反馈入口。
- 有限流、缓存、降级和预算设计。
- 输出进入业务前需要用户确认或校验。
不合格表现:
- 前端直接调用模型服务商 API。
- 只实现聊天框,没有任务流和状态机。
- 不记录 token 和成本。
- 模型失败时只显示“出错了”。
- 没有 eval,靠人工感觉上线。
3. 验收题参考答案
- AI 应用和普通 Web 应用在工程上有哪些关键差异?
AI 应用引入不确定输出、token 成本、模型延迟、流式响应、内容安全、评测集、Prompt 版本和供应商风险。普通 Web 更偏确定性业务逻辑。
- 为什么前端不能直接持有模型 API key?
前端密钥可被用户提取,导致滥用、账单风险和数据泄漏。模型调用应走服务端,统一鉴权、限流、日志和预算。
- Provider adapter 应该统一哪些字段和错误?
统一输入消息、输出内容、结构化结果、usage、model、request id、finish reason、错误类型、重试建议和安全拦截信息。
- Streaming 和异步任务分别适合什么场景?
Streaming 适合用户等待中的增量文本生成;异步任务适合长文档、批处理、耗时工具链和用户可离开页面的任务。
- 流式响应中断时应该如何处理用户体验和数据状态?
标记为 failed 或 interrupted,保留部分草稿但不当作完成结果,提供重试、继续生成或重新提交,并记录上游错误和 trace。
- AI 缓存 key 为什么必须包含权限和版本信息?
同一问题在不同用户权限、文档版本、Prompt 版本、模型或参数下可能答案不同。缓存 key 缺少这些字段会造成越权或旧答案。
- 成本账本至少应该记录哪些字段?
用户、租户、功能、模型、provider、prompt version、输入/输出 token、费用估算、延迟、cache hit、fallback、request id 和 trace id。
- 模型调用失败应如何分类和恢复?
分类为认证、限流、超时、上游不可用、内容安全、schema 校验、预算不足和未知错误。恢复方式包括重试、降级、排队、转人工、提示用户修改输入或回滚版本。
- AI 输出为什么通常需要用户确认或可编辑机制?
模型输出可能不完整、不准确或不符合上下文。用户确认和编辑能降低错误进入业务系统的风险,尤其是对外发送、工单、合同和资金相关场景。
- 线上 AI 功能如何形成评测闭环?
线上收集 trace、用户反馈、采纳率、失败样例和成本数据,定期回流到 eval 集。Prompt、模型或 RAG 变更必须通过回归评测和灰度。