Code Interpreter临时文件为什么泄露到其他任务?工作目录与生命周期排查

文章摘要

多个任务复用容器、工作目录或缓存时,前一个用户生成的文件可能被后续任务读取。

一、问题为什么容易误判

沙箱隔离必须覆盖进程、文件系统、网络、凭证和生命周期。

常见表现包括:

  • 用户看到其他任务文件
  • 临时目录长期不清理
  • 相同文件名覆盖
  • 任务结束后下载链接仍有效
  • 日志包含文件内容

这类问题不能只通过重复请求或更换模型解决。应先把调用链拆开,确认故障发生在输入、配置、状态、检索、工具、模型还是输出阶段。

二、完整调用链

用户请求 → Code Interpreter临时文件为什么泄露到其他任务前置处理 → 核心服务 → 模型/数据/工具 → 输出校验 → 用户

排查时要为每一段记录输入摘要、版本、耗时、错误类型和关联ID,避免只看最终异常。

三、最常见的根因

  1. 共享工作目录
  2. 任务ID未进入路径
  3. 清理失败无告警
  4. 对象存储URL过期过长
  5. 容器池复用未擦除

四、推荐排查顺序

  1. 每任务独立目录
  2. 挂载只读输入和独立输出
  3. 退出时可靠清理
  4. 下载使用短期授权
  5. 复用前执行擦除验证
  6. 定期扫描孤儿文件

一次只改变一个变量,并保留变更前后的Trace。否则即使问题消失,也无法确认真正原因。

五、核心实现示例

ExecutionPolicy policy = policyService.resolve(request.tenantId());
sandbox.execute(request.code(), SandboxOptions.builder()
        .networkEnabled(false)
        .timeout(Duration.ofSeconds(30))
        .memoryLimitMb(512)
        .policy(policy)
        .build());

示例只展示关键控制点。生产项目还应补充参数校验、异常映射、超时、重试边界、租户权限和审计字段。

六、需要记录的观测指标

  • request_id与tenant_id
  • 实际模型、Prompt和配置版本
  • 阶段耗时与错误分类
  • 重试、回退和取消次数
  • 最终业务状态与成本

七、容易踩的误区

  • 只看最终错误,不检查中间阶段
  • 把所有异常都当成模型质量问题
  • 同时修改多个配置后无法定位原因
  • 在日志中记录完整敏感输入
  • 没有为问题建立可回放测试样本

八、上线前检查清单

□ 完整调用链可追踪
□ 关键配置和版本进入Trace
□ 错误类型有稳定业务映射
□ 异常场景有自动化回归
□ 高风险失败默认拒绝

九、如何建立最小可复现环境

针对“Code Interpreter临时文件为什么泄露到其他任务?工作目录与生命周期排查”这类问题,建议不要直接在生产环境反复修改配置。可以建立一个只包含单个入口、单个测试租户和固定测试数据的最小环境,并固定以下变量:

代码提交版本
Prompt版本
模型与Provider
配置中心版本
测试数据或索引版本
请求参数
预期结果

先在最小环境稳定复现,再逐层替换真实组件。每次实验只修改一个变量,并保存请求Trace、配置快照和输出差异。这样才能判断修复是来自代码、配置、模型、数据还是偶然波动。

十、修复后怎样灰度验证

修复不能只验证一条成功请求。推荐依次执行:

  1. 回放最初失败样本,确认问题不再出现;
  2. 运行同类边界样本,防止只修复表面现象;
  3. 使用影子流量比较修复前后的错误率、延迟和成本;
  4. 先对内部用户或低风险租户开放;
  5. 连续观察关键指标后再扩大流量;
  6. 保留旧配置和快速回滚开关。

发生过的故障还应进入回归测试集。只有能够自动阻止同类问题再次上线,排查工作才真正形成了工程资产。

总结

代码执行的安全边界必须以任务为单位,而不是只依赖容器进程。

延伸阅读

如果你正在关注企业级 AI 应用、Spring AI、RAG、Agent 与大模型工程化落地,欢迎访问 智元界

https://www.zyentor.com/

智元界将持续分享可运行的技术实战、架构设计、问题排查与企业应用案例。