AI工作流会持续产生原始上传文件、解析中间件、提示词快照、模型草稿、审核版本和正式结果。系统刚上线时,这些文件数量不多,通常全部保留;运行一段时间后,临时文件、历史版本和未完成分片不断积累,人工又不敢删除,因为无法判断哪些文件仍被任务引用。
直接设置“超过七天全部删除”并不安全。临时文件可以过期,待审核文件可能需要继续保留,已经发布的结果需要追踪来源,争议或审计中的文件更不能被自动清理。
更合理的方式是先把业务保留状态写清楚,再用OSS前缀、对象标签和生命周期规则执行存储动作。应用负责判断对象属于临时、审核、正式还是保留锁定;OSS负责按已配置条件转换存储类型或过期处理。
一、先区分业务状态与存储动作
业务状态可以设计为:
temporary
review
published
legal_hold
对应的存储动作可能是:
temporary → 到期删除
review → 一段时间后归档
published → 持续保留或按制度管理
legal_hold → 排除自动清理
这里的天数只是业务配置,不应写死在所有代码中。不同文件类型、合同要求和数据规则可能需要不同期限。
OSS生命周期管理支持按照前缀、对象标签或文件大小等条件筛选对象,并执行存储类型转换或过期处理。官方文档同时提醒,生命周期配置存在加载和周期执行过程,不应把规则理解成精确到秒的定时删除器。OSS生命周期概述
二、为什么只按目录前缀还不够
使用目录前缀管理文件很直观:
temporary/
review/
published/
但对象从待审核变成正式结果时,如果依靠复制到新目录,会产生新对象,还需要处理旧对象是否删除、引用是否更新和版本是否保留。
对象标签可以为同一Object记录分类。例如:
stage=temporary
stage=review
stage=published
hold=true
OSS支持使用Key-Value标签分类对象,并可针对同标签对象设置生命周期规则和访问权限。官方文档说明,周期性生成且无需长期保存的对象可以在上传时设置标签,再通过生命周期规则定期处理。OSS对象标签
前缀适合表达稳定物理边界,标签适合表达会变化的业务状态。两者可以组合,而不是二选一。
三、一个本地保留决策器
先用本地数据结构把业务决策写清楚:
from dataclasses import dataclass
@dataclass(frozen=True)
class ObjectRecord:
key: str
stage: str
age_days: int
legal_hold: bool = False
示例规则:
def plan(record: ObjectRecord) -> str:
if record.legal_hold:
return "retain_hold"
if (
record.stage == "temporary"
and record.age_days >= 7
):
return "expire"
if (
record.stage == "review"
and record.age_days >= 30
):
return "archive"
if record.stage == "published":
return "retain"
return "keep_current"
这里的7天和30天仅用于本地演示,不是阿里云推荐期限,也不适用于所有业务。
决策顺序很重要:legal_hold优先于其他条件。即使文件很旧,只要处于保留锁定状态,就不进入自动过期候选。
四、验证四种对象状态
records = [
ObjectRecord(
"tmp/t1.txt", "temporary", 9
),
ObjectRecord(
"review/t2.txt", "review", 40
),
ObjectRecord(
"published/t3.txt", "published", 100
),
ObjectRecord(
"tmp/t4.txt", "temporary", 90,
legal_hold=True,
),
]
for item in records:
print(item.key, plan(item))
实际运行输出:
tmp/t1.txt expire
review/t2.txt archive
published/t3.txt retain
tmp/t4.txt retain_hold
结果说明:
- 过期临时文件进入删除候选;
- 较旧审核文件进入归档候选;
- 正式文件继续保留;
- 即使很旧,保留锁定对象仍被排除。
这只是业务规则的Dry Run,不执行任何真实OSS删除或存储类型转换。
五、为什么要先Dry Run
生命周期规则一旦命中,可能执行不可逆删除。上线前应先生成候选清单,至少检查:
object_key
version_id
stage
age_days
hold
referenced_by
planned_action
reason
重点抽查:
- 仍被运行中任务引用的对象;
- 已发布内容引用的原始资料;
- 标签缺失或未知状态对象;
- 开启版本控制后的历史版本;
- 涉及争议、审计或人工保留的对象。
未知状态默认保留,不能默认删除。
Dry Run通过后,再把已经确认的前缀与标签条件映射到OSS生命周期规则。不要让业务程序每天逐个调用DeleteObject,除非确实需要精确、即时且可审计的删除流程。
六、生命周期规则如何组合前缀和标签
可以设计:
前缀:ai-workflow/
标签:stage=temporary
动作:达到业务设定时间后过期
待审核文件:
前缀:ai-workflow/
标签:stage=review
动作:达到设定时间后转换存储类型
保留锁定对象可以放入独立前缀,或者使用生命周期规则的排除条件。OSS生命周期配置支持Filter、Prefix、Tag和Not等元素;官方文档提醒,多条规则的排除条件彼此独立,错误组合可能导致原本希望保留的对象仍被其他规则命中。OSS生命周期配置元素
因此,规则设计应从“一个对象会同时命中哪些规则”出发,而不是单独看每条规则都觉得合理。
七、生命周期配置更新为什么要完整读取
使用API或SDK修改Bucket生命周期时,需要特别注意覆盖语义。阿里云官方文档提示,调用PutBucketLifecycle会覆盖当前Bucket的全部生命周期配置;若只提交新规则而没有包含已有规则,旧规则可能被删除或失效。OSS生命周期概述
安全的配置流程应是:
读取当前规则
→ 与期望规则做差异比较
→ 人工复核删除与转换动作
→ 提交完整规则集合
→ 再次读取确认
→ 观察命中情况
生命周期规则应纳入版本管理。记录规则ID、变更人、变更原因和生效时间,不能只在控制台临时修改。
八、对象标签权限需要收紧
如果任何处理函数都能把stage=published改成stage=temporary,它就可能间接触发删除。
OSS对象标签的读取、添加和删除需要相应权限。官方文档列出了oss:GetObjectTagging、oss:PutObjectTagging和oss:DeleteObjectTagging等操作权限。OSS对象标签命令与权限
可以拆分:
- 上传函数:只能写临时对象并设置初始标签;
- 审核函数:可以将
temporary变为review; - 发布流程:经人工确认后变为
published; - 保留管理员:单独设置或解除
hold; - 生命周期规则:只负责已匹配对象的存储动作。
保留锁定权限不应与普通内容生成函数共用。
九、开启版本控制后,删除行为会变化
开启版本控制后,对象可能同时存在当前版本、历史版本和删除标记。
官方文档说明,在开启版本控制的Bucket中,当前版本过期时可能添加删除标记,使原对象成为历史版本;历史版本的永久删除则需要相应的非当前版本过期规则。OSS版本控制下的生命周期管理
这意味着:
- 页面上看不到当前对象,不代表历史版本已经清除;
- 删除当前版本与永久删除历史版本不是同一动作;
- 恢复需求与成本控制需要一起设计;
- Dry Run要包含
version_id和是否为当前版本。
不要为了快速释放空间,直接设置极短的历史版本过期时间。应先验证恢复窗口和业务要求。
十、未完成分片也会积累
AI工作流可能上传较大的PDF、音频和视频。如果分片上传中断,未完成Part可能长期保留。
OSS生命周期可以配置清理超过指定时间的未完成分片。官方文档将自动清理上传碎片列为生命周期的典型场景。OSS生命周期概述
碎片清理与对象过期应分开配置和观察。前者针对没有完成合并的上传,后者针对已经存在的Object。
十一、归档前要确认下游能否读取
把待审核文件转换为归档类存储可能降低长期存储成本,但读取方式、最短存储时长和数据取回费用可能与标准存储不同。
因此,不能只根据“多久没访问”自动归档。还要检查:
- 审核系统是否需要立即读取;
- 模型工作流是否会再次处理;
- 归档后恢复等待时间是否可接受;
- 是否存在最低存储时长相关费用;
- 当前地域和存储类型是否支持预期能力。
这些信息可能变化,发布和配置前应查看当前OSS计费与存储类型文档。本文不提供固定费用数字。
十二、任务状态与对象状态怎样关联
推荐保存独立清单:
task_id
object_key
version_id
artifact_type
stage
referenced_by
created_at
retention_policy
hold_reason
任务结束不等于所有对象都可以删除。输入可能被正式结果引用,审核记录可能需要保留,临时缓存则可以较快过期。
对象从一个状态转到另一个状态时,写入审计记录。不要只改标签而不记录原因,否则后来很难解释为什么某对象被排除或删除。
十三、怎样防止“标签改了但规则还没生效”
对象标签变化和生命周期规则执行不是同步事务。应用不能在设置stage=temporary后,立即假设对象已经被清理。
业务状态应记录“进入过期候选”,实际删除则由后续存储检查确认。
可以区分:
retention_decision = expire
storage_status = present
lifecycle_observed = pending
只有确认对象不存在或目标存储类型已变化,才更新存储状态。
同时注意,OSS文档说明修改标签不会更新Object的Last-Modified时间。如果生命周期按最后修改时间计算,改变标签不等于重新开始计时。OSS对象标签
十四、适合OPC一人公司的最小落地方法
一个人维护AI内容系统,可以先采用三前缀、四状态:
input/
working/
output/
temporary
review
published
hold
先只对working/下明确标记为temporary的对象设置保守过期策略。运行一段时间,核对候选与实际清理情况,再逐步加入审核归档和历史版本管理。
不要一开始对整个Bucket配置统一删除规则,也不要把正式内容与临时缓存混在同一前缀且没有标签。
在“智能体来了”的内容实践中,AI大模型工具深度运用不仅包括生成内容,也包括管理输入、草稿、审核版本和正式资产的生命周期。OPC中国在这里仅表示中国语境下的一人公司实践,不表示任何机构或标准。
十五、上线前检查清单
- 是否区分临时、审核、正式和保留锁定;
- 未知状态是否默认保留;
- 前缀与标签是否会命中多条规则;
- 是否先执行候选Dry Run;
- 删除规则是否经过人工复核;
- 标签修改权限是否最小化;
- 生命周期更新是否提交完整规则集合;
- 版本控制下是否配置历史版本策略;
- 未完成分片是否单独清理;
- 归档后的访问与费用边界是否确认;
- 对象是否仍被任务或正式结果引用;
- 是否能够回读规则并观察实际执行结果。
结语
AI临时文件治理不能从“删多少天以前的文件”开始,而应从“这份文件在业务上是什么”开始。
应用使用状态和标签表达保留意图,OSS生命周期按照前缀、标签和时间执行存储动作,版本控制与排除规则处理恢复边界,Dry Run则在真正删除前提供人工检查机会。
本文本地原型验证了临时过期、审核归档、正式保留和保留锁定四条路径,但没有执行任何云端删除。真正配置OSS时,应重新核对当前生命周期、版本、权限和计费文档,并先在隔离前缀和少量测试对象上验证。
清理的目标不是让Bucket看起来更空,而是在不破坏可追踪性和恢复能力的前提下,只保留真正需要的AI数据资产。
说明:本文使用AI工具辅助进行结构整理和语言优化,架构判断、示例代码及正文内容已由发布者人工审核。本地输出只是保留决策Dry Run,不代表已执行OSS生命周期配置、归档或删除。