AI 应用后端工程化:从原型到可交付系统 · 第 24 篇 · 第七章 · 生产化收束
把工作流校验、工具权限、应用凭证和会话管理串成一条生产请求路径,补齐跨模块边界。
系统接近完整时,新增的往往不再是醒目的大功能,而是模块之间的边界:工作流引用的工具是否属于当前账号,公开应用使用哪枚凭证,会话列表怎样分页,删除会话是否同时清理消息。生产化就是让这些局部能力在一条真实请求中保持一致。
沿一次请求检查边界
sequenceDiagram
participant C as 客户端
participant A as API Key 中间件
participant P as 应用配置服务
participant W as 工作流验证器
participant T as 工具注册表
participant V as 会话服务
C->>A: 携带应用 Token 请求
A->>A: 验证、撤销状态与作用域
A->>P: 读取已发布版本
P->>W: 校验工作流与资源权限
W->>T: 提取允许工具快照
T-->>W: 可执行工具集
W->>V: 创建会话与执行记录
V-->>C: 流式事件与 conversation_id
任何一步都不能只相信上一步传来的 ID。配置服务确认版本属于应用,工作流验证器确认数据集和工具属于所有者,工具注册表在执行时再次按主体授权。多层检查不是重复浪费,而是防止另一入口绕过某一层。
工作流验证分结构与权限
结构验证可以缓存:节点存在、边合法、变量类型匹配。权限验证依赖当前主体和资源状态,必须在发布或运行时执行。将两者混在一个布尔 valid 中,资源转移或工具停用后旧结果仍可能被误用。
def prepare_workflow(definition, principal, repositories):
graph = validate_structure(definition)
resources = resolve_references(graph, repositories)
for resource in resources:
authorize(principal, "use", resource)
return compile_execution_plan(graph, resources)
编译出的执行计划使用资源版本快照,运行中后台编辑不会改变当前任务。计划可以缓存,但缓存键包含工作流修订与权限上下文。
从配置提取工具要保留来源
应用可能同时引用内置工具、自定义 API 工具和工作流工具。统一成运行时 ToolEntity 后仍应保留类型、原始 ID、版本和权限范围。出现错误时才能定位是哪份配置,而不是只看到重名函数。
工具名冲突需要确定策略。更安全的是发布时拒绝并要求重命名,不要运行时“后加载覆盖先加载”。模型 Schema 中的名字稳定,旧会话回放才能找到对应执行记录。
应用凭证也有生命周期
应用 Token 用于外部调用,和用户网页登录 Token 不同。它需要作用域、过期、撤销、最后使用和轮换。Token 明文只展示一次,数据库保存哈希;请求日志记录凭证 ID,不记录秘密。
增加数据库字段只是开始。生成逻辑要使用安全随机数,查询必须过滤 revoked,缓存要及时感知撤销。轮换期间允许两枚凭证并存,监控旧凭证最后使用,确认客户端切换后再撤销。
会话 API 是数据治理入口
用户需要分页查看会话与消息,也需要删除。列表按更新时间和 ID 稳定排序,消息按创建时间与序号排序。会话标题、最后消息摘要可以冗余以提高列表性能,但更新要保持一致。
删除会话应明确是软删除、立即物理删除还是进入保留期。消息、推理过程、工具结果与长期记忆的处理可能不同。法规或审计要求保留时,界面“删除”只代表对用户不可见,文档必须说清楚。
分页读取还要防止越权:先以当前主体过滤会话,再查询消息;不能只校验会话列表接口,而让 /conversations/{id}/messages 直接按 ID 返回。
一个跨模块事故
应用发布时工具属于账号 A,之后工具被转移或停用。运行服务从缓存拿到旧 ToolEntity,仍用旧凭证调用。会话只记录工具名,事故后无法确认版本。
解决需要多点配合:资源变更发布失效事件,运行前或短 TTL 重新验证,执行记录保存工具 ID 与版本,停用状态在统一注册表强制检查。没有任何一个单独补丁能解决全部问题。
生产化检查表如何使用
不要按模块问“会话做完了吗”,而要按用户旅程问“凭证被撤销后,正在运行和新请求分别怎样”“工具删除后,历史会话还能否解释”“用户离开组织后,数据与 Token 如何处理”。跨模块问题更接近真实事故。
练习:创建应用版本并绑定工具,开始一次会话后停用工具。验证当前执行策略、新请求拒绝、历史记录展示和缓存失效。随后撤销应用 Token,确保不重启服务也能阻止调用。
五次提交补齐跨模块连接
ddc9677:增加工作流格式与权限验证。e787fcc:从配置中提取工作流工具,连接编排与工具系统。5c9c546:增加应用 Token 与生成逻辑,建立外部凭证。183e706:加入会话和消息分页管理 Handler。1379c3f:补充会话查询、删除及消息路由。
这些提交没有引入新的核心算法,却把权限、工具、凭证和历史数据连成一条可交付路径。生产系统的成熟度往往就体现在这种连接处。