第 20 章:权限、限流、成本控制和日志

4 阅读2分钟

第 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 能解决权限问题。权限必须写在代码和数据层。

不要让日志变成新的数据泄露点。

本章小结

这一章补齐了生产化底线。下一章会讲部署上线和环境变量管理。