第 20 章:权限、限流、成本控制和日志
本章目标
这一章把项目从 Demo 往生产应用推进。AI 应用如果不做权限和成本控制,很容易失控。
权限控制
至少要控制:
- 谁能访问 Chat
- 谁能上传文档
- 谁能删除知识库
- 谁能调用高风险工具
- 谁能查看日志和成本
接口层不要只依赖前端隐藏按钮。
function assertAdmin(user: { role: string }) {
if (user.role !== "admin") {
throw new Error("没有权限");
}
}
工具权限
工具调用尤其要小心。查询类工具风险较低,写入类工具风险更高。
低风险:搜索制度、计算价格
中风险:查询订单、查询客户信息
高风险:退款、删除、发送通知、修改权限
高风险工具要二次确认,不要让模型直接执行。
限流
AI 请求成本高,必须限流。
可以按用户维度限制:
interface RateLimitRecord {
userId: string;
count: number;
resetAt: number;
}
规则示例:
普通用户:每分钟 10 次
管理员:每分钟 60 次
匿名用户:不允许访问
教学项目可以用内存实现,生产环境建议用 Redis。
成本控制
成本来自:
- 输入 token
- 输出 token
- Embedding
- 工具调用中的外部 API
- 向量库和数据库资源
可以记录:
interface AIUsageLog {
id: string;
userId: string;
model: string;
feature: "chat" | "agent" | "rag" | "embedding";
inputTokens?: number;
outputTokens?: number;
estimatedCost?: number;
createdAt: number;
}
不同供应商返回 token usage 的方式不同,记录逻辑要留扩展口。
日志
AI 应用日志建议分层:
请求日志:谁在什么时候问了什么
检索日志:检索到了哪些文档
工具日志:调用了什么工具,参数是什么
模型日志:模型、耗时、token
错误日志:失败类型和堆栈
敏感信息要脱敏。
安全边界
几个必须注意的点:
- 不要把 API Key 暴露给前端
- 不要让模型执行任意代码
- 不要让模型访问任意 URL
- 不要让模型绕过用户权限
- 不要把企业敏感资料发给未批准的模型服务
- 不要在日志里保存明文隐私信息
实战任务
完成:
- 简单用户角色判断
- 请求限流中间件设计
- AI 使用日志类型
- 工具风险分级
- 高风险工具二次确认流程图
常见坑
不要等上线后再考虑成本。AI 应用的成本是核心架构问题。
不要相信 Prompt 能解决权限问题。权限必须写在代码和数据层。
不要让日志变成新的数据泄露点。
本章小结
这一章补齐了生产化底线。下一章会讲部署上线和环境变量管理。