构建一个带沙盒 Python 和可控包访问的 AI 数据分析师

构建一个带沙盒 Python 和可控包访问的 AI 数据分析师

一个 AI 数据分析师需要沙盒化的 Python,当用户提供的数据集、模型生成的代码、包安装、生成的图表以及可下载的输出必须在一个隔离且可观测的环境中运行时。实际的实现流程是:上传文件、用可信代码检查模式、向模型请求计划、审查生成的 Python、在受限沙盒中运行、验证输出工件,然后向用户展示发生了什么。

AI 数据分析师架构:上传、分析、审查

产品模式在表面上看很简单:用户上传一个 CSV,用自然语言提问,并期望获得有用的表格、图表和可下载文件。在底层,应用程序运行着一个带有实际副作用的小型智能体工作流。模型规划分析并起草 Python 代码,而应用程序决定哪些代码、包、文件、网络访问和输出是被允许的。

围绕一条清晰的路径构建第一个版本:

  1. 为一个分析任务接受 CSV 上传。
  2. 创建一个任务范围沙盒工作空间。
  3. 在向模型请求 Python 代码之前,运行自有的模式检查代码。
  4. 向模型请求一个分析计划,然后请求一个遵循你的文件和包规则的脚本。
  5. 在时间、内存、磁盘、包和网络限制下执行脚本。
  6. 仅从已知的输出目录中收集已验证的工件。
  7. 向用户展示答案、图表、警告、日志以及选择用于下载的文件。

这种分离保持了职责清晰。模型提出并解释分析。后端应用产品策略和编排。沙盒在受约束的文件、包、时间、内存、网络访问和密钥环境下运行代码。

Python 数据分析沙盒中运行什么?

将分析工作空间放在沙盒内部,而不是你的主应用服务器内部。沙盒应为单个分析任务接收一个狭窄的输入包:上传的文件、一个小型清单、生成的脚本以及任何已批准的运行时配置。应用程序后端应将身份验证、计费、用户身份、长期存储和生产密钥保留在该工作空间之外。

对于一个 AI 数据分析师,沙盒通常负责以下任务:

沙盒任务 为何属于此处
文件暂存 上传的 CSV 可以在 Python 接触之前被扫描并复制到一个隔离的工作目录中。
模式检查 应用程序可以推断列名、类型、空值率、行数和样本值,而无需将整个文件暴露给模型。
Python 执行 模型生成的代码在应用服务器之外运行,并且可以设置时间限制。
包准备 仅为任务安装或提供已批准的依赖项。
图表渲染 绘图图像被写入文件,并在下载前进行审查。
结果打包 最终的工件可以从已知的输出目录中收集。
清理 临时文件、生成的代码和会话状态可以被删除或允许过期。

保持模型的提示比数据更小。发送模式摘要、如果策略允许则发送几行代表性数据、列描述、用户意图以及约束条件,例如“不要训练模型”或“只使用已批准的包”。原始数据集应保留在沙盒文件系统中,除非你的产品有具体且经过审查的理由需要暴露更多数据。

CSV 上传和模式检查应该如何工作?

从将每次上传视为不受信任的输入开始。在模型介入之前,验证文件类型、大小、编码、分隔符、行数、列数以及可疑公式。CSV 仍然可能包含在稍后打开时触发电子表格公式执行的值,因此导出的文件也应针对目标格式进行清理。

一个实际的上传流程如下所示:

  1. 用户将 CSV 上传到应用程序。
  2. 后端将原始文件存储在任务范围的对象键或暂存路径下。
  3. 后端为任务创建一个沙盒会话。
  4. 后端将文件复制到沙盒工作目录中。
  5. 一个小的、确定性的检查脚本读取文件并生成模式摘要。
  6. 模型接收模式摘要、用户问题、允许的库和输出要求。

检查步骤应该是你拥有的确定性代码,而不是模型生成的代码。它可以生成一个紧凑的 JSON 摘要,如下所示:

{
  "file": "sales.csv",
  "rows": 84231,
  "columns": [
    {"name": "order_date", "type": "date", "null_rate": 0.01},
    {"name": "region", "type": "string", "sample_values": ["NA", "EMEA", "APAC"]},
    {"name": "revenue", "type": "number", "null_rate": 0.0}
  ],
  "safe_sample_rows": 5
}

该摘要为模型提供了足够的上下文来起草分析,而无需将整个数据集交给它。对于敏感工作负载,减少或移除样本值、屏蔽列,或要求用户批准哪些列可以使用。

模型如何安全地生成并运行 Python?

模型应该在生成代码之前生成一个计划。一个好的计划会说明它将使用的列、打算运行的转换、预期创建的图表以及它将写入的输出文件。这为你的应用程序提供了一个用于策略和用户审查的检查点。

在计划被接受后,要求 Python 代码遵循一个狭窄的契约:

  • 仅从 input/ 目录读取输入文件。
  • 仅将工件写入 output/ 目录。
  • 仅使用已批准的包。
  • 除非任务策略明确允许,否则避免网络调用。
  • 最后打印一个结构化摘要。
  • 当所需列缺失时,清晰报错。

在概念层面,编排循环如下所示:

job = create_analysis_job(user_id, uploaded_file)
sandbox = create_sandbox(job_id=job.id, timeout_seconds=300)

copy_file_to_sandbox(uploaded_file, sandbox_path="/work/input/data.csv")
schema = run_owned_schema_inspector(sandbox, "/work/input/data.csv")

plan = ask_model_for_analysis_plan(
    user_question=job.question,
    schema=schema,
    allowed_packages=["pandas", "numpy", "matplotlib"],
    output_contract={"directory": "/work/output", "formats": ["png", "csv", "json"]},
)

review_policy(plan)

script = ask_model_for_python(plan=plan, schema=schema)
review_static_code_policy(script)

result = run_python_in_sandbox(
    sandbox=sandbox,
    script=script,
    working_dir="/work",
    timeout_seconds=120,
    memory_limit_mb=1024,
)

artifacts = collect_outputs(sandbox, "/work/output")
review_outputs(artifacts)
return_answer_to_user(result.summary, artifacts)

这是伪代码,不是产品 SDK 契约。关键在于边界:生成的代码经过审查,在超时限制下运行,受限于已知目录,然后进行输出收集和审查。

如果脚本失败,将错误消息和一小段代码摘录发送回模型进行修复。不要发送无限制的日志。错误修复应保持与首次尝试相同的包、文件、网络和输出策略。

用于 AI 数据分析的受控 Python 包访问

包访问是许多 AI 数据分析师演示变得有风险的地方。模型可能会请求一个库,因为它在一个教程中看到过,因为一个包名看起来合理,或者因为用户的提示暗示了它。你的应用程序不应将这些建议转化为不受限制的包安装。

使用与数据敏感性相匹配的策略:

包策略 最佳适用场景 权衡
仅使用预构建镜像 具有可预测分析需求的生产工作负载 最低灵活性,最简单的审查面
允许列表中的包 大多数 CSV 分析助手 pandas、绘图和常见统计包的良好平衡
版本固定的安装 可重现的分析任务 需要包维护和漏洞审查
缓存的内部镜像 企业或受监管的数据工作流 更多运维工作,更好控制供应链
用户批准的安装 面向可信用户的探索性工具 更灵活,但速度较慢,需要明确的警告

对于第一个生产版本,从预构建环境或短允许列表开始。大多数 CSV 问题可以用一小组库回答:pandasnumpymatplotlibseabornscipy,有时还有 scikit-learn。如果某个任务需要另一个包,让模型解释原因,然后将该请求路由到人工审批或包审查工作流。

记录包名称、版本、来源仓库、安装时间以及请求该包的原因。如果你的安全团队使用依赖扫描器或私有仓库,则应与该流程集成,而不是让智能体绕过它。

如何验证图表和输出文件

生成的文件是产品体验的一部分,但它们也是信任边界的一部分。图表可能出错。CSV 可能包含类似公式的值。笔记本可能包含隐藏代码。ZIP 可能包含意外路径。将工件视为需要检查的产物,而不仅仅是下载的文件。

定义一个简单的输出契约:

{
  "required_files": ["summary.json"],
  "optional_files": ["chart-*.png", "filtered-data.csv"],
  "blocked_extensions": [".exe", ".sh", ".bat", ".html"],
  "max_total_size_mb": 25
}

对于每个完成的任务,仅从预期的输出目录收集文件。验证 MIME 类型、扩展名、大小和路径。对于图像,生成缩略图用于预览。对于 CSV 导出,如果文件可能在 Excel 或 Google Sheets 中打开,则转义电子表格公式。对于 JSON 摘要,在 UI 中使用之前,根据模式进行验证。

在用户下载或分享结果之前,给他们一个审查步骤。审查屏幕应显示:

  • 原始问题。
  • 使用的数据集名称和模式。
  • 用通俗语言描述的分析步骤。
  • 生成的图表和表格。
  • 任何因策略原因被排除的列。
  • 警告、错误、重试或包请求。

模型可以编写叙述性解释,但应用程序应将该解释基于沙盒运行中的文件和日志。

上线前的安全检查点

仅当安全和平台团队能够推理出 AI 数据分析师被允许做什么时,它才是一个有用的内部工具。审查应涵盖隔离、资源限制、包策略、网络行为、密钥、日志和删除。

在超越原型阶段之前,使用此检查表:

检查点 需要回答的问题
隔离边界 什么将一位用户的代码和文件与主机及其他用户隔离开?
文件访问 生成的代码能否仅读取任务目录,还是可以访问更广泛的存储?
资源限制 什么限制了 CPU 时间、内存、磁盘、进程数和挂钟时间?
网络策略 出站网络访问是关闭、被允许列表限制、通过代理还是完全开放?
包策略 哪些包可以安装,从何处安装,以及采用什么版本控制?
密钥边界 API 密钥、数据库凭证和服务令牌是否被保留在沙盒之外,除非明确设定范围?
日志 命令、包安装、错误、文件读取/写入和输出工件是否被记录?
人工审查 哪些计划、代码片段、包请求和输出需要批准?
清理 沙盒状态、上传的文件、生成的脚本、日志和输出何时被删除?

避免诸如“代码无法逃逸”或“数据不会泄露”之类的绝对断言。更实际的标准是:定义边界,记录控制措施,测试故障模式,并保留足够的审计追踪以调查意外行为。

对于网络和包策略,请记住,依赖安装是一种网络出口形式,除非包来自预构建镜像或受控镜像。如果数据集是敏感的,默认情况下应阻止网络访问或严格限制允许列表。如果分析师需要实时外部数据,将其作为一个单独的工具,并拥有自己的批准和日志记录路径。

使用 Novita Agent 沙盒作为执行层

Novita Agent 沙盒 为 AI 智能体提供隔离的、有状态的执行环境。当前的 Novita 文档描述了支持运行代码、安装依赖项、访问文件、使用浏览器以及跨会话保持执行状态。对于一个 AI 数据分析师来说,这些原语直接映射到架构的执行部分:创建任务工作空间、移入文件、运行分析代码、收集工件,并根据会话设计清理或保持状态。

Novita Agent 沙盒 SDK 和 CLI 文档 列出了对 Python 和 JavaScript/TypeScript 的官方 SDK 支持,这适用于常见的应用程序后端。沙盒文件系统文档 描述了一个隔离的文件系统,为沙盒提供固定的 20 GB 存储空间,这对于在任务范围的工作空间中暂存 CSV 文件和生成的工件很有用。

保持区别清晰:

  • 本文中的实施指导描述了 AI 数据分析师应用程序的通用架构。
  • Novita Agent 沙盒可以为这些工作流提供沙盒执行层。
  • 你的应用程序仍然拥有用户身份验证、数据保留策略、包批准、网络策略、输出审查以及发布/部署决策的所有权。

这种分离有助于团队以清晰的职责模型进行构建。模型建议并解释分析。应用程序执行产品策略。沙盒提供受控的运行时环境,在该环境中,代码、文件、包、图表和日志可以在主应用服务器之外进行处理。

结论

最强的 AI 数据分析师设计不是“让模型运行 Python”。它是一个受控的循环:检查数据集、向模型请求计划、审查生成的代码、在沙盒中运行、收集已验证的工件、向用户展示发生了什么,并在任务完成时清理状态。这种结构在保持用户体验快速的同时,为工程和安全团队提供了具体的检查点,以便在上线前进行评估。

对于正在构建此模式的团队,从小处着手:CSV 上传、模式检查、简短的包允许列表、图表输出、严格的超时以及可见的审查屏幕。只有在边界被文档化并经过测试后,再添加更广泛的包访问、网络工具、持久化和自动化。

常见问题解答

为什么 AI 数据分析师需要沙盒?

它需要一个沙盒,因为工作流结合了不受信任的文件、模型生成的 Python、包请求、图表生成和可下载的工件。在单独的环境中运行该工作,为你的应用程序提供了一个应用文件、资源、包、网络、日志记录和清理控制的地方。

模型应该看到完整的 CSV 吗?

通常不。开始时,向模型发送模式摘要、安全样本、列描述和用户的问题。将原始文件保留在沙盒中,除非你的产品有经过审查的理由需要向模型暴露更多数据。

允许包安装吗?

是的,但应该受到控制。使用预构建镜像、允许列表、固定版本、私有镜像或审批工作流。不要让模型生成的代码在没有审查的情况下从公共互联网安装任意包。

应用程序应该向用户返回哪些文件?

仅返回来自已知输出目录的已验证文件,例如图表图像、摘要 JSON 和经过清理的 CSV 导出文件。阻止意外的扩展名、大文件、隐藏路径以及不属于输出契约的工件。

这是合规性保证吗?

不。沙盒只是执行架构的一部分。合规性和安全审批取决于你的数据、威胁模型、控制措施、日志记录、保留策略、审查流程和部署环境。

推荐阅读