当用户提供的数据集、模型生成的代码、包安装、生成的图表以及可下载的输出必须在一个隔离、可观察的环境中运行时,AI数据分析师就需要沙盒化Python。实际的实现流程是:上传文件,使用可信代码检查模式,向模型询问计划,审查生成的Python代码,在受限沙盒中运行它,验证输出产物,并向用户展示发生了什么。
AI数据分析师架构:上传、分析、审查
产品模式表面上看很简单:用户上传CSV文件,提出自然语言问题,期望获得有用的表格、图表和可下载文件。在底层,应用程序正在运行一个具有真实副作用的小型代理工作流。模型规划分析并起草Python代码,而应用程序决定允许哪些代码、包、文件、网络访问和输出。
围绕一条清晰的路径构建第一个版本:
- 接受一个CSV文件上传以进行一项分析任务。
- 为任务创建一个作用域沙盒工作区。
- 在向模型请求Python代码之前,运行拥有的模式检查代码。
- 向模型请求分析计划,然后请求一个遵循文件和包规则的脚本。
- 使用时间、内存、磁盘、包和网络限制执行脚本。
- 仅从已知的输出目录收集经过验证的产物。
- 向用户展示答案、图表、警告、日志以及可供下载的文件。
这种分离明确了职责。模型提出并解释分析方案。后端应用产品策略并进行编排。沙盒使用受限的文件、包、时间、内存、网络访问和密钥来运行代码。
数据分析的Python沙盒中运行什么?
将分析工作区放在沙盒内部,而不是主应用服务器中。沙盒应为单个分析任务接收一个窄输入包:上传的文件、一个小清单、一个生成的脚本以及任何经批准的运行时配置。应用程序后端应将身份验证、计费、用户身份、长期存储和生产密钥保持在该工作区之外。
对于AI数据分析师,沙盒通常负责以下任务:
| 沙盒任务 | 为什么属于这里 |
|---|---|
| 文件存储 | 在上传的CSV被Python处理之前,可以将其扫描并复制到隔离的工作目录中。 |
| 模式检查 | 应用程序可以推断列名、类型、空值率、行数和样本值,而无需将完整文件暴露给模型。 |
| Python执行 | 模型生成的代码远离应用服务器运行,并且可以设定时间限制。 |
| 包准备 | 只有经过批准的依赖项才会被安装或提供给任务使用。 |
| 图表渲染 | 绘图图像作为文件写入,并在下载前进行审查。 |
| 结果打包 | 最终产物可以从已知的输出目录中收集。 |
| 清理 | 临时文件、生成的代码和会话状态可以被删除或允许过期。 |
保持模型的提示词小于数据。发送模式摘要、如果策略允许则发送几行代表性数据、列描述、用户意图以及约束条件,例如“不要训练模型”或“仅使用批准的包。”原始数据集应保留在沙盒文件系统中,除非您的产品有特定且经审查的理由需要暴露更多数据。
CSV上传和模式检查应如何工作?
首先,将每一次上传都视为不受信任的输入。在模型介入之前,验证文件类型、大小、编码、分隔符、行数、列数以及可疑的公式。CSV文件可能包含在后续打开时触发电子表格公式执行的值,因此导出的文件也应针对目标格式进行清理。
一个实用的上传流程如下:
- 用户向应用程序上传CSV文件。
- 后端将原始文件存储在作用域任务的对象键或暂存路径下。
- 后端为任务创建一个沙盒会话。
- 后端将文件复制到沙盒工作目录中。
- 一个小的、确定性的检查脚本读取文件并产生模式摘要。
- 模型接收模式摘要、用户问题、允许的库和输出要求。
检查步骤应为您拥有的确定性代码,而非模型生成的代码。它可以生成一个紧凑的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问题可以用一小组库回答:pandas、numpy、matplotlib、seaborn、scipy,有时还有 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摘要,在使用之前根据模式进行验证。
在用户下载或分享结果之前,给他们一个审查步骤。审查屏幕应显示:
- 原始问题。
- 使用的数据集名称和模式。
- 用通俗语言表述的分析步骤。
- 生成的图表和表格。
- 因策略原因排除的任何列。
- 警告、错误、重试或包请求。
模型可以编写叙述性解释,但应用程序应将该解释基于沙盒运行中的文件和日志。
投产前的安全检查点
只有当安全和平台团队能够推理出AI数据分析师被允许做什么时,它才是一个有用的内部工具。审查应涵盖隔离、资源限制、包策略、网络行为、密钥、日志和删除。
在超越原型之前,使用此检查清单:
| 检查点 | 需要回答的问题 |
|---|---|
| 隔离边界 | 什么将一名用户的代码和文件与主机及其他用户隔离开? |
| 文件访问 | 生成的代码只能读取任务目录,还是可以访问更广泛的存储? |
| 资源限制 | 什么限制了CPU时间、内存、磁盘、进程数和挂钟时间? |
| 网络策略 | 出站网络访问是关闭、列入白名单、通过代理还是完全开放的? |
| 包策略 | 哪些包可以安装,从哪里安装,有哪些版本控制? |
| 密钥边界 | API密钥、数据库凭据和服务令牌是否保持在外,除非明确作用域? |
| 日志 | 命令、包安装、错误、文件读/写以及输出产物是否被记录? |
| 人工审查 | 哪些计划、代码片段、包请求和输出需要批准? |
| 清理 | 沙盒状态、上传的文件、生成的脚本、日志和输出何时被删除? |
避免绝对的说法,例如“代码无法逃逸”或“数据不会泄漏”。更具体的实际标准是:定义边界,记录控制措施,测试失败模式,并保留足够的审计追踪以调查意外行为。
对于网络和包策略,请记住,除非包来自预构建镜像或受控镜像,否则依赖项安装是一种形式的网络出口。如果数据集是敏感的,则默认应阻止网络访问或严格列入白名单。如果分析师需要实时外部数据,请将其作为一个单独的工具,并拥有自己的批准和日志记录路径。
使用Novita Agent Sandbox作为执行层
Novita Agent Sandbox 为AI代理提供隔离且有状态的执行环境。当前的Novita文档描述了支持运行代码、安装依赖项、访问文件、使用浏览器以及在会话间保留执行状态。对于AI数据分析师,这些原语直接映射到架构的执行部分:创建工作区,移入文件,运行分析代码,收集产物,并根据会话设计清理或保留状态。
Novita Agent Sandbox SDK和CLI文档 列出了对Python和JavaScript/TypeScript的官方SDK支持,这适合常见的应用程序后端。沙盒文件系统文档 描述了一个隔离的文件系统,为沙盒提供固定的20 GB存储空间,对于在任务作用域工作区内暂存CSV文件和生成的产物非常有用。
保持清晰的区分:
- 本文中的实现指南描述的是AI数据分析师应用的通用架构。
- Novita Agent Sandbox可以为这些工作流提供沙盒执行层。
- 您的应用仍然拥有用户认证、数据保留策略、包批准、网络策略、输出审查以及发布/部署决策。
这种分离有助于团队使用清晰的职责模型进行构建。模型建议并解释分析方案。应用程序强制执行产品策略。沙盒提供受控运行时,代码、文件、包、图表和日志可以在其中处理,远离主应用服务器。
结论
最强大的AI数据分析师设计不是“让模型运行Python。”它是一个受控循环:检查数据集,向模型请求计划,审查生成的代码,在沙盒中运行它,收集验证后的产物,向用户展示发生了什么,并在任务完成后清理状态。这种结构在保持用户体验快速的同时,为工程和安全团队提供了在投产前进行评估的具体检查点。
对于构建此模式的团队,从小处着手:CSV上传、模式检查、简短的包允许列表、图表输出、严格的超时以及一个可见的审查屏幕。只有在边界得到记录和测试后,再添加更广泛的包访问、网络工具、持久化和自动化。
FAQ
为什么AI数据分析师需要一个沙盒?
因为工作流结合了不受信任的文件、模型生成的Python、包请求、图表生成和可下载的产物。在独立的环境中运行这些工作,让您的应用可以实施文件、资源、包、网络、日志和清理控制。
模型应该看到完整的CSV吗?
通常不需要。首先向模型发送模式摘要、安全样本、列描述和用户问题。将原始文件保留在沙盒中,除非您的产品有经过审查的理由需要向模型暴露更多数据。
可以允许安装包吗?
是的,但应加以控制。使用预构建镜像、允许列表、固定版本、私有镜像或审批工作流。不要让模型生成的代码在未经审查的情况下从公共互联网安装任意包。
应用应向用户返回哪些文件?
仅返回来自已知输出目录且经过验证的文件,例如图表图像、摘要JSON和经过清理的CSV导出。阻止意外的扩展名、大文件、隐藏路径以及不属于输出契约的产物。
这是合规性保证吗?
不是。沙盒是执行架构的一部分。合规性和安全批准取决于您的数据、威胁模型、控制措施、日志记录、保留策略、审查流程和部署环境。
